(function(e, a) { for(var i in a) e[i] = a[i]; }(this, /******/ (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 = 1); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/cartographer.js": /*!*****************************!*\ !*** ./src/cartographer.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Cartographer; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _funky__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./funky */ "./src/funky.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DEFAULTS = { adjustScaleMin: true, // in pixels scale: 50, scaleMin: 10, scaleMax: 250 }; var Cartographer = /*#__PURE__*/ function () { function Cartographer(settings) { var _this = this; _classCallCheck(this, Cartographer); ['getOriginX', 'getOriginY', 'getScale', 'move', '_checkMove', 'setOriginX', 'setOriginY', 'zoom', 'remap'].map(function (method) { return _this[method] = _this[method].bind(_this); }); this.settings = Object.assign({}, DEFAULTS, settings); Object.assign(this, Object(_funky__WEBPACK_IMPORTED_MODULE_1__["pick"])(this.settings, ['height', 'negativeTiles', 'radius', 'width', 'wrap'])); if (!this.width || !this.height) delete this.wrap; this.checkScale(this.settings.canvasHeight, this.settings.canvasWidth); this.setOriginX(this.settings.canvasWidth, this.settings.centerX); this.setOriginY(this.settings.canvasHeight, this.settings.centerY); } _createClass(Cartographer, [{ key: "getOriginX", value: function getOriginX() { return this.originX; } }, { key: "getOriginY", value: function getOriginY() { return this.originY; } }, { key: "getScale", value: function getScale() { return this.scale; } }, { key: "checkScale", value: function checkScale(canvasHeight, canvasWidth) { var heightMin = this.height ? this.calculateVerticalScale(canvasHeight, this.height) : 0; var widthMin = this.width ? this.calculateHorizontalScale(canvasWidth, this.width) : 0; this.scaleMax = this.settings.scaleMax; this.scaleMin = this.settings.adjustScaleMin ? Math.max(this.settings.scaleMin, heightMin, widthMin) : this.settings.scaleMin; this.scale = this.scaleMin > this.settings.scale ? this.scaleMin : this.settings.scale; } }, { key: "setOriginX", value: function setOriginX(canvasWidth, centerX) { this.originX = centerX ? centerX - canvasWidth / 2 : this.negativeTiles ? parseInt(canvasWidth / 2) : this.width ? this.width * this.horizontalDistance() / -2 + canvasWidth / 2 + this.horizontalDistance() / 2 : this.tileWidth() / 2; } }, { key: "setOriginY", value: function setOriginY(canvasHeight, centerY) { var boardHeight = this.height * this.verticalDistance(); this.originY = centerY ? centerY + canvasHeight / 2 : this.negativeTiles ? parseInt(canvasHeight / 2) : this.height ? boardHeight - (boardHeight - canvasHeight) / 2 - this.verticalDistance() / 2 : canvasHeight - this.tileHeight() / 2; } }, { key: "move", value: function move(event) { if (!Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["has"])(event, 'height')) event.height = event.target.offsetHeight; if (!Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["has"])(event, 'width')) event.width = event.target.offsetWidth; var newX = this.originX + event.deltaX; var newY = this.originY + event.deltaY; this.originX = newX; this.originY = newY; this._checkMove(event); // return if the move succeeded or not return this.originX === newX && this.originY === newY; } }, { key: "_checkMove", value: function _checkMove(event) { if (this.negativeTiles) { this._checkMoveNegativeTiles(event); } else { this._checkMovePositiveTiles(event); } } }, { key: "_checkMovePositiveTiles", value: function _checkMovePositiveTiles(event) { var canvasWidth = event.width; var canvasHeight = event.height; var colWidth = this.horizontalDistance(); var rowHeight = this.verticalDistance(); var maxX = this.tileWidth() / 2; var minY = canvasHeight - this.tileHeight() / 2; if (!this.wrap) { this.originX = this.originX > maxX ? maxX : this.originX; this.originY = this.originY < minY ? minY : this.originY; if (this.width) { var boardWidth = this.width * colWidth + this.horizontalOverhang(); var minX = maxX - (boardWidth - canvasWidth); this.originX = this.originX < minX ? minX : this.originX; } if (this.height) { var boardHeight = this.height * rowHeight + this.verticalOverhang(); var maxY = boardHeight - this.tileHeight() / 2; this.originY = this.originY > maxY ? maxY : this.originY; } } } }, { key: "_checkMoveNegativeTiles", value: function _checkMoveNegativeTiles(event) { var colWidth = this.horizontalDistance(); var rowHeight = this.verticalDistance(); if (!this.wrap) { if (this.width) { var canvasWidth = event.width; var halfBoardWidth = (this.width * colWidth + this.horizontalOverhang()) / 2; this.originX = this.originX > halfBoardWidth ? halfBoardWidth : canvasWidth - this.originX > halfBoardWidth ? canvasWidth - halfBoardWidth : this.originX; } if (this.height) { var canvasHeight = event.height; var halfBoardHeight = (this.height * rowHeight + this.verticalOverhang()) / 2; this.originY = this.originY > halfBoardHeight ? halfBoardHeight : canvasHeight - this.originY > halfBoardHeight ? canvasHeight - halfBoardHeight : this.originY; } } } }, { key: "zoom", value: function zoom(event) { var scaleOrig = this.scale; var scaleTemp = scaleOrig * event.scaleStep; scaleTemp = Math.max(scaleTemp, this.scaleMin); scaleTemp = Math.min(scaleTemp, this.scaleMax); if (scaleOrig !== scaleTemp) { this.scale = scaleTemp; // zoom to the current mouse location this.move({ deltaX: (event.offsetX - this.originX) / scaleOrig * (scaleOrig - scaleTemp), deltaY: (event.offsetY - this.originY) / scaleOrig * (scaleOrig - scaleTemp), width: event.target.offsetWidth, height: event.target.offsetHeight }); } } }, { key: "remap", value: function remap(config) { Object.assign(this, Object(_funky__WEBPACK_IMPORTED_MODULE_1__["pick"])(config, ['height', 'width', 'negativeTiles'])); this.checkScale(config.canvasHeight, config.canvasWidth); this.setOriginX(config.canvasWidth, config.centerX); this.setOriginY(config.canvasHeight, config.centerY); } }]); return Cartographer; }(); /***/ }), /***/ "./src/cartographerFlatXY.js": /*!***********************************!*\ !*** ./src/cartographerFlatXY.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CartographerFlatXY; }); /* harmony import */ var _cartographer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cartographer.js */ "./src/cartographer.js"); /* harmony import */ var _funky__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./funky */ "./src/funky.js"); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); /* harmony import */ var _square_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./square.js */ "./src/square.js"); 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 isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var tilePointToSquare = function tilePointToSquare(_ref) { var tilePoint = _ref.tilePoint, mapPoint = _ref.mapPoint, pixelPoint = _ref.pixelPoint; return { tile: tilePoint instanceof _square_js__WEBPACK_IMPORTED_MODULE_4__["default"] ? tilePoint : new _square_js__WEBPACK_IMPORTED_MODULE_4__["default"](tilePoint), mapTile: mapPoint instanceof _square_js__WEBPACK_IMPORTED_MODULE_4__["default"] ? mapPoint : mapPoint ? new _square_js__WEBPACK_IMPORTED_MODULE_4__["default"](mapPoint) : mapPoint, pixelPoint: pixelPoint }; }; var CartographerFlatXY = /*#__PURE__*/ function (_Cartographer) { _inherits(CartographerFlatXY, _Cartographer); function CartographerFlatXY(settings) { var _this; _classCallCheck(this, CartographerFlatXY); _this = _possibleConstructorReturn(this, _getPrototypeOf(CartographerFlatXY).call(this, settings)); ['tileHeight', 'tileWidth', 'maxWidth', 'minWidth', 'horizontalOverhang', 'verticalOverhang', 'horizontalDistance', 'verticalDistance', 'calculateHorizontalScale', 'calculateVerticalScale', 'tileToPixel', 'pixelToTile', 'teleport', 'inBounds', 'enforceBoundries', 'boundingBox'].map(function (method) { return _this[method] = _this[method].bind(_assertThisInitialized(_assertThisInitialized(_this))); }); return _this; } _createClass(CartographerFlatXY, [{ key: "tileHeight", value: function tileHeight() { return this.minWidth(); } }, { key: "tileWidth", value: function tileWidth() { return this.minWidth(); } }, { key: "maxWidth", value: function maxWidth() { return this.scale * 2; } }, { key: "minWidth", value: function minWidth() { return this.maxWidth() * _utils_js__WEBPACK_IMPORTED_MODULE_2__["invSqrt2"]; } }, { key: "horizontalOverhang", value: function horizontalOverhang() { return 0; } }, { key: "verticalOverhang", value: function verticalOverhang() { return 0; } }, { key: "horizontalDistance", value: function horizontalDistance() { return this.minWidth(); } }, { key: "verticalDistance", value: function verticalDistance() { return this.minWidth(); } }, { key: "calculateHorizontalScale", value: function calculateHorizontalScale(pixels, tiles) { return pixels / tiles / _utils_js__WEBPACK_IMPORTED_MODULE_2__["invSqrt2"] / 2; } }, { key: "calculateVerticalScale", value: function calculateVerticalScale(pixels, tiles) { return pixels / tiles / _utils_js__WEBPACK_IMPORTED_MODULE_2__["invSqrt2"] / 2; } }, { key: "tileToPixel", value: function tileToPixel(square) { square = square instanceof _square_js__WEBPACK_IMPORTED_MODULE_4__["default"] ? square : _construct(_square_js__WEBPACK_IMPORTED_MODULE_4__["default"], Array.prototype.slice.call(arguments)); var x = square.getX() * this.minWidth() + this.originX; var y = this.originY - square.getY() * this.minWidth(); return new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](x, y); } }, { key: "pixelToTile", value: function pixelToTile(point) { point = point instanceof _point_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? point : _construct(_point_js__WEBPACK_IMPORTED_MODULE_3__["default"], Array.prototype.slice.call(arguments)); var pixelX = point.getX() - this.originX; var pixelY = this.originY - point.getY(); var x = pixelX / this.minWidth(); var y = pixelY / this.minWidth(); return new _square_js__WEBPACK_IMPORTED_MODULE_4__["default"](x, y); } }, { key: "teleport", value: function teleport(_ref2) { var x = _ref2.x, y = _ref2.y; if (!this.wrap) return new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](x, y); x = x % this.width; y = y % this.height; x = x < 0 ? this.width + x : x; y = y < 0 ? this.height + y : y; return new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](x, y); } }, { key: "inBounds", value: function inBounds(_ref3) { var x = _ref3.x, y = _ref3.y; if (this.negativeTiles) { return (!this.width || Math.abs(x) <= Math.floor(this.width / 2)) && (!this.height || Math.abs(y) <= Math.floor(this.height / 2)); } else { return (!this.width || x >= 0 && x < this.width) && (!this.height || y >= 0 && y < this.height); } } }, { key: "enforceBoundries", value: function enforceBoundries(_ref4) { var tilePoint = _ref4.tilePoint, pixelPoint = _ref4.pixelPoint; return this.wrap ? { tilePoint: tilePoint, mapPoint: this.teleport(tilePoint), pixelPoint: pixelPoint } : this.inBounds(tilePoint) ? { tilePoint: tilePoint, mapPoint: tilePoint, pixelPoint: pixelPoint } : { tilePoint: tilePoint, mapPoint: null, pixelPoint: pixelPoint }; } }, { key: "boundingBox", value: function boundingBox(upperLeftPoint, upperRightPoint, lowerLeftPoint, lowerRightPoint) { var _this2 = this; var upperLeftTile = this.pixelToTile(upperLeftPoint); var lowerRightTile = this.pixelToTile(lowerRightPoint); var upperRightTile = this.pixelToTile(upperRightPoint); var columns = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(upperLeftTile.getX(), upperRightTile.getX()); var rows = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(lowerRightTile.getY(), upperLeftTile.getY()); var makeAPoint = function makeAPoint(x) { return rows.map(function (y) { return { x: x, y: y }; }); }; var makeAPointPair = function makeAPointPair(tilePoint) { return { tilePoint: tilePoint, pixelPoint: _this2.tileToPixel(tilePoint) }; }; return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](columns).map(makeAPoint).flatten().map(makeAPointPair).map(this.enforceBoundries).map(tilePointToSquare).value(); } }]); return CartographerFlatXY; }(_cartographer_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/cartographerFlatXYZ.js": /*!************************************!*\ !*** ./src/cartographerFlatXYZ.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CartographerFlatXYZ; }); /* harmony import */ var _cartographer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cartographer.js */ "./src/cartographer.js"); /* harmony import */ var _funky__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./funky */ "./src/funky.js"); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _hex_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hex.js */ "./src/hex.js"); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); 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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var tilePointToHex = function tilePointToHex(_ref) { var tilePoint = _ref.tilePoint, mapPoint = _ref.mapPoint, pixelPoint = _ref.pixelPoint; return { tile: tilePoint instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? tilePoint : new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](tilePoint), mapTile: mapPoint instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? mapPoint : mapPoint ? new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](mapPoint) : mapPoint, pixelPoint: pixelPoint }; }; var zeroZeroZero = new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ x: 0, y: 0, z: 0 }); var CartographerFlatXYZ = /*#__PURE__*/ function (_Cartographer) { _inherits(CartographerFlatXYZ, _Cartographer); function CartographerFlatXYZ(settings) { var _this; _classCallCheck(this, CartographerFlatXYZ); _this = _possibleConstructorReturn(this, _getPrototypeOf(CartographerFlatXYZ).call(this, settings)); ['tileHeight', 'tileWidth', 'maxWidth', 'minWidth', 'horizontalOverhang', 'verticalOverhang', 'horizontalDistance', 'verticalDistance', 'calculateHorizontalScale', 'calculateVerticalScale', 'tileToPixel', 'pixelToTile', 'teleport', 'inBounds', 'enforceBoundries', 'boundingBox'].map(function (method) { return _this[method] = _this[method].bind(_assertThisInitialized(_assertThisInitialized(_this))); }); if (_this.radius) { _this.mirrors = [new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // East x: 2 * _this.radius + 1, y: -_this.radius - 1, z: -_this.radius }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // North East x: _this.radius + 1, y: _this.radius, z: -2 * _this.radius - 1 }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // North West x: -_this.radius, y: 2 * _this.radius + 1, z: -_this.radius - 1 }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // West x: -2 * _this.radius - 1, y: _this.radius + 1, z: _this.radius }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // South West x: -_this.radius - 1, y: -_this.radius, z: 2 * _this.radius + 1 }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // South East x: _this.radius, y: -2 * _this.radius - 1, z: _this.radius + 1 })]; } return _this; } _createClass(CartographerFlatXYZ, [{ key: "tileHeight", value: function tileHeight() { return this.minWidth(); } }, { key: "tileWidth", value: function tileWidth() { return this.maxWidth(); } }, { key: "maxWidth", value: function maxWidth() { return this.scale * 2; } }, { key: "minWidth", value: function minWidth() { return this.scale * _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"]; } }, { key: "horizontalOverhang", value: function horizontalOverhang() { return this.maxWidth() * 0.25; } }, { key: "verticalOverhang", value: function verticalOverhang() { return 0; } }, { key: "horizontalDistance", value: function horizontalDistance() { return this.maxWidth() * (3 / 4); } }, { key: "verticalDistance", value: function verticalDistance() { return this.minWidth(); } }, { key: "calculateHorizontalScale", value: function calculateHorizontalScale(pixels, tiles) { return pixels / (tiles * 0.75 + 0.25) / 2; } }, { key: "calculateVerticalScale", value: function calculateVerticalScale(pixels, tiles) { return pixels / tiles / _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"]; } }, { key: "tileToPixel", value: function tileToPixel(hex) { hex = hex instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? hex : _construct(_hex_js__WEBPACK_IMPORTED_MODULE_3__["default"], Array.prototype.slice.call(arguments)); var pixelX = this.scale * 3 / 2 * hex.getQ() + this.originX; var pixelY = this.scale * _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"] * (hex.getR() + hex.getQ() / 2) + this.originY; return new _point_js__WEBPACK_IMPORTED_MODULE_4__["default"](pixelX, pixelY); } }, { key: "pixelToTile", value: function pixelToTile(point) { point = point instanceof _point_js__WEBPACK_IMPORTED_MODULE_4__["default"] ? point : _construct(_point_js__WEBPACK_IMPORTED_MODULE_4__["default"], Array.prototype.slice.call(arguments)); var pixelX = point.getX() - this.originX; var pixelY = point.getY() - this.originY; var q = pixelX * (2 / 3) / this.scale; var r = (pixelY * (_utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"] / 3) - pixelX / 3) / this.scale; return new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](q, r); } }, { key: "teleport", value: function teleport(hex) { if (!this.wrap) return hex; hex = hex instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? hex : new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](hex); if (this.radius) { if (hex.distance(zeroZeroZero) <= this.radius) return hex; var distances = this.mirrors.map(function (mirror) { return hex.distance(mirror); }); var mirror = this.mirrors[distances.indexOf(Math.min.apply(Math, _toConsumableArray(distances)))]; return this.teleport(hex.subtractHex(mirror)); } else { var _Hex$cubeToEvenQ = _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"].cubeToEvenQ(hex), col = _Hex$cubeToEvenQ.col, row = _Hex$cubeToEvenQ.row; // ensure odd-width maps wrap properly if (this.width % 2) { var offset = Math.floor(col / this.width); var verticalAdjust = offset / 2; verticalAdjust = offset % 2 === 0 ? verticalAdjust : col % 2 ? Math.ceil(verticalAdjust) : Math.floor(verticalAdjust); row -= verticalAdjust; } var halfWidth = Math.floor(this.width / 2); var halfHeight = Math.floor(this.height / 2); if (this.negativeTiles) { col += halfWidth; row += halfHeight; } col = col % this.width; row = row % this.height; col = col < 0 ? col + this.width : col; row = row < 0 ? row + this.height : row; if (this.negativeTiles) { col -= halfWidth; row -= halfHeight; } return _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"].evenQToCube(col, row); } } }, { key: "inBounds", value: function inBounds(_ref2) { var x = _ref2.x, z = _ref2.z, _ref2$y = _ref2.y, y = _ref2$y === void 0 ? -x - z : _ref2$y; if (this.radius) { if (this.negativeTiles) { return Math.max(Math.abs(x), Math.abs(y), Math.abs(z)) <= Math.floor(this.radius); } else { return Math.max(Math.abs(x - this.radius), Math.abs(y + this.radius), Math.abs(z)) <= this.radius; } } else if (this.width || this.height) { if (this.negativeTiles) { return (!this.width || Math.abs(x) < this.width / 2) && (!this.height || Math.abs(-y - Math.floor(x / 2)) < this.height / 2); } else { return (!this.width || x >= 0 && x < this.width) && (!this.height || y <= Math.floor(x / 2) * -1 && -y - Math.floor(x / 2) < this.height); } } else { return true; } } }, { key: "enforceBoundries", value: function enforceBoundries(_ref3) { var tilePoint = _ref3.tilePoint, pixelPoint = _ref3.pixelPoint; return this.wrap ? { tilePoint: tilePoint, mapPoint: this.teleport(tilePoint), pixelPoint: pixelPoint } : this.inBounds(tilePoint) ? { tilePoint: tilePoint, mapPoint: tilePoint, pixelPoint: pixelPoint } : { tilePoint: tilePoint, mapPoint: null, pixelPoint: pixelPoint }; } }, { key: "boundingBox", value: function boundingBox(upperLeftPoint, upperRightPoint, lowerLeftPoint, lowerRightPoint) { var _this2 = this; var upperLeftTile = this.pixelToTile(upperLeftPoint); var lowerLeftTile = this.pixelToTile(lowerLeftPoint); var lowerRightTile = this.pixelToTile(lowerRightPoint); var upperRightTile = this.pixelToTile(upperRightPoint); var columns = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(upperLeftTile.getQ() - 1, upperRightTile.getQ() + 1); var height = lowerRightTile.getR() - upperRightTile.getR(); var makeAPointPair = function makeAPointPair(tilePoint) { return { tilePoint: tilePoint, pixelPoint: _this2.tileToPixel(tilePoint) }; }; var processRow = function processRow(q, index) { var top = upperLeftTile.getR() - Math.floor(index / 2); var bottom = top + height; var rows = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(top, bottom + 1); var makeAPoint = function makeAPoint(r) { return _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"].qrToCube(q, r); }; return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](rows).map(makeAPoint).map(makeAPointPair).map(_this2.enforceBoundries).map(tilePointToHex).value(); }; return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](columns).map(processRow).flatten().value(); } }]); return CartographerFlatXYZ; }(_cartographer_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/cartographerPointyXY.js": /*!*************************************!*\ !*** ./src/cartographerPointyXY.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CartographerPointyXY; }); /* harmony import */ var _cartographer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cartographer.js */ "./src/cartographer.js"); /* harmony import */ var _funky__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./funky */ "./src/funky.js"); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _square_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./square.js */ "./src/square.js"); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); 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 isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var tilePointToSquare = function tilePointToSquare(_ref) { var tilePoint = _ref.tilePoint, mapPoint = _ref.mapPoint, pixelPoint = _ref.pixelPoint; return { tile: tilePoint instanceof _square_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? tilePoint : new _square_js__WEBPACK_IMPORTED_MODULE_3__["default"](tilePoint), mapTile: mapPoint instanceof _square_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? mapPoint : mapPoint ? new _square_js__WEBPACK_IMPORTED_MODULE_3__["default"](mapPoint) : mapPoint, pixelPoint: pixelPoint }; }; var CartographerPointyXY = /*#__PURE__*/ function (_Cartographer) { _inherits(CartographerPointyXY, _Cartographer); function CartographerPointyXY(settings) { var _this; _classCallCheck(this, CartographerPointyXY); _this = _possibleConstructorReturn(this, _getPrototypeOf(CartographerPointyXY).call(this, settings)); ['tileHeight', 'tileWidth', 'maxWidth', 'minWidth', 'horizontalOverhang', 'verticalOverhang', 'horizontalDistance', 'verticalDistance', 'calculateHorizontalScale', 'calculateVerticalScale', 'tileToPixel', 'pixelToTile', 'teleport', 'inBounds', 'enforceBoundries', 'boundingBox'].map(function (method) { return _this[method] = _this[method].bind(_assertThisInitialized(_assertThisInitialized(_this))); }); return _this; } _createClass(CartographerPointyXY, [{ key: "tileHeight", value: function tileHeight() { return this.maxWidth(); } }, { key: "tileWidth", value: function tileWidth() { return this.maxWidth(); } }, { key: "maxWidth", value: function maxWidth() { return this.scale * 2; } }, { key: "minWidth", value: function minWidth() { return this.maxWidth() * _utils_js__WEBPACK_IMPORTED_MODULE_2__["invSqrt2"]; } }, { key: "horizontalOverhang", value: function horizontalOverhang() { return this.maxWidth() * 0.5; } }, { key: "verticalOverhang", value: function verticalOverhang() { return this.maxWidth() * 0.5; } }, { key: "horizontalDistance", value: function horizontalDistance() { return this.maxWidth() / 2; } }, { key: "verticalDistance", value: function verticalDistance() { return this.maxWidth() / 2; } }, { key: "calculateHorizontalScale", value: function calculateHorizontalScale(pixels, tiles) { return pixels / (tiles / 2) / 2; } }, { key: "calculateVerticalScale", value: function calculateVerticalScale(pixels, tiles) { return pixels / (tiles / 2) / 2; } }, { key: "tileToPixel", value: function tileToPixel(square) { square = square instanceof _square_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? square : _construct(_square_js__WEBPACK_IMPORTED_MODULE_3__["default"], Array.prototype.slice.call(arguments)); var x = square.getX(); var y = square.getY(); // (above/below axis) * (distance from axis) / (size) var pixelX = (x < y ? -1 : 1) * (Math.abs(y - x) / _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt2"]) * this.minWidth() + this.originX; var pixelY = this.originY - (-x < y ? 1 : -1) * (Math.abs(x + y) / _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt2"]) * this.minWidth(); return new _point_js__WEBPACK_IMPORTED_MODULE_4__["default"](pixelX, pixelY); } }, { key: "pixelToTile", value: function pixelToTile(point) { point = point instanceof _point_js__WEBPACK_IMPORTED_MODULE_4__["default"] ? point : _construct(_point_js__WEBPACK_IMPORTED_MODULE_4__["default"], Array.prototype.slice.call(arguments)); var pixelX = point.getX() - this.originX; var pixelY = this.originY - point.getY(); // (above/below axis) * (distance from axis) / (size) var x = (-pixelX < pixelY ? 1 : -1) * (Math.abs(pixelX + pixelY) / _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt2"]) / this.minWidth(); var y = (pixelX < pixelY ? 1 : -1) * (Math.abs(pixelY - pixelX) / _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt2"]) / this.minWidth(); return new _square_js__WEBPACK_IMPORTED_MODULE_3__["default"](x, y); } }, { key: "teleport", value: function teleport(_ref2) { var x = _ref2.x, y = _ref2.y; if (!this.wrap) return new _point_js__WEBPACK_IMPORTED_MODULE_4__["default"](x, y); x = x % this.width; y = y % this.height; x = x < 0 ? this.width + x : x; y = y < 0 ? this.height + y : y; return new _point_js__WEBPACK_IMPORTED_MODULE_4__["default"](x, y); } }, { key: "inBounds", value: function inBounds(_ref3) { var x = _ref3.x, y = _ref3.y; if (this.negativeTiles) { return (!this.width || Math.abs(x) <= Math.floor(this.width / 2)) && (!this.height || Math.abs(y) <= Math.floor(this.height / 2)); } else { return (!this.width || x >= 0 && x < this.width) && (!this.height || y >= 0 && y < this.height); } } }, { key: "enforceBoundries", value: function enforceBoundries(_ref4) { var tilePoint = _ref4.tilePoint, pixelPoint = _ref4.pixelPoint; return this.wrap ? { tilePoint: tilePoint, mapPoint: this.teleport(tilePoint), pixelPoint: pixelPoint } : this.inBounds(tilePoint) ? { tilePoint: tilePoint, mapPoint: tilePoint, pixelPoint: pixelPoint } : { tilePoint: tilePoint, mapPoint: null, pixelPoint: pixelPoint }; } }, { key: "boundingBox", value: function boundingBox(upperLeftPoint, upperRightPoint, lowerLeftPoint, lowerRightPoint) { var _this2 = this; var upperLeftTile = this.pixelToTile(upperLeftPoint); var lowerRightTile = this.pixelToTile(lowerRightPoint); var upperRightTile = this.pixelToTile(upperRightPoint); var lowerLeftTile = this.pixelToTile(lowerLeftPoint); var columns = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(lowerLeftTile.getX(), upperRightTile.getX()); var upperLeftIntercept = upperLeftTile.getY() - upperLeftTile.getX(); var upperRightIntercept = upperLeftTile.getY() + upperLeftTile.getX(); var lowerLeftIntercept = lowerRightTile.getY() - lowerRightTile.getX(); var lowerRightIntercept = lowerRightTile.getY() + lowerRightTile.getX(); var aboutHalf = Math.floor(columns.length / 2); var midway = columns.length % 2 ? columns[aboutHalf] : (columns[aboutHalf - 1] + columns[aboutHalf]) / 2; var makeAPointPair = function makeAPointPair(tilePoint) { return { tilePoint: tilePoint, pixelPoint: _this2.tileToPixel(tilePoint) }; }; var processRow = function processRow(x) { var top = x < midway ? upperLeftIntercept + x : upperRightIntercept - x; var bottom = x < midway ? lowerRightIntercept - x : lowerLeftIntercept + x; bottom = Math.min(bottom, top); top = Math.max(bottom, top); // push out by 1 on either end to account for interlocking tiles var row = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(bottom - 1, top + 1); var makeAPoint = function makeAPoint(y) { return { x: x, y: y }; }; return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](row).map(makeAPoint).map(makeAPointPair).map(_this2.enforceBoundries).map(tilePointToSquare).value(); }; return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](columns).map(processRow).flatten().value(); } }]); return CartographerPointyXY; }(_cartographer_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/cartographerPointyXYZ.js": /*!**************************************!*\ !*** ./src/cartographerPointyXYZ.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CartographerPointyXYZ; }); /* harmony import */ var _cartographer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cartographer.js */ "./src/cartographer.js"); /* harmony import */ var _funky__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./funky */ "./src/funky.js"); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _hex_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hex.js */ "./src/hex.js"); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); 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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var tilePointToHex = function tilePointToHex(_ref) { var tilePoint = _ref.tilePoint, mapPoint = _ref.mapPoint, pixelPoint = _ref.pixelPoint; return { tile: tilePoint instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? tilePoint : new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](tilePoint), mapTile: mapPoint instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? mapPoint : mapPoint ? new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](mapPoint) : mapPoint, pixelPoint: pixelPoint }; }; var zeroZeroZero = new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ x: 0, y: 0, z: 0 }); var CartographerPointyXYZ = /*#__PURE__*/ function (_Cartographer) { _inherits(CartographerPointyXYZ, _Cartographer); function CartographerPointyXYZ(settings) { var _this; _classCallCheck(this, CartographerPointyXYZ); _this = _possibleConstructorReturn(this, _getPrototypeOf(CartographerPointyXYZ).call(this, settings)); ['tileHeight', 'tileWidth', 'maxWidth', 'minWidth', 'horizontalOverhang', 'verticalOverhang', 'horizontalDistance', 'verticalDistance', 'calculateHorizontalScale', 'calculateVerticalScale', 'tileToPixel', 'pixelToTile', 'teleport', 'inBounds', 'enforceBoundries', 'boundingBox'].map(function (method) { return _this[method] = _this[method].bind(_assertThisInitialized(_assertThisInitialized(_this))); }); if (_this.radius) { _this.mirrors = [new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // East x: 2 * _this.radius + 1, y: -_this.radius - 1, z: -_this.radius }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // North East x: _this.radius + 1, y: _this.radius, z: -2 * _this.radius - 1 }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // North West x: -_this.radius, y: 2 * _this.radius + 1, z: -_this.radius - 1 }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // West x: -2 * _this.radius - 1, y: _this.radius + 1, z: _this.radius }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // South West x: -_this.radius - 1, y: -_this.radius, z: 2 * _this.radius + 1 }), new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"]({ // South East x: _this.radius, y: -2 * _this.radius - 1, z: _this.radius + 1 })]; } return _this; } _createClass(CartographerPointyXYZ, [{ key: "tileHeight", value: function tileHeight() { return this.maxWidth(); } }, { key: "tileWidth", value: function tileWidth() { return this.minWidth(); } }, { key: "maxWidth", value: function maxWidth() { return this.scale * 2; } }, { key: "minWidth", value: function minWidth() { return this.scale * _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"]; } }, { key: "horizontalOverhang", value: function horizontalOverhang() { return 0; } }, { key: "verticalOverhang", value: function verticalOverhang() { return this.maxWidth() * 0.25; } }, { key: "horizontalDistance", value: function horizontalDistance() { return this.minWidth(); } }, { key: "verticalDistance", value: function verticalDistance() { return this.maxWidth() * (3 / 4); } }, { key: "calculateHorizontalScale", value: function calculateHorizontalScale(pixels, tiles) { return pixels / tiles / _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"]; } }, { key: "calculateVerticalScale", value: function calculateVerticalScale(pixels, tiles) { return pixels / (tiles * 0.75 + 0.25) / 2; } }, { key: "tileToPixel", value: function tileToPixel(hex) { hex = hex instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? hex : _construct(_hex_js__WEBPACK_IMPORTED_MODULE_3__["default"], Array.prototype.slice.call(arguments)); var pixelX = this.scale * _utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"] * (hex.getQ() + hex.getR() / 2); var pixelY = this.scale * 3 / 2 * hex.getR(); return new _point_js__WEBPACK_IMPORTED_MODULE_4__["default"](pixelX + this.originX, pixelY + this.originY); } }, { key: "pixelToTile", value: function pixelToTile(point) { point = point instanceof _point_js__WEBPACK_IMPORTED_MODULE_4__["default"] ? point : _construct(_point_js__WEBPACK_IMPORTED_MODULE_4__["default"], Array.prototype.slice.call(arguments)); var pixelX = point.getX() - this.originX; var pixelY = point.getY() - this.originY; var q = (pixelX * (_utils_js__WEBPACK_IMPORTED_MODULE_2__["sqrt3"] / 3) - pixelY / 3) / this.scale; var r = pixelY * (2 / 3) / this.scale; return new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](q, r); } }, { key: "teleport", value: function teleport(hex) { if (!this.wrap) return hex; hex = hex instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? hex : new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](hex); if (this.radius) { if (hex.distance(zeroZeroZero) <= this.radius) return hex; var distances = this.mirrors.map(function (mirror) { return hex.distance(mirror); }); var mirror = this.mirrors[distances.indexOf(Math.min.apply(Math, _toConsumableArray(distances)))]; return this.teleport(hex.subtractHex(mirror)); } else { var _Hex$cubeToEvenR = _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"].cubeToEvenR(hex), col = _Hex$cubeToEvenR.col, row = _Hex$cubeToEvenR.row; // ensure odd-width maps wrap properly if (this.height % 2) { var offset = Math.floor(row / this.height); var horizontalAdjust = offset / 2; horizontalAdjust = offset % 2 === 0 ? horizontalAdjust : row % 2 ? Math.ceil(horizontalAdjust) : Math.floor(horizontalAdjust); col -= horizontalAdjust; } var halfWidth = Math.floor(this.width / 2); var halfHeight = Math.floor(this.height / 2); if (this.negativeTiles) { col += halfWidth; row += halfHeight; } col = col % this.width; row = row % this.height; col = col < 0 ? col + this.width : col; row = row < 0 ? row + this.height : row; if (this.negativeTiles) { col -= halfWidth; row -= halfHeight; } return _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"].evenRToCube(col, row); } } }, { key: "inBounds", value: function inBounds(hex) { hex = hex instanceof _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"] ? hex : new _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"](hex); if (this.radius) { if (this.negativeTiles) { return Math.max(Math.abs(hex.x), Math.abs(hex.y), Math.abs(hex.z)) <= Math.floor(this.radius); } else { return Math.max(Math.abs(hex.x - this.radius), Math.abs(hex.y + this.radius), Math.abs(hex.z)) <= this.radius; } } else if (this.width || this.height) { if (this.negativeTiles) { return (!this.width || Math.abs(hex.x) < this.width / 2) && (!this.height || Math.abs(-hex.y - Math.floor(hex.x / 2)) < this.height / 2); } else { return (!this.width || hex.x >= 0 && hex.x < this.width) && (!this.height || hex.y <= Math.floor(hex.x / 2) * -1 && -hex.y - Math.floor(hex.x / 2) < this.height); } } else { return true; } } }, { key: "enforceBoundries", value: function enforceBoundries(_ref2) { var tilePoint = _ref2.tilePoint, pixelPoint = _ref2.pixelPoint; return this.wrap ? { tilePoint: tilePoint, mapPoint: this.teleport(tilePoint), pixelPoint: pixelPoint } : this.inBounds(tilePoint) ? { tilePoint: tilePoint, mapPoint: tilePoint, pixelPoint: pixelPoint } : { tilePoint: tilePoint, mapPoint: null, pixelPoint: pixelPoint }; } }, { key: "boundingBox", value: function boundingBox(upperLeftPoint, upperRightPoint, lowerLeftPoint, lowerRightPoint) { var _this2 = this; var upperLeftTile = this.pixelToTile(upperLeftPoint); var lowerLeftTile = this.pixelToTile(lowerLeftPoint); var lowerRightTile = this.pixelToTile(lowerRightPoint); var upperRightTile = this.pixelToTile(upperRightPoint); var rows = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(upperLeftTile.getR() - 1, lowerLeftTile.getR() + 1); var width = upperRightTile.getQ() - upperLeftTile.getQ(); var makeAPointPair = function makeAPointPair(tilePoint) { return { tilePoint: tilePoint, pixelPoint: _this2.tileToPixel(tilePoint) }; }; var processColumn = function processColumn(r, index) { var left = upperLeftTile.getQ() - Math.floor(index / 2); var right = left + width; var columns = Object(_utils_js__WEBPACK_IMPORTED_MODULE_2__["rangeInclusive"])(left, right + 1); var makeAPoint = function makeAPoint(q) { return _hex_js__WEBPACK_IMPORTED_MODULE_3__["default"].qrToCube(q, r); }; //({x: q, z: r, y: -q - r}); return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](columns).map(makeAPoint).map(makeAPointPair).map(_this2.enforceBoundries).map(tilePointToHex).value(); }; return _funky__WEBPACK_IMPORTED_MODULE_1__["chain"](rows).map(processColumn).flatten().value(); } }]); return CartographerPointyXYZ; }(_cartographer_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/cell.js": /*!*********************!*\ !*** ./src/cell.js ***! \*********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Cell; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./consts.js */ "./src/consts.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var DEFAULTS = { x: 0, y: 0, scale: 10, orientation: _consts_js__WEBPACK_IMPORTED_MODULE_1__["FLAT"], tileStyle: _consts_js__WEBPACK_IMPORTED_MODULE_1__["HEX"], drawStyle: _consts_js__WEBPACK_IMPORTED_MODULE_1__["FILL"], width: 1, color: { red: 0, green: 0, blue: 0, alpha: 0.5 } }; var Cell = function Cell(settings) { _classCallCheck(this, Cell); Object.assign(this, DEFAULTS, settings); }; /***/ }), /***/ "./src/consts.js": /*!***********************!*\ !*** ./src/consts.js ***! \***********************/ /*! exports provided: HEX, CIRCLE, SQUARE, TILE_STYLES, BOARD_STYLES, FLAT, POINTY, ORIENTATION_STYLES, FILL, OUTLINE, DRAW_STYLES */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HEX", function() { return HEX; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CIRCLE", function() { return CIRCLE; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SQUARE", function() { return SQUARE; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TILE_STYLES", function() { return TILE_STYLES; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BOARD_STYLES", function() { return BOARD_STYLES; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FLAT", function() { return FLAT; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "POINTY", function() { return POINTY; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ORIENTATION_STYLES", function() { return ORIENTATION_STYLES; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FILL", function() { return FILL; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OUTLINE", function() { return OUTLINE; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DRAW_STYLES", function() { return DRAW_STYLES; }); var HEX = 'hex'; var CIRCLE = 'circle'; var SQUARE = 'square'; var TILE_STYLES = { HEX: HEX, CIRCLE: CIRCLE, SQUARE: SQUARE }; var BOARD_STYLES = { HEX: HEX, SQUARE: SQUARE }; var FLAT = 'flat'; var POINTY = 'pointy'; var ORIENTATION_STYLES = { FLAT: FLAT, POINTY: POINTY }; var FILL = 'fill'; var OUTLINE = 'outline'; var DRAW_STYLES = { FILL: FILL, OUTLINE: OUTLINE }; /***/ }), /***/ "./src/drawCircle.js": /*!***************************!*\ !*** ./src/drawCircle.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DrawCircle; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DrawCircle = /*#__PURE__*/ function () { function DrawCircle(settings) { _classCallCheck(this, DrawCircle); } _createClass(DrawCircle, [{ key: "fill", value: function fill(context, scale, x, y, cell) { context.beginPath(); context.arc(x, y, scale * cell.scale, 0, 2 * Math.PI, false); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(cell.color); context.fill(); } }, { key: "outline", value: function outline(context, scale, x, y, cell) { context.beginPath(); context.arc(x, y, scale * cell.scale, 0, 2 * Math.PI, false); context.lineWidth = cell.width; context.strokeStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(cell.color); context.stroke(); } }]); return DrawCircle; }(); /***/ }), /***/ "./src/drawHexagon.js": /*!****************************!*\ !*** ./src/drawHexagon.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DrawHexagon; }); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./consts.js */ "./src/consts.js"); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DrawHexagon = /*#__PURE__*/ function () { function DrawHexagon(settings) { var _this = this; _classCallCheck(this, DrawHexagon); this.settings = Object.assign({}, settings); this.flatTopCornerX = []; this.flatTopCornerY = []; this.pointyTopCornerX = []; this.pointyTopCornerY = []; var hexSides = 6; var hexSlices = 24; Object(_utils_js__WEBPACK_IMPORTED_MODULE_1__["range"])(hexSlices).forEach(function (hexSlice) { var x = Object(_utils_js__WEBPACK_IMPORTED_MODULE_1__["toFixed"])(Math.cos(hexSlice / hexSlices * hexSides * (2 * Math.PI) / hexSides)); var y = Object(_utils_js__WEBPACK_IMPORTED_MODULE_1__["toFixed"])(Math.sin(hexSlice / hexSlices * hexSides * (2 * Math.PI) / hexSides)); if (hexSlice % 4 === 0) { var cur = hexSlice / 4; _this.flatTopCornerX[cur] = x; _this.flatTopCornerY[cur] = y; } if ((hexSlice - 2) % 4 === 0) { var _cur = (hexSlice - 2) / 4; _this.pointyTopCornerX[_cur] = x; _this.pointyTopCornerY[_cur] = y; } }); } _createClass(DrawHexagon, [{ key: "outline", value: function outline(context, scale, x, y, cell) { scale = scale * cell.scale; var hexCornerX = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_0__["POINTY"] ? this.pointyTopCornerX : this.flatTopCornerX; var hexCornerY = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_0__["POINTY"] ? this.pointyTopCornerY : this.flatTopCornerY; context.beginPath(); context.moveTo(x + scale * hexCornerX[0], y + scale * hexCornerY[0]); context.lineTo(x + scale * hexCornerX[1], y + scale * hexCornerY[1]); context.lineTo(x + scale * hexCornerX[2], y + scale * hexCornerY[2]); context.lineTo(x + scale * hexCornerX[3], y + scale * hexCornerY[3]); context.lineTo(x + scale * hexCornerX[4], y + scale * hexCornerY[4]); context.lineTo(x + scale * hexCornerX[5], y + scale * hexCornerY[5]); context.closePath(); context.lineWidth = cell.width; context.strokeStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_1__["getColor"])(cell.color); context.stroke(); } // fill(context, scale, x, y, cell) { // if (cell.cacheScale !== scale) { // cell.cacheScale = scale; // scale = scale * cell.scale; // // cell.cacheHalfWidth = scale; // cell.cacheHalfHeight = scale; // // cell.cacheHex = quickCanvas((context, height, width) => { // const hexCornerX = cell.orientation === POINTY ? this.pointyTopCornerX : this.flatTopCornerX; // const hexCornerY = cell.orientation === POINTY ? this.pointyTopCornerY : this.flatTopCornerY; // // context.beginPath(); // context.moveTo(scale + scale * hexCornerX[0], scale + scale * hexCornerY[0]); // context.lineTo(scale + scale * hexCornerX[1], scale + scale * hexCornerY[1]); // context.lineTo(scale + scale * hexCornerX[2], scale + scale * hexCornerY[2]); // context.lineTo(scale + scale * hexCornerX[3], scale + scale * hexCornerY[3]); // context.lineTo(scale + scale * hexCornerX[4], scale + scale * hexCornerY[4]); // context.lineTo(scale + scale * hexCornerX[5], scale + scale * hexCornerY[5]); // // context.fillStyle = getColor(cell.color); // context.fill(); // }, scale * 2); // } // // context.drawImage(cell.cacheHex, x - cell.cacheHalfWidth, y - cell.cacheHalfHeight); // } }, { key: "fill", value: function fill(context, scale, x, y, cell) { scale = scale * cell.scale; var hexCornerX = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_0__["POINTY"] ? this.pointyTopCornerX : this.flatTopCornerX; var hexCornerY = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_0__["POINTY"] ? this.pointyTopCornerY : this.flatTopCornerY; context.beginPath(); context.moveTo(x + scale * hexCornerX[0], y + scale * hexCornerY[0]); context.lineTo(x + scale * hexCornerX[1], y + scale * hexCornerY[1]); context.lineTo(x + scale * hexCornerX[2], y + scale * hexCornerY[2]); context.lineTo(x + scale * hexCornerX[3], y + scale * hexCornerY[3]); context.lineTo(x + scale * hexCornerX[4], y + scale * hexCornerY[4]); context.lineTo(x + scale * hexCornerX[5], y + scale * hexCornerY[5]); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_1__["getColor"])(cell.color); context.fill(); } }]); return DrawHexagon; }(); /***/ }), /***/ "./src/drawShapes.js": /*!***************************!*\ !*** ./src/drawShapes.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DrawShapes; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./consts.js */ "./src/consts.js"); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DEFAULTS = { mine: { border: { scale: 0.38, color: { red: 255, blue: 255, green: 255, alpha: 0.8 }, horns: { scale: 0.07, distance: 0.36 } }, body: { scale: 0.36, color: { red: 32, blue: 32, green: 32 }, horns: { scale: 0.05, distance: 0.36 } } }, pip: { border: { scale: 0.17, color: { red: 255, blue: 255, green: 255, alpha: 0.9 } }, body: { scale: 0.15, color: { red: 0, blue: 0, green: 0 } }, distance: 0.6 }, sides: 6, slices: 24 }; function generateFlatSquarePips() { var pips = []; var pipX = [0, _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], 0, 0]; var pipY = [0, _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], 0, 0, -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"]]; var getVertex = function getVertex(n) { return [pipX[n], pipY[n]]; }; pips[1] = [0].map(getVertex); pips[2] = [1, 3].map(getVertex); pips[3] = [0, 1, 3].map(getVertex); pips[4] = [1, 2, 3, 4].map(getVertex); pips[5] = [0, 1, 2, 3, 4].map(getVertex); pips[6] = [1, 2, 3, 4, 5, 6].map(getVertex); pips[7] = [0, 1, 2, 3, 4, 5, 6].map(getVertex); pips[8] = [1, 2, 3, 4, 5, 6, 7, 8].map(getVertex); pips[9] = [0, 1, 2, 3, 4, 5, 6, 7, 8].map(getVertex); return pips; } function generatePointySquarePips() { var pips = []; var pipX = [0, 1, 0, -1, 0, 0.5, -0.5, 0.5, -0.5]; var pipY = [0, 0, -1, 0, 1, -0.5, 0.5, 0.5, -0.5]; var getVertex = function getVertex(n) { return [pipX[n], pipY[n]]; }; pips[1] = [0].map(getVertex); pips[2] = [1, 3].map(getVertex); pips[3] = [0, 1, 3].map(getVertex); pips[4] = [1, 2, 3, 4].map(getVertex); pips[5] = [0, 1, 2, 3, 4].map(getVertex); pips[6] = [1, 2, 3, 4, 5, 6].map(getVertex); pips[7] = [0, 1, 2, 3, 4, 5, 6].map(getVertex); pips[8] = [1, 2, 3, 4, 5, 6, 7, 8].map(getVertex); pips[9] = [0, 1, 2, 3, 4, 5, 6, 7, 8].map(getVertex); return pips; } function generateFlatHexPips(slicesX, slicesY) { var pips = []; slicesX = [0].concat(slicesX); slicesY = [0].concat(slicesY); var getVertex = function getVertex(n) { return [slicesX[n], slicesY[n]]; }; pips[1] = [0].map(getVertex); pips[2] = [1, 13].map(getVertex); pips[3] = [5, 13, 21].map(getVertex); pips[4] = [0, 1, 9, 17].map(getVertex); pips[5] = [0, 5, 9, 17, 21].map(getVertex); pips[6] = [1, 5, 9, 13, 17, 21].map(getVertex); pips[7] = [0, 1, 5, 9, 13, 17, 21].map(getVertex); return pips; } function generatePointyHexPips(slicesX, slicesY) { var pips = []; slicesX = [0].concat(slicesX); slicesY = [0].concat(slicesY); var getVertex = function getVertex(n) { return [slicesX[n], slicesY[n]]; }; pips[1] = [0].map(getVertex); pips[2] = [7, 19].map(getVertex); pips[3] = [7, 15, 23].map(getVertex); pips[4] = [0, 3, 11, 19].map(getVertex); pips[5] = [0, 3, 11, 15, 23].map(getVertex); pips[6] = [3, 7, 11, 15, 19, 23].map(getVertex); pips[7] = [0, 3, 7, 11, 15, 19, 23].map(getVertex); return pips; } var DrawShapes = /*#__PURE__*/ function () { function DrawShapes(settings) { var _HEX, _SQUARE, _this$pipVertices; _classCallCheck(this, DrawShapes); this.settings = Object.assign({}, DEFAULTS, settings); var sides = this.settings.sides; var slices = this.settings.slices; this.slicesX = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["range"])(slices).map(function (slice) { return Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["toFixed"])(Math.cos(slice / slices * sides * (2 * Math.PI) / sides)); }); this.slicesY = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["range"])(slices).map(function (slice) { return Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["toFixed"])(Math.sin(slice / slices * sides * (2 * Math.PI) / sides)); }); this.pipCache = {}; this.mineCache = {}; this.pipVertices = (_this$pipVertices = {}, _defineProperty(_this$pipVertices, _consts_js__WEBPACK_IMPORTED_MODULE_1__["HEX"], (_HEX = {}, _defineProperty(_HEX, _consts_js__WEBPACK_IMPORTED_MODULE_1__["FLAT"], generateFlatHexPips(this.slicesX, this.slicesY)), _defineProperty(_HEX, _consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"], generatePointyHexPips(this.slicesX, this.slicesY)), _HEX)), _defineProperty(_this$pipVertices, _consts_js__WEBPACK_IMPORTED_MODULE_1__["SQUARE"], (_SQUARE = {}, _defineProperty(_SQUARE, _consts_js__WEBPACK_IMPORTED_MODULE_1__["FLAT"], generateFlatSquarePips()), _defineProperty(_SQUARE, _consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"], generatePointySquarePips()), _SQUARE)), _this$pipVertices); this.horns = this.pipVertices[_consts_js__WEBPACK_IMPORTED_MODULE_1__["HEX"]][_consts_js__WEBPACK_IMPORTED_MODULE_1__["FLAT"]][6].concat(this.pipVertices[_consts_js__WEBPACK_IMPORTED_MODULE_1__["HEX"]][_consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"]][6]); } _createClass(DrawShapes, [{ key: "background", value: function background(context, height, width, color) { context.beginPath(); context.rect(0, 0, width, height); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(color); context.closePath(); context.fill(); } }, { key: "pip", value: function pip(context, scale, cellX, cellY, vertexX, vertexY, pipRadius, pipDistance) { var x = cellX + pipDistance * vertexX; var y = cellY + pipDistance * vertexY; context.moveTo(x, y); context.arc(x, y, pipRadius, 0, Math.PI * 2, true); } }, { key: "setPipCache", value: function setPipCache(pips, scale) { var _this = this; var pipDistance = scale * this.settings.pip.distance; //* cell.scale; var pipBodyRadius = scale * this.settings.pip.body.scale; var pipBorderRadius = scale * this.settings.pip.border.scale; this.pipCache.scale = scale; this.pipCache.height = (Math.ceil(pipBorderRadius) + 1) * 2; this.pipCache.width = this.pipCache.height; var pipCenter = this.pipCache.height / 2; this.pipCache.pip = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["quickCanvas"])(function (context, height, width) { context.beginPath(); context.arc(pipCenter, pipCenter, pipBorderRadius, 0, Math.PI * 2, true); context.closePath(); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(_this.settings.pip.border.color); context.fill(); context.beginPath(); context.arc(pipCenter, pipCenter, pipBodyRadius, 0, Math.PI * 2, true); context.closePath(); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(_this.settings.pip.body.color); context.fill(); }, this.pipCache.height, this.pipCache.width); var pipsCenter = scale - pipCenter; this.pipCache.pips = pips.map(function (vertices) { return Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["quickCanvas"])(function (context) { vertices.forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), pipX = _ref2[0], pipY = _ref2[1]; return context.drawImage(_this.pipCache.pip, pipsCenter + pipDistance * pipX, pipsCenter + pipDistance * pipY); }); }, scale * 2); }); } }, { key: "pips", value: function pips(context, scale, x, y, cell) { var alpha = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; var tileStyle = cell.tileStyle, orientation = cell.orientation, pips = cell.pips; if (this.pipVertices[tileStyle] && this.pipVertices[tileStyle][orientation] && this.pipVertices[tileStyle][orientation][pips]) { if (scale !== this.pipCache.scale) { this.setPipCache(this.pipVertices[tileStyle][orientation], scale); } var scaleWidth = scale * 2 * cell.scale; var scaleHeight = scale * 2 * cell.scale; context.globalAlpha = alpha; context.drawImage(this.pipCache.pips[pips], x - scaleWidth / 2, y - scaleHeight / 2, scaleWidth, scaleHeight); context.globalAlpha = 1; } } }, { key: "mine", value: function mine(context, scale, x, y) { var _mine = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.settings.mine; if (scale !== this.mineCache.scale) { this.setMineCache(scale); } context.drawImage(this.mineCache.mine, x - scale, y - scale, scale * 2, scale * 2); } }, { key: "setMineCache", value: function setMineCache(scale) { var _this2 = this; this.mineCache.scale = scale; this.mineCache.mine = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["quickCanvas"])(function (context) { _this2._mine(context, scale, scale, scale, _this2.settings.mine.border); _this2._horns(context, scale, scale, scale, _this2.settings.mine.border.horns, _this2.settings.mine.border.color); _this2._mine(context, scale, scale, scale, _this2.settings.mine.body); _this2._horns(context, scale, scale, scale, _this2.settings.mine.body.horns, _this2.settings.mine.body.color); }, scale * 2); } }, { key: "_mine", value: function _mine(context, scale, x, y, mine) { context.beginPath(); context.moveTo(x, y); context.arc(x, y, scale * mine.scale, 0, Math.PI * 2, true); context.closePath(); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(mine.color); context.fill(); } }, { key: "_horns", value: function _horns(context, scale, x, y, horn, color) { var _this3 = this; var hornRadius = scale * horn.scale; var hornDistance = scale * horn.distance; context.beginPath(); this.horns.forEach(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), hornX = _ref4[0], hornY = _ref4[1]; return _this3.pip(context, scale, x, y, hornX, hornY, hornRadius, hornDistance); }); context.closePath(); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(color); context.fill(); } }, { key: "explosion", value: function explosion(context, scale, x, y) { var _this4 = this; var peak = scale * 0.667; var valley = scale * 0.333; context.beginPath(); context.moveTo(x, y); context.moveTo(x + peak * this.slicesX[0], y + peak * this.slicesY[0]); Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["range"])(this.settings.slices).filter(function (slice) { return slice % 2 === 1; }).forEach(function (slice) { context.lineTo(x + valley * _this4.slicesX[slice], y + valley * _this4.slicesY[slice]); context.lineTo(x + peak * _this4.slicesX[slice + 1], y + peak * _this4.slicesY[slice + 1]); }); context.closePath(); context.fillStyle = 'rgb(255,0,0)'; context.fill(); } }]); return DrawShapes; }(); /***/ }), /***/ "./src/drawSquare.js": /*!***************************!*\ !*** ./src/drawSquare.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DrawSquare; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./consts.js */ "./src/consts.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DrawSquare = /*#__PURE__*/ function () { function DrawSquare(settings) { _classCallCheck(this, DrawSquare); this.settings = Object.assign({}, settings); this.squareX = [_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"]]; this.squareY = [_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], -_utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"], _utils_js__WEBPACK_IMPORTED_MODULE_0__["invSqrt2"]]; this.diamondX = [1, 0, -1, 0, 0.5, -0.5]; this.diamondY = [0, -1, 0, 1, -0.5, 0.5]; } _createClass(DrawSquare, [{ key: "fill", value: function fill(context, scale, x, y, cell) { scale = scale * cell.scale; var squareCornerX = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"] ? this.diamondX : this.squareX; var squareCornerY = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"] ? this.diamondY : this.squareY; context.beginPath(); context.moveTo(x + scale * squareCornerX[0], y + scale * squareCornerY[0]); context.lineTo(x + scale * squareCornerX[1], y + scale * squareCornerY[1]); context.lineTo(x + scale * squareCornerX[2], y + scale * squareCornerY[2]); context.lineTo(x + scale * squareCornerX[3], y + scale * squareCornerY[3]); context.fillStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(cell.color); context.fill(); } }, { key: "outline", value: function outline(context, scale, x, y, cell) { scale = scale * cell.scale; var squareCornerX = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"] ? this.diamondX : this.squareX; var squareCornerY = cell.orientation === _consts_js__WEBPACK_IMPORTED_MODULE_1__["POINTY"] ? this.diamondY : this.squareY; context.beginPath(); context.moveTo(x + scale * squareCornerX[0], y + scale * squareCornerY[0]); context.lineTo(x + scale * squareCornerX[1], y + scale * squareCornerY[1]); context.lineTo(x + scale * squareCornerX[2], y + scale * squareCornerY[2]); context.lineTo(x + scale * squareCornerX[3], y + scale * squareCornerY[3]); context.closePath(); context.lineWidth = cell.width; context.strokeStyle = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["getColor"])(cell.color); context.stroke(); } }]); return DrawSquare; }(); /***/ }), /***/ "./src/funky.js": /*!**********************!*\ !*** ./src/funky.js ***! \**********************/ /*! exports provided: chain, compact, contains, filter, find, flatten, forEach, groupBy, identity, map, mapObj, max, min, omit, pick, range, reduce, reject, some, _ */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "chain", function() { return chain; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "compact", function() { return compact; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "contains", function() { return contains; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flatten", function() { return flatten; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forEach", function() { return forEach; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapObj", function() { return mapObj; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "omit", function() { return omit; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pick", function() { return pick; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reject", function() { return reject; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "some", function() { return some; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_", function() { return _; }); 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 chain(obj) { var chainInstance = { log: function log() { var predicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { return true; }; if (predicate(obj)) console.log(obj); return chainInstance; }, value: function value() { return obj; } }; forEach(_, function (method, key) { chainInstance[key] = function () { obj = method.apply(void 0, [obj].concat(Array.prototype.slice.call(arguments))); return chainInstance; }; }); return chainInstance; } function compact(obj) { return filter(obj, function (val) { return val != null; }); } function contains(obj, value) { if (Array.isArray(obj)) { var length = obj.length; for (var i = 0; i < length; i++) { if (obj[i] === value) { return true; } } } else { for (var key in obj) { if (obj[key] === value) { return true; } } } return false; } function filter(obj, predicate) { var result = {}; if (Array.isArray(obj)) { return obj.filter(predicate); } else { forEach(obj, function (val, key) { if (predicate(val, key)) result[key] = val; }); } return result; } function find(obj, predicate) { if (Array.isArray(obj)) { return obj.find(predicate); } else { for (var key in obj) { if (predicate(obj[key])) return obj[key]; } } } function flatten(obj) { if (Array.isArray(obj)) { return obj.reduce(function (memo, element) { return memo.concat(Array.isArray(element) ? flatten(element) : element); }, []); } else { return reduce(function (flat, prop) { return flat.concat(prop); }, []); } } function forEach(obj, iteratee) { if (Array.isArray(obj)) { // native 'forEach' but the return below allows us to chain obj.forEach(iteratee); } else { for (var key in obj) { iteratee(obj[key], key, obj); } } return obj; } function groupBy(obj, iteratee) { var result = {}; forEach(obj, function (val) { var key = typeof iteratee === 'string' ? val[iteratee] : iteratee(val); result[key] = result[key] || []; result[key].push(val); }); return result; } function identity(value) { return value; } function map(obj, iteratee) { var result = []; if (Array.isArray(obj)) { // native 'map' but the return below allows us to chain return obj.map(iteratee); } else { forEach(obj, function (value, key) { result.push(iteratee(value, key, obj)); }); } return result; } function isObject(obj) { return obj && _typeof(obj) === 'object' && !Array.isArray(obj) ? true : false; } function has(obj, prop) { return obj && obj.hasOwnProperty(prop); } function mapObj(obj, iteratee) { var result = {}; if (Array.isArray(obj)) { forEach(obj, function (value, index) { var returned = iteratee(value, index, obj); if (isObject(returned) && has(returned, 'key') && has(returned, 'value')) { result[returned.key] = returned.value; } else { result[index] = returned; } }); } else { forEach(obj, function (value, key) { var returned = iteratee(value, key, obj); if (isObject(returned) && has(returned, 'key') && has(returned, 'value')) { result[returned.key] = returned.value; } else { result[key] = returned; } }); } return result; } function max() { var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var iteratee = arguments.length > 1 ? arguments[1] : undefined; var max = -Infinity; if (!iteratee) { forEach(obj, function (value) { return max = value > max ? value : max; }); } else { var lastComputed = -Infinity; forEach(obj, function (value, index, list) { var computed = iteratee(value, index, list); if (computed > lastComputed || computed === -Infinity && max === -Infinity) { max = value; lastComputed = computed; } }); } return max; } function min() { var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var iteratee = arguments.length > 1 ? arguments[1] : undefined; var min = Infinity; if (!iteratee) { forEach(obj, function (value) { return min = value < min ? value : min; }); } else { var lastComputed = Infinity; forEach(obj, function (value, index, list) { var computed = iteratee(value, index, list); if (computed < lastComputed || computed === Infinity && min === Infinity) { min = value; lastComputed = computed; } }); } return min; } function omit(obj, keys) { var result = {}; forEach(obj, function (value, key) { if (!contains(keys, key)) { result[key] = value; } }); return result; } function pick(obj, keys) { var result = {}; keys.forEach(function (key) { if (obj.hasOwnProperty(key)) { result[key] = obj[key]; } }); return result; } function range(size) { var iteratee = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity; return Array.from(Array(size), function (value, index) { return iteratee(index); }); } function reduce() { var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var iteratee = arguments.length > 1 ? arguments[1] : undefined; var memo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : obj[0] != null ? obj[0] : 0; if (Array.isArray(obj)) { return obj.reduce(iteratee, memo); } else { forEach(obj, function (val, key, obj) { memo = iteratee(memo, val, key, obj); }); } return memo; } function reject(obj, predicate) { return filter(obj, function (val, key, obj) { return !predicate(val, key, obj); }); } function some(obj) { var predicate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity; return find(obj, predicate) ? true : false; } var _ = { compact: compact, contains: contains, filter: filter, find: find, flatten: flatten, forEach: forEach, groupBy: groupBy, identity: identity, map: map, mapObj: mapObj, max: max, min: min, omit: omit, pick: pick, range: range, reduce: reduce, reject: reject, some: some }; /***/ }), /***/ "./src/hex.js": /*!********************!*\ !*** ./src/hex.js ***! \********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Hex; }); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function computeY(x, z) { return -x - z; } // convert real numbers to integers: // round off coords // throw out whichever one changed the most // re-establish "x + y + z = 0" function roundOff(hex) { var rX = Math.round(hex.x); var rY = Math.round(hex.y); var rZ = Math.round(hex.z); var xDiff = Math.abs(rX - hex.x); var yDiff = Math.abs(rY - hex.y); var zDiff = Math.abs(rZ - hex.z); if (xDiff > yDiff && xDiff > zDiff) { rX = -rY - rZ; } else if (yDiff > zDiff) { rY = -rX - rZ; } else { rZ = -rX - rY; } hex.x = rX === -0 ? 0 : rX; hex.y = rY === -0 ? 0 : rY; hex.z = rZ === -0 ? 0 : rZ; return hex; } var Hex = /*#__PURE__*/ function (_Point) { _inherits(Hex, _Point); _createClass(Hex, null, [{ key: "qrToCube", value: function qrToCube(q, r) { return { x: q, y: computeY(q, r), z: r }; } }, { key: "cubeToEvenR", value: function cubeToEvenR(_ref) { var x = _ref.x, y = _ref.y, z = _ref.z; var col = x + (z + (z & 1)) / 2; ; var row = z; return { col: col, row: row }; } }, { key: "evenRToCube", value: function evenRToCube(col, row) { var x = col - (row + (row & 1)) / 2; ; var z = row; var y = -x - z; return new Hex(x, y, z); } }, { key: "cubeToEvenQ", value: function cubeToEvenQ(_ref2) { var x = _ref2.x, y = _ref2.y, z = _ref2.z; var col = x; var row = z + (x + (x & 1)) / 2; return { col: col, row: row }; } }, { key: "evenQToCube", value: function evenQToCube(col, row) { var x = col; var z = row - (col + (col & 1)) / 2; var y = -x - z; return new Hex(x, y, z); } }]); function Hex() { var _this; _classCallCheck(this, Hex); _this = _possibleConstructorReturn(this, _getPrototypeOf(Hex).call(this)); if (arguments.length === 1) { var _arguments$ = arguments[0], q = _arguments$.q, r = _arguments$.r, _arguments$$s = _arguments$.s, s = _arguments$$s === void 0 ? -q - r : _arguments$$s; var _arguments$2 = arguments[0], x = _arguments$2.x, z = _arguments$2.z, _arguments$2$y = _arguments$2.y, y = _arguments$2$y === void 0 ? -x - z : _arguments$2$y; _this.x = !isNaN(q) ? q : x; _this.y = !isNaN(s) ? s : y; _this.z = !isNaN(r) ? r : z; } else if (arguments.length === 2) { // hex = Hex(q, r); _this.x = arguments[0]; _this.z = arguments[1]; _this.y = computeY(_this.x, _this.z); } else if (arguments.length === 3) { // hex = Hex(x, y, z); _this.x = arguments[0]; _this.y = arguments[1]; _this.z = arguments[2]; } roundOff(_assertThisInitialized(_assertThisInitialized(_this))); return _this; } _createClass(Hex, [{ key: "getX", value: function getX() { return this.x; } }, { key: "getY", value: function getY() { return this.y; } }, { key: "getZ", value: function getZ() { return this.z; } }, { key: "setX", value: function setX(newX) { this.x = newX; return this; } }, { key: "setY", value: function setY(newY) { this.y = newY; return this; } }, { key: "setZ", value: function setZ(newZ) { this.z = newZ; return this; } }, { key: "moveX", value: function moveX(byX) { this.x += byX; return this; } }, { key: "moveY", value: function moveY(byY) { this.y += byY; return this; } }, { key: "moveZ", value: function moveZ(byZ) { this.z += byZ; return this; } }, { key: "getQ", value: function getQ() { return this.x; } }, { key: "getR", value: function getR() { return this.z; } }, { key: "setQ", value: function setQ(newQ) { this.x = newQ; this.y = computeY(this.x, this.z); return this; } }, { key: "setR", value: function setR(newR) { this.z = newR; this.y = computeY(this.x, this.z); return this; } }, { key: "moveQ", value: function moveQ(byQ) { this.x += byQ; this.y = computeY(this.x, this.z); return this; } }, { key: "moveR", value: function moveR(byR) { this.z += byR; this.y = computeY(this.x, this.z); return this; } }, { key: "getPoint", value: function getPoint() { return { x: this.x, y: this.y, z: this.z }; } }, { key: "setHex", value: function setHex(newHex) { this.x = newHex.x; this.y = newHex.y; this.z = newHex.z; return this; } }, { key: "moveHex", value: function moveHex(byHex) { this.x += byHex.x; this.y += byHex.y; this.z += byHex.z; return this; } }, { key: "subtractHex", value: function subtractHex(hex) { this.x -= hex.x; this.y -= hex.y; this.z -= hex.z; return this; } }, { key: "getAxial", value: function getAxial() { return { q: this.x, r: this.z }; } }, { key: "setAxial", value: function setAxial(newAxial) { this.x = newAxial.q; this.z = newAxial.r; this.y = computeY(this.x, this.y); return this; } }, { key: "moveAxial", value: function moveAxial(byAxial) { this.x += byAxial.q; this.z += byAxial.r; this.y = computeY(this.x, this.z); return this; } }, { key: "distance", value: function distance(hex) { return Math.max(Math.abs(this.x - hex.x), Math.abs(this.y - hex.y), Math.abs(this.z - hex.z)); } }]); return Hex; }(_point_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/onTap.js": /*!**********************!*\ !*** ./src/onTap.js ***! \**********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return OnTap; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var MODULE = 'onTap'; var DEFAULTS = { debug: false, element: document.body, desktopPress: false, tap: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], tapStart: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], move: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], doubletap: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], press: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], pressStart: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], zoom: _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"], moveThreshold: 5, doubletapThreshold: 500, pressThreshold: 300, wheelFactor: -100 }; var events = ['contextmenu', 'mousedown', 'mouseup', 'mousemove', 'touchstart', 'touchend', 'touchmove', 'touchcancel', 'wheel']; var methods = ['eventHandler', 'tapStart', 'pressStart'].concat(events); var OnTap = /*#__PURE__*/ function () { function OnTap(settings) { var _this = this; _classCallCheck(this, OnTap); this.settings = Object.assign({}, DEFAULTS, settings); this.state = { tapStartTime: null }; methods.forEach(function (method) { return _this[method] = _this[method].bind(_this); }); events.forEach(function (eventName) { return _this.settings.element.addEventListener(eventName, function (event) { return _this.eventHandler(event, eventName); }); }); } _createClass(OnTap, [{ key: "eventHandler", value: function eventHandler(event, eventName) { event.timeStampUTC = Date.now(); if (this.settings.debug) console.debug("[".concat(MODULE, "][").concat(eventName, "]"), event); this[eventName](event); } }, { key: "contextmenu", value: function contextmenu(event) { event.preventDefault(); } }, { key: "tapStart", value: function tapStart(event) { var _this2 = this; if (!this.state.tapStartTime) { var mobile = event.mobile; this.state.tapStartTime = event.timeStampUTC; if (mobile || this.settings.desktopPress) { clearTimeout(this.state.pressTO); this.state.pressTO = setTimeout(function () { _this2.pressStart({ mobile: mobile, timeStampUTC: Date.now(), offsetX: _this2.state.lastX, offsetY: _this2.state.lastY }); }, this.settings.pressThreshold); } this.settings.tapStart(event); } } }, { key: "mousedown", value: function mousedown(event) { Object.assign(event, { mobile: false }); this.state.lastX = event.offsetX; this.state.lastY = event.offsetY; if (event.which && event.which !== 1) { this.settings.pressStart(event); } else { this.tapStart(event); } } }, { key: "touchstart", value: function touchstart(event) { event.preventDefault(); Object.assign(event, { mobile: true }); var touches = _toConsumableArray(event.touches); event.offsetX = touches.reduce(function (memo, touch) { return memo + touch.pageX; }, 0) / touches.length; event.offsetY = touches.reduce(function (memo, touch) { return memo + touch.pageY; }, 0) / touches.length; this.state.lastX = event.offsetX; this.state.lastY = event.offsetY; if (event.touches.length > 1) { this.state.scaleStart = Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["hypotenuse"])(touches[0].pageX - touches[1].pageX, touches[0].pageY - touches[1].pageY); this.state.pinching = true; this.state.lastPinch = 1; clearTimeout(this.state.pressTO); } this.tapStart(event); } }, { key: "pressStart", value: function pressStart(event) { this.settings.pressStart(event); } }, { key: "mouseup", value: function mouseup(event) { Object.assign(event, { mobile: false, duration: event.timeStampUTC - this.state.tapStartTime }); if (!this.state.moving) { var rightClick = event.which && event.which !== 1 || event.altKey || event.ctrlKey || event.metaKey; var press = this.settings.desktopPress && event.duration >= this.settings.pressThreshold; if (rightClick || press) { this.settings.press(event); } else { clearTimeout(this.state.pressTO); this.settings.tap(event); } } this.state.moving = null; this.state.lastX = null; this.state.lastY = null; this.state.tapStartTime = null; clearTimeout(this.state.pressTO); } }, { key: "touchend", value: function touchend(event) { event.preventDefault(); Object.assign(event, { mobile: true, duration: event.timeStampUTC - this.state.tapStartTime }); var touches = _toConsumableArray(event.touches); if (touches.length) { event.offsetX = touches.reduce(function (memo, touch) { return memo + touch.pageX; }, 0) / touches.length; event.offsetY = touches.reduce(function (memo, touch) { return memo + touch.pageY; }, 0) / touches.length; this.state.lastX = event.offsetX; this.state.lastY = event.offsetY; } else { event.offsetX = this.state.lastX; event.offsetY = this.state.lastY; } if (!(this.state.moving || this.state.pinching)) { if (event.duration >= this.settings.pressThreshold) { this.settings.press(event); } else { clearTimeout(this.state.pressTO); this.settings.tap(event); } } if (event.touches.length <= 1) { this.state.pinching = false; this.state.scaleStart = null; this.state.lastPinch = null; } if (event.touches.length === 0) { this.state.moving = null; this.state.lastX = null; this.state.lastY = null; this.state.tapStartTime = null; } } }, { key: "mousemove", value: function mousemove(event) { if (this.state.tapStartTime) { if (!this.state.moving) { if (Math.abs(event.offsetX - this.state.lastX) > this.settings.moveThreshold || Math.abs(event.offsetY - this.state.lastY) > this.settings.moveThreshold) { this.state.moving = true; clearTimeout(this.state.pressTO); } } if (this.state.moving) { Object.assign(event, { mobile: false, deltaX: event.offsetX - this.state.lastX, deltaY: event.offsetY - this.state.lastY }); this.settings.move(event); this.state.lastX = event.offsetX; this.state.lastY = event.offsetY; } } } }, { key: "touchmove", value: function touchmove(event) { event.preventDefault(); if (this.state.tapStartTime) { var touches = _toConsumableArray(event.touches); if (!Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["has"])(event, 'scale')) { event.scale = touches.length < 2 ? 1 : Object(_utils_js__WEBPACK_IMPORTED_MODULE_0__["hypotenuse"])(touches[0].pageX - touches[1].pageX, touches[0].pageY - touches[1].pageY) / this.state.scaleStart; } Object.assign(event, { offsetX: touches.reduce(function (memo, touch) { return memo + touch.pageX; }, 0) / touches.length, offsetY: touches.reduce(function (memo, touch) { return memo + touch.pageY; }, 0) / touches.length, scaleStep: event.scale / this.state.lastPinch, mobile: true }); if (this.state.pinching) { this.settings.zoom(event); this.state.lastPinch = event.scale; } if (!this.state.moving) { if (Math.abs(event.offsetX - this.state.lastX) > this.settings.moveThreshold || Math.abs(event.offsetY - this.state.lastY) > this.settings.moveThreshold) { this.state.moving = true; clearTimeout(this.state.pressTO); } } if (this.state.moving) { Object.assign(event, { deltaX: event.offsetX - this.state.lastX, deltaY: event.offsetY - this.state.lastY }); this.settings.move(event); this.state.lastX = event.offsetX; this.state.lastY = event.offsetY; } } } }, { key: "touchcancel", value: function touchcancel(event) { console.log('touchcancel', event); } }, { key: "wheel", value: function wheel(event) { Object.assign(event, { scaleStep: 1 + event.deltaY / this.settings.wheelFactor, mobile: false }); this.settings.zoom(event); } }]); return OnTap; }(); /***/ }), /***/ "./src/point.js": /*!**********************!*\ !*** ./src/point.js ***! \**********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Point; }); 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var Point = /*#__PURE__*/ function () { function Point(x, y) { _classCallCheck(this, Point); if (_typeof(x) === 'object') { y = x.y; x = x.x; } // add zero to turn -0 into 0 this.x = Math.round(x) + 0; this.y = Math.round(y) + 0; } _createClass(Point, [{ key: "getX", value: function getX() { return this.x; } }, { key: "getY", value: function getY() { return this.y; } }, { key: "setX", value: function setX(newX) { this.x = newX; } }, { key: "setY", value: function setY(newY) { this.y = newY; } }, { key: "getPoint", value: function getPoint() { return { x: this.x, y: this.y }; } }]); return Point; }(); /***/ }), /***/ "./src/sketch.js": /*!***********************!*\ !*** ./src/sketch.js ***! \***********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Sketch; }); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var Sketch = /*#__PURE__*/ function () { function Sketch(settings) { var _this = this; _classCallCheck(this, Sketch); this.lastNow = null; ['getContext', 'getSize', 'onResize', 'render'].map(function (method) { return _this[method] = _this[method].bind(_this); }); this.draw = settings.draw || _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"]; this.resize = settings.resize || _utils_js__WEBPACK_IMPORTED_MODULE_0__["noop"]; this.container = settings.element || document.body; window.addEventListener('resize', this.onResize); this.canvas = document.createElement('canvas'); this.canvas.width = this.container.offsetWidth; this.canvas.height = this.container.offsetHeight; this.context = this.canvas.getContext('2d'); this.container.appendChild(this.canvas); requestAnimationFrame(this.render); } _createClass(Sketch, [{ key: "getContext", value: function getContext() { return this.context; } }, { key: "getSize", value: function getSize() { return { canvasWidth: this.container.offsetWidth, canvasHeight: this.container.offsetHeight }; } }, { key: "onResize", value: function onResize(event) { var width = this.container.offsetWidth; var height = this.container.offsetHeight; var oldWidth = this.canvas.width; var oldHeight = this.canvas.height; var deltaX = width - oldWidth; var deltaY = height - oldHeight; this.canvas.width = width; this.canvas.height = height; Object.assign(event, { height: height, width: width, oldHeight: oldHeight, oldWidth: oldWidth, deltaX: deltaX, deltaY: deltaY }); this.resize(event); } }, { key: "render", value: function render(now) { var _this2 = this; this.context.lastUTC = this.context.utc || null; this.context.utc = Date.now(); this.context.now = now; this.context.lastNow = this.lastNow; var drawDelay = this.draw(this.context); this.lastNow = now; if (drawDelay) setTimeout(function () { return requestAnimationFrame(_this2.render); }, drawDelay);else requestAnimationFrame(this.render); } }]); return Sketch; }(); /***/ }), /***/ "./src/square.js": /*!***********************!*\ !*** ./src/square.js ***! \***********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Square; }); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Square = /*#__PURE__*/ function (_Point) { _inherits(Square, _Point); function Square(x, y) { _classCallCheck(this, Square); return _possibleConstructorReturn(this, _getPrototypeOf(Square).call(this, x, y)); } return Square; }(_point_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "./src/tessellate.js": /*!***************************!*\ !*** ./src/tessellate.js ***! \***************************/ /*! exports provided: Tessellate */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tessellate", function() { return Tessellate; }); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/utils.js"); /* harmony import */ var _funky__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./funky */ "./src/funky.js"); /* harmony import */ var _onTap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./onTap.js */ "./src/onTap.js"); /* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./point.js */ "./src/point.js"); /* harmony import */ var _sketch_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sketch.js */ "./src/sketch.js"); /* harmony import */ var _drawShapes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./drawShapes.js */ "./src/drawShapes.js"); /* harmony import */ var _drawCircle_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./drawCircle.js */ "./src/drawCircle.js"); /* harmony import */ var _drawSquare_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawSquare.js */ "./src/drawSquare.js"); /* harmony import */ var _drawHexagon_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./drawHexagon.js */ "./src/drawHexagon.js"); /* harmony import */ var _cell_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./cell.js */ "./src/cell.js"); /* harmony import */ var _cartographerFlatXY_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cartographerFlatXY.js */ "./src/cartographerFlatXY.js"); /* harmony import */ var _cartographerPointyXY_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./cartographerPointyXY.js */ "./src/cartographerPointyXY.js"); /* harmony import */ var _cartographerFlatXYZ_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./cartographerFlatXYZ.js */ "./src/cartographerFlatXYZ.js"); /* harmony import */ var _cartographerPointyXYZ_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./cartographerPointyXYZ.js */ "./src/cartographerPointyXYZ.js"); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./consts.js */ "./src/consts.js"); var _TILES; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var TILES = (_TILES = {}, _defineProperty(_TILES, _consts_js__WEBPACK_IMPORTED_MODULE_14__["HEX"], new _drawHexagon_js__WEBPACK_IMPORTED_MODULE_8__["default"]()), _defineProperty(_TILES, _consts_js__WEBPACK_IMPORTED_MODULE_14__["CIRCLE"], new _drawCircle_js__WEBPACK_IMPORTED_MODULE_6__["default"]()), _defineProperty(_TILES, _consts_js__WEBPACK_IMPORTED_MODULE_14__["SQUARE"], new _drawSquare_js__WEBPACK_IMPORTED_MODULE_7__["default"]()), _TILES); var Shapes = new _drawShapes_js__WEBPACK_IMPORTED_MODULE_5__["default"](); var DEFAULTS = { tile: _consts_js__WEBPACK_IMPORTED_MODULE_14__["HEX"], board: _consts_js__WEBPACK_IMPORTED_MODULE_14__["HEX"], orientation: _consts_js__WEBPACK_IMPORTED_MODULE_14__["FLAT"], negativeTiles: true, tap: _utils__WEBPACK_IMPORTED_MODULE_0__["noop"], pressStart: _utils__WEBPACK_IMPORTED_MODULE_0__["noop"], press: _utils__WEBPACK_IMPORTED_MODULE_0__["noop"], draw: _utils__WEBPACK_IMPORTED_MODULE_0__["noop"] }; function selectCartographer(board, orientation) { switch (board) { case _consts_js__WEBPACK_IMPORTED_MODULE_14__["HEX"]: switch (orientation) { case _consts_js__WEBPACK_IMPORTED_MODULE_14__["FLAT"]: return _cartographerFlatXYZ_js__WEBPACK_IMPORTED_MODULE_12__["default"]; case _consts_js__WEBPACK_IMPORTED_MODULE_14__["POINTY"]: return _cartographerPointyXYZ_js__WEBPACK_IMPORTED_MODULE_13__["default"]; } case _consts_js__WEBPACK_IMPORTED_MODULE_14__["SQUARE"]: switch (orientation) { case _consts_js__WEBPACK_IMPORTED_MODULE_14__["FLAT"]: return _cartographerFlatXY_js__WEBPACK_IMPORTED_MODULE_10__["default"]; case _consts_js__WEBPACK_IMPORTED_MODULE_14__["POINTY"]: return _cartographerPointyXY_js__WEBPACK_IMPORTED_MODULE_11__["default"]; } } } var Tessellate = /*#__PURE__*/ function () { _createClass(Tessellate, null, [{ key: "TILE_STYLES", get: function get() { return _consts_js__WEBPACK_IMPORTED_MODULE_14__["TILE_STYLES"]; } }, { key: "BOARD_STYLES", get: function get() { return _consts_js__WEBPACK_IMPORTED_MODULE_14__["BOARD_STYLES"]; } }, { key: "ORIENTATION_STYLES", get: function get() { return _consts_js__WEBPACK_IMPORTED_MODULE_14__["ORIENTATION_STYLES"]; } }, { key: "DRAW_STYLES", get: function get() { return _consts_js__WEBPACK_IMPORTED_MODULE_14__["DRAW_STYLES"]; } }, { key: "TILES", get: function get() { return TILES; } }, { key: "Cell", get: function get() { return _cell_js__WEBPACK_IMPORTED_MODULE_9__["default"]; } }, { key: "Shapes", get: function get() { return Shapes; } }, { key: "utils", get: function get() { return _utils__WEBPACK_IMPORTED_MODULE_0__; } }, { key: "funky", get: function get() { return _funky__WEBPACK_IMPORTED_MODULE_1__; } }]); function Tessellate(settings) { var _this = this; _classCallCheck(this, Tessellate); ['checkSettings', 'tap', 'doubletap', 'pressStart', 'press', 'move', 'zoom', 'pixelToTile', 'tileToPixel', 'getLocationSets', 'draw', 'resize', 'remap'].map(function (method) { _this[method] = _this[method].bind(_this); }); this.interacted = Date.now(); this.checkSettings(settings); this.sketch = new _sketch_js__WEBPACK_IMPORTED_MODULE_4__["default"]({ element: this.settings.element, draw: this.draw, resize: this.resize }); this.onTap = new _onTap_js__WEBPACK_IMPORTED_MODULE_2__["default"](Object.assign({ element: this.settings.element, tap: this.tap, doubletap: this.doubletap, pressStart: this.pressStart, press: this.press, move: this.move, zoom: this.zoom }, _funky__WEBPACK_IMPORTED_MODULE_1__["pick"](this.settings, ['desktopPress', 'moveThreshold', 'doubletapThreshold', 'pressThreshold', 'wheelFactor']))); var cartographer = selectCartographer(this.settings.board, this.settings.orientation); this.cartographer = new cartographer(Object.assign(this.sketch.getSize(), _funky__WEBPACK_IMPORTED_MODULE_1__["pick"](this.settings, ['adjustScaleMin', 'centerX', 'centerY', 'height', 'negativeTiles', 'radius', 'scale', 'width', 'wrap']))); } _createClass(Tessellate, [{ key: "checkSettings", value: function checkSettings(settings) { this.settings = Object.assign({}, DEFAULTS, settings); this.settings.element = this.settings.element instanceof HTMLElement ? this.settings.element : document.querySelector(this.settings.element); if (this.settings.radius) { this.settings.height = this.settings.radius * 2 + 1; this.settings.width = this.settings.radius * 2 + 1; } if (this.settings.negativeTiles) { if (this.settings.height && this.settings.height % 2 === 0) { this.settings.height++; } if (this.settings.width && this.settings.width % 2 === 0) { this.settings.width++; } } } }, { key: "tap", value: function tap(event) { var point = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](event.offsetX, event.offsetY); var tile = this.cartographer.pixelToTile(point); var mapTile = this.cartographer.teleport(tile); this.interacted = Date.now(); this.settings.tap({ event: event, mapTile: mapTile, point: point, tile: tile }); } }, { key: "doubletap", value: function doubletap(event) { console.log('DOUBLETAP', event); var point = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](event.offsetX, event.offsetY); var tile = this.cartographer.pixelToTile(point); var mapTile = this.cartographer.teleport(tile); this.interacted = true; this.interacted = Date.now(); var tap = { event: event, map: map, mapTile: mapTile, point: point, tile: tile }; console.log(tap); } }, { key: "pressStart", value: function pressStart(event) { var point = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](event.offsetX, event.offsetY); var tile = this.cartographer.pixelToTile(point); var mapTile = this.cartographer.teleport(tile); this.interacted = true; this.interacted = Date.now(); this.settings.pressStart({ event: event, mapTile: mapTile, point: point, tile: tile }); } }, { key: "press", value: function press(event) { var point = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](event.offsetX, event.offsetY); var tile = this.cartographer.pixelToTile(point); var mapTile = this.cartographer.teleport(tile); this.interacted = true; this.interacted = Date.now(); this.settings.press({ event: event, mapTile: mapTile, point: point, tile: tile }); } }, { key: "move", value: function move(event) { this.interacted = Date.now(); return this.cartographer.move(event); } }, { key: "zoom", value: function zoom(event) { this.interacted = Date.now(); this.cartographer.zoom(event); } }, { key: "pixelToTile", value: function pixelToTile(x, y) { return this.cartographer.pixelToTile(x, y); } }, { key: "tileToPixel", value: function tileToPixel(tilePoint) { return this.cartographer.tileToPixel(tilePoint); } }, { key: "newLocation", value: function newLocation(corners) { var _this2 = this; this.lastLocation = this.lastLocation || {}; var currentLocation = _utils__WEBPACK_IMPORTED_MODULE_0__["extend"]({ scale: this.cartographer.getScale(), originX: this.cartographer.getOriginX(), originY: this.cartographer.getOriginY() }, corners); var changed = _funky__WEBPACK_IMPORTED_MODULE_1__["reduce"](currentLocation, function (same, val, key) { return same || _this2.lastLocation[key] !== val; }, false); this.lastLocation = currentLocation; return changed; } }, { key: "getLocationSets", value: function getLocationSets(corners) { var upperLeftX = corners.upperLeftX, upperLeftY = corners.upperLeftY, lowerRightX = corners.lowerRightX, lowerRightY = corners.lowerRightY; var upperLeft = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](upperLeftX, upperLeftY); var upperRight = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](lowerRightX, 0); var lowerLeft = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](0, lowerRightY); var lowerRight = new _point_js__WEBPACK_IMPORTED_MODULE_3__["default"](lowerRightX, lowerRightY); return this.cartographer.boundingBox(upperLeft, upperRight, lowerLeft, lowerRight); } }, { key: "draw", value: function draw(context) { var canvas = context.canvas; var height = canvas.height; var width = canvas.width; var corners = { upperLeftX: 0, upperLeftY: 0, lowerRightX: width, lowerRightY: height }; var moved = this.newLocation(corners); this.locationSets = moved ? this.getLocationSets(corners) : this.locationSets; return this.settings.draw({ context: context, height: height, width: width, scale: this.cartographer.getScale(), lastNow: context.lastUTC, now: context.utc, moved: moved, interacted: this.interacted, locationSets: this.locationSets }); } }, { key: "resize", value: function resize(event) { var originX = this.cartographer.getOriginX(); var originY = this.cartographer.getOriginY(); var scaleOrig = this.cartographer.getScale(); var moveForResize = Object.assign({}, event, { deltaX: event.deltaX / 2, deltaY: event.deltaY / 2 }); this.move(moveForResize); this.cartographer.checkScale(event.height, event.width); var centerX = event.width / 2; var centerY = event.height / 2; var scaleNew = this.cartographer.getScale(); var moveForScale = { deltaX: (centerX - originX) / scaleOrig * (scaleOrig - scaleNew), deltaY: (centerY - originY) / scaleOrig * (scaleOrig - scaleNew), height: event.height, width: event.width }; this.move(moveForScale); } }, { key: "remap", value: function remap(_ref) { var height = _ref.height, width = _ref.width; this.cartographer.remap(Object.assign({ height: height, width: width }, this.sketch.getSize())); } }]); return Tessellate; }(); /***/ }), /***/ "./src/utils.js": /*!**********************!*\ !*** ./src/utils.js ***! \**********************/ /*! exports provided: noop, sqrt2, sqrt3, invSqrt2, clone, has, hypotenuse, isObject, random, range, rangeInclusive, getQueryStringParameters, getQueryStringObj, parseString, toFixed, getColor, grayscale, extend, quickCanvas */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt2", function() { return sqrt2; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt3", function() { return sqrt3; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "invSqrt2", function() { return invSqrt2; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return clone; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "has", function() { return has; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hypotenuse", function() { return hypotenuse; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return isObject; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rangeInclusive", function() { return rangeInclusive; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getQueryStringParameters", function() { return getQueryStringParameters; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getQueryStringObj", function() { return getQueryStringObj; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseString", function() { return parseString; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toFixed", function() { return toFixed; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColor", function() { return getColor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "grayscale", function() { return grayscale; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extend", function() { return extend; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quickCanvas", function() { return quickCanvas; }); /* harmony import */ var _funky_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./funky.js */ "./src/funky.js"); 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 noop() {} ; // hypotenuse factor of isoscelese right triangle var sqrt2 = Math.sqrt(2); // short width factor given the lenght of a hexagon's side // (2*S gives long width) var sqrt3 = Math.sqrt(3); // leg factor of isoscelese right triangle with unit hypotenuse var invSqrt2 = 1 / sqrt2; function clone(obj) { return JSON.parse(JSON.stringify(obj)); } function has(obj, prop) { return obj && (obj.hasOwnProperty(prop) || prop in obj); } function hypotenuse(a, b) { if (b == null) b = a; return Math.sqrt(a * a + b * b); } function isObject(obj) { return obj && _typeof(obj) === 'object' && !Array.isArray(obj) ? true : false; } function random(min, max) { if (Array.isArray(min)) { return min[random(min.length - 1)]; } if (_typeof(min) === 'object') { return min[random(Object.keys(min))]; } if (max == null) { max = min; min = 0; } return min + Math.floor(Math.random() * (max - min + 1)); } function range(start, end) { if (end == null) { end = start; start = 0; } if (start > end) { var swap = start; start = end; end = swap; } return Array.from(Array(Math.abs(end - start)), function (_value, index) { return index + start; }); } function rangeInclusive(start, end) { if (end == null) { end = start; start = 0; } return range(Math.min(start, end), Math.max(start, end) + 1); } function getQueryStringParameters() { var queryString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.location.search; var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '&'; var assignment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '='; var parameters = {}; queryString.replace(/(^\?)/, '').split(separator).forEach(function (pair) { pair = pair.split(assignment); parameters[pair[0]] = pair[1]; }); return parameters; } function getQueryStringObj() { var queryString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.location.search; var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '&'; var assignment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '='; return Object(_funky_js__WEBPACK_IMPORTED_MODULE_0__["mapObj"])(getQueryStringParameters(queryString, separator, assignment), parseString); } var braced = /^{.*}$/; var bracketed = /^\[.*\]$/; function parseString(str) { return typeof str !== 'string' ? str : str.toLowerCase() === 'true' ? true : str.toLowerCase() === 'false' ? false : str.toLowerCase() === 'null' ? null : str.toLowerCase() === 'undefined' ? undefined : !isNaN(Number(str)) ? Number(str) : braced.test(str) || bracketed.test(str) ? JSON.parse(decodeURIComponent(str)) : str; } function toFixed(number) { var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3; var fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : NaN; return typeof number === 'number' && !isNaN(number) ? Number(number.toFixed(precision)) : fallback; } function getColor(_ref) { var red = _ref.red, green = _ref.green, blue = _ref.blue, alpha = _ref.alpha; return alpha != null ? "rgba(".concat(red, ", ").concat(green, ", ").concat(blue, ", ").concat(alpha, ")") : "rgb(".concat(red, ", ").concat(green, ", ").concat(blue, ")"); } var GRAY_FACTOR = { red: 0.299, green: 0.587, blue: 0.114 }; // grayscale accounting for luminosity function grayscale(_ref2) { var red = _ref2.red, green = _ref2.green, blue = _ref2.blue; return GRAY_FACTOR.red * red + GRAY_FACTOR.green * green + GRAY_FACTOR.blue * blue; } function extend(obj) { var extended = Object.assign({}, obj); for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { sources[_key - 1] = arguments[_key]; } sources.forEach(function (src) { Object(_funky_js__WEBPACK_IMPORTED_MODULE_0__["forEach"])(src, function (value, key) { if (has(src, key)) { if (isObject(value) && isObject(extended[key])) { extended[key] = extend(extended[key], value); } else { extended[key] = value; } } }); }); return extended; } function quickCanvas(draw, height) { var width = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : height; var canvas = document.createElement('canvas'); canvas.height = height; canvas.width = width; draw(canvas.getContext('2d'), canvas.height, canvas.width); return canvas; } /***/ }), /***/ 1: /*!*********************************!*\ !*** multi ./src/tessellate.js ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(/*! /home/mcdoh/projects/Tessellate/src/tessellate.js */"./src/tessellate.js"); /***/ }) /******/ }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NhcnRvZ3JhcGhlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2FydG9ncmFwaGVyRmxhdFhZLmpzIiwid2VicGFjazovLy8uL3NyYy9jYXJ0b2dyYXBoZXJGbGF0WFlaLmpzIiwid2VicGFjazovLy8uL3NyYy9jYXJ0b2dyYXBoZXJQb2ludHlYWS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2FydG9ncmFwaGVyUG9pbnR5WFlaLmpzIiwid2VicGFjazovLy8uL3NyYy9jZWxsLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25zdHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RyYXdDaXJjbGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RyYXdIZXhhZ29uLmpzIiwid2VicGFjazovLy8uL3NyYy9kcmF3U2hhcGVzLmpzIiwid2VicGFjazovLy8uL3NyYy9kcmF3U3F1YXJlLmpzIiwid2VicGFjazovLy8uL3NyYy9mdW5reS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9vblRhcC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NrZXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3F1YXJlLmpzIiwid2VicGFjazovLy8uL3NyYy90ZXNzZWxsYXRlLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJERUZBVUxUUyIsImFkanVzdFNjYWxlTWluIiwic2NhbGUiLCJzY2FsZU1pbiIsInNjYWxlTWF4IiwiQ2FydG9ncmFwaGVyIiwic2V0dGluZ3MiLCJtYXAiLCJtZXRob2QiLCJiaW5kIiwiT2JqZWN0IiwiYXNzaWduIiwicGljayIsIndpZHRoIiwiaGVpZ2h0Iiwid3JhcCIsImNoZWNrU2NhbGUiLCJjYW52YXNIZWlnaHQiLCJjYW52YXNXaWR0aCIsInNldE9yaWdpblgiLCJjZW50ZXJYIiwic2V0T3JpZ2luWSIsImNlbnRlclkiLCJvcmlnaW5YIiwib3JpZ2luWSIsImhlaWdodE1pbiIsImNhbGN1bGF0ZVZlcnRpY2FsU2NhbGUiLCJ3aWR0aE1pbiIsImNhbGN1bGF0ZUhvcml6b250YWxTY2FsZSIsIk1hdGgiLCJtYXgiLCJuZWdhdGl2ZVRpbGVzIiwicGFyc2VJbnQiLCJob3Jpem9udGFsRGlzdGFuY2UiLCJ0aWxlV2lkdGgiLCJib2FyZEhlaWdodCIsInZlcnRpY2FsRGlzdGFuY2UiLCJ0aWxlSGVpZ2h0IiwiZXZlbnQiLCJoYXMiLCJ0YXJnZXQiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXRXaWR0aCIsIm5ld1giLCJkZWx0YVgiLCJuZXdZIiwiZGVsdGFZIiwiX2NoZWNrTW92ZSIsIl9jaGVja01vdmVOZWdhdGl2ZVRpbGVzIiwiX2NoZWNrTW92ZVBvc2l0aXZlVGlsZXMiLCJjb2xXaWR0aCIsInJvd0hlaWdodCIsIm1heFgiLCJtaW5ZIiwiYm9hcmRXaWR0aCIsImhvcml6b250YWxPdmVyaGFuZyIsIm1pblgiLCJ2ZXJ0aWNhbE92ZXJoYW5nIiwibWF4WSIsImhhbGZCb2FyZFdpZHRoIiwiaGFsZkJvYXJkSGVpZ2h0Iiwic2NhbGVPcmlnIiwic2NhbGVUZW1wIiwic2NhbGVTdGVwIiwibWluIiwibW92ZSIsIm9mZnNldFgiLCJvZmZzZXRZIiwiY29uZmlnIiwidGlsZVBvaW50VG9TcXVhcmUiLCJ0aWxlUG9pbnQiLCJtYXBQb2ludCIsInBpeGVsUG9pbnQiLCJ0aWxlIiwiU3F1YXJlIiwibWFwVGlsZSIsIkNhcnRvZ3JhcGhlckZsYXRYWSIsIm1pbldpZHRoIiwibWF4V2lkdGgiLCJpbnZTcXJ0MiIsInBpeGVscyIsInRpbGVzIiwic3F1YXJlIiwiYXJndW1lbnRzIiwieCIsImdldFgiLCJ5IiwiZ2V0WSIsIlBvaW50IiwicG9pbnQiLCJwaXhlbFgiLCJwaXhlbFkiLCJhYnMiLCJmbG9vciIsInRlbGVwb3J0IiwiaW5Cb3VuZHMiLCJ1cHBlckxlZnRQb2ludCIsInVwcGVyUmlnaHRQb2ludCIsImxvd2VyTGVmdFBvaW50IiwibG93ZXJSaWdodFBvaW50IiwidXBwZXJMZWZ0VGlsZSIsInBpeGVsVG9UaWxlIiwibG93ZXJSaWdodFRpbGUiLCJ1cHBlclJpZ2h0VGlsZSIsImNvbHVtbnMiLCJyYW5nZUluY2x1c2l2ZSIsInJvd3MiLCJtYWtlQVBvaW50IiwibWFrZUFQb2ludFBhaXIiLCJ0aWxlVG9QaXhlbCIsImZ1bmt5IiwiZmxhdHRlbiIsImVuZm9yY2VCb3VuZHJpZXMiLCJ2YWx1ZSIsInRpbGVQb2ludFRvSGV4IiwiSGV4IiwiemVyb1plcm9aZXJvIiwieiIsIkNhcnRvZ3JhcGhlckZsYXRYWVoiLCJyYWRpdXMiLCJtaXJyb3JzIiwic3FydDMiLCJoZXgiLCJnZXRRIiwiZ2V0UiIsInEiLCJyIiwiZGlzdGFuY2UiLCJkaXN0YW5jZXMiLCJtaXJyb3IiLCJpbmRleE9mIiwic3VidHJhY3RIZXgiLCJjdWJlVG9FdmVuUSIsImNvbCIsInJvdyIsIm9mZnNldCIsInZlcnRpY2FsQWRqdXN0IiwiY2VpbCIsImhhbGZXaWR0aCIsImhhbGZIZWlnaHQiLCJldmVuUVRvQ3ViZSIsImxvd2VyTGVmdFRpbGUiLCJwcm9jZXNzUm93IiwiaW5kZXgiLCJ0b3AiLCJib3R0b20iLCJxclRvQ3ViZSIsIkNhcnRvZ3JhcGhlclBvaW50eVhZIiwic3FydDIiLCJ1cHBlckxlZnRJbnRlcmNlcHQiLCJ1cHBlclJpZ2h0SW50ZXJjZXB0IiwibG93ZXJMZWZ0SW50ZXJjZXB0IiwibG93ZXJSaWdodEludGVyY2VwdCIsImFib3V0SGFsZiIsImxlbmd0aCIsIm1pZHdheSIsIkNhcnRvZ3JhcGhlclBvaW50eVhZWiIsImN1YmVUb0V2ZW5SIiwiaG9yaXpvbnRhbEFkanVzdCIsImV2ZW5SVG9DdWJlIiwicHJvY2Vzc0NvbHVtbiIsImxlZnQiLCJyaWdodCIsIm9yaWVudGF0aW9uIiwiRkxBVCIsInRpbGVTdHlsZSIsIkhFWCIsImRyYXdTdHlsZSIsIkZJTEwiLCJjb2xvciIsInJlZCIsImdyZWVuIiwiYmx1ZSIsImFscGhhIiwiQ2VsbCIsIkNJUkNMRSIsIlNRVUFSRSIsIlRJTEVfU1RZTEVTIiwiQk9BUkRfU1RZTEVTIiwiUE9JTlRZIiwiT1JJRU5UQVRJT05fU1RZTEVTIiwiT1VUTElORSIsIkRSQVdfU1RZTEVTIiwiRHJhd0NpcmNsZSIsImNvbnRleHQiLCJjZWxsIiwiYmVnaW5QYXRoIiwiYXJjIiwiUEkiLCJmaWxsU3R5bGUiLCJnZXRDb2xvciIsImZpbGwiLCJsaW5lV2lkdGgiLCJzdHJva2VTdHlsZSIsInN0cm9rZSIsIkRyYXdIZXhhZ29uIiwiZmxhdFRvcENvcm5lclgiLCJmbGF0VG9wQ29ybmVyWSIsInBvaW50eVRvcENvcm5lclgiLCJwb2ludHlUb3BDb3JuZXJZIiwiaGV4U2lkZXMiLCJoZXhTbGljZXMiLCJyYW5nZSIsImZvckVhY2giLCJoZXhTbGljZSIsInRvRml4ZWQiLCJjb3MiLCJzaW4iLCJjdXIiLCJoZXhDb3JuZXJYIiwiaGV4Q29ybmVyWSIsIm1vdmVUbyIsImxpbmVUbyIsImNsb3NlUGF0aCIsIm1pbmUiLCJib3JkZXIiLCJob3JucyIsImJvZHkiLCJwaXAiLCJzaWRlcyIsInNsaWNlcyIsImdlbmVyYXRlRmxhdFNxdWFyZVBpcHMiLCJwaXBzIiwicGlwWCIsInBpcFkiLCJnZXRWZXJ0ZXgiLCJuIiwiZ2VuZXJhdGVQb2ludHlTcXVhcmVQaXBzIiwiZ2VuZXJhdGVGbGF0SGV4UGlwcyIsInNsaWNlc1giLCJzbGljZXNZIiwiY29uY2F0IiwiZ2VuZXJhdGVQb2ludHlIZXhQaXBzIiwiRHJhd1NoYXBlcyIsInNsaWNlIiwicGlwQ2FjaGUiLCJtaW5lQ2FjaGUiLCJwaXBWZXJ0aWNlcyIsInJlY3QiLCJjZWxsWCIsImNlbGxZIiwidmVydGV4WCIsInZlcnRleFkiLCJwaXBSYWRpdXMiLCJwaXBEaXN0YW5jZSIsInBpcEJvZHlSYWRpdXMiLCJwaXBCb3JkZXJSYWRpdXMiLCJwaXBDZW50ZXIiLCJxdWlja0NhbnZhcyIsInBpcHNDZW50ZXIiLCJ2ZXJ0aWNlcyIsImRyYXdJbWFnZSIsInNldFBpcENhY2hlIiwic2NhbGVXaWR0aCIsInNjYWxlSGVpZ2h0IiwiZ2xvYmFsQWxwaGEiLCJzZXRNaW5lQ2FjaGUiLCJfbWluZSIsIl9ob3JucyIsImhvcm4iLCJob3JuUmFkaXVzIiwiaG9ybkRpc3RhbmNlIiwiaG9yblgiLCJob3JuWSIsInBlYWsiLCJ2YWxsZXkiLCJmaWx0ZXIiLCJEcmF3U3F1YXJlIiwic3F1YXJlWCIsInNxdWFyZVkiLCJkaWFtb25kWCIsImRpYW1vbmRZIiwic3F1YXJlQ29ybmVyWCIsInNxdWFyZUNvcm5lclkiLCJjaGFpbiIsIm9iaiIsImNoYWluSW5zdGFuY2UiLCJsb2ciLCJwcmVkaWNhdGUiLCJjb25zb2xlIiwiXyIsImtleSIsImNvbXBhY3QiLCJ2YWwiLCJjb250YWlucyIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJyZXN1bHQiLCJmaW5kIiwicmVkdWNlIiwibWVtbyIsImVsZW1lbnQiLCJmbGF0IiwicHJvcCIsIml0ZXJhdGVlIiwiZ3JvdXBCeSIsInB1c2giLCJpZGVudGl0eSIsImlzT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJtYXBPYmoiLCJyZXR1cm5lZCIsIkluZmluaXR5IiwibGFzdENvbXB1dGVkIiwibGlzdCIsImNvbXB1dGVkIiwib21pdCIsImtleXMiLCJzaXplIiwiZnJvbSIsInJlamVjdCIsInNvbWUiLCJjb21wdXRlWSIsInJvdW5kT2ZmIiwiclgiLCJyb3VuZCIsInJZIiwicloiLCJ4RGlmZiIsInlEaWZmIiwiekRpZmYiLCJzIiwiaXNOYU4iLCJuZXdaIiwiYnlYIiwiYnlZIiwiYnlaIiwibmV3USIsIm5ld1IiLCJieVEiLCJieVIiLCJuZXdIZXgiLCJieUhleCIsIm5ld0F4aWFsIiwiYnlBeGlhbCIsIk1PRFVMRSIsImRlYnVnIiwiZG9jdW1lbnQiLCJkZXNrdG9wUHJlc3MiLCJ0YXAiLCJub29wIiwidGFwU3RhcnQiLCJkb3VibGV0YXAiLCJwcmVzcyIsInByZXNzU3RhcnQiLCJ6b29tIiwibW92ZVRocmVzaG9sZCIsImRvdWJsZXRhcFRocmVzaG9sZCIsInByZXNzVGhyZXNob2xkIiwid2hlZWxGYWN0b3IiLCJldmVudHMiLCJtZXRob2RzIiwiT25UYXAiLCJzdGF0ZSIsInRhcFN0YXJ0VGltZSIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJldmVudEhhbmRsZXIiLCJ0aW1lU3RhbXBVVEMiLCJEYXRlIiwibm93IiwicHJldmVudERlZmF1bHQiLCJtb2JpbGUiLCJjbGVhclRpbWVvdXQiLCJwcmVzc1RPIiwic2V0VGltZW91dCIsImxhc3RYIiwibGFzdFkiLCJ3aGljaCIsInRvdWNoZXMiLCJ0b3VjaCIsInBhZ2VYIiwicGFnZVkiLCJzY2FsZVN0YXJ0IiwiaHlwb3RlbnVzZSIsInBpbmNoaW5nIiwibGFzdFBpbmNoIiwiZHVyYXRpb24iLCJtb3ZpbmciLCJyaWdodENsaWNrIiwiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJTa2V0Y2giLCJsYXN0Tm93IiwiZHJhdyIsInJlc2l6ZSIsImNvbnRhaW5lciIsIndpbmRvdyIsIm9uUmVzaXplIiwiY2FudmFzIiwiY3JlYXRlRWxlbWVudCIsImdldENvbnRleHQiLCJhcHBlbmRDaGlsZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInJlbmRlciIsIm9sZFdpZHRoIiwib2xkSGVpZ2h0IiwibGFzdFVUQyIsInV0YyIsImRyYXdEZWxheSIsIlRJTEVTIiwiU2hhcGVzIiwiYm9hcmQiLCJ1dGlscyIsInNlbGVjdENhcnRvZ3JhcGhlciIsIlRlc3NlbGxhdGUiLCJpbnRlcmFjdGVkIiwiY2hlY2tTZXR0aW5ncyIsInNrZXRjaCIsIm9uVGFwIiwiY2FydG9ncmFwaGVyIiwiZ2V0U2l6ZSIsIkhUTUxFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImNvcm5lcnMiLCJsYXN0TG9jYXRpb24iLCJjdXJyZW50TG9jYXRpb24iLCJnZXRTY2FsZSIsImdldE9yaWdpblgiLCJnZXRPcmlnaW5ZIiwiY2hhbmdlZCIsInNhbWUiLCJ1cHBlckxlZnRYIiwidXBwZXJMZWZ0WSIsImxvd2VyUmlnaHRYIiwibG93ZXJSaWdodFkiLCJ1cHBlckxlZnQiLCJ1cHBlclJpZ2h0IiwibG93ZXJMZWZ0IiwibG93ZXJSaWdodCIsImJvdW5kaW5nQm94IiwibW92ZWQiLCJuZXdMb2NhdGlvbiIsImxvY2F0aW9uU2V0cyIsImdldExvY2F0aW9uU2V0cyIsIm1vdmVGb3JSZXNpemUiLCJzY2FsZU5ldyIsIm1vdmVGb3JTY2FsZSIsInJlbWFwIiwic3FydCIsImNsb25lIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiYSIsImIiLCJyYW5kb20iLCJzdGFydCIsImVuZCIsInN3YXAiLCJfdmFsdWUiLCJnZXRRdWVyeVN0cmluZ1BhcmFtZXRlcnMiLCJxdWVyeVN0cmluZyIsImxvY2F0aW9uIiwic2VhcmNoIiwic2VwYXJhdG9yIiwiYXNzaWdubWVudCIsInBhcmFtZXRlcnMiLCJyZXBsYWNlIiwic3BsaXQiLCJwYWlyIiwiZ2V0UXVlcnlTdHJpbmdPYmoiLCJwYXJzZVN0cmluZyIsImJyYWNlZCIsImJyYWNrZXRlZCIsInN0ciIsInRvTG93ZXJDYXNlIiwidW5kZWZpbmVkIiwiTnVtYmVyIiwidGVzdCIsImRlY29kZVVSSUNvbXBvbmVudCIsIm51bWJlciIsInByZWNpc2lvbiIsImZhbGxiYWNrIiwiTmFOIiwiR1JBWV9GQUNUT1IiLCJncmF5c2NhbGUiLCJleHRlbmQiLCJleHRlbmRlZCIsInNvdXJjZXMiLCJzcmMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUEwQyxnQ0FBZ0M7QUFDMUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnRUFBd0Qsa0JBQWtCO0FBQzFFO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUF5QyxpQ0FBaUM7QUFDMUUsd0hBQWdILG1CQUFtQixFQUFFO0FBQ3JJO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQ0E7QUFFQSxJQUFNQSxRQUFRLEdBQUc7QUFDaEJDLGdCQUFjLEVBQUUsSUFEQTtBQUdoQjtBQUNBQyxPQUFLLEVBQUUsRUFKUztBQUtoQkMsVUFBUSxFQUFFLEVBTE07QUFNaEJDLFVBQVEsRUFBRTtBQU5NLENBQWpCOztJQVNxQkMsWTs7O0FBQ3BCLHdCQUFhQyxRQUFiLEVBQXVCO0FBQUE7O0FBQUE7O0FBQ3RCLEtBQ0MsWUFERCxFQUVDLFlBRkQsRUFJQyxVQUpELEVBTUMsTUFORCxFQU9DLFlBUEQsRUFRQyxZQVJELEVBU0MsWUFURCxFQVdDLE1BWEQsRUFhQyxPQWJELEVBY0VDLEdBZEYsQ0FjTSxVQUFBQyxNQUFNO0FBQUEsYUFBSSxLQUFJLENBQUNBLE1BQUQsQ0FBSixHQUFlLEtBQUksQ0FBQ0EsTUFBRCxDQUFKLENBQWFDLElBQWIsQ0FBa0IsS0FBbEIsQ0FBbkI7QUFBQSxLQWRaO0FBZ0JBLFNBQUtILFFBQUwsR0FBZ0JJLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JYLFFBQWxCLEVBQTRCTSxRQUE1QixDQUFoQjtBQUVBSSxVQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFkLEVBQW9CQyxtREFBSSxDQUFDLEtBQUtOLFFBQU4sRUFBZ0IsQ0FDdkMsUUFEdUMsRUFFdkMsZUFGdUMsRUFHdkMsUUFIdUMsRUFJdkMsT0FKdUMsRUFLdkMsTUFMdUMsQ0FBaEIsQ0FBeEI7QUFRQSxRQUFJLENBQUMsS0FBS08sS0FBTixJQUFlLENBQUMsS0FBS0MsTUFBekIsRUFBaUMsT0FBTyxLQUFLQyxJQUFaO0FBRWpDLFNBQUtDLFVBQUwsQ0FBZ0IsS0FBS1YsUUFBTCxDQUFjVyxZQUE5QixFQUE0QyxLQUFLWCxRQUFMLENBQWNZLFdBQTFEO0FBRUEsU0FBS0MsVUFBTCxDQUFnQixLQUFLYixRQUFMLENBQWNZLFdBQTlCLEVBQTJDLEtBQUtaLFFBQUwsQ0FBY2MsT0FBekQ7QUFDQSxTQUFLQyxVQUFMLENBQWdCLEtBQUtmLFFBQUwsQ0FBY1csWUFBOUIsRUFBNEMsS0FBS1gsUUFBTCxDQUFjZ0IsT0FBMUQ7QUFDQTs7OztpQ0FFYTtBQUFDLGFBQU8sS0FBS0MsT0FBWjtBQUFxQjs7O2lDQUN0QjtBQUFDLGFBQU8sS0FBS0MsT0FBWjtBQUFxQjs7OytCQUV4QjtBQUFDLGFBQU8sS0FBS3RCLEtBQVo7QUFBbUI7OzsrQkFFcEJlLFksRUFBY0MsVyxFQUFhO0FBQ3RDLFVBQU1PLFNBQVMsR0FBRyxLQUFLWCxNQUFMLEdBQWMsS0FBS1ksc0JBQUwsQ0FBNEJULFlBQTVCLEVBQTBDLEtBQUtILE1BQS9DLENBQWQsR0FBdUUsQ0FBekY7QUFDQSxVQUFNYSxRQUFRLEdBQUcsS0FBS2QsS0FBTCxHQUFhLEtBQUtlLHdCQUFMLENBQThCVixXQUE5QixFQUEyQyxLQUFLTCxLQUFoRCxDQUFiLEdBQXNFLENBQXZGO0FBRUEsV0FBS1QsUUFBTCxHQUFnQixLQUFLRSxRQUFMLENBQWNGLFFBQTlCO0FBQ0EsV0FBS0QsUUFBTCxHQUFnQixLQUFLRyxRQUFMLENBQWNMLGNBQWQsR0FBK0I0QixJQUFJLENBQUNDLEdBQUwsQ0FBUyxLQUFLeEIsUUFBTCxDQUFjSCxRQUF2QixFQUFpQ3NCLFNBQWpDLEVBQTRDRSxRQUE1QyxDQUEvQixHQUF1RixLQUFLckIsUUFBTCxDQUFjSCxRQUFySDtBQUVBLFdBQUtELEtBQUwsR0FBYSxLQUFLQyxRQUFMLEdBQWdCLEtBQUtHLFFBQUwsQ0FBY0osS0FBOUIsR0FBc0MsS0FBS0MsUUFBM0MsR0FBc0QsS0FBS0csUUFBTCxDQUFjSixLQUFqRjtBQUNBOzs7K0JBRVdnQixXLEVBQWFFLE8sRUFBUztBQUNqQyxXQUFLRyxPQUFMLEdBQWVILE9BQU8sR0FBR0EsT0FBTyxHQUFHRixXQUFXLEdBQUcsQ0FBM0IsR0FDckIsS0FBS2EsYUFBTCxHQUFxQkMsUUFBUSxDQUFDZCxXQUFXLEdBQUcsQ0FBZixDQUE3QixHQUNBLEtBQUtMLEtBQUwsR0FBZSxLQUFLQSxLQUFMLEdBQWEsS0FBS29CLGtCQUFMLEVBQWQsR0FBMkMsQ0FBQyxDQUE3QyxHQUFtRGYsV0FBVyxHQUFHLENBQWpFLEdBQXVFLEtBQUtlLGtCQUFMLEtBQTRCLENBQWhILEdBQ0EsS0FBS0MsU0FBTCxLQUFtQixDQUhwQjtBQUlBOzs7K0JBRVdqQixZLEVBQWNLLE8sRUFBUztBQUNsQyxVQUFNYSxXQUFXLEdBQUcsS0FBS3JCLE1BQUwsR0FBYyxLQUFLc0IsZ0JBQUwsRUFBbEM7QUFFQSxXQUFLWixPQUFMLEdBQWVGLE9BQU8sR0FBR0EsT0FBTyxHQUFHTCxZQUFZLEdBQUcsQ0FBNUIsR0FDckIsS0FBS2MsYUFBTCxHQUFxQkMsUUFBUSxDQUFDZixZQUFZLEdBQUcsQ0FBaEIsQ0FBN0IsR0FDQSxLQUFLSCxNQUFMLEdBQWVxQixXQUFELEdBQWlCLENBQUNBLFdBQVcsR0FBR2xCLFlBQWYsSUFBK0IsQ0FBaEQsR0FBc0QsS0FBS21CLGdCQUFMLEtBQTBCLENBQTlGLEdBQ0FuQixZQUFZLEdBQUksS0FBS29CLFVBQUwsS0FBb0IsQ0FIckM7QUFJQTs7O3lCQUVLQyxLLEVBQU87QUFDWixVQUFJLENBQUNDLHFEQUFHLENBQUNELEtBQUQsRUFBUSxRQUFSLENBQVIsRUFBMkJBLEtBQUssQ0FBQ3hCLE1BQU4sR0FBZXdCLEtBQUssQ0FBQ0UsTUFBTixDQUFhQyxZQUE1QjtBQUMzQixVQUFJLENBQUNGLHFEQUFHLENBQUNELEtBQUQsRUFBUSxPQUFSLENBQVIsRUFBMEJBLEtBQUssQ0FBQ3pCLEtBQU4sR0FBY3lCLEtBQUssQ0FBQ0UsTUFBTixDQUFhRSxXQUEzQjtBQUUxQixVQUFNQyxJQUFJLEdBQUcsS0FBS3BCLE9BQUwsR0FBZWUsS0FBSyxDQUFDTSxNQUFsQztBQUNBLFVBQU1DLElBQUksR0FBRyxLQUFLckIsT0FBTCxHQUFlYyxLQUFLLENBQUNRLE1BQWxDO0FBRUEsV0FBS3ZCLE9BQUwsR0FBZW9CLElBQWY7QUFDQSxXQUFLbkIsT0FBTCxHQUFlcUIsSUFBZjs7QUFFQSxXQUFLRSxVQUFMLENBQWdCVCxLQUFoQixFQVZZLENBWVo7OztBQUNBLGFBQU8sS0FBS2YsT0FBTCxLQUFpQm9CLElBQWpCLElBQXlCLEtBQUtuQixPQUFMLEtBQWlCcUIsSUFBakQ7QUFDQTs7OytCQUVXUCxLLEVBQU87QUFDbEIsVUFBSSxLQUFLUCxhQUFULEVBQXdCO0FBQ3ZCLGFBQUtpQix1QkFBTCxDQUE2QlYsS0FBN0I7QUFDQSxPQUZELE1BR0s7QUFDSixhQUFLVyx1QkFBTCxDQUE2QlgsS0FBN0I7QUFDQTtBQUNEOzs7NENBRXdCQSxLLEVBQU87QUFDL0IsVUFBTXBCLFdBQVcsR0FBR29CLEtBQUssQ0FBQ3pCLEtBQTFCO0FBQ0EsVUFBTUksWUFBWSxHQUFHcUIsS0FBSyxDQUFDeEIsTUFBM0I7QUFFQSxVQUFNb0MsUUFBUSxHQUFHLEtBQUtqQixrQkFBTCxFQUFqQjtBQUNBLFVBQU1rQixTQUFTLEdBQUcsS0FBS2YsZ0JBQUwsRUFBbEI7QUFFQSxVQUFNZ0IsSUFBSSxHQUFHLEtBQUtsQixTQUFMLEtBQW1CLENBQWhDO0FBQ0EsVUFBTW1CLElBQUksR0FBR3BDLFlBQVksR0FBSSxLQUFLb0IsVUFBTCxLQUFvQixDQUFqRDs7QUFFQSxVQUFJLENBQUMsS0FBS3RCLElBQVYsRUFBZ0I7QUFDZixhQUFLUSxPQUFMLEdBQWUsS0FBS0EsT0FBTCxHQUFlNkIsSUFBZixHQUFzQkEsSUFBdEIsR0FBNkIsS0FBSzdCLE9BQWpEO0FBQ0EsYUFBS0MsT0FBTCxHQUFlLEtBQUtBLE9BQUwsR0FBZTZCLElBQWYsR0FBc0JBLElBQXRCLEdBQTZCLEtBQUs3QixPQUFqRDs7QUFFQSxZQUFJLEtBQUtYLEtBQVQsRUFBZ0I7QUFDZixjQUFNeUMsVUFBVSxHQUFHLEtBQUt6QyxLQUFMLEdBQWFxQyxRQUFiLEdBQXdCLEtBQUtLLGtCQUFMLEVBQTNDO0FBQ0EsY0FBTUMsSUFBSSxHQUFHSixJQUFJLElBQUlFLFVBQVUsR0FBR3BDLFdBQWpCLENBQWpCO0FBRUEsZUFBS0ssT0FBTCxHQUFlLEtBQUtBLE9BQUwsR0FBZWlDLElBQWYsR0FBc0JBLElBQXRCLEdBQTZCLEtBQUtqQyxPQUFqRDtBQUNBOztBQUVELFlBQUksS0FBS1QsTUFBVCxFQUFpQjtBQUNoQixjQUFNcUIsV0FBVyxHQUFHLEtBQUtyQixNQUFMLEdBQWNxQyxTQUFkLEdBQTBCLEtBQUtNLGdCQUFMLEVBQTlDO0FBQ0EsY0FBTUMsSUFBSSxHQUFHdkIsV0FBVyxHQUFJLEtBQUtFLFVBQUwsS0FBb0IsQ0FBaEQ7QUFFQSxlQUFLYixPQUFMLEdBQWUsS0FBS0EsT0FBTCxHQUFla0MsSUFBZixHQUFzQkEsSUFBdEIsR0FBNkIsS0FBS2xDLE9BQWpEO0FBQ0E7QUFDRDtBQUNEOzs7NENBRXdCYyxLLEVBQU87QUFDL0IsVUFBTVksUUFBUSxHQUFHLEtBQUtqQixrQkFBTCxFQUFqQjtBQUNBLFVBQU1rQixTQUFTLEdBQUcsS0FBS2YsZ0JBQUwsRUFBbEI7O0FBRUEsVUFBSSxDQUFDLEtBQUtyQixJQUFWLEVBQWdCO0FBQ2YsWUFBSSxLQUFLRixLQUFULEVBQWdCO0FBQ2YsY0FBTUssV0FBVyxHQUFHb0IsS0FBSyxDQUFDekIsS0FBMUI7QUFDQSxjQUFNOEMsY0FBYyxHQUFHLENBQUMsS0FBSzlDLEtBQUwsR0FBYXFDLFFBQWIsR0FBd0IsS0FBS0ssa0JBQUwsRUFBekIsSUFBc0QsQ0FBN0U7QUFFQSxlQUFLaEMsT0FBTCxHQUFlLEtBQUtBLE9BQUwsR0FBZW9DLGNBQWYsR0FBZ0NBLGNBQWhDLEdBQ2J6QyxXQUFXLEdBQUcsS0FBS0ssT0FBcEIsR0FBK0JvQyxjQUEvQixHQUFnRHpDLFdBQVcsR0FBR3lDLGNBQTlELEdBQ0EsS0FBS3BDLE9BRk47QUFHQTs7QUFFRCxZQUFJLEtBQUtULE1BQVQsRUFBaUI7QUFDaEIsY0FBTUcsWUFBWSxHQUFHcUIsS0FBSyxDQUFDeEIsTUFBM0I7QUFDQSxjQUFNOEMsZUFBZSxHQUFHLENBQUMsS0FBSzlDLE1BQUwsR0FBY3FDLFNBQWQsR0FBMEIsS0FBS00sZ0JBQUwsRUFBM0IsSUFBc0QsQ0FBOUU7QUFFQSxlQUFLakMsT0FBTCxHQUFlLEtBQUtBLE9BQUwsR0FBZW9DLGVBQWYsR0FBaUNBLGVBQWpDLEdBQ2IzQyxZQUFZLEdBQUcsS0FBS08sT0FBckIsR0FBZ0NvQyxlQUFoQyxHQUFrRDNDLFlBQVksR0FBRzJDLGVBQWpFLEdBQ0EsS0FBS3BDLE9BRk47QUFHQTtBQUNEO0FBQ0Q7Ozt5QkFFS2MsSyxFQUFPO0FBQ1osVUFBTXVCLFNBQVMsR0FBRyxLQUFLM0QsS0FBdkI7QUFFQSxVQUFJNEQsU0FBUyxHQUFHRCxTQUFTLEdBQUd2QixLQUFLLENBQUN5QixTQUFsQztBQUVBRCxlQUFTLEdBQUdqQyxJQUFJLENBQUNDLEdBQUwsQ0FBU2dDLFNBQVQsRUFBb0IsS0FBSzNELFFBQXpCLENBQVo7QUFDQTJELGVBQVMsR0FBR2pDLElBQUksQ0FBQ21DLEdBQUwsQ0FBU0YsU0FBVCxFQUFvQixLQUFLMUQsUUFBekIsQ0FBWjs7QUFFQSxVQUFJeUQsU0FBUyxLQUFLQyxTQUFsQixFQUE2QjtBQUM1QixhQUFLNUQsS0FBTCxHQUFhNEQsU0FBYixDQUQ0QixDQUc1Qjs7QUFDQSxhQUFLRyxJQUFMLENBQVU7QUFDVHJCLGdCQUFNLEVBQUksQ0FBQ04sS0FBSyxDQUFDNEIsT0FBTixHQUFnQixLQUFLM0MsT0FBdEIsSUFBaUNzQyxTQUFsQyxJQUFnREEsU0FBUyxHQUFHQyxTQUE1RCxDQURBO0FBRVRoQixnQkFBTSxFQUFJLENBQUNSLEtBQUssQ0FBQzZCLE9BQU4sR0FBZ0IsS0FBSzNDLE9BQXRCLElBQWlDcUMsU0FBbEMsSUFBZ0RBLFNBQVMsR0FBR0MsU0FBNUQsQ0FGQTtBQUdUakQsZUFBSyxFQUFFeUIsS0FBSyxDQUFDRSxNQUFOLENBQWFFLFdBSFg7QUFJVDVCLGdCQUFNLEVBQUV3QixLQUFLLENBQUNFLE1BQU4sQ0FBYUM7QUFKWixTQUFWO0FBTUE7QUFDRDs7OzBCQUVNMkIsTSxFQUFRO0FBQ2QxRCxZQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFkLEVBQW9CQyxtREFBSSxDQUFDd0QsTUFBRCxFQUFTLENBQUMsUUFBRCxFQUFXLE9BQVgsRUFBb0IsZUFBcEIsQ0FBVCxDQUF4QjtBQUVBLFdBQUtwRCxVQUFMLENBQWdCb0QsTUFBTSxDQUFDbkQsWUFBdkIsRUFBcUNtRCxNQUFNLENBQUNsRCxXQUE1QztBQUVBLFdBQUtDLFVBQUwsQ0FBZ0JpRCxNQUFNLENBQUNsRCxXQUF2QixFQUFvQ2tELE1BQU0sQ0FBQ2hELE9BQTNDO0FBQ0EsV0FBS0MsVUFBTCxDQUFnQitDLE1BQU0sQ0FBQ25ELFlBQXZCLEVBQXFDbUQsTUFBTSxDQUFDOUMsT0FBNUM7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzTEY7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFFQSxJQUFNK0MsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQjtBQUFBLE1BQUVDLFNBQUYsUUFBRUEsU0FBRjtBQUFBLE1BQWFDLFFBQWIsUUFBYUEsUUFBYjtBQUFBLE1BQXVCQyxVQUF2QixRQUF1QkEsVUFBdkI7QUFBQSxTQUF3QztBQUNqRUMsUUFBSSxFQUFFSCxTQUFTLFlBQVlJLGtEQUFyQixHQUE4QkosU0FBOUIsR0FBMEMsSUFBSUksa0RBQUosQ0FBV0osU0FBWCxDQURpQjtBQUVqRUssV0FBTyxFQUFFSixRQUFRLFlBQVlHLGtEQUFwQixHQUE2QkgsUUFBN0IsR0FDUkEsUUFBUSxHQUFHLElBQUlHLGtEQUFKLENBQVdILFFBQVgsQ0FBSCxHQUNSQSxRQUpnRTtBQUtqRUMsY0FBVSxFQUFWQTtBQUxpRSxHQUF4QztBQUFBLENBQTFCOztJQVFxQkksa0I7Ozs7O0FBQ3BCLDhCQUFZdEUsUUFBWixFQUFzQjtBQUFBOztBQUFBOztBQUNyQiw0RkFBTUEsUUFBTjtBQUVBLEtBQ0MsWUFERCxFQUVDLFdBRkQsRUFJQyxVQUpELEVBS0MsVUFMRCxFQU9DLG9CQVBELEVBUUMsa0JBUkQsRUFVQyxvQkFWRCxFQVdDLGtCQVhELEVBYUMsMEJBYkQsRUFjQyx3QkFkRCxFQWdCQyxhQWhCRCxFQWlCQyxhQWpCRCxFQWtCQyxVQWxCRCxFQW9CQyxVQXBCRCxFQXFCQyxrQkFyQkQsRUFzQkMsYUF0QkQsRUF1QkVDLEdBdkJGLENBdUJNLFVBQUFDLE1BQU07QUFBQSxhQUFJLE1BQUtBLE1BQUwsSUFBZSxNQUFLQSxNQUFMLEVBQWFDLElBQWIsdURBQW5CO0FBQUEsS0F2Qlo7QUFIcUI7QUEyQnJCOzs7O2lDQUVZO0FBQ1osYUFBTyxLQUFLb0UsUUFBTCxFQUFQO0FBQ0E7OztnQ0FFVztBQUNYLGFBQU8sS0FBS0EsUUFBTCxFQUFQO0FBQ0E7OzsrQkFFVTtBQUNWLGFBQU8sS0FBSzNFLEtBQUwsR0FBYSxDQUFwQjtBQUNBOzs7K0JBRVU7QUFDVixhQUFPLEtBQUs0RSxRQUFMLEtBQWtCQyxrREFBekI7QUFDQTs7O3lDQUVvQjtBQUNwQixhQUFPLENBQVA7QUFDQTs7O3VDQUVrQjtBQUNsQixhQUFPLENBQVA7QUFDQTs7O3lDQUVvQjtBQUNwQixhQUFPLEtBQUtGLFFBQUwsRUFBUDtBQUNBOzs7dUNBRWtCO0FBQ2xCLGFBQU8sS0FBS0EsUUFBTCxFQUFQO0FBQ0E7Ozs2Q0FFd0JHLE0sRUFBUUMsSyxFQUFPO0FBQ3ZDLGFBQU9ELE1BQU0sR0FBR0MsS0FBVCxHQUFpQkYsa0RBQWpCLEdBQTRCLENBQW5DO0FBQ0E7OzsyQ0FFc0JDLE0sRUFBUUMsSyxFQUFPO0FBQ3JDLGFBQU9ELE1BQU0sR0FBR0MsS0FBVCxHQUFpQkYsa0RBQWpCLEdBQTRCLENBQW5DO0FBQ0E7OztnQ0FFV0csTSxFQUFRO0FBQ25CQSxZQUFNLEdBQUdBLE1BQU0sWUFBWVIsa0RBQWxCLEdBQTJCUSxNQUEzQixjQUF3Q1Isa0RBQXhDLDZCQUFrRFMsU0FBbEQsRUFBVDtBQUVBLFVBQU1DLENBQUMsR0FBSUYsTUFBTSxDQUFDRyxJQUFQLEtBQWdCLEtBQUtSLFFBQUwsRUFBakIsR0FBb0MsS0FBS3RELE9BQW5EO0FBQ0EsVUFBTStELENBQUMsR0FBRyxLQUFLOUQsT0FBTCxHQUFnQjBELE1BQU0sQ0FBQ0ssSUFBUCxLQUFnQixLQUFLVixRQUFMLEVBQTFDO0FBRUEsYUFBTyxJQUFJVyxpREFBSixDQUFVSixDQUFWLEVBQWFFLENBQWIsQ0FBUDtBQUNBOzs7Z0NBRVlHLEssRUFBTztBQUNuQkEsV0FBSyxHQUFHQSxLQUFLLFlBQVlELGlEQUFqQixHQUF5QkMsS0FBekIsY0FBcUNELGlEQUFyQyw2QkFBOENMLFNBQTlDLEVBQVI7QUFFQSxVQUFNTyxNQUFNLEdBQUdELEtBQUssQ0FBQ0osSUFBTixLQUFlLEtBQUs5RCxPQUFuQztBQUNBLFVBQU1vRSxNQUFNLEdBQUcsS0FBS25FLE9BQUwsR0FBZWlFLEtBQUssQ0FBQ0YsSUFBTixFQUE5QjtBQUVBLFVBQU1ILENBQUMsR0FBR00sTUFBTSxHQUFHLEtBQUtiLFFBQUwsRUFBbkI7QUFDQSxVQUFNUyxDQUFDLEdBQUdLLE1BQU0sR0FBRyxLQUFLZCxRQUFMLEVBQW5CO0FBRUEsYUFBTyxJQUFJSCxrREFBSixDQUFXVSxDQUFYLEVBQWNFLENBQWQsQ0FBUDtBQUNBOzs7b0NBRWlCO0FBQUEsVUFBUEYsQ0FBTyxTQUFQQSxDQUFPO0FBQUEsVUFBSkUsQ0FBSSxTQUFKQSxDQUFJO0FBQ2pCLFVBQUksQ0FBQyxLQUFLdkUsSUFBVixFQUFnQixPQUFPLElBQUl5RSxpREFBSixDQUFVSixDQUFWLEVBQWFFLENBQWIsQ0FBUDtBQUVoQkYsT0FBQyxHQUFHQSxDQUFDLEdBQUcsS0FBS3ZFLEtBQWI7QUFDQXlFLE9BQUMsR0FBR0EsQ0FBQyxHQUFHLEtBQUt4RSxNQUFiO0FBRUFzRSxPQUFDLEdBQUdBLENBQUMsR0FBRyxDQUFKLEdBQVEsS0FBS3ZFLEtBQUwsR0FBYXVFLENBQXJCLEdBQXlCQSxDQUE3QjtBQUNBRSxPQUFDLEdBQUdBLENBQUMsR0FBRyxDQUFKLEdBQVEsS0FBS3hFLE1BQUwsR0FBY3dFLENBQXRCLEdBQTBCQSxDQUE5QjtBQUVBLGFBQU8sSUFBSUUsaURBQUosQ0FBVUosQ0FBVixFQUFhRSxDQUFiLENBQVA7QUFDQTs7O29DQUVpQjtBQUFBLFVBQVBGLENBQU8sU0FBUEEsQ0FBTztBQUFBLFVBQUpFLENBQUksU0FBSkEsQ0FBSTs7QUFDakIsVUFBSSxLQUFLdkQsYUFBVCxFQUF3QjtBQUN2QixlQUFPLENBQUMsQ0FBQyxLQUFLbEIsS0FBTixJQUFlZ0IsSUFBSSxDQUFDK0QsR0FBTCxDQUFTUixDQUFULEtBQWV2RCxJQUFJLENBQUNnRSxLQUFMLENBQVcsS0FBS2hGLEtBQUwsR0FBYSxDQUF4QixDQUEvQixNQUNGLENBQUMsS0FBS0MsTUFBTixJQUFnQmUsSUFBSSxDQUFDK0QsR0FBTCxDQUFTTixDQUFULEtBQWV6RCxJQUFJLENBQUNnRSxLQUFMLENBQVcsS0FBSy9FLE1BQUwsR0FBYyxDQUF6QixDQUQ3QixDQUFQO0FBRUEsT0FIRCxNQUlLO0FBQ0osZUFBTyxDQUFDLENBQUMsS0FBS0QsS0FBTixJQUFnQnVFLENBQUMsSUFBSSxDQUFMLElBQVVBLENBQUMsR0FBRyxLQUFLdkUsS0FBcEMsTUFDRixDQUFDLEtBQUtDLE1BQU4sSUFBaUJ3RSxDQUFDLElBQUksQ0FBTCxJQUFVQSxDQUFDLEdBQUcsS0FBS3hFLE1BRGxDLENBQVA7QUFFQTtBQUNEOzs7NENBRTBDO0FBQUEsVUFBeEJ3RCxTQUF3QixTQUF4QkEsU0FBd0I7QUFBQSxVQUFiRSxVQUFhLFNBQWJBLFVBQWE7QUFDMUMsYUFBTyxLQUFLekQsSUFBTCxHQUFZO0FBQUN1RCxpQkFBUyxFQUFUQSxTQUFEO0FBQVlDLGdCQUFRLEVBQUUsS0FBS3VCLFFBQUwsQ0FBY3hCLFNBQWQsQ0FBdEI7QUFBZ0RFLGtCQUFVLEVBQVZBO0FBQWhELE9BQVosR0FDTixLQUFLdUIsUUFBTCxDQUFjekIsU0FBZCxJQUEyQjtBQUFDQSxpQkFBUyxFQUFUQSxTQUFEO0FBQVlDLGdCQUFRLEVBQUVELFNBQXRCO0FBQWlDRSxrQkFBVSxFQUFWQTtBQUFqQyxPQUEzQixHQUNBO0FBQUNGLGlCQUFTLEVBQVRBLFNBQUQ7QUFBWUMsZ0JBQVEsRUFBRSxJQUF0QjtBQUE0QkMsa0JBQVUsRUFBVkE7QUFBNUIsT0FGRDtBQUdBOzs7Z0NBRVd3QixjLEVBQWdCQyxlLEVBQWlCQyxjLEVBQWdCQyxlLEVBQWlCO0FBQUE7O0FBQzdFLFVBQU1DLGFBQWEsR0FBRyxLQUFLQyxXQUFMLENBQWlCTCxjQUFqQixDQUF0QjtBQUNBLFVBQU1NLGNBQWMsR0FBRyxLQUFLRCxXQUFMLENBQWlCRixlQUFqQixDQUF2QjtBQUNBLFVBQU1JLGNBQWMsR0FBRyxLQUFLRixXQUFMLENBQWlCSixlQUFqQixDQUF2QjtBQUVBLFVBQU1PLE9BQU8sR0FBR0MsZ0VBQWMsQ0FBQ0wsYUFBYSxDQUFDZixJQUFkLEVBQUQsRUFBdUJrQixjQUFjLENBQUNsQixJQUFmLEVBQXZCLENBQTlCO0FBQ0EsVUFBTXFCLElBQUksR0FBR0QsZ0VBQWMsQ0FBQ0gsY0FBYyxDQUFDZixJQUFmLEVBQUQsRUFBd0JhLGFBQWEsQ0FBQ2IsSUFBZCxFQUF4QixDQUEzQjs7QUFFQSxVQUFNb0IsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQXZCLENBQUM7QUFBQSxlQUFJc0IsSUFBSSxDQUFDbkcsR0FBTCxDQUFTLFVBQUErRSxDQUFDO0FBQUEsaUJBQUs7QUFBQ0YsYUFBQyxFQUFEQSxDQUFEO0FBQUlFLGFBQUMsRUFBREE7QUFBSixXQUFMO0FBQUEsU0FBVixDQUFKO0FBQUEsT0FBcEI7O0FBQ0EsVUFBTXNCLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQXRDLFNBQVM7QUFBQSxlQUFLO0FBQUNBLG1CQUFTLEVBQVRBLFNBQUQ7QUFBWUUsb0JBQVUsRUFBRSxNQUFJLENBQUNxQyxXQUFMLENBQWlCdkMsU0FBakI7QUFBeEIsU0FBTDtBQUFBLE9BQWhDOztBQUVBLGFBQU93Qyw0Q0FBQSxDQUFZTixPQUFaLEVBQ05qRyxHQURNLENBQ0ZvRyxVQURFLEVBRU5JLE9BRk0sR0FHTnhHLEdBSE0sQ0FHRnFHLGNBSEUsRUFJTnJHLEdBSk0sQ0FJRixLQUFLeUcsZ0JBSkgsRUFLTnpHLEdBTE0sQ0FLRjhELGlCQUxFLEVBTU40QyxLQU5NLEVBQVA7QUFPQTs7OztFQTFJOEM1Ryx3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEJoRDtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBLElBQU02RyxjQUFjLEdBQUcsU0FBakJBLGNBQWlCO0FBQUEsTUFBRTVDLFNBQUYsUUFBRUEsU0FBRjtBQUFBLE1BQWFDLFFBQWIsUUFBYUEsUUFBYjtBQUFBLE1BQXVCQyxVQUF2QixRQUF1QkEsVUFBdkI7QUFBQSxTQUF3QztBQUM5REMsUUFBSSxFQUFFSCxTQUFTLFlBQVk2QywrQ0FBckIsR0FBMkI3QyxTQUEzQixHQUF1QyxJQUFJNkMsK0NBQUosQ0FBUTdDLFNBQVIsQ0FEaUI7QUFFOURLLFdBQU8sRUFBRUosUUFBUSxZQUFZNEMsK0NBQXBCLEdBQTBCNUMsUUFBMUIsR0FDUkEsUUFBUSxHQUFHLElBQUk0QywrQ0FBSixDQUFRNUMsUUFBUixDQUFILEdBQ1JBLFFBSjZEO0FBSzlEQyxjQUFVLEVBQVZBO0FBTDhELEdBQXhDO0FBQUEsQ0FBdkI7O0FBUUEsSUFBTTRDLFlBQVksR0FBRyxJQUFJRCwrQ0FBSixDQUFRO0FBQUMvQixHQUFDLEVBQUUsQ0FBSjtBQUFPRSxHQUFDLEVBQUUsQ0FBVjtBQUFhK0IsR0FBQyxFQUFFO0FBQWhCLENBQVIsQ0FBckI7O0lBRXFCQyxtQjs7Ozs7QUFDcEIsK0JBQWFoSCxRQUFiLEVBQXVCO0FBQUE7O0FBQUE7O0FBQ3RCLDZGQUFNQSxRQUFOO0FBRUEsS0FDQyxZQURELEVBRUMsV0FGRCxFQUlDLFVBSkQsRUFLQyxVQUxELEVBT0Msb0JBUEQsRUFRQyxrQkFSRCxFQVVDLG9CQVZELEVBV0Msa0JBWEQsRUFhQywwQkFiRCxFQWNDLHdCQWRELEVBZ0JDLGFBaEJELEVBaUJDLGFBakJELEVBa0JDLFVBbEJELEVBb0JDLFVBcEJELEVBcUJDLGtCQXJCRCxFQXNCQyxhQXRCRCxFQXVCRUMsR0F2QkYsQ0F1Qk0sVUFBQUMsTUFBTTtBQUFBLGFBQUksTUFBS0EsTUFBTCxJQUFlLE1BQUtBLE1BQUwsRUFBYUMsSUFBYix1REFBbkI7QUFBQSxLQXZCWjs7QUF5QkEsUUFBSSxNQUFLOEcsTUFBVCxFQUFpQjtBQUNoQixZQUFLQyxPQUFMLEdBQWUsQ0FDZCxJQUFJTCwrQ0FBSixDQUFRO0FBQUU7QUFDVC9CLFNBQUMsRUFBRSxJQUFJLE1BQUttQyxNQUFULEdBQWtCLENBRGQ7QUFFUGpDLFNBQUMsRUFBRSxDQUFDLE1BQUtpQyxNQUFOLEdBQWUsQ0FGWDtBQUdQRixTQUFDLEVBQUUsQ0FBQyxNQUFLRTtBQUhGLE9BQVIsQ0FEYyxFQU1kLElBQUlKLCtDQUFKLENBQVE7QUFBRTtBQUNUL0IsU0FBQyxFQUFFLE1BQUttQyxNQUFMLEdBQWMsQ0FEVjtBQUVQakMsU0FBQyxFQUFFLE1BQUtpQyxNQUZEO0FBR1BGLFNBQUMsRUFBRSxDQUFDLENBQUQsR0FBSyxNQUFLRSxNQUFWLEdBQW1CO0FBSGYsT0FBUixDQU5jLEVBV2QsSUFBSUosK0NBQUosQ0FBUTtBQUFFO0FBQ1QvQixTQUFDLEVBQUUsQ0FBQyxNQUFLbUMsTUFERjtBQUVQakMsU0FBQyxFQUFFLElBQUksTUFBS2lDLE1BQVQsR0FBa0IsQ0FGZDtBQUdQRixTQUFDLEVBQUUsQ0FBQyxNQUFLRSxNQUFOLEdBQWU7QUFIWCxPQUFSLENBWGMsRUFnQmQsSUFBSUosK0NBQUosQ0FBUztBQUFFO0FBQ1YvQixTQUFDLEVBQUUsQ0FBQyxDQUFELEdBQUssTUFBS21DLE1BQVYsR0FBbUIsQ0FEZDtBQUVSakMsU0FBQyxFQUFFLE1BQUtpQyxNQUFMLEdBQWMsQ0FGVDtBQUdSRixTQUFDLEVBQUUsTUFBS0U7QUFIQSxPQUFULENBaEJjLEVBcUJkLElBQUlKLCtDQUFKLENBQVM7QUFBRTtBQUNWL0IsU0FBQyxFQUFFLENBQUMsTUFBS21DLE1BQU4sR0FBZSxDQURWO0FBRVJqQyxTQUFDLEVBQUUsQ0FBQyxNQUFLaUMsTUFGRDtBQUdSRixTQUFDLEVBQUUsSUFBSSxNQUFLRSxNQUFULEdBQWtCO0FBSGIsT0FBVCxDQXJCYyxFQTBCZCxJQUFJSiwrQ0FBSixDQUFTO0FBQUU7QUFDVi9CLFNBQUMsRUFBRSxNQUFLbUMsTUFEQTtBQUVSakMsU0FBQyxFQUFFLENBQUMsQ0FBRCxHQUFLLE1BQUtpQyxNQUFWLEdBQW1CLENBRmQ7QUFHUkYsU0FBQyxFQUFFLE1BQUtFLE1BQUwsR0FBYztBQUhULE9BQVQsQ0ExQmMsQ0FBZjtBQWdDQTs7QUE3RHFCO0FBOER0Qjs7OztpQ0FFYTtBQUNiLGFBQU8sS0FBSzFDLFFBQUwsRUFBUDtBQUNBOzs7Z0NBRVk7QUFDWixhQUFPLEtBQUtDLFFBQUwsRUFBUDtBQUNBOzs7K0JBRVc7QUFDWCxhQUFPLEtBQUs1RSxLQUFMLEdBQWEsQ0FBcEI7QUFDQTs7OytCQUVXO0FBQ1gsYUFBTyxLQUFLQSxLQUFMLEdBQWF1SCwrQ0FBcEI7QUFDQTs7O3lDQUVxQjtBQUNyQixhQUFPLEtBQUszQyxRQUFMLEtBQWtCLElBQXpCO0FBQ0E7Ozt1Q0FFbUI7QUFDbkIsYUFBTyxDQUFQO0FBQ0E7Ozt5Q0FFcUI7QUFDckIsYUFBTyxLQUFLQSxRQUFMLE1BQW1CLElBQUUsQ0FBckIsQ0FBUDtBQUNBOzs7dUNBRW1CO0FBQ25CLGFBQU8sS0FBS0QsUUFBTCxFQUFQO0FBQ0E7Ozs2Q0FFeUJHLE0sRUFBUUMsSyxFQUFPO0FBQ3hDLGFBQU9ELE1BQU0sSUFBSUMsS0FBSyxHQUFHLElBQVIsR0FBZSxJQUFuQixDQUFOLEdBQWlDLENBQXhDO0FBQ0E7OzsyQ0FFdUJELE0sRUFBUUMsSyxFQUFPO0FBQ3RDLGFBQU9ELE1BQU0sR0FBR0MsS0FBVCxHQUFpQndDLCtDQUF4QjtBQUNBOzs7Z0NBRVlDLEcsRUFBSztBQUNqQkEsU0FBRyxHQUFHQSxHQUFHLFlBQVlQLCtDQUFmLEdBQXFCTyxHQUFyQixjQUErQlAsK0NBQS9CLDZCQUFzQ2hDLFNBQXRDLEVBQU47QUFFQSxVQUFNTyxNQUFNLEdBQUcsS0FBS3hGLEtBQUwsR0FBYSxDQUFiLEdBQWUsQ0FBZixHQUFtQndILEdBQUcsQ0FBQ0MsSUFBSixFQUFuQixHQUFnQyxLQUFLcEcsT0FBcEQ7QUFDQSxVQUFNb0UsTUFBTSxHQUFHLEtBQUt6RixLQUFMLEdBQWF1SCwrQ0FBYixJQUFzQkMsR0FBRyxDQUFDRSxJQUFKLEtBQWNGLEdBQUcsQ0FBQ0MsSUFBSixLQUFhLENBQWpELElBQXVELEtBQUtuRyxPQUEzRTtBQUVBLGFBQU8sSUFBSWdFLGlEQUFKLENBQVVFLE1BQVYsRUFBa0JDLE1BQWxCLENBQVA7QUFDQTs7O2dDQUVZRixLLEVBQU87QUFDbkJBLFdBQUssR0FBR0EsS0FBSyxZQUFZRCxpREFBakIsR0FBeUJDLEtBQXpCLGNBQXFDRCxpREFBckMsNkJBQThDTCxTQUE5QyxFQUFSO0FBRUEsVUFBTU8sTUFBTSxHQUFHRCxLQUFLLENBQUNKLElBQU4sS0FBZSxLQUFLOUQsT0FBbkM7QUFDQSxVQUFNb0UsTUFBTSxHQUFHRixLQUFLLENBQUNGLElBQU4sS0FBZSxLQUFLL0QsT0FBbkM7QUFFQSxVQUFNcUcsQ0FBQyxHQUFJbkMsTUFBTSxJQUFJLElBQUksQ0FBUixDQUFQLEdBQXFCLEtBQUt4RixLQUFwQztBQUNBLFVBQU00SCxDQUFDLEdBQUcsQ0FBRW5DLE1BQU0sSUFBSThCLCtDQUFLLEdBQUcsQ0FBWixDQUFQLEdBQTBCL0IsTUFBTSxHQUFHLENBQXBDLElBQTBDLEtBQUt4RixLQUF6RDtBQUVBLGFBQU8sSUFBSWlILCtDQUFKLENBQVFVLENBQVIsRUFBV0MsQ0FBWCxDQUFQO0FBQ0E7Ozs2QkFFU0osRyxFQUFLO0FBQ2QsVUFBSSxDQUFDLEtBQUszRyxJQUFWLEVBQWdCLE9BQU8yRyxHQUFQO0FBRWhCQSxTQUFHLEdBQUlBLEdBQUcsWUFBWVAsK0NBQWYsR0FBcUJPLEdBQXJCLEdBQTJCLElBQUlQLCtDQUFKLENBQVFPLEdBQVIsQ0FBbEM7O0FBRUEsVUFBSSxLQUFLSCxNQUFULEVBQWlCO0FBQ2hCLFlBQUlHLEdBQUcsQ0FBQ0ssUUFBSixDQUFhWCxZQUFiLEtBQThCLEtBQUtHLE1BQXZDLEVBQStDLE9BQU9HLEdBQVA7QUFFL0MsWUFBTU0sU0FBUyxHQUFHLEtBQUtSLE9BQUwsQ0FBYWpILEdBQWIsQ0FBaUIsVUFBQTBILE1BQU07QUFBQSxpQkFBSVAsR0FBRyxDQUFDSyxRQUFKLENBQWFFLE1BQWIsQ0FBSjtBQUFBLFNBQXZCLENBQWxCO0FBQ0EsWUFBTUEsTUFBTSxHQUFHLEtBQUtULE9BQUwsQ0FBYVEsU0FBUyxDQUFDRSxPQUFWLENBQWtCckcsSUFBSSxDQUFDbUMsR0FBTCxPQUFBbkMsSUFBSSxxQkFBUW1HLFNBQVIsRUFBdEIsQ0FBYixDQUFmO0FBRUEsZUFBTyxLQUFLbEMsUUFBTCxDQUFjNEIsR0FBRyxDQUFDUyxXQUFKLENBQWdCRixNQUFoQixDQUFkLENBQVA7QUFDQSxPQVBELE1BUUs7QUFBQSwrQkFDYWQsK0NBQUcsQ0FBQ2lCLFdBQUosQ0FBZ0JWLEdBQWhCLENBRGI7QUFBQSxZQUNDVyxHQURELG9CQUNDQSxHQUREO0FBQUEsWUFDTUMsR0FETixvQkFDTUEsR0FETixFQUdKOzs7QUFDQSxZQUFJLEtBQUt6SCxLQUFMLEdBQWEsQ0FBakIsRUFBb0I7QUFDbkIsY0FBTTBILE1BQU0sR0FBRzFHLElBQUksQ0FBQ2dFLEtBQUwsQ0FBV3dDLEdBQUcsR0FBRyxLQUFLeEgsS0FBdEIsQ0FBZjtBQUVBLGNBQUkySCxjQUFjLEdBQUdELE1BQU0sR0FBRyxDQUE5QjtBQUNBQyx3QkFBYyxHQUFHRCxNQUFNLEdBQUcsQ0FBVCxLQUFlLENBQWYsR0FBbUJDLGNBQW5CLEdBQ2hCSCxHQUFHLEdBQUcsQ0FBTixHQUFVeEcsSUFBSSxDQUFDNEcsSUFBTCxDQUFVRCxjQUFWLENBQVYsR0FDQTNHLElBQUksQ0FBQ2dFLEtBQUwsQ0FBVzJDLGNBQVgsQ0FGRDtBQUlBRixhQUFHLElBQUlFLGNBQVA7QUFDQTs7QUFFRCxZQUFNRSxTQUFTLEdBQUk3RyxJQUFJLENBQUNnRSxLQUFMLENBQVcsS0FBS2hGLEtBQUwsR0FBYSxDQUF4QixDQUFuQjtBQUNBLFlBQU04SCxVQUFVLEdBQUc5RyxJQUFJLENBQUNnRSxLQUFMLENBQVcsS0FBSy9FLE1BQUwsR0FBYyxDQUF6QixDQUFuQjs7QUFFQSxZQUFJLEtBQUtpQixhQUFULEVBQXdCO0FBQ3ZCc0csYUFBRyxJQUFJSyxTQUFQO0FBQ0FKLGFBQUcsSUFBSUssVUFBUDtBQUNBOztBQUVETixXQUFHLEdBQUdBLEdBQUcsR0FBRyxLQUFLeEgsS0FBakI7QUFDQXlILFdBQUcsR0FBR0EsR0FBRyxHQUFHLEtBQUt4SCxNQUFqQjtBQUVBdUgsV0FBRyxHQUFHQSxHQUFHLEdBQUcsQ0FBTixHQUFVQSxHQUFHLEdBQUcsS0FBS3hILEtBQXJCLEdBQTZCd0gsR0FBbkM7QUFDQUMsV0FBRyxHQUFHQSxHQUFHLEdBQUcsQ0FBTixHQUFVQSxHQUFHLEdBQUcsS0FBS3hILE1BQXJCLEdBQThCd0gsR0FBcEM7O0FBRUEsWUFBSSxLQUFLdkcsYUFBVCxFQUF3QjtBQUN2QnNHLGFBQUcsSUFBSUssU0FBUDtBQUNBSixhQUFHLElBQUlLLFVBQVA7QUFDQTs7QUFFRCxlQUFPeEIsK0NBQUcsQ0FBQ3lCLFdBQUosQ0FBZ0JQLEdBQWhCLEVBQXFCQyxHQUFyQixDQUFQO0FBQ0E7QUFDRDs7O29DQUU2QjtBQUFBLFVBQW5CbEQsQ0FBbUIsU0FBbkJBLENBQW1CO0FBQUEsVUFBaEJpQyxDQUFnQixTQUFoQkEsQ0FBZ0I7QUFBQSwwQkFBYi9CLENBQWE7QUFBQSxVQUFiQSxDQUFhLHdCQUFULENBQUNGLENBQUQsR0FBS2lDLENBQUk7O0FBQzdCLFVBQUksS0FBS0UsTUFBVCxFQUFpQjtBQUNoQixZQUFJLEtBQUt4RixhQUFULEVBQXdCO0FBQ3ZCLGlCQUFPRixJQUFJLENBQUNDLEdBQUwsQ0FBU0QsSUFBSSxDQUFDK0QsR0FBTCxDQUFTUixDQUFULENBQVQsRUFBc0J2RCxJQUFJLENBQUMrRCxHQUFMLENBQVNOLENBQVQsQ0FBdEIsRUFBbUN6RCxJQUFJLENBQUMrRCxHQUFMLENBQVN5QixDQUFULENBQW5DLEtBQW1EeEYsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXLEtBQUswQixNQUFoQixDQUExRDtBQUNBLFNBRkQsTUFHSztBQUNKLGlCQUFPMUYsSUFBSSxDQUFDQyxHQUFMLENBQVNELElBQUksQ0FBQytELEdBQUwsQ0FBU1IsQ0FBQyxHQUFHLEtBQUttQyxNQUFsQixDQUFULEVBQW9DMUYsSUFBSSxDQUFDK0QsR0FBTCxDQUFTTixDQUFDLEdBQUcsS0FBS2lDLE1BQWxCLENBQXBDLEVBQStEMUYsSUFBSSxDQUFDK0QsR0FBTCxDQUFTeUIsQ0FBVCxDQUEvRCxLQUErRSxLQUFLRSxNQUEzRjtBQUNBO0FBQ0QsT0FQRCxNQVFLLElBQUksS0FBSzFHLEtBQUwsSUFBYyxLQUFLQyxNQUF2QixFQUErQjtBQUNuQyxZQUFJLEtBQUtpQixhQUFULEVBQXdCO0FBQ3ZCLGlCQUFPLENBQUMsQ0FBQyxLQUFLbEIsS0FBTixJQUFnQmdCLElBQUksQ0FBQytELEdBQUwsQ0FBU1IsQ0FBVCxJQUFjLEtBQUt2RSxLQUFMLEdBQWEsQ0FBNUMsTUFDRixDQUFDLEtBQUtDLE1BQU4sSUFBaUJlLElBQUksQ0FBQytELEdBQUwsQ0FBUyxDQUFDTixDQUFELEdBQUt6RCxJQUFJLENBQUNnRSxLQUFMLENBQVdULENBQUMsR0FBRyxDQUFmLENBQWQsSUFBb0MsS0FBS3RFLE1BQUwsR0FBYyxDQURqRSxDQUFQO0FBRUEsU0FIRCxNQUlLO0FBQ0osaUJBQU8sQ0FBQyxDQUFDLEtBQUtELEtBQU4sSUFBZ0J1RSxDQUFDLElBQUksQ0FBTCxJQUFVQSxDQUFDLEdBQUcsS0FBS3ZFLEtBQXBDLE1BQ0YsQ0FBQyxLQUFLQyxNQUFOLElBQWlCd0UsQ0FBQyxJQUFLekQsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXVCxDQUFDLEdBQUcsQ0FBZixJQUFvQixDQUFDLENBQTNCLElBQWtDLENBQUNFLENBQUQsR0FBS3pELElBQUksQ0FBQ2dFLEtBQUwsQ0FBV1QsQ0FBQyxHQUFHLENBQWYsQ0FBTixHQUEyQixLQUFLdEUsTUFEaEYsQ0FBUDtBQUVBO0FBQ0QsT0FUSSxNQVVBO0FBQ0osZUFBTyxJQUFQO0FBQ0E7QUFDRDs7OzRDQUUwQztBQUFBLFVBQXhCd0QsU0FBd0IsU0FBeEJBLFNBQXdCO0FBQUEsVUFBYkUsVUFBYSxTQUFiQSxVQUFhO0FBQzFDLGFBQU8sS0FBS3pELElBQUwsR0FBWTtBQUFDdUQsaUJBQVMsRUFBVEEsU0FBRDtBQUFZQyxnQkFBUSxFQUFFLEtBQUt1QixRQUFMLENBQWN4QixTQUFkLENBQXRCO0FBQWdERSxrQkFBVSxFQUFWQTtBQUFoRCxPQUFaLEdBQ04sS0FBS3VCLFFBQUwsQ0FBY3pCLFNBQWQsSUFBMkI7QUFBQ0EsaUJBQVMsRUFBVEEsU0FBRDtBQUFZQyxnQkFBUSxFQUFFRCxTQUF0QjtBQUFpQ0Usa0JBQVUsRUFBVkE7QUFBakMsT0FBM0IsR0FDQTtBQUFDRixpQkFBUyxFQUFUQSxTQUFEO0FBQVlDLGdCQUFRLEVBQUUsSUFBdEI7QUFBNEJDLGtCQUFVLEVBQVZBO0FBQTVCLE9BRkQ7QUFHQTs7O2dDQUVZd0IsYyxFQUFnQkMsZSxFQUFpQkMsYyxFQUFnQkMsZSxFQUFpQjtBQUFBOztBQUM5RSxVQUFNQyxhQUFhLEdBQUcsS0FBS0MsV0FBTCxDQUFpQkwsY0FBakIsQ0FBdEI7QUFDQSxVQUFNNkMsYUFBYSxHQUFHLEtBQUt4QyxXQUFMLENBQWlCSCxjQUFqQixDQUF0QjtBQUNBLFVBQU1JLGNBQWMsR0FBRyxLQUFLRCxXQUFMLENBQWlCRixlQUFqQixDQUF2QjtBQUNBLFVBQU1JLGNBQWMsR0FBRyxLQUFLRixXQUFMLENBQWlCSixlQUFqQixDQUF2QjtBQUVBLFVBQU1PLE9BQU8sR0FBR0MsZ0VBQWMsQ0FBQ0wsYUFBYSxDQUFDdUIsSUFBZCxLQUF1QixDQUF4QixFQUEyQnBCLGNBQWMsQ0FBQ29CLElBQWYsS0FBd0IsQ0FBbkQsQ0FBOUI7QUFFQSxVQUFNN0csTUFBTSxHQUFHd0YsY0FBYyxDQUFDc0IsSUFBZixLQUF3QnJCLGNBQWMsQ0FBQ3FCLElBQWYsRUFBdkM7O0FBRUEsVUFBTWhCLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQXRDLFNBQVM7QUFBQSxlQUFLO0FBQUNBLG1CQUFTLEVBQVRBLFNBQUQ7QUFBWUUsb0JBQVUsRUFBRSxNQUFJLENBQUNxQyxXQUFMLENBQWlCdkMsU0FBakI7QUFBeEIsU0FBTDtBQUFBLE9BQWhDOztBQUVBLFVBQU13RSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDakIsQ0FBRCxFQUFJa0IsS0FBSixFQUFjO0FBQ2hDLFlBQU1DLEdBQUcsR0FBRzVDLGFBQWEsQ0FBQ3dCLElBQWQsS0FBdUIvRixJQUFJLENBQUNnRSxLQUFMLENBQVdrRCxLQUFLLEdBQUcsQ0FBbkIsQ0FBbkM7QUFDQSxZQUFNRSxNQUFNLEdBQUdELEdBQUcsR0FBR2xJLE1BQXJCO0FBQ0EsWUFBTTRGLElBQUksR0FBR0QsZ0VBQWMsQ0FBQ3VDLEdBQUQsRUFBTUMsTUFBTSxHQUFHLENBQWYsQ0FBM0I7O0FBRUEsWUFBTXRDLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUFtQixDQUFDO0FBQUEsaUJBQUlYLCtDQUFHLENBQUMrQixRQUFKLENBQWFyQixDQUFiLEVBQWdCQyxDQUFoQixDQUFKO0FBQUEsU0FBcEI7O0FBRUEsZUFBT2hCLDRDQUFBLENBQVlKLElBQVosRUFDTm5HLEdBRE0sQ0FDRm9HLFVBREUsRUFFTnBHLEdBRk0sQ0FFRnFHLGNBRkUsRUFHTnJHLEdBSE0sQ0FHRixNQUFJLENBQUN5RyxnQkFISCxFQUlOekcsR0FKTSxDQUlGMkcsY0FKRSxFQUtORCxLQUxNLEVBQVA7QUFNQSxPQWJEOztBQWVBLGFBQU9ILDRDQUFBLENBQVlOLE9BQVosRUFDTmpHLEdBRE0sQ0FDRnVJLFVBREUsRUFFTi9CLE9BRk0sR0FHTkUsS0FITSxFQUFQO0FBSUE7Ozs7RUE5TytDNUcsd0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQmpEO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUEsSUFBTWdFLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0I7QUFBQSxNQUFFQyxTQUFGLFFBQUVBLFNBQUY7QUFBQSxNQUFhQyxRQUFiLFFBQWFBLFFBQWI7QUFBQSxNQUF1QkMsVUFBdkIsUUFBdUJBLFVBQXZCO0FBQUEsU0FBd0M7QUFDakVDLFFBQUksRUFBRUgsU0FBUyxZQUFZSSxrREFBckIsR0FBOEJKLFNBQTlCLEdBQTBDLElBQUlJLGtEQUFKLENBQVdKLFNBQVgsQ0FEaUI7QUFFakVLLFdBQU8sRUFBRUosUUFBUSxZQUFZRyxrREFBcEIsR0FBNkJILFFBQTdCLEdBQ1JBLFFBQVEsR0FBRyxJQUFJRyxrREFBSixDQUFXSCxRQUFYLENBQUgsR0FDUkEsUUFKZ0U7QUFLakVDLGNBQVUsRUFBVkE7QUFMaUUsR0FBeEM7QUFBQSxDQUExQjs7SUFRcUIyRSxvQjs7Ozs7QUFDcEIsZ0NBQVk3SSxRQUFaLEVBQXNCO0FBQUE7O0FBQUE7O0FBQ3JCLDhGQUFNQSxRQUFOO0FBRUEsS0FDQyxZQURELEVBRUMsV0FGRCxFQUlDLFVBSkQsRUFLQyxVQUxELEVBT0Msb0JBUEQsRUFRQyxrQkFSRCxFQVVDLG9CQVZELEVBV0Msa0JBWEQsRUFhQywwQkFiRCxFQWNDLHdCQWRELEVBZ0JDLGFBaEJELEVBaUJDLGFBakJELEVBa0JDLFVBbEJELEVBb0JDLFVBcEJELEVBcUJDLGtCQXJCRCxFQXNCQyxhQXRCRCxFQXVCRUMsR0F2QkYsQ0F1Qk0sVUFBQUMsTUFBTTtBQUFBLGFBQUksTUFBS0EsTUFBTCxJQUFlLE1BQUtBLE1BQUwsRUFBYUMsSUFBYix1REFBbkI7QUFBQSxLQXZCWjtBQUhxQjtBQTJCckI7Ozs7aUNBRVk7QUFDWixhQUFPLEtBQUtxRSxRQUFMLEVBQVA7QUFDQTs7O2dDQUVXO0FBQ1gsYUFBTyxLQUFLQSxRQUFMLEVBQVA7QUFDQTs7OytCQUVVO0FBQ1YsYUFBTyxLQUFLNUUsS0FBTCxHQUFhLENBQXBCO0FBQ0E7OzsrQkFFVTtBQUNWLGFBQU8sS0FBSzRFLFFBQUwsS0FBa0JDLGtEQUF6QjtBQUNBOzs7eUNBRW9CO0FBQ3BCLGFBQU8sS0FBS0QsUUFBTCxLQUFrQixHQUF6QjtBQUNBOzs7dUNBRWtCO0FBQ2xCLGFBQU8sS0FBS0EsUUFBTCxLQUFrQixHQUF6QjtBQUNBOzs7eUNBRW9CO0FBQ3BCLGFBQU8sS0FBS0EsUUFBTCxLQUFrQixDQUF6QjtBQUNBOzs7dUNBRWtCO0FBQ2xCLGFBQU8sS0FBS0EsUUFBTCxLQUFrQixDQUF6QjtBQUNBOzs7NkNBRXdCRSxNLEVBQVFDLEssRUFBTztBQUN2QyxhQUFPRCxNQUFNLElBQUlDLEtBQUssR0FBRyxDQUFaLENBQU4sR0FBdUIsQ0FBOUI7QUFDQTs7OzJDQUVzQkQsTSxFQUFRQyxLLEVBQU87QUFDckMsYUFBT0QsTUFBTSxJQUFJQyxLQUFLLEdBQUcsQ0FBWixDQUFOLEdBQXVCLENBQTlCO0FBQ0E7OztnQ0FFV0MsTSxFQUFRO0FBQ25CQSxZQUFNLEdBQUdBLE1BQU0sWUFBWVIsa0RBQWxCLEdBQTJCUSxNQUEzQixjQUF3Q1Isa0RBQXhDLDZCQUFrRFMsU0FBbEQsRUFBVDtBQUVBLFVBQU1DLENBQUMsR0FBR0YsTUFBTSxDQUFDRyxJQUFQLEVBQVY7QUFDQSxVQUFNQyxDQUFDLEdBQUdKLE1BQU0sQ0FBQ0ssSUFBUCxFQUFWLENBSm1CLENBTW5COztBQUNBLFVBQU1HLE1BQU0sR0FBSSxDQUFDTixDQUFDLEdBQUdFLENBQUosR0FBUSxDQUFDLENBQVQsR0FBYSxDQUFkLEtBQXNCekQsSUFBSSxDQUFDK0QsR0FBTCxDQUFTTixDQUFDLEdBQUdGLENBQWIsSUFBa0JnRSwrQ0FBeEMsSUFBbUQsS0FBS3ZFLFFBQUwsRUFBbkQsR0FBcUUsS0FBS3RELE9BQTFGO0FBQ0EsVUFBTW9FLE1BQU0sR0FBRyxLQUFLbkUsT0FBTCxHQUFlLENBQUMsQ0FBQzRELENBQUQsR0FBS0UsQ0FBTCxHQUFTLENBQVQsR0FBYSxDQUFDLENBQWYsS0FBdUJ6RCxJQUFJLENBQUMrRCxHQUFMLENBQVNSLENBQUMsR0FBR0UsQ0FBYixJQUFrQjhELCtDQUF6QyxJQUFvRCxLQUFLdkUsUUFBTCxFQUFsRjtBQUVBLGFBQU8sSUFBSVcsaURBQUosQ0FBVUUsTUFBVixFQUFrQkMsTUFBbEIsQ0FBUDtBQUNBOzs7Z0NBRVlGLEssRUFBTztBQUNuQkEsV0FBSyxHQUFHQSxLQUFLLFlBQVlELGlEQUFqQixHQUF5QkMsS0FBekIsY0FBcUNELGlEQUFyQyw2QkFBOENMLFNBQTlDLEVBQVI7QUFFQSxVQUFNTyxNQUFNLEdBQUdELEtBQUssQ0FBQ0osSUFBTixLQUFlLEtBQUs5RCxPQUFuQztBQUNBLFVBQU1vRSxNQUFNLEdBQUcsS0FBS25FLE9BQUwsR0FBZWlFLEtBQUssQ0FBQ0YsSUFBTixFQUE5QixDQUptQixDQU1uQjs7QUFDQSxVQUFNSCxDQUFDLEdBQUcsQ0FBQyxDQUFDTSxNQUFELEdBQVVDLE1BQVYsR0FBbUIsQ0FBbkIsR0FBdUIsQ0FBQyxDQUF6QixLQUFpQzlELElBQUksQ0FBQytELEdBQUwsQ0FBU0YsTUFBTSxHQUFHQyxNQUFsQixJQUE0QnlELCtDQUE3RCxJQUF3RSxLQUFLdkUsUUFBTCxFQUFsRjtBQUNBLFVBQU1TLENBQUMsR0FBSSxDQUFDSSxNQUFNLEdBQUdDLE1BQVQsR0FBa0IsQ0FBbEIsR0FBc0IsQ0FBQyxDQUF4QixLQUFnQzlELElBQUksQ0FBQytELEdBQUwsQ0FBU0QsTUFBTSxHQUFHRCxNQUFsQixJQUE0QjBELCtDQUE1RCxJQUF1RSxLQUFLdkUsUUFBTCxFQUFsRjtBQUVBLGFBQU8sSUFBSUgsa0RBQUosQ0FBV1UsQ0FBWCxFQUFjRSxDQUFkLENBQVA7QUFDQTs7O29DQUVpQjtBQUFBLFVBQVBGLENBQU8sU0FBUEEsQ0FBTztBQUFBLFVBQUpFLENBQUksU0FBSkEsQ0FBSTtBQUNqQixVQUFJLENBQUMsS0FBS3ZFLElBQVYsRUFBZ0IsT0FBTyxJQUFJeUUsaURBQUosQ0FBVUosQ0FBVixFQUFhRSxDQUFiLENBQVA7QUFFaEJGLE9BQUMsR0FBR0EsQ0FBQyxHQUFHLEtBQUt2RSxLQUFiO0FBQ0F5RSxPQUFDLEdBQUdBLENBQUMsR0FBRyxLQUFLeEUsTUFBYjtBQUVBc0UsT0FBQyxHQUFHQSxDQUFDLEdBQUcsQ0FBSixHQUFRLEtBQUt2RSxLQUFMLEdBQWF1RSxDQUFyQixHQUF5QkEsQ0FBN0I7QUFDQUUsT0FBQyxHQUFHQSxDQUFDLEdBQUcsQ0FBSixHQUFRLEtBQUt4RSxNQUFMLEdBQWN3RSxDQUF0QixHQUEwQkEsQ0FBOUI7QUFFQSxhQUFPLElBQUlFLGlEQUFKLENBQVVKLENBQVYsRUFBYUUsQ0FBYixDQUFQO0FBQ0E7OztvQ0FFaUI7QUFBQSxVQUFQRixDQUFPLFNBQVBBLENBQU87QUFBQSxVQUFKRSxDQUFJLFNBQUpBLENBQUk7O0FBQ2pCLFVBQUksS0FBS3ZELGFBQVQsRUFBd0I7QUFDdkIsZUFBTyxDQUFDLENBQUMsS0FBS2xCLEtBQU4sSUFBZWdCLElBQUksQ0FBQytELEdBQUwsQ0FBU1IsQ0FBVCxLQUFldkQsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXLEtBQUtoRixLQUFMLEdBQWEsQ0FBeEIsQ0FBL0IsTUFDRixDQUFDLEtBQUtDLE1BQU4sSUFBZ0JlLElBQUksQ0FBQytELEdBQUwsQ0FBU04sQ0FBVCxLQUFlekQsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXLEtBQUsvRSxNQUFMLEdBQWMsQ0FBekIsQ0FEN0IsQ0FBUDtBQUVBLE9BSEQsTUFJSztBQUNKLGVBQU8sQ0FBQyxDQUFDLEtBQUtELEtBQU4sSUFBZ0J1RSxDQUFDLElBQUksQ0FBTCxJQUFVQSxDQUFDLEdBQUcsS0FBS3ZFLEtBQXBDLE1BQ0YsQ0FBQyxLQUFLQyxNQUFOLElBQWlCd0UsQ0FBQyxJQUFJLENBQUwsSUFBVUEsQ0FBQyxHQUFHLEtBQUt4RSxNQURsQyxDQUFQO0FBRUE7QUFDRDs7OzRDQUUwQztBQUFBLFVBQXhCd0QsU0FBd0IsU0FBeEJBLFNBQXdCO0FBQUEsVUFBYkUsVUFBYSxTQUFiQSxVQUFhO0FBQzFDLGFBQU8sS0FBS3pELElBQUwsR0FBWTtBQUFDdUQsaUJBQVMsRUFBVEEsU0FBRDtBQUFZQyxnQkFBUSxFQUFFLEtBQUt1QixRQUFMLENBQWN4QixTQUFkLENBQXRCO0FBQWdERSxrQkFBVSxFQUFWQTtBQUFoRCxPQUFaLEdBQ04sS0FBS3VCLFFBQUwsQ0FBY3pCLFNBQWQsSUFBMkI7QUFBQ0EsaUJBQVMsRUFBVEEsU0FBRDtBQUFZQyxnQkFBUSxFQUFFRCxTQUF0QjtBQUFpQ0Usa0JBQVUsRUFBVkE7QUFBakMsT0FBM0IsR0FDQTtBQUFDRixpQkFBUyxFQUFUQSxTQUFEO0FBQVlDLGdCQUFRLEVBQUUsSUFBdEI7QUFBNEJDLGtCQUFVLEVBQVZBO0FBQTVCLE9BRkQ7QUFHQTs7O2dDQUVXd0IsYyxFQUFnQkMsZSxFQUFpQkMsYyxFQUFnQkMsZSxFQUFpQjtBQUFBOztBQUM3RSxVQUFNQyxhQUFhLEdBQUcsS0FBS0MsV0FBTCxDQUFpQkwsY0FBakIsQ0FBdEI7QUFDQSxVQUFNTSxjQUFjLEdBQUcsS0FBS0QsV0FBTCxDQUFpQkYsZUFBakIsQ0FBdkI7QUFDQSxVQUFNSSxjQUFjLEdBQUcsS0FBS0YsV0FBTCxDQUFpQkosZUFBakIsQ0FBdkI7QUFDQSxVQUFNNEMsYUFBYSxHQUFHLEtBQUt4QyxXQUFMLENBQWlCSCxjQUFqQixDQUF0QjtBQUVBLFVBQU1NLE9BQU8sR0FBR0MsZ0VBQWMsQ0FBQ29DLGFBQWEsQ0FBQ3hELElBQWQsRUFBRCxFQUF1QmtCLGNBQWMsQ0FBQ2xCLElBQWYsRUFBdkIsQ0FBOUI7QUFFQSxVQUFNZ0Usa0JBQWtCLEdBQUdqRCxhQUFhLENBQUNiLElBQWQsS0FBdUJhLGFBQWEsQ0FBQ2YsSUFBZCxFQUFsRDtBQUNBLFVBQU1pRSxtQkFBbUIsR0FBR2xELGFBQWEsQ0FBQ2IsSUFBZCxLQUF1QmEsYUFBYSxDQUFDZixJQUFkLEVBQW5EO0FBRUEsVUFBTWtFLGtCQUFrQixHQUFHakQsY0FBYyxDQUFDZixJQUFmLEtBQXdCZSxjQUFjLENBQUNqQixJQUFmLEVBQW5EO0FBQ0EsVUFBTW1FLG1CQUFtQixHQUFHbEQsY0FBYyxDQUFDZixJQUFmLEtBQXdCZSxjQUFjLENBQUNqQixJQUFmLEVBQXBEO0FBRUEsVUFBTW9FLFNBQVMsR0FBRzVILElBQUksQ0FBQ2dFLEtBQUwsQ0FBV1csT0FBTyxDQUFDa0QsTUFBUixHQUFpQixDQUE1QixDQUFsQjtBQUNBLFVBQU1DLE1BQU0sR0FBR25ELE9BQU8sQ0FBQ2tELE1BQVIsR0FBaUIsQ0FBakIsR0FBcUJsRCxPQUFPLENBQUNpRCxTQUFELENBQTVCLEdBQ2QsQ0FBQ2pELE9BQU8sQ0FBQ2lELFNBQVMsR0FBRyxDQUFiLENBQVAsR0FBeUJqRCxPQUFPLENBQUNpRCxTQUFELENBQWpDLElBQWdELENBRGpEOztBQUdBLFVBQU03QyxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQUF0QyxTQUFTO0FBQUEsZUFBSztBQUFDQSxtQkFBUyxFQUFUQSxTQUFEO0FBQVlFLG9CQUFVLEVBQUUsTUFBSSxDQUFDcUMsV0FBTCxDQUFpQnZDLFNBQWpCO0FBQXhCLFNBQUw7QUFBQSxPQUFoQzs7QUFFQSxVQUFNd0UsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQTFELENBQUMsRUFBSTtBQUN2QixZQUFJNEQsR0FBRyxHQUFNNUQsQ0FBQyxHQUFHdUUsTUFBSixHQUFjTixrQkFBa0IsR0FBR2pFLENBQW5DLEdBQXVDa0UsbUJBQW1CLEdBQUdsRSxDQUExRTtBQUNBLFlBQUk2RCxNQUFNLEdBQUc3RCxDQUFDLEdBQUd1RSxNQUFKLEdBQWFILG1CQUFtQixHQUFHcEUsQ0FBbkMsR0FBd0NtRSxrQkFBa0IsR0FBR25FLENBQTFFO0FBRUE2RCxjQUFNLEdBQUdwSCxJQUFJLENBQUNtQyxHQUFMLENBQVNpRixNQUFULEVBQWlCRCxHQUFqQixDQUFUO0FBQ0FBLFdBQUcsR0FBTW5ILElBQUksQ0FBQ0MsR0FBTCxDQUFTbUgsTUFBVCxFQUFpQkQsR0FBakIsQ0FBVCxDQUx1QixDQU92Qjs7QUFDQSxZQUFNVixHQUFHLEdBQUc3QixnRUFBYyxDQUFDd0MsTUFBTSxHQUFHLENBQVYsRUFBYUQsR0FBRyxHQUFHLENBQW5CLENBQTFCOztBQUVBLFlBQU1yQyxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFBckIsQ0FBQztBQUFBLGlCQUFLO0FBQUNGLGFBQUMsRUFBREEsQ0FBRDtBQUFJRSxhQUFDLEVBQURBO0FBQUosV0FBTDtBQUFBLFNBQXBCOztBQUVBLGVBQU93Qiw0Q0FBQSxDQUFZd0IsR0FBWixFQUNOL0gsR0FETSxDQUNGb0csVUFERSxFQUVOcEcsR0FGTSxDQUVGcUcsY0FGRSxFQUdOckcsR0FITSxDQUdGLE1BQUksQ0FBQ3lHLGdCQUhILEVBSU56RyxHQUpNLENBSUY4RCxpQkFKRSxFQUtONEMsS0FMTSxFQUFQO0FBTUEsT0FsQkQ7O0FBb0JBLGFBQU9ILDRDQUFBLENBQVlOLE9BQVosRUFDTmpHLEdBRE0sQ0FDRnVJLFVBREUsRUFFTi9CLE9BRk0sR0FHTkUsS0FITSxFQUFQO0FBSUE7Ozs7RUF6S2dENUcsd0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCbEQ7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFFQSxJQUFNNkcsY0FBYyxHQUFHLFNBQWpCQSxjQUFpQjtBQUFBLE1BQUU1QyxTQUFGLFFBQUVBLFNBQUY7QUFBQSxNQUFhQyxRQUFiLFFBQWFBLFFBQWI7QUFBQSxNQUF1QkMsVUFBdkIsUUFBdUJBLFVBQXZCO0FBQUEsU0FBd0M7QUFDOURDLFFBQUksRUFBRUgsU0FBUyxZQUFZNkMsK0NBQXJCLEdBQTJCN0MsU0FBM0IsR0FBdUMsSUFBSTZDLCtDQUFKLENBQVE3QyxTQUFSLENBRGlCO0FBRTlESyxXQUFPLEVBQUVKLFFBQVEsWUFBWTRDLCtDQUFwQixHQUEwQjVDLFFBQTFCLEdBQ1JBLFFBQVEsR0FBRyxJQUFJNEMsK0NBQUosQ0FBUTVDLFFBQVIsQ0FBSCxHQUNSQSxRQUo2RDtBQUs5REMsY0FBVSxFQUFWQTtBQUw4RCxHQUF4QztBQUFBLENBQXZCOztBQVFBLElBQU00QyxZQUFZLEdBQUcsSUFBSUQsK0NBQUosQ0FBUTtBQUFDL0IsR0FBQyxFQUFFLENBQUo7QUFBT0UsR0FBQyxFQUFFLENBQVY7QUFBYStCLEdBQUMsRUFBRTtBQUFoQixDQUFSLENBQXJCOztJQUVxQnVDLHFCOzs7OztBQUNwQixpQ0FBYXRKLFFBQWIsRUFBdUI7QUFBQTs7QUFBQTs7QUFDdEIsK0ZBQU1BLFFBQU47QUFFQSxLQUNDLFlBREQsRUFFQyxXQUZELEVBSUMsVUFKRCxFQUtDLFVBTEQsRUFPQyxvQkFQRCxFQVFDLGtCQVJELEVBVUMsb0JBVkQsRUFXQyxrQkFYRCxFQWFDLDBCQWJELEVBY0Msd0JBZEQsRUFnQkMsYUFoQkQsRUFpQkMsYUFqQkQsRUFrQkMsVUFsQkQsRUFvQkMsVUFwQkQsRUFxQkMsa0JBckJELEVBc0JDLGFBdEJELEVBdUJFQyxHQXZCRixDQXVCTSxVQUFBQyxNQUFNO0FBQUEsYUFBSSxNQUFLQSxNQUFMLElBQWUsTUFBS0EsTUFBTCxFQUFhQyxJQUFiLHVEQUFuQjtBQUFBLEtBdkJaOztBQXlCQSxRQUFJLE1BQUs4RyxNQUFULEVBQWlCO0FBQ2hCLFlBQUtDLE9BQUwsR0FBZSxDQUNkLElBQUlMLCtDQUFKLENBQVE7QUFBRTtBQUNUL0IsU0FBQyxFQUFFLElBQUksTUFBS21DLE1BQVQsR0FBa0IsQ0FEZDtBQUVQakMsU0FBQyxFQUFFLENBQUMsTUFBS2lDLE1BQU4sR0FBZSxDQUZYO0FBR1BGLFNBQUMsRUFBRSxDQUFDLE1BQUtFO0FBSEYsT0FBUixDQURjLEVBTWQsSUFBSUosK0NBQUosQ0FBUTtBQUFFO0FBQ1QvQixTQUFDLEVBQUUsTUFBS21DLE1BQUwsR0FBYyxDQURWO0FBRVBqQyxTQUFDLEVBQUUsTUFBS2lDLE1BRkQ7QUFHUEYsU0FBQyxFQUFFLENBQUMsQ0FBRCxHQUFLLE1BQUtFLE1BQVYsR0FBbUI7QUFIZixPQUFSLENBTmMsRUFXZCxJQUFJSiwrQ0FBSixDQUFRO0FBQUU7QUFDVC9CLFNBQUMsRUFBRSxDQUFDLE1BQUttQyxNQURGO0FBRVBqQyxTQUFDLEVBQUUsSUFBSSxNQUFLaUMsTUFBVCxHQUFrQixDQUZkO0FBR1BGLFNBQUMsRUFBRSxDQUFDLE1BQUtFLE1BQU4sR0FBZTtBQUhYLE9BQVIsQ0FYYyxFQWdCZCxJQUFJSiwrQ0FBSixDQUFTO0FBQUU7QUFDVi9CLFNBQUMsRUFBRSxDQUFDLENBQUQsR0FBSyxNQUFLbUMsTUFBVixHQUFtQixDQURkO0FBRVJqQyxTQUFDLEVBQUUsTUFBS2lDLE1BQUwsR0FBYyxDQUZUO0FBR1JGLFNBQUMsRUFBRSxNQUFLRTtBQUhBLE9BQVQsQ0FoQmMsRUFxQmQsSUFBSUosK0NBQUosQ0FBUztBQUFFO0FBQ1YvQixTQUFDLEVBQUUsQ0FBQyxNQUFLbUMsTUFBTixHQUFlLENBRFY7QUFFUmpDLFNBQUMsRUFBRSxDQUFDLE1BQUtpQyxNQUZEO0FBR1JGLFNBQUMsRUFBRSxJQUFJLE1BQUtFLE1BQVQsR0FBa0I7QUFIYixPQUFULENBckJjLEVBMEJkLElBQUlKLCtDQUFKLENBQVM7QUFBRTtBQUNWL0IsU0FBQyxFQUFFLE1BQUttQyxNQURBO0FBRVJqQyxTQUFDLEVBQUUsQ0FBQyxDQUFELEdBQUssTUFBS2lDLE1BQVYsR0FBbUIsQ0FGZDtBQUdSRixTQUFDLEVBQUUsTUFBS0UsTUFBTCxHQUFjO0FBSFQsT0FBVCxDQTFCYyxDQUFmO0FBZ0NBOztBQTdEcUI7QUE4RHRCOzs7O2lDQUVhO0FBQ2IsYUFBTyxLQUFLekMsUUFBTCxFQUFQO0FBQ0E7OztnQ0FFWTtBQUNaLGFBQU8sS0FBS0QsUUFBTCxFQUFQO0FBQ0E7OzsrQkFFVztBQUNYLGFBQU8sS0FBSzNFLEtBQUwsR0FBYSxDQUFwQjtBQUNBOzs7K0JBRVc7QUFDWCxhQUFPLEtBQUtBLEtBQUwsR0FBYXVILCtDQUFwQjtBQUNBOzs7eUNBRXFCO0FBQ3JCLGFBQU8sQ0FBUDtBQUNBOzs7dUNBRW1CO0FBQ25CLGFBQU8sS0FBSzNDLFFBQUwsS0FBa0IsSUFBekI7QUFDQTs7O3lDQUVxQjtBQUNyQixhQUFPLEtBQUtELFFBQUwsRUFBUDtBQUNBOzs7dUNBRW1CO0FBQ25CLGFBQU8sS0FBS0MsUUFBTCxNQUFtQixJQUFFLENBQXJCLENBQVA7QUFDQTs7OzZDQUV5QkUsTSxFQUFRQyxLLEVBQU87QUFDeEMsYUFBT0QsTUFBTSxHQUFHQyxLQUFULEdBQWlCd0MsK0NBQXhCO0FBQ0E7OzsyQ0FFdUJ6QyxNLEVBQVFDLEssRUFBTztBQUN0QyxhQUFPRCxNQUFNLElBQUlDLEtBQUssR0FBRyxJQUFSLEdBQWUsSUFBbkIsQ0FBTixHQUFpQyxDQUF4QztBQUNBOzs7Z0NBRVl5QyxHLEVBQUs7QUFDakJBLFNBQUcsR0FBR0EsR0FBRyxZQUFZUCwrQ0FBZixHQUFxQk8sR0FBckIsY0FBK0JQLCtDQUEvQiw2QkFBc0NoQyxTQUF0QyxFQUFOO0FBRUEsVUFBTU8sTUFBTSxHQUFHLEtBQUt4RixLQUFMLEdBQWF1SCwrQ0FBYixJQUFzQkMsR0FBRyxDQUFDQyxJQUFKLEtBQWNELEdBQUcsQ0FBQ0UsSUFBSixLQUFhLENBQWpELENBQWY7QUFDQSxVQUFNakMsTUFBTSxHQUFHLEtBQUt6RixLQUFMLEdBQWEsQ0FBYixHQUFlLENBQWYsR0FBbUJ3SCxHQUFHLENBQUNFLElBQUosRUFBbEM7QUFFQSxhQUFPLElBQUlwQyxpREFBSixDQUFVRSxNQUFNLEdBQUcsS0FBS25FLE9BQXhCLEVBQWlDb0UsTUFBTSxHQUFHLEtBQUtuRSxPQUEvQyxDQUFQO0FBQ0E7OztnQ0FFWWlFLEssRUFBTztBQUNuQkEsV0FBSyxHQUFHQSxLQUFLLFlBQVlELGlEQUFqQixHQUF5QkMsS0FBekIsY0FBcUNELGlEQUFyQyw2QkFBOENMLFNBQTlDLEVBQVI7QUFFQSxVQUFNTyxNQUFNLEdBQUdELEtBQUssQ0FBQ0osSUFBTixLQUFlLEtBQUs5RCxPQUFuQztBQUNBLFVBQU1vRSxNQUFNLEdBQUdGLEtBQUssQ0FBQ0YsSUFBTixLQUFlLEtBQUsvRCxPQUFuQztBQUVBLFVBQU1xRyxDQUFDLEdBQUcsQ0FBRW5DLE1BQU0sSUFBSStCLCtDQUFLLEdBQUcsQ0FBWixDQUFQLEdBQTBCOUIsTUFBTSxHQUFHLENBQXBDLElBQTBDLEtBQUt6RixLQUF6RDtBQUNBLFVBQU00SCxDQUFDLEdBQUluQyxNQUFNLElBQUksSUFBSSxDQUFSLENBQVAsR0FBcUIsS0FBS3pGLEtBQXBDO0FBRUEsYUFBTyxJQUFJaUgsK0NBQUosQ0FBUVUsQ0FBUixFQUFXQyxDQUFYLENBQVA7QUFDQTs7OzZCQUVTSixHLEVBQUs7QUFDZCxVQUFJLENBQUMsS0FBSzNHLElBQVYsRUFBZ0IsT0FBTzJHLEdBQVA7QUFFaEJBLFNBQUcsR0FBSUEsR0FBRyxZQUFZUCwrQ0FBZixHQUFxQk8sR0FBckIsR0FBMkIsSUFBSVAsK0NBQUosQ0FBUU8sR0FBUixDQUFsQzs7QUFFQSxVQUFJLEtBQUtILE1BQVQsRUFBaUI7QUFDaEIsWUFBSUcsR0FBRyxDQUFDSyxRQUFKLENBQWFYLFlBQWIsS0FBOEIsS0FBS0csTUFBdkMsRUFBK0MsT0FBT0csR0FBUDtBQUUvQyxZQUFNTSxTQUFTLEdBQUcsS0FBS1IsT0FBTCxDQUFhakgsR0FBYixDQUFpQixVQUFBMEgsTUFBTTtBQUFBLGlCQUFJUCxHQUFHLENBQUNLLFFBQUosQ0FBYUUsTUFBYixDQUFKO0FBQUEsU0FBdkIsQ0FBbEI7QUFDQSxZQUFNQSxNQUFNLEdBQUcsS0FBS1QsT0FBTCxDQUFhUSxTQUFTLENBQUNFLE9BQVYsQ0FBa0JyRyxJQUFJLENBQUNtQyxHQUFMLE9BQUFuQyxJQUFJLHFCQUFRbUcsU0FBUixFQUF0QixDQUFiLENBQWY7QUFFQSxlQUFPLEtBQUtsQyxRQUFMLENBQWM0QixHQUFHLENBQUNTLFdBQUosQ0FBZ0JGLE1BQWhCLENBQWQsQ0FBUDtBQUNBLE9BUEQsTUFRSztBQUFBLCtCQUNhZCwrQ0FBRyxDQUFDMEMsV0FBSixDQUFnQm5DLEdBQWhCLENBRGI7QUFBQSxZQUNDVyxHQURELG9CQUNDQSxHQUREO0FBQUEsWUFDTUMsR0FETixvQkFDTUEsR0FETixFQUdKOzs7QUFDQSxZQUFJLEtBQUt4SCxNQUFMLEdBQWMsQ0FBbEIsRUFBcUI7QUFDcEIsY0FBTXlILE1BQU0sR0FBRzFHLElBQUksQ0FBQ2dFLEtBQUwsQ0FBV3lDLEdBQUcsR0FBRyxLQUFLeEgsTUFBdEIsQ0FBZjtBQUVBLGNBQUlnSixnQkFBZ0IsR0FBR3ZCLE1BQU0sR0FBRyxDQUFoQztBQUNBdUIsMEJBQWdCLEdBQUd2QixNQUFNLEdBQUcsQ0FBVCxLQUFlLENBQWYsR0FBbUJ1QixnQkFBbkIsR0FDbEJ4QixHQUFHLEdBQUcsQ0FBTixHQUFVekcsSUFBSSxDQUFDNEcsSUFBTCxDQUFVcUIsZ0JBQVYsQ0FBVixHQUNBakksSUFBSSxDQUFDZ0UsS0FBTCxDQUFXaUUsZ0JBQVgsQ0FGRDtBQUlBekIsYUFBRyxJQUFJeUIsZ0JBQVA7QUFDQTs7QUFFRCxZQUFNcEIsU0FBUyxHQUFJN0csSUFBSSxDQUFDZ0UsS0FBTCxDQUFXLEtBQUtoRixLQUFMLEdBQWEsQ0FBeEIsQ0FBbkI7QUFDQSxZQUFNOEgsVUFBVSxHQUFHOUcsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXLEtBQUsvRSxNQUFMLEdBQWMsQ0FBekIsQ0FBbkI7O0FBRUEsWUFBSSxLQUFLaUIsYUFBVCxFQUF3QjtBQUN2QnNHLGFBQUcsSUFBSUssU0FBUDtBQUNBSixhQUFHLElBQUlLLFVBQVA7QUFDQTs7QUFFRE4sV0FBRyxHQUFHQSxHQUFHLEdBQUcsS0FBS3hILEtBQWpCO0FBQ0F5SCxXQUFHLEdBQUdBLEdBQUcsR0FBRyxLQUFLeEgsTUFBakI7QUFFQXVILFdBQUcsR0FBR0EsR0FBRyxHQUFHLENBQU4sR0FBVUEsR0FBRyxHQUFHLEtBQUt4SCxLQUFyQixHQUE2QndILEdBQW5DO0FBQ0FDLFdBQUcsR0FBR0EsR0FBRyxHQUFHLENBQU4sR0FBVUEsR0FBRyxHQUFHLEtBQUt4SCxNQUFyQixHQUE4QndILEdBQXBDOztBQUVBLFlBQUksS0FBS3ZHLGFBQVQsRUFBd0I7QUFDdkJzRyxhQUFHLElBQUlLLFNBQVA7QUFDQUosYUFBRyxJQUFJSyxVQUFQO0FBQ0E7O0FBRUQsZUFBT3hCLCtDQUFHLENBQUM0QyxXQUFKLENBQWdCMUIsR0FBaEIsRUFBcUJDLEdBQXJCLENBQVA7QUFDQTtBQUNEOzs7NkJBRVNaLEcsRUFBSztBQUNkQSxTQUFHLEdBQUlBLEdBQUcsWUFBWVAsK0NBQWYsR0FBcUJPLEdBQXJCLEdBQTJCLElBQUlQLCtDQUFKLENBQVFPLEdBQVIsQ0FBbEM7O0FBRUEsVUFBSSxLQUFLSCxNQUFULEVBQWlCO0FBQ2hCLFlBQUksS0FBS3hGLGFBQVQsRUFBd0I7QUFDdkIsaUJBQU9GLElBQUksQ0FBQ0MsR0FBTCxDQUFTRCxJQUFJLENBQUMrRCxHQUFMLENBQVM4QixHQUFHLENBQUN0QyxDQUFiLENBQVQsRUFBMEJ2RCxJQUFJLENBQUMrRCxHQUFMLENBQVM4QixHQUFHLENBQUNwQyxDQUFiLENBQTFCLEVBQTJDekQsSUFBSSxDQUFDK0QsR0FBTCxDQUFTOEIsR0FBRyxDQUFDTCxDQUFiLENBQTNDLEtBQStEeEYsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXLEtBQUswQixNQUFoQixDQUF0RTtBQUNBLFNBRkQsTUFHSztBQUNKLGlCQUFPMUYsSUFBSSxDQUFDQyxHQUFMLENBQVNELElBQUksQ0FBQytELEdBQUwsQ0FBUzhCLEdBQUcsQ0FBQ3RDLENBQUosR0FBUSxLQUFLbUMsTUFBdEIsQ0FBVCxFQUF3QzFGLElBQUksQ0FBQytELEdBQUwsQ0FBUzhCLEdBQUcsQ0FBQ3BDLENBQUosR0FBUSxLQUFLaUMsTUFBdEIsQ0FBeEMsRUFBdUUxRixJQUFJLENBQUMrRCxHQUFMLENBQVM4QixHQUFHLENBQUNMLENBQWIsQ0FBdkUsS0FBMkYsS0FBS0UsTUFBdkc7QUFDQTtBQUNELE9BUEQsTUFRSyxJQUFJLEtBQUsxRyxLQUFMLElBQWMsS0FBS0MsTUFBdkIsRUFBK0I7QUFDbkMsWUFBSSxLQUFLaUIsYUFBVCxFQUF3QjtBQUN2QixpQkFBTyxDQUFDLENBQUMsS0FBS2xCLEtBQU4sSUFBZ0JnQixJQUFJLENBQUMrRCxHQUFMLENBQVM4QixHQUFHLENBQUN0QyxDQUFiLElBQWtCLEtBQUt2RSxLQUFMLEdBQWEsQ0FBaEQsTUFDRixDQUFDLEtBQUtDLE1BQU4sSUFBaUJlLElBQUksQ0FBQytELEdBQUwsQ0FBUyxDQUFDOEIsR0FBRyxDQUFDcEMsQ0FBTCxHQUFTekQsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXNkIsR0FBRyxDQUFDdEMsQ0FBSixHQUFRLENBQW5CLENBQWxCLElBQTRDLEtBQUt0RSxNQUFMLEdBQWMsQ0FEekUsQ0FBUDtBQUVBLFNBSEQsTUFJSztBQUNKLGlCQUFPLENBQUMsQ0FBQyxLQUFLRCxLQUFOLElBQWdCNkcsR0FBRyxDQUFDdEMsQ0FBSixJQUFTLENBQVQsSUFBY3NDLEdBQUcsQ0FBQ3RDLENBQUosR0FBUSxLQUFLdkUsS0FBNUMsTUFDRixDQUFDLEtBQUtDLE1BQU4sSUFBaUI0RyxHQUFHLENBQUNwQyxDQUFKLElBQVV6RCxJQUFJLENBQUNnRSxLQUFMLENBQVc2QixHQUFHLENBQUN0QyxDQUFKLEdBQVEsQ0FBbkIsSUFBd0IsQ0FBQyxDQUFuQyxJQUEwQyxDQUFDc0MsR0FBRyxDQUFDcEMsQ0FBTCxHQUFTekQsSUFBSSxDQUFDZ0UsS0FBTCxDQUFXNkIsR0FBRyxDQUFDdEMsQ0FBSixHQUFRLENBQW5CLENBQVYsR0FBbUMsS0FBS3RFLE1BRGhHLENBQVA7QUFFQTtBQUNELE9BVEksTUFVQTtBQUNKLGVBQU8sSUFBUDtBQUNBO0FBQ0Q7Ozs0Q0FFMEM7QUFBQSxVQUF4QndELFNBQXdCLFNBQXhCQSxTQUF3QjtBQUFBLFVBQWJFLFVBQWEsU0FBYkEsVUFBYTtBQUMxQyxhQUFPLEtBQUt6RCxJQUFMLEdBQVk7QUFBQ3VELGlCQUFTLEVBQVRBLFNBQUQ7QUFBWUMsZ0JBQVEsRUFBRSxLQUFLdUIsUUFBTCxDQUFjeEIsU0FBZCxDQUF0QjtBQUFnREUsa0JBQVUsRUFBVkE7QUFBaEQsT0FBWixHQUNOLEtBQUt1QixRQUFMLENBQWN6QixTQUFkLElBQTJCO0FBQUNBLGlCQUFTLEVBQVRBLFNBQUQ7QUFBWUMsZ0JBQVEsRUFBRUQsU0FBdEI7QUFBaUNFLGtCQUFVLEVBQVZBO0FBQWpDLE9BQTNCLEdBQ0E7QUFBQ0YsaUJBQVMsRUFBVEEsU0FBRDtBQUFZQyxnQkFBUSxFQUFFLElBQXRCO0FBQTRCQyxrQkFBVSxFQUFWQTtBQUE1QixPQUZEO0FBR0E7OztnQ0FFWXdCLGMsRUFBZ0JDLGUsRUFBaUJDLGMsRUFBZ0JDLGUsRUFBaUI7QUFBQTs7QUFDOUUsVUFBTUMsYUFBYSxHQUFHLEtBQUtDLFdBQUwsQ0FBaUJMLGNBQWpCLENBQXRCO0FBQ0EsVUFBTTZDLGFBQWEsR0FBRyxLQUFLeEMsV0FBTCxDQUFpQkgsY0FBakIsQ0FBdEI7QUFDQSxVQUFNSSxjQUFjLEdBQUcsS0FBS0QsV0FBTCxDQUFpQkYsZUFBakIsQ0FBdkI7QUFDQSxVQUFNSSxjQUFjLEdBQUcsS0FBS0YsV0FBTCxDQUFpQkosZUFBakIsQ0FBdkI7QUFFQSxVQUFNUyxJQUFJLEdBQUdELGdFQUFjLENBQUNMLGFBQWEsQ0FBQ3dCLElBQWQsS0FBc0IsQ0FBdkIsRUFBMkJpQixhQUFhLENBQUNqQixJQUFkLEtBQXVCLENBQWxELENBQTNCO0FBRUEsVUFBTS9HLEtBQUssR0FBRzBGLGNBQWMsQ0FBQ29CLElBQWYsS0FBd0J2QixhQUFhLENBQUN1QixJQUFkLEVBQXRDOztBQUVBLFVBQU1mLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQXRDLFNBQVM7QUFBQSxlQUFLO0FBQUNBLG1CQUFTLEVBQVRBLFNBQUQ7QUFBWUUsb0JBQVUsRUFBRSxNQUFJLENBQUNxQyxXQUFMLENBQWlCdkMsU0FBakI7QUFBeEIsU0FBTDtBQUFBLE9BQWhDOztBQUVBLFVBQU0wRixhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUNsQyxDQUFELEVBQUlpQixLQUFKLEVBQWM7QUFDbkMsWUFBTWtCLElBQUksR0FBRzdELGFBQWEsQ0FBQ3VCLElBQWQsS0FBdUI5RixJQUFJLENBQUNnRSxLQUFMLENBQVdrRCxLQUFLLEdBQUcsQ0FBbkIsQ0FBcEM7QUFDQSxZQUFNbUIsS0FBSyxHQUFHRCxJQUFJLEdBQUdwSixLQUFyQjtBQUNBLFlBQU0yRixPQUFPLEdBQUdDLGdFQUFjLENBQUN3RCxJQUFELEVBQU9DLEtBQUssR0FBRyxDQUFmLENBQTlCOztBQUVBLFlBQU12RCxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFBa0IsQ0FBQztBQUFBLGlCQUFJViwrQ0FBRyxDQUFDK0IsUUFBSixDQUFhckIsQ0FBYixFQUFnQkMsQ0FBaEIsQ0FBSjtBQUFBLFNBQXBCLENBTG1DLENBS1M7OztBQUU1QyxlQUFPaEIsNENBQUEsQ0FBWU4sT0FBWixFQUNOakcsR0FETSxDQUNGb0csVUFERSxFQUVOcEcsR0FGTSxDQUVGcUcsY0FGRSxFQUdOckcsR0FITSxDQUdGLE1BQUksQ0FBQ3lHLGdCQUhILEVBSU56RyxHQUpNLENBSUYyRyxjQUpFLEVBS05ELEtBTE0sRUFBUDtBQU1BLE9BYkQ7O0FBZUEsYUFBT0gsNENBQUEsQ0FBWUosSUFBWixFQUNObkcsR0FETSxDQUNGeUosYUFERSxFQUVOakQsT0FGTSxHQUdORSxLQUhNLEVBQVA7QUFJQTs7OztFQWhQaUQ1Ryx3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQm5EO0FBQ0E7QUFNQSxJQUFNTCxRQUFRLEdBQUc7QUFDaEJvRixHQUFDLEVBQUUsQ0FEYTtBQUVoQkUsR0FBQyxFQUFFLENBRmE7QUFJaEJwRixPQUFLLEVBQUUsRUFKUztBQUtoQmlLLGFBQVcsRUFBRUMsK0NBTEc7QUFNaEJDLFdBQVMsRUFBRUMsOENBTks7QUFPaEJDLFdBQVMsRUFBRUMsK0NBUEs7QUFRaEIzSixPQUFLLEVBQUUsQ0FSUztBQVVoQjRKLE9BQUssRUFBRTtBQUNOQyxPQUFHLEVBQUUsQ0FEQztBQUVOQyxTQUFLLEVBQUUsQ0FGRDtBQUdOQyxRQUFJLEVBQUUsQ0FIQTtBQUlOQyxTQUFLLEVBQUU7QUFKRDtBQVZTLENBQWpCOztJQWtCcUJDLEksR0FDcEIsY0FBWXhLLFFBQVosRUFBc0I7QUFBQTs7QUFDckJJLFFBQU0sQ0FBQ0MsTUFBUCxDQUFjLElBQWQsRUFBb0JYLFFBQXBCLEVBQThCTSxRQUE5QjtBQUNBLEM7Ozs7Ozs7Ozs7Ozs7O0FDNUJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPLElBQU1nSyxHQUFHLEdBQUcsS0FBWjtBQUNBLElBQU1TLE1BQU0sR0FBRyxRQUFmO0FBQ0EsSUFBTUMsTUFBTSxHQUFHLFFBQWY7QUFFQSxJQUFNQyxXQUFXLEdBQUc7QUFBQ1gsS0FBRyxFQUFIQSxHQUFEO0FBQU1TLFFBQU0sRUFBTkEsTUFBTjtBQUFjQyxRQUFNLEVBQU5BO0FBQWQsQ0FBcEI7QUFFQSxJQUFNRSxZQUFZLEdBQUc7QUFDM0JaLEtBQUcsRUFBSEEsR0FEMkI7QUFFM0JVLFFBQU0sRUFBTkE7QUFGMkIsQ0FBckI7QUFLQSxJQUFNWixJQUFJLEdBQUcsTUFBYjtBQUNBLElBQU1lLE1BQU0sR0FBRyxRQUFmO0FBRUEsSUFBTUMsa0JBQWtCLEdBQUc7QUFDakNoQixNQUFJLEVBQUpBLElBRGlDO0FBRWpDZSxRQUFNLEVBQU5BO0FBRmlDLENBQTNCO0FBS0EsSUFBTVgsSUFBSSxHQUFHLE1BQWI7QUFDQSxJQUFNYSxPQUFPLEdBQUcsU0FBaEI7QUFDQSxJQUFNQyxXQUFXLEdBQUc7QUFDMUJkLE1BQUksRUFBSkEsSUFEMEI7QUFFMUJhLFNBQU8sRUFBUEE7QUFGMEIsQ0FBcEIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJQOztJQUVxQkUsVTs7O0FBQ3BCLHNCQUFZakwsUUFBWixFQUFzQjtBQUFBO0FBQ3JCOzs7O3lCQUVJa0wsTyxFQUFTdEwsSyxFQUFPa0YsQyxFQUFHRSxDLEVBQUdtRyxJLEVBQU07QUFDaENELGFBQU8sQ0FBQ0UsU0FBUjtBQUNBRixhQUFPLENBQUNHLEdBQVIsQ0FBWXZHLENBQVosRUFBZUUsQ0FBZixFQUFrQnBGLEtBQUssR0FBR3VMLElBQUksQ0FBQ3ZMLEtBQS9CLEVBQXNDLENBQXRDLEVBQXlDLElBQUUyQixJQUFJLENBQUMrSixFQUFoRCxFQUFvRCxLQUFwRDtBQUNBSixhQUFPLENBQUNLLFNBQVIsR0FBb0JDLDBEQUFRLENBQUNMLElBQUksQ0FBQ2hCLEtBQU4sQ0FBNUI7QUFDQWUsYUFBTyxDQUFDTyxJQUFSO0FBQ0E7Ozs0QkFFT1AsTyxFQUFTdEwsSyxFQUFPa0YsQyxFQUFHRSxDLEVBQUdtRyxJLEVBQU07QUFDbkNELGFBQU8sQ0FBQ0UsU0FBUjtBQUNBRixhQUFPLENBQUNHLEdBQVIsQ0FBWXZHLENBQVosRUFBZUUsQ0FBZixFQUFrQnBGLEtBQUssR0FBR3VMLElBQUksQ0FBQ3ZMLEtBQS9CLEVBQXNDLENBQXRDLEVBQXlDLElBQUUyQixJQUFJLENBQUMrSixFQUFoRCxFQUFvRCxLQUFwRDtBQUNBSixhQUFPLENBQUNRLFNBQVIsR0FBb0JQLElBQUksQ0FBQzVLLEtBQXpCO0FBQ0EySyxhQUFPLENBQUNTLFdBQVIsR0FBc0JILDBEQUFRLENBQUNMLElBQUksQ0FBQ2hCLEtBQU4sQ0FBOUI7QUFDQWUsYUFBTyxDQUFDVSxNQUFSO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQkY7QUFDQTs7SUFFcUJDLFc7OztBQUNwQix1QkFBWTdMLFFBQVosRUFBc0I7QUFBQTs7QUFBQTs7QUFDckIsU0FBS0EsUUFBTCxHQUFnQkksTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkwsUUFBbEIsQ0FBaEI7QUFFQSxTQUFLOEwsY0FBTCxHQUFzQixFQUF0QjtBQUNBLFNBQUtDLGNBQUwsR0FBc0IsRUFBdEI7QUFDQSxTQUFLQyxnQkFBTCxHQUF3QixFQUF4QjtBQUNBLFNBQUtDLGdCQUFMLEdBQXdCLEVBQXhCO0FBRUEsUUFBTUMsUUFBUSxHQUFHLENBQWpCO0FBQ0EsUUFBTUMsU0FBUyxHQUFHLEVBQWxCO0FBRUFDLDJEQUFLLENBQUNELFNBQUQsQ0FBTCxDQUFpQkUsT0FBakIsQ0FBeUIsVUFBQUMsUUFBUSxFQUFJO0FBQ3BDLFVBQU14SCxDQUFDLEdBQUd5SCx5REFBTyxDQUFDaEwsSUFBSSxDQUFDaUwsR0FBTCxDQUFXRixRQUFRLEdBQUdILFNBQVosR0FBeUJELFFBQTFCLElBQXVDLElBQUkzSyxJQUFJLENBQUMrSixFQUFoRCxJQUFzRFksUUFBL0QsQ0FBRCxDQUFqQjtBQUNBLFVBQU1sSCxDQUFDLEdBQUd1SCx5REFBTyxDQUFDaEwsSUFBSSxDQUFDa0wsR0FBTCxDQUFXSCxRQUFRLEdBQUdILFNBQVosR0FBeUJELFFBQTFCLElBQXVDLElBQUkzSyxJQUFJLENBQUMrSixFQUFoRCxJQUFzRFksUUFBL0QsQ0FBRCxDQUFqQjs7QUFFQSxVQUFLSSxRQUFRLEdBQUcsQ0FBWixLQUFtQixDQUF2QixFQUEwQjtBQUN6QixZQUFNSSxHQUFHLEdBQUdKLFFBQVEsR0FBRyxDQUF2QjtBQUNBLGFBQUksQ0FBQ1IsY0FBTCxDQUFvQlksR0FBcEIsSUFBMkI1SCxDQUEzQjtBQUNBLGFBQUksQ0FBQ2lILGNBQUwsQ0FBb0JXLEdBQXBCLElBQTJCMUgsQ0FBM0I7QUFDQTs7QUFFRCxVQUFLLENBQUNzSCxRQUFRLEdBQUMsQ0FBVixJQUFlLENBQWhCLEtBQXVCLENBQTNCLEVBQThCO0FBQzdCLFlBQU1JLElBQUcsR0FBRyxDQUFDSixRQUFRLEdBQUMsQ0FBVixJQUFlLENBQTNCOztBQUNBLGFBQUksQ0FBQ04sZ0JBQUwsQ0FBc0JVLElBQXRCLElBQTZCNUgsQ0FBN0I7QUFDQSxhQUFJLENBQUNtSCxnQkFBTCxDQUFzQlMsSUFBdEIsSUFBNkIxSCxDQUE3QjtBQUNBO0FBQ0QsS0FmRDtBQWdCQTs7Ozs0QkFFT2tHLE8sRUFBU3RMLEssRUFBT2tGLEMsRUFBR0UsQyxFQUFHbUcsSSxFQUFNO0FBQ25DdkwsV0FBSyxHQUFHQSxLQUFLLEdBQUd1TCxJQUFJLENBQUN2TCxLQUFyQjtBQUNBLFVBQUkrTSxVQUFVLEdBQUd4QixJQUFJLENBQUN0QixXQUFMLEtBQXFCZ0IsaURBQXJCLEdBQThCLEtBQUttQixnQkFBbkMsR0FBc0QsS0FBS0YsY0FBNUU7QUFDQSxVQUFJYyxVQUFVLEdBQUd6QixJQUFJLENBQUN0QixXQUFMLEtBQXFCZ0IsaURBQXJCLEdBQThCLEtBQUtvQixnQkFBbkMsR0FBc0QsS0FBS0YsY0FBNUU7QUFFQWIsYUFBTyxDQUFDRSxTQUFSO0FBQ0FGLGFBQU8sQ0FBQzJCLE1BQVIsQ0FBZS9ILENBQUMsR0FBR2xGLEtBQUssR0FBRytNLFVBQVUsQ0FBQyxDQUFELENBQXJDLEVBQTBDM0gsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHZ04sVUFBVSxDQUFDLENBQUQsQ0FBaEU7QUFDQTFCLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRytNLFVBQVUsQ0FBQyxDQUFELENBQXJDLEVBQTBDM0gsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHZ04sVUFBVSxDQUFDLENBQUQsQ0FBaEU7QUFDQTFCLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRytNLFVBQVUsQ0FBQyxDQUFELENBQXJDLEVBQTBDM0gsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHZ04sVUFBVSxDQUFDLENBQUQsQ0FBaEU7QUFDQTFCLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRytNLFVBQVUsQ0FBQyxDQUFELENBQXJDLEVBQTBDM0gsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHZ04sVUFBVSxDQUFDLENBQUQsQ0FBaEU7QUFDQTFCLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRytNLFVBQVUsQ0FBQyxDQUFELENBQXJDLEVBQTBDM0gsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHZ04sVUFBVSxDQUFDLENBQUQsQ0FBaEU7QUFDQTFCLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRytNLFVBQVUsQ0FBQyxDQUFELENBQXJDLEVBQTBDM0gsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHZ04sVUFBVSxDQUFDLENBQUQsQ0FBaEU7QUFDQTFCLGFBQU8sQ0FBQzZCLFNBQVI7QUFFQTdCLGFBQU8sQ0FBQ1EsU0FBUixHQUFvQlAsSUFBSSxDQUFDNUssS0FBekI7QUFDQTJLLGFBQU8sQ0FBQ1MsV0FBUixHQUFzQkgsMERBQVEsQ0FBQ0wsSUFBSSxDQUFDaEIsS0FBTixDQUE5QjtBQUNBZSxhQUFPLENBQUNVLE1BQVI7QUFDQSxLLENBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O3lCQUVNVixPLEVBQVN0TCxLLEVBQU9rRixDLEVBQUdFLEMsRUFBR21HLEksRUFBTTtBQUNoQ3ZMLFdBQUssR0FBR0EsS0FBSyxHQUFHdUwsSUFBSSxDQUFDdkwsS0FBckI7QUFDQSxVQUFJK00sVUFBVSxHQUFHeEIsSUFBSSxDQUFDdEIsV0FBTCxLQUFxQmdCLGlEQUFyQixHQUE4QixLQUFLbUIsZ0JBQW5DLEdBQXNELEtBQUtGLGNBQTVFO0FBQ0EsVUFBSWMsVUFBVSxHQUFHekIsSUFBSSxDQUFDdEIsV0FBTCxLQUFxQmdCLGlEQUFyQixHQUE4QixLQUFLb0IsZ0JBQW5DLEdBQXNELEtBQUtGLGNBQTVFO0FBRUFiLGFBQU8sQ0FBQ0UsU0FBUjtBQUNBRixhQUFPLENBQUMyQixNQUFSLENBQWUvSCxDQUFDLEdBQUdsRixLQUFLLEdBQUcrTSxVQUFVLENBQUMsQ0FBRCxDQUFyQyxFQUEwQzNILENBQUMsR0FBR3BGLEtBQUssR0FBR2dOLFVBQVUsQ0FBQyxDQUFELENBQWhFO0FBQ0ExQixhQUFPLENBQUM0QixNQUFSLENBQWVoSSxDQUFDLEdBQUdsRixLQUFLLEdBQUcrTSxVQUFVLENBQUMsQ0FBRCxDQUFyQyxFQUEwQzNILENBQUMsR0FBR3BGLEtBQUssR0FBR2dOLFVBQVUsQ0FBQyxDQUFELENBQWhFO0FBQ0ExQixhQUFPLENBQUM0QixNQUFSLENBQWVoSSxDQUFDLEdBQUdsRixLQUFLLEdBQUcrTSxVQUFVLENBQUMsQ0FBRCxDQUFyQyxFQUEwQzNILENBQUMsR0FBR3BGLEtBQUssR0FBR2dOLFVBQVUsQ0FBQyxDQUFELENBQWhFO0FBQ0ExQixhQUFPLENBQUM0QixNQUFSLENBQWVoSSxDQUFDLEdBQUdsRixLQUFLLEdBQUcrTSxVQUFVLENBQUMsQ0FBRCxDQUFyQyxFQUEwQzNILENBQUMsR0FBR3BGLEtBQUssR0FBR2dOLFVBQVUsQ0FBQyxDQUFELENBQWhFO0FBQ0ExQixhQUFPLENBQUM0QixNQUFSLENBQWVoSSxDQUFDLEdBQUdsRixLQUFLLEdBQUcrTSxVQUFVLENBQUMsQ0FBRCxDQUFyQyxFQUEwQzNILENBQUMsR0FBR3BGLEtBQUssR0FBR2dOLFVBQVUsQ0FBQyxDQUFELENBQWhFO0FBQ0ExQixhQUFPLENBQUM0QixNQUFSLENBQWVoSSxDQUFDLEdBQUdsRixLQUFLLEdBQUcrTSxVQUFVLENBQUMsQ0FBRCxDQUFyQyxFQUEwQzNILENBQUMsR0FBR3BGLEtBQUssR0FBR2dOLFVBQVUsQ0FBQyxDQUFELENBQWhFO0FBRUExQixhQUFPLENBQUNLLFNBQVIsR0FBb0JDLDBEQUFRLENBQUNMLElBQUksQ0FBQ2hCLEtBQU4sQ0FBNUI7QUFDQWUsYUFBTyxDQUFDTyxJQUFSO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0ZGO0FBQ0E7QUFFQSxJQUFNL0wsUUFBUSxHQUFHO0FBQ2hCc04sTUFBSSxFQUFFO0FBQ0xDLFVBQU0sRUFBRTtBQUNQck4sV0FBSyxFQUFFLElBREE7QUFHUHVLLFdBQUssRUFBRTtBQUNOQyxXQUFHLEVBQUUsR0FEQztBQUVORSxZQUFJLEVBQUUsR0FGQTtBQUdORCxhQUFLLEVBQUUsR0FIRDtBQUlORSxhQUFLLEVBQUU7QUFKRCxPQUhBO0FBVVAyQyxXQUFLLEVBQUU7QUFDTnROLGFBQUssRUFBRSxJQUREO0FBRU42SCxnQkFBUSxFQUFFO0FBRko7QUFWQSxLQURIO0FBZ0JMMEYsUUFBSSxFQUFFO0FBQ0x2TixXQUFLLEVBQUUsSUFERjtBQUdMdUssV0FBSyxFQUFFO0FBQ05DLFdBQUcsRUFBRSxFQURDO0FBRU5FLFlBQUksRUFBRSxFQUZBO0FBR05ELGFBQUssRUFBRTtBQUhELE9BSEY7QUFTTDZDLFdBQUssRUFBRTtBQUNOdE4sYUFBSyxFQUFFLElBREQ7QUFFTjZILGdCQUFRLEVBQUU7QUFGSjtBQVRGO0FBaEJELEdBRFU7QUFpQ2hCMkYsS0FBRyxFQUFFO0FBQ0pILFVBQU0sRUFBRTtBQUNQck4sV0FBSyxFQUFFLElBREE7QUFFUHVLLFdBQUssRUFBRTtBQUNOQyxXQUFHLEVBQUUsR0FEQztBQUVORSxZQUFJLEVBQUUsR0FGQTtBQUdORCxhQUFLLEVBQUUsR0FIRDtBQUlORSxhQUFLLEVBQUU7QUFKRDtBQUZBLEtBREo7QUFVSjRDLFFBQUksRUFBRTtBQUNMdk4sV0FBSyxFQUFFLElBREY7QUFFTHVLLFdBQUssRUFBRTtBQUNOQyxXQUFHLEVBQUUsQ0FEQztBQUVORSxZQUFJLEVBQUUsQ0FGQTtBQUdORCxhQUFLLEVBQUU7QUFIRDtBQUZGLEtBVkY7QUFrQko1QyxZQUFRLEVBQUU7QUFsQk4sR0FqQ1c7QUFzRGhCNEYsT0FBSyxFQUFFLENBdERTO0FBdURoQkMsUUFBTSxFQUFFO0FBdkRRLENBQWpCOztBQTBEQSxTQUFTQyxzQkFBVCxHQUFtQztBQUNsQyxNQUFNQyxJQUFJLEdBQUcsRUFBYjtBQUNBLE1BQU1DLElBQUksR0FBRyxDQUFDLENBQUQsRUFBSWhKLGtEQUFKLEVBQWNBLGtEQUFkLEVBQXdCLENBQUNBLGtEQUF6QixFQUFtQyxDQUFDQSxrREFBcEMsRUFBOENBLGtEQUE5QyxFQUF3RCxDQUFDQSxrREFBekQsRUFBbUUsQ0FBbkUsRUFBc0UsQ0FBdEUsQ0FBYjtBQUNBLE1BQU1pSixJQUFJLEdBQUcsQ0FBQyxDQUFELEVBQUlqSixrREFBSixFQUFjLENBQUNBLGtEQUFmLEVBQXlCLENBQUNBLGtEQUExQixFQUFvQ0Esa0RBQXBDLEVBQThDLENBQTlDLEVBQWlELENBQWpELEVBQW9ELENBQUNBLGtEQUFyRCxFQUErREEsa0RBQS9ELENBQWI7O0FBRUEsTUFBTWtKLFNBQVMsR0FBRyxTQUFaQSxTQUFZLENBQUFDLENBQUM7QUFBQSxXQUFJLENBQUNILElBQUksQ0FBQ0csQ0FBRCxDQUFMLEVBQVVGLElBQUksQ0FBQ0UsQ0FBRCxDQUFkLENBQUo7QUFBQSxHQUFuQjs7QUFFQUosTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJdk4sR0FBSixDQUFRME4sU0FBUixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU92TixHQUFQLENBQVcwTixTQUFYLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVV2TixHQUFWLENBQWMwTixTQUFkLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhdk4sR0FBYixDQUFpQjBOLFNBQWpCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0J2TixHQUFoQixDQUFvQjBOLFNBQXBCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUJ2TixHQUFuQixDQUF1QjBOLFNBQXZCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0J2TixHQUF0QixDQUEwQjBOLFNBQTFCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUJ2TixHQUF6QixDQUE2QjBOLFNBQTdCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEJ2TixHQUE1QixDQUFnQzBOLFNBQWhDLENBQVY7QUFFQSxTQUFPSCxJQUFQO0FBQ0E7O0FBRUQsU0FBU0ssd0JBQVQsR0FBcUM7QUFDcEMsTUFBTUwsSUFBSSxHQUFHLEVBQWI7QUFDQSxNQUFNQyxJQUFJLEdBQUcsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFDLENBQVgsRUFBYyxDQUFkLEVBQWlCLEdBQWpCLEVBQXNCLENBQUMsR0FBdkIsRUFBNEIsR0FBNUIsRUFBaUMsQ0FBQyxHQUFsQyxDQUFiO0FBQ0EsTUFBTUMsSUFBSSxHQUFHLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFDLENBQVIsRUFBVyxDQUFYLEVBQWMsQ0FBZCxFQUFpQixDQUFDLEdBQWxCLEVBQXVCLEdBQXZCLEVBQTRCLEdBQTVCLEVBQWlDLENBQUMsR0FBbEMsQ0FBYjs7QUFFQSxNQUFNQyxTQUFTLEdBQUcsU0FBWkEsU0FBWSxDQUFBQyxDQUFDO0FBQUEsV0FBSSxDQUFDSCxJQUFJLENBQUNHLENBQUQsQ0FBTCxFQUFVRixJQUFJLENBQUNFLENBQUQsQ0FBZCxDQUFKO0FBQUEsR0FBbkI7O0FBRUFKLE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSXZOLEdBQUosQ0FBUTBOLFNBQVIsQ0FBVjtBQUNBSCxNQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPdk4sR0FBUCxDQUFXME4sU0FBWCxDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVdk4sR0FBVixDQUFjME4sU0FBZCxDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYXZOLEdBQWIsQ0FBaUIwTixTQUFqQixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCdk4sR0FBaEIsQ0FBb0IwTixTQUFwQixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1Cdk4sR0FBbkIsQ0FBdUIwTixTQUF2QixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLENBQW5CLEVBQXNCdk4sR0FBdEIsQ0FBMEIwTixTQUExQixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLENBQW5CLEVBQXNCLENBQXRCLEVBQXlCdk4sR0FBekIsQ0FBNkIwTixTQUE3QixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLENBQW5CLEVBQXNCLENBQXRCLEVBQXlCLENBQXpCLEVBQTRCdk4sR0FBNUIsQ0FBZ0MwTixTQUFoQyxDQUFWO0FBRUEsU0FBT0gsSUFBUDtBQUNBOztBQUVELFNBQVNNLG1CQUFULENBQThCQyxPQUE5QixFQUF1Q0MsT0FBdkMsRUFBZ0Q7QUFDL0MsTUFBTVIsSUFBSSxHQUFHLEVBQWI7QUFDQU8sU0FBTyxHQUFHLENBQUMsQ0FBRCxFQUFJRSxNQUFKLENBQVdGLE9BQVgsQ0FBVjtBQUNBQyxTQUFPLEdBQUcsQ0FBQyxDQUFELEVBQUlDLE1BQUosQ0FBV0QsT0FBWCxDQUFWOztBQUVBLE1BQU1MLFNBQVMsR0FBRyxTQUFaQSxTQUFZLENBQUFDLENBQUM7QUFBQSxXQUFJLENBQUNHLE9BQU8sQ0FBQ0gsQ0FBRCxDQUFSLEVBQWFJLE9BQU8sQ0FBQ0osQ0FBRCxDQUFwQixDQUFKO0FBQUEsR0FBbkI7O0FBRUFKLE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSXZOLEdBQUosQ0FBUTBOLFNBQVIsQ0FBVjtBQUNBSCxNQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsQ0FBQyxDQUFELEVBQUksRUFBSixFQUFRdk4sR0FBUixDQUFZME4sU0FBWixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsRUFBUixFQUFZdk4sR0FBWixDQUFnQjBOLFNBQWhCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsRUFBVixFQUFjdk4sR0FBZCxDQUFrQjBOLFNBQWxCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsRUFBVixFQUFjLEVBQWQsRUFBa0J2TixHQUFsQixDQUFzQjBOLFNBQXRCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsRUFBVixFQUFjLEVBQWQsRUFBa0IsRUFBbEIsRUFBc0J2TixHQUF0QixDQUEwQjBOLFNBQTFCLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLEVBQWIsRUFBaUIsRUFBakIsRUFBcUIsRUFBckIsRUFBeUJ2TixHQUF6QixDQUE2QjBOLFNBQTdCLENBQVY7QUFFQSxTQUFPSCxJQUFQO0FBQ0E7O0FBRUQsU0FBU1UscUJBQVQsQ0FBZ0NILE9BQWhDLEVBQXlDQyxPQUF6QyxFQUFrRDtBQUNqRCxNQUFNUixJQUFJLEdBQUcsRUFBYjtBQUNBTyxTQUFPLEdBQUcsQ0FBQyxDQUFELEVBQUlFLE1BQUosQ0FBV0YsT0FBWCxDQUFWO0FBQ0FDLFNBQU8sR0FBRyxDQUFDLENBQUQsRUFBSUMsTUFBSixDQUFXRCxPQUFYLENBQVY7O0FBRUEsTUFBTUwsU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQUMsQ0FBQztBQUFBLFdBQUksQ0FBQ0csT0FBTyxDQUFDSCxDQUFELENBQVIsRUFBYUksT0FBTyxDQUFDSixDQUFELENBQXBCLENBQUo7QUFBQSxHQUFuQjs7QUFFQUosTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJdk4sR0FBSixDQUFRME4sU0FBUixDQUFWO0FBQ0FILE1BQUksQ0FBQyxDQUFELENBQUosR0FBVSxDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVF2TixHQUFSLENBQVkwTixTQUFaLENBQVY7QUFDQUgsTUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLENBQUMsQ0FBRCxFQUFJLEVBQUosRUFBUSxFQUFSLEVBQVl2TixHQUFaLENBQWdCME4sU0FBaEIsQ0FBVjtBQUNBSCxNQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLEVBQVAsRUFBVyxFQUFYLEVBQWV2TixHQUFmLENBQW1CME4sU0FBbkIsQ0FBVjtBQUNBSCxNQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLEVBQVAsRUFBVyxFQUFYLEVBQWUsRUFBZixFQUFtQnZOLEdBQW5CLENBQXVCME4sU0FBdkIsQ0FBVjtBQUNBSCxNQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLEVBQVAsRUFBVyxFQUFYLEVBQWUsRUFBZixFQUFtQixFQUFuQixFQUF1QnZOLEdBQXZCLENBQTJCME4sU0FBM0IsQ0FBVjtBQUNBSCxNQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQixFQUFsQixFQUFzQixFQUF0QixFQUEwQnZOLEdBQTFCLENBQThCME4sU0FBOUIsQ0FBVjtBQUVBLFNBQU9ILElBQVA7QUFDQTs7SUFFb0JXLFU7OztBQUNwQixzQkFBYW5PLFFBQWIsRUFBdUI7QUFBQTs7QUFBQTs7QUFDdEIsU0FBS0EsUUFBTCxHQUFnQkksTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQlgsUUFBbEIsRUFBNEJNLFFBQTVCLENBQWhCO0FBRUEsUUFBTXFOLEtBQUssR0FBRyxLQUFLck4sUUFBTCxDQUFjcU4sS0FBNUI7QUFDQSxRQUFNQyxNQUFNLEdBQUcsS0FBS3ROLFFBQUwsQ0FBY3NOLE1BQTdCO0FBQ0EsU0FBS1MsT0FBTCxHQUFlM0IsdURBQUssQ0FBQ2tCLE1BQUQsQ0FBTCxDQUFjck4sR0FBZCxDQUFrQixVQUFBbU8sS0FBSztBQUFBLGFBQUk3Qix5REFBTyxDQUFDaEwsSUFBSSxDQUFDaUwsR0FBTCxDQUFXNEIsS0FBSyxHQUFHZCxNQUFULEdBQW1CRCxLQUFwQixJQUE4QixJQUFJOUwsSUFBSSxDQUFDK0osRUFBdkMsSUFBNkMrQixLQUF0RCxDQUFELENBQVg7QUFBQSxLQUF2QixDQUFmO0FBQ0EsU0FBS1csT0FBTCxHQUFlNUIsdURBQUssQ0FBQ2tCLE1BQUQsQ0FBTCxDQUFjck4sR0FBZCxDQUFrQixVQUFBbU8sS0FBSztBQUFBLGFBQUk3Qix5REFBTyxDQUFDaEwsSUFBSSxDQUFDa0wsR0FBTCxDQUFXMkIsS0FBSyxHQUFHZCxNQUFULEdBQW1CRCxLQUFwQixJQUE4QixJQUFJOUwsSUFBSSxDQUFDK0osRUFBdkMsSUFBNkMrQixLQUF0RCxDQUFELENBQVg7QUFBQSxLQUF2QixDQUFmO0FBRUEsU0FBS2dCLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCO0FBRUEsU0FBS0MsV0FBTCwrREFDRXZFLDhDQURGLG9DQUVHRiwrQ0FGSCxFQUVVZ0UsbUJBQW1CLENBQUMsS0FBS0MsT0FBTixFQUFlLEtBQUtDLE9BQXBCLENBRjdCLHlCQUdHbkQsaURBSEgsRUFHWXFELHFCQUFxQixDQUFDLEtBQUtILE9BQU4sRUFBZSxLQUFLQyxPQUFwQixDQUhqQyw4Q0FLRXRELGlEQUxGLDBDQU1HWiwrQ0FOSCxFQU1VeUQsc0JBQXNCLEVBTmhDLDRCQU9HMUMsaURBUEgsRUFPWWdELHdCQUF3QixFQVBwQztBQVdBLFNBQUtYLEtBQUwsR0FBYSxLQUFLcUIsV0FBTCxDQUFpQnZFLDhDQUFqQixFQUFzQkYsK0NBQXRCLEVBQTRCLENBQTVCLEVBQStCbUUsTUFBL0IsQ0FBc0MsS0FBS00sV0FBTCxDQUFpQnZFLDhDQUFqQixFQUFzQmEsaURBQXRCLEVBQThCLENBQTlCLENBQXRDLENBQWI7QUFDQTs7OzsrQkFFV0ssTyxFQUFTMUssTSxFQUFRRCxLLEVBQU80SixLLEVBQU87QUFDMUNlLGFBQU8sQ0FBQ0UsU0FBUjtBQUNBRixhQUFPLENBQUNzRCxJQUFSLENBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQmpPLEtBQW5CLEVBQTBCQyxNQUExQjtBQUNBMEssYUFBTyxDQUFDSyxTQUFSLEdBQW9CQywwREFBUSxDQUFDckIsS0FBRCxDQUE1QjtBQUNBZSxhQUFPLENBQUM2QixTQUFSO0FBQ0E3QixhQUFPLENBQUNPLElBQVI7QUFDQTs7O3dCQUVJUCxPLEVBQVN0TCxLLEVBQU82TyxLLEVBQU9DLEssRUFBT0MsTyxFQUFTQyxPLEVBQVNDLFMsRUFBV0MsVyxFQUFhO0FBQzVFLFVBQU1oSyxDQUFDLEdBQUcySixLQUFLLEdBQUlLLFdBQVcsR0FBR0gsT0FBakM7QUFDQSxVQUFNM0osQ0FBQyxHQUFHMEosS0FBSyxHQUFJSSxXQUFXLEdBQUdGLE9BQWpDO0FBRUExRCxhQUFPLENBQUMyQixNQUFSLENBQWUvSCxDQUFmLEVBQWtCRSxDQUFsQjtBQUNBa0csYUFBTyxDQUFDRyxHQUFSLENBQVl2RyxDQUFaLEVBQWVFLENBQWYsRUFBa0I2SixTQUFsQixFQUE2QixDQUE3QixFQUFnQ3ROLElBQUksQ0FBQytKLEVBQUwsR0FBUSxDQUF4QyxFQUEyQyxJQUEzQztBQUNBOzs7Z0NBRVlrQyxJLEVBQU01TixLLEVBQU87QUFBQTs7QUFDekIsVUFBTWtQLFdBQVcsR0FBR2xQLEtBQUssR0FBRyxLQUFLSSxRQUFMLENBQWNvTixHQUFkLENBQWtCM0YsUUFBOUMsQ0FEeUIsQ0FDK0I7O0FBQ3hELFVBQU1zSCxhQUFhLEdBQUduUCxLQUFLLEdBQUcsS0FBS0ksUUFBTCxDQUFjb04sR0FBZCxDQUFrQkQsSUFBbEIsQ0FBdUJ2TixLQUFyRDtBQUNBLFVBQU1vUCxlQUFlLEdBQUdwUCxLQUFLLEdBQUcsS0FBS0ksUUFBTCxDQUFjb04sR0FBZCxDQUFrQkgsTUFBbEIsQ0FBeUJyTixLQUF6RDtBQUVBLFdBQUt5TyxRQUFMLENBQWN6TyxLQUFkLEdBQXNCQSxLQUF0QjtBQUNBLFdBQUt5TyxRQUFMLENBQWM3TixNQUFkLEdBQXVCLENBQUNlLElBQUksQ0FBQzRHLElBQUwsQ0FBVTZHLGVBQVYsSUFBNkIsQ0FBOUIsSUFBbUMsQ0FBMUQ7QUFDQSxXQUFLWCxRQUFMLENBQWM5TixLQUFkLEdBQXNCLEtBQUs4TixRQUFMLENBQWM3TixNQUFwQztBQUVBLFVBQU15TyxTQUFTLEdBQUcsS0FBS1osUUFBTCxDQUFjN04sTUFBZCxHQUF1QixDQUF6QztBQUVBLFdBQUs2TixRQUFMLENBQWNqQixHQUFkLEdBQW9COEIsNkRBQVcsQ0FBQyxVQUFDaEUsT0FBRCxFQUFVMUssTUFBVixFQUFrQkQsS0FBbEIsRUFBNEI7QUFDM0QySyxlQUFPLENBQUNFLFNBQVI7QUFDQUYsZUFBTyxDQUFDRyxHQUFSLENBQVk0RCxTQUFaLEVBQXVCQSxTQUF2QixFQUFrQ0QsZUFBbEMsRUFBbUQsQ0FBbkQsRUFBc0R6TixJQUFJLENBQUMrSixFQUFMLEdBQVEsQ0FBOUQsRUFBaUUsSUFBakU7QUFDQUosZUFBTyxDQUFDNkIsU0FBUjtBQUNBN0IsZUFBTyxDQUFDSyxTQUFSLEdBQW9CQywwREFBUSxDQUFDLEtBQUksQ0FBQ3hMLFFBQUwsQ0FBY29OLEdBQWQsQ0FBa0JILE1BQWxCLENBQXlCOUMsS0FBMUIsQ0FBNUI7QUFDQWUsZUFBTyxDQUFDTyxJQUFSO0FBRUFQLGVBQU8sQ0FBQ0UsU0FBUjtBQUNBRixlQUFPLENBQUNHLEdBQVIsQ0FBWTRELFNBQVosRUFBdUJBLFNBQXZCLEVBQWtDRixhQUFsQyxFQUFpRCxDQUFqRCxFQUFvRHhOLElBQUksQ0FBQytKLEVBQUwsR0FBUSxDQUE1RCxFQUErRCxJQUEvRDtBQUNBSixlQUFPLENBQUM2QixTQUFSO0FBQ0E3QixlQUFPLENBQUNLLFNBQVIsR0FBb0JDLDBEQUFRLENBQUMsS0FBSSxDQUFDeEwsUUFBTCxDQUFjb04sR0FBZCxDQUFrQkQsSUFBbEIsQ0FBdUJoRCxLQUF4QixDQUE1QjtBQUNBZSxlQUFPLENBQUNPLElBQVI7QUFDQSxPQVo4QixFQVk1QixLQUFLNEMsUUFBTCxDQUFjN04sTUFaYyxFQVlOLEtBQUs2TixRQUFMLENBQWM5TixLQVpSLENBQS9CO0FBY0EsVUFBTTRPLFVBQVUsR0FBR3ZQLEtBQUssR0FBR3FQLFNBQTNCO0FBRUEsV0FBS1osUUFBTCxDQUFjYixJQUFkLEdBQXFCQSxJQUFJLENBQUN2TixHQUFMLENBQVMsVUFBQW1QLFFBQVEsRUFBSTtBQUN6QyxlQUFPRiw2REFBVyxDQUFDLFVBQUFoRSxPQUFPLEVBQUk7QUFDN0JrRSxrQkFBUSxDQUFDL0MsT0FBVCxDQUFpQjtBQUFBO0FBQUEsZ0JBQUVvQixJQUFGO0FBQUEsZ0JBQVFDLElBQVI7O0FBQUEsbUJBQWtCeEMsT0FBTyxDQUFDbUUsU0FBUixDQUFrQixLQUFJLENBQUNoQixRQUFMLENBQWNqQixHQUFoQyxFQUFxQytCLFVBQVUsR0FBSUwsV0FBVyxHQUFHckIsSUFBakUsRUFBd0UwQixVQUFVLEdBQUlMLFdBQVcsR0FBR3BCLElBQXBHLENBQWxCO0FBQUEsV0FBakI7QUFDQSxTQUZpQixFQUVmOU4sS0FBSyxHQUFHLENBRk8sQ0FBbEI7QUFHQSxPQUpvQixDQUFyQjtBQUtBOzs7eUJBRUtzTCxPLEVBQVN0TCxLLEVBQU9rRixDLEVBQUdFLEMsRUFBR21HLEksRUFBaUI7QUFBQSxVQUFYWixLQUFXLHVFQUFILENBQUc7QUFBQSxVQUNyQ1IsU0FEcUMsR0FDTG9CLElBREssQ0FDckNwQixTQURxQztBQUFBLFVBQzFCRixXQUQwQixHQUNMc0IsSUFESyxDQUMxQnRCLFdBRDBCO0FBQUEsVUFDYjJELElBRGEsR0FDTHJDLElBREssQ0FDYnFDLElBRGE7O0FBRzVDLFVBQUksS0FBS2UsV0FBTCxDQUFpQnhFLFNBQWpCLEtBQ0QsS0FBS3dFLFdBQUwsQ0FBaUJ4RSxTQUFqQixFQUE0QkYsV0FBNUIsQ0FEQyxJQUVELEtBQUswRSxXQUFMLENBQWlCeEUsU0FBakIsRUFBNEJGLFdBQTVCLEVBQXlDMkQsSUFBekMsQ0FGSCxFQUVtRDtBQUVsRCxZQUFJNU4sS0FBSyxLQUFLLEtBQUt5TyxRQUFMLENBQWN6TyxLQUE1QixFQUFtQztBQUNsQyxlQUFLMFAsV0FBTCxDQUFpQixLQUFLZixXQUFMLENBQWlCeEUsU0FBakIsRUFBNEJGLFdBQTVCLENBQWpCLEVBQTJEakssS0FBM0Q7QUFDQTs7QUFFRCxZQUFNMlAsVUFBVSxHQUFJM1AsS0FBSyxHQUFHLENBQVQsR0FBY3VMLElBQUksQ0FBQ3ZMLEtBQXRDO0FBQ0EsWUFBTTRQLFdBQVcsR0FBSTVQLEtBQUssR0FBRyxDQUFULEdBQWN1TCxJQUFJLENBQUN2TCxLQUF2QztBQUVBc0wsZUFBTyxDQUFDdUUsV0FBUixHQUFzQmxGLEtBQXRCO0FBQ0FXLGVBQU8sQ0FBQ21FLFNBQVIsQ0FBa0IsS0FBS2hCLFFBQUwsQ0FBY2IsSUFBZCxDQUFtQkEsSUFBbkIsQ0FBbEIsRUFBNEMxSSxDQUFDLEdBQUl5SyxVQUFVLEdBQUcsQ0FBOUQsRUFBa0V2SyxDQUFDLEdBQUl3SyxXQUFXLEdBQUcsQ0FBckYsRUFBeUZELFVBQXpGLEVBQXFHQyxXQUFyRztBQUNBdEUsZUFBTyxDQUFDdUUsV0FBUixHQUFzQixDQUF0QjtBQUNBO0FBQ0Q7Ozt5QkFFS3ZFLE8sRUFBU3RMLEssRUFBT2tGLEMsRUFBR0UsQyxFQUE4QjtBQUFBLFVBQTNCZ0ksS0FBMkIsdUVBQXBCLEtBQUtoTixRQUFMLENBQWNnTixJQUFNOztBQUN0RCxVQUFJcE4sS0FBSyxLQUFLLEtBQUswTyxTQUFMLENBQWUxTyxLQUE3QixFQUFvQztBQUNuQyxhQUFLOFAsWUFBTCxDQUFrQjlQLEtBQWxCO0FBQ0E7O0FBRURzTCxhQUFPLENBQUNtRSxTQUFSLENBQWtCLEtBQUtmLFNBQUwsQ0FBZXRCLElBQWpDLEVBQXVDbEksQ0FBQyxHQUFHbEYsS0FBM0MsRUFBa0RvRixDQUFDLEdBQUdwRixLQUF0RCxFQUE2REEsS0FBSyxHQUFHLENBQXJFLEVBQXdFQSxLQUFLLEdBQUcsQ0FBaEY7QUFDQTs7O2lDQUVhQSxLLEVBQU87QUFBQTs7QUFDcEIsV0FBSzBPLFNBQUwsQ0FBZTFPLEtBQWYsR0FBdUJBLEtBQXZCO0FBRUEsV0FBSzBPLFNBQUwsQ0FBZXRCLElBQWYsR0FBc0JrQyw2REFBVyxDQUFDLFVBQUFoRSxPQUFPLEVBQUk7QUFDNUMsY0FBSSxDQUFDeUUsS0FBTCxDQUFXekUsT0FBWCxFQUFvQnRMLEtBQXBCLEVBQTJCQSxLQUEzQixFQUFrQ0EsS0FBbEMsRUFBeUMsTUFBSSxDQUFDSSxRQUFMLENBQWNnTixJQUFkLENBQW1CQyxNQUE1RDs7QUFDQSxjQUFJLENBQUMyQyxNQUFMLENBQVkxRSxPQUFaLEVBQXFCdEwsS0FBckIsRUFBNEJBLEtBQTVCLEVBQW1DQSxLQUFuQyxFQUEwQyxNQUFJLENBQUNJLFFBQUwsQ0FBY2dOLElBQWQsQ0FBbUJDLE1BQW5CLENBQTBCQyxLQUFwRSxFQUEyRSxNQUFJLENBQUNsTixRQUFMLENBQWNnTixJQUFkLENBQW1CQyxNQUFuQixDQUEwQjlDLEtBQXJHOztBQUNBLGNBQUksQ0FBQ3dGLEtBQUwsQ0FBV3pFLE9BQVgsRUFBb0J0TCxLQUFwQixFQUEyQkEsS0FBM0IsRUFBa0NBLEtBQWxDLEVBQXlDLE1BQUksQ0FBQ0ksUUFBTCxDQUFjZ04sSUFBZCxDQUFtQkcsSUFBNUQ7O0FBQ0EsY0FBSSxDQUFDeUMsTUFBTCxDQUFZMUUsT0FBWixFQUFxQnRMLEtBQXJCLEVBQTRCQSxLQUE1QixFQUFtQ0EsS0FBbkMsRUFBMEMsTUFBSSxDQUFDSSxRQUFMLENBQWNnTixJQUFkLENBQW1CRyxJQUFuQixDQUF3QkQsS0FBbEUsRUFBeUUsTUFBSSxDQUFDbE4sUUFBTCxDQUFjZ04sSUFBZCxDQUFtQkcsSUFBbkIsQ0FBd0JoRCxLQUFqRztBQUNBLE9BTGdDLEVBSzlCdkssS0FBSyxHQUFHLENBTHNCLENBQWpDO0FBTUE7OzswQkFFTXNMLE8sRUFBU3RMLEssRUFBT2tGLEMsRUFBR0UsQyxFQUFHZ0ksSSxFQUFNO0FBQ2xDOUIsYUFBTyxDQUFDRSxTQUFSO0FBQ0FGLGFBQU8sQ0FBQzJCLE1BQVIsQ0FBZS9ILENBQWYsRUFBa0JFLENBQWxCO0FBRUFrRyxhQUFPLENBQUNHLEdBQVIsQ0FBWXZHLENBQVosRUFBZUUsQ0FBZixFQUFrQnBGLEtBQUssR0FBR29OLElBQUksQ0FBQ3BOLEtBQS9CLEVBQXNDLENBQXRDLEVBQXlDMkIsSUFBSSxDQUFDK0osRUFBTCxHQUFRLENBQWpELEVBQW9ELElBQXBEO0FBRUFKLGFBQU8sQ0FBQzZCLFNBQVI7QUFDQTdCLGFBQU8sQ0FBQ0ssU0FBUixHQUFvQkMsMERBQVEsQ0FBQ3dCLElBQUksQ0FBQzdDLEtBQU4sQ0FBNUI7QUFDQWUsYUFBTyxDQUFDTyxJQUFSO0FBQ0E7OzsyQkFFT1AsTyxFQUFTdEwsSyxFQUFPa0YsQyxFQUFHRSxDLEVBQUc2SyxJLEVBQU0xRixLLEVBQU87QUFBQTs7QUFDMUMsVUFBTTJGLFVBQVUsR0FBR2xRLEtBQUssR0FBR2lRLElBQUksQ0FBQ2pRLEtBQWhDO0FBQ0EsVUFBTW1RLFlBQVksR0FBR25RLEtBQUssR0FBR2lRLElBQUksQ0FBQ3BJLFFBQWxDO0FBRUF5RCxhQUFPLENBQUNFLFNBQVI7QUFFQSxXQUFLOEIsS0FBTCxDQUNDYixPQURELENBQ1M7QUFBQTtBQUFBLFlBQUUyRCxLQUFGO0FBQUEsWUFBU0MsS0FBVDs7QUFBQSxlQUFvQixNQUFJLENBQUM3QyxHQUFMLENBQVNsQyxPQUFULEVBQWtCdEwsS0FBbEIsRUFBeUJrRixDQUF6QixFQUEyQkUsQ0FBM0IsRUFBOEJnTCxLQUE5QixFQUFxQ0MsS0FBckMsRUFBNENILFVBQTVDLEVBQXdEQyxZQUF4RCxDQUFwQjtBQUFBLE9BRFQ7QUFHQTdFLGFBQU8sQ0FBQzZCLFNBQVI7QUFDQTdCLGFBQU8sQ0FBQ0ssU0FBUixHQUFvQkMsMERBQVEsQ0FBQ3JCLEtBQUQsQ0FBNUI7QUFDQWUsYUFBTyxDQUFDTyxJQUFSO0FBQ0E7Ozs4QkFFVVAsTyxFQUFTdEwsSyxFQUFPa0YsQyxFQUFHRSxDLEVBQUc7QUFBQTs7QUFDaEMsVUFBSWtMLElBQUksR0FBR3RRLEtBQUssR0FBRyxLQUFuQjtBQUNBLFVBQUl1USxNQUFNLEdBQUd2USxLQUFLLEdBQUcsS0FBckI7QUFFQXNMLGFBQU8sQ0FBQ0UsU0FBUjtBQUNBRixhQUFPLENBQUMyQixNQUFSLENBQWUvSCxDQUFmLEVBQWlCRSxDQUFqQjtBQUVBa0csYUFBTyxDQUFDMkIsTUFBUixDQUFlL0gsQ0FBQyxHQUFHb0wsSUFBSSxHQUFHLEtBQUtuQyxPQUFMLENBQWEsQ0FBYixDQUExQixFQUEyQy9JLENBQUMsR0FBR2tMLElBQUksR0FBRyxLQUFLbEMsT0FBTCxDQUFhLENBQWIsQ0FBdEQ7QUFDQTVCLDZEQUFLLENBQUMsS0FBS3BNLFFBQUwsQ0FBY3NOLE1BQWYsQ0FBTCxDQUE0QjhDLE1BQTVCLENBQW1DLFVBQUFoQyxLQUFLO0FBQUEsZUFBSUEsS0FBSyxHQUFHLENBQVIsS0FBYyxDQUFsQjtBQUFBLE9BQXhDLEVBQTZEL0IsT0FBN0QsQ0FBcUUsVUFBQStCLEtBQUssRUFBSTtBQUM3RWxELGVBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR3FMLE1BQU0sR0FBRyxNQUFJLENBQUNwQyxPQUFMLENBQWFLLEtBQWIsQ0FBNUIsRUFBaURwSixDQUFDLEdBQUdtTCxNQUFNLEdBQUcsTUFBSSxDQUFDbkMsT0FBTCxDQUFhSSxLQUFiLENBQTlEO0FBQ0FsRCxlQUFPLENBQUM0QixNQUFSLENBQWVoSSxDQUFDLEdBQUdvTCxJQUFJLEdBQUcsTUFBSSxDQUFDbkMsT0FBTCxDQUFhSyxLQUFLLEdBQUMsQ0FBbkIsQ0FBMUIsRUFBaURwSixDQUFDLEdBQUdrTCxJQUFJLEdBQUcsTUFBSSxDQUFDbEMsT0FBTCxDQUFhSSxLQUFLLEdBQUMsQ0FBbkIsQ0FBNUQ7QUFDQSxPQUhEO0FBS0FsRCxhQUFPLENBQUM2QixTQUFSO0FBQ0E3QixhQUFPLENBQUNLLFNBQVIsR0FBb0IsY0FBcEI7QUFDQUwsYUFBTyxDQUFDTyxJQUFSO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyU0Y7QUFDQTs7SUFFcUI0RSxVOzs7QUFDcEIsc0JBQVlyUSxRQUFaLEVBQXNCO0FBQUE7O0FBQ3JCLFNBQUtBLFFBQUwsR0FBZ0JJLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JMLFFBQWxCLENBQWhCO0FBRUEsU0FBS3NRLE9BQUwsR0FBZSxDQUFDN0wsa0RBQUQsRUFBV0Esa0RBQVgsRUFBcUIsQ0FBQ0Esa0RBQXRCLEVBQWdDLENBQUNBLGtEQUFqQyxDQUFmO0FBQ0EsU0FBSzhMLE9BQUwsR0FBZSxDQUFDOUwsa0RBQUQsRUFBVyxDQUFDQSxrREFBWixFQUFzQixDQUFDQSxrREFBdkIsRUFBaUNBLGtEQUFqQyxDQUFmO0FBQ0EsU0FBSytMLFFBQUwsR0FBZ0IsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQUMsQ0FBUixFQUFXLENBQVgsRUFBYyxHQUFkLEVBQW1CLENBQUMsR0FBcEIsQ0FBaEI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLENBQUMsQ0FBRCxFQUFJLENBQUMsQ0FBTCxFQUFRLENBQVIsRUFBVyxDQUFYLEVBQWMsQ0FBQyxHQUFmLEVBQW9CLEdBQXBCLENBQWhCO0FBQ0E7Ozs7eUJBRUl2RixPLEVBQVN0TCxLLEVBQU9rRixDLEVBQUdFLEMsRUFBR21HLEksRUFBTTtBQUNoQ3ZMLFdBQUssR0FBR0EsS0FBSyxHQUFHdUwsSUFBSSxDQUFDdkwsS0FBckI7QUFDQSxVQUFJOFEsYUFBYSxHQUFHdkYsSUFBSSxDQUFDdEIsV0FBTCxLQUFxQmdCLGlEQUFyQixHQUE4QixLQUFLMkYsUUFBbkMsR0FBOEMsS0FBS0YsT0FBdkU7QUFDQSxVQUFJSyxhQUFhLEdBQUd4RixJQUFJLENBQUN0QixXQUFMLEtBQXFCZ0IsaURBQXJCLEdBQThCLEtBQUs0RixRQUFuQyxHQUE4QyxLQUFLRixPQUF2RTtBQUVBckYsYUFBTyxDQUFDRSxTQUFSO0FBQ0FGLGFBQU8sQ0FBQzJCLE1BQVIsQ0FBZS9ILENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFFQXpGLGFBQU8sQ0FBQ0ssU0FBUixHQUFvQkMsMERBQVEsQ0FBQ0wsSUFBSSxDQUFDaEIsS0FBTixDQUE1QjtBQUNBZSxhQUFPLENBQUNPLElBQVI7QUFDQTs7OzRCQUVPUCxPLEVBQVN0TCxLLEVBQU9rRixDLEVBQUdFLEMsRUFBR21HLEksRUFBTTtBQUNuQ3ZMLFdBQUssR0FBR0EsS0FBSyxHQUFHdUwsSUFBSSxDQUFDdkwsS0FBckI7QUFDQSxVQUFJOFEsYUFBYSxHQUFHdkYsSUFBSSxDQUFDdEIsV0FBTCxLQUFxQmdCLGlEQUFyQixHQUE4QixLQUFLMkYsUUFBbkMsR0FBOEMsS0FBS0YsT0FBdkU7QUFDQSxVQUFJSyxhQUFhLEdBQUd4RixJQUFJLENBQUN0QixXQUFMLEtBQXFCZ0IsaURBQXJCLEdBQThCLEtBQUs0RixRQUFuQyxHQUE4QyxLQUFLRixPQUF2RTtBQUVBckYsYUFBTyxDQUFDRSxTQUFSO0FBQ0FGLGFBQU8sQ0FBQzJCLE1BQVIsQ0FBZS9ILENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzRCLE1BQVIsQ0FBZWhJLENBQUMsR0FBR2xGLEtBQUssR0FBRzhRLGFBQWEsQ0FBQyxDQUFELENBQXhDLEVBQTZDMUwsQ0FBQyxHQUFHcEYsS0FBSyxHQUFHK1EsYUFBYSxDQUFDLENBQUQsQ0FBdEU7QUFDQXpGLGFBQU8sQ0FBQzZCLFNBQVI7QUFFQTdCLGFBQU8sQ0FBQ1EsU0FBUixHQUFvQlAsSUFBSSxDQUFDNUssS0FBekI7QUFDQTJLLGFBQU8sQ0FBQ1MsV0FBUixHQUFzQkgsMERBQVEsQ0FBQ0wsSUFBSSxDQUFDaEIsS0FBTixDQUE5QjtBQUNBZSxhQUFPLENBQUNVLE1BQVI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQ0ssU0FBU2dGLEtBQVQsQ0FBZ0JDLEdBQWhCLEVBQXFCO0FBQzNCLE1BQUlDLGFBQWEsR0FBRztBQUNuQkMsT0FBRyxFQUFFLGVBQWtDO0FBQUEsVUFBeEJDLFNBQXdCLHVFQUFaO0FBQUEsZUFBTSxJQUFOO0FBQUEsT0FBWTtBQUN0QyxVQUFJQSxTQUFTLENBQUNILEdBQUQsQ0FBYixFQUFvQkksT0FBTyxDQUFDRixHQUFSLENBQVlGLEdBQVo7QUFDcEIsYUFBT0MsYUFBUDtBQUNBLEtBSmtCO0FBTW5CbkssU0FBSyxFQUFFLGlCQUFZO0FBQ2xCLGFBQU9rSyxHQUFQO0FBQ0E7QUFSa0IsR0FBcEI7QUFXQXhFLFNBQU8sQ0FBQzZFLENBQUQsRUFBSSxVQUFVaFIsTUFBVixFQUFrQmlSLEdBQWxCLEVBQXVCO0FBQ2pDTCxpQkFBYSxDQUFDSyxHQUFELENBQWIsR0FBcUIsWUFBWTtBQUNoQ04sU0FBRyxHQUFHM1EsTUFBTSxNQUFOLFVBQU8yUSxHQUFQLG9DQUFlaE0sU0FBZixHQUFOO0FBQ0EsYUFBT2lNLGFBQVA7QUFDQSxLQUhEO0FBSUEsR0FMTSxDQUFQO0FBT0EsU0FBT0EsYUFBUDtBQUNBO0FBRU0sU0FBU00sT0FBVCxDQUFrQlAsR0FBbEIsRUFBdUI7QUFDN0IsU0FBT1QsTUFBTSxDQUFDUyxHQUFELEVBQU0sVUFBQVEsR0FBRztBQUFBLFdBQUlBLEdBQUcsSUFBSSxJQUFYO0FBQUEsR0FBVCxDQUFiO0FBQ0E7QUFFTSxTQUFTQyxRQUFULENBQW1CVCxHQUFuQixFQUF3QmxLLEtBQXhCLEVBQStCO0FBQ3JDLE1BQUk0SyxLQUFLLENBQUNDLE9BQU4sQ0FBY1gsR0FBZCxDQUFKLEVBQXdCO0FBQ3ZCLFFBQUl6SCxNQUFNLEdBQUd5SCxHQUFHLENBQUN6SCxNQUFqQjs7QUFDQSxTQUFLLElBQUlxSSxDQUFDLEdBQUMsQ0FBWCxFQUFjQSxDQUFDLEdBQUNySSxNQUFoQixFQUF3QnFJLENBQUMsRUFBekIsRUFBNkI7QUFDNUIsVUFBSVosR0FBRyxDQUFDWSxDQUFELENBQUgsS0FBVzlLLEtBQWYsRUFBc0I7QUFDckIsZUFBTyxJQUFQO0FBQ0E7QUFDRDtBQUNELEdBUEQsTUFRSztBQUNKLFNBQUssSUFBSXdLLEdBQVQsSUFBZ0JOLEdBQWhCLEVBQXFCO0FBQ3BCLFVBQUlBLEdBQUcsQ0FBQ00sR0FBRCxDQUFILEtBQWF4SyxLQUFqQixFQUF3QjtBQUN2QixlQUFPLElBQVA7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0E7QUFFTSxTQUFTeUosTUFBVCxDQUFpQlMsR0FBakIsRUFBc0JHLFNBQXRCLEVBQWlDO0FBQ3ZDLE1BQUlVLE1BQU0sR0FBRyxFQUFiOztBQUVBLE1BQUlILEtBQUssQ0FBQ0MsT0FBTixDQUFjWCxHQUFkLENBQUosRUFBd0I7QUFDdkIsV0FBT0EsR0FBRyxDQUFDVCxNQUFKLENBQVdZLFNBQVgsQ0FBUDtBQUNBLEdBRkQsTUFHSztBQUNKM0UsV0FBTyxDQUFDd0UsR0FBRCxFQUFNLFVBQUNRLEdBQUQsRUFBTUYsR0FBTixFQUFjO0FBQUMsVUFBSUgsU0FBUyxDQUFDSyxHQUFELEVBQU1GLEdBQU4sQ0FBYixFQUF5Qk8sTUFBTSxDQUFDUCxHQUFELENBQU4sR0FBY0UsR0FBZDtBQUFtQixLQUFqRSxDQUFQO0FBQ0E7O0FBRUQsU0FBT0ssTUFBUDtBQUNBO0FBRU0sU0FBU0MsSUFBVCxDQUFlZCxHQUFmLEVBQW9CRyxTQUFwQixFQUErQjtBQUVyQyxNQUFJTyxLQUFLLENBQUNDLE9BQU4sQ0FBY1gsR0FBZCxDQUFKLEVBQXdCO0FBQ3ZCLFdBQU9BLEdBQUcsQ0FBQ2MsSUFBSixDQUFTWCxTQUFULENBQVA7QUFDQSxHQUZELE1BR0s7QUFDSixTQUFLLElBQUlHLEdBQVQsSUFBZ0JOLEdBQWhCLEVBQXFCO0FBQ3BCLFVBQUlHLFNBQVMsQ0FBQ0gsR0FBRyxDQUFDTSxHQUFELENBQUosQ0FBYixFQUF5QixPQUFPTixHQUFHLENBQUNNLEdBQUQsQ0FBVjtBQUN6QjtBQUNEO0FBQ0Q7QUFFTSxTQUFTMUssT0FBVCxDQUFrQm9LLEdBQWxCLEVBQXVCO0FBQzdCLE1BQUlVLEtBQUssQ0FBQ0MsT0FBTixDQUFjWCxHQUFkLENBQUosRUFBd0I7QUFDdkIsV0FBT0EsR0FBRyxDQUFDZSxNQUFKLENBQVcsVUFBQ0MsSUFBRCxFQUFPQyxPQUFQO0FBQUEsYUFBbUJELElBQUksQ0FBQzVELE1BQUwsQ0FBWXNELEtBQUssQ0FBQ0MsT0FBTixDQUFjTSxPQUFkLElBQXlCckwsT0FBTyxDQUFDcUwsT0FBRCxDQUFoQyxHQUE0Q0EsT0FBeEQsQ0FBbkI7QUFBQSxLQUFYLEVBQWdHLEVBQWhHLENBQVA7QUFDQSxHQUZELE1BR0s7QUFDSixXQUFPRixNQUFNLENBQUMsVUFBQ0csSUFBRCxFQUFPQyxJQUFQO0FBQUEsYUFBZ0JELElBQUksQ0FBQzlELE1BQUwsQ0FBWStELElBQVosQ0FBaEI7QUFBQSxLQUFELEVBQW9DLEVBQXBDLENBQWI7QUFDQTtBQUNEO0FBRU0sU0FBUzNGLE9BQVQsQ0FBa0J3RSxHQUFsQixFQUF1Qm9CLFFBQXZCLEVBQWlDO0FBQ3ZDLE1BQUlWLEtBQUssQ0FBQ0MsT0FBTixDQUFjWCxHQUFkLENBQUosRUFBd0I7QUFDdkI7QUFDQUEsT0FBRyxDQUFDeEUsT0FBSixDQUFZNEYsUUFBWjtBQUNBLEdBSEQsTUFJSztBQUNKLFNBQUssSUFBSWQsR0FBVCxJQUFnQk4sR0FBaEIsRUFBcUI7QUFDcEJvQixjQUFRLENBQUNwQixHQUFHLENBQUNNLEdBQUQsQ0FBSixFQUFXQSxHQUFYLEVBQWdCTixHQUFoQixDQUFSO0FBQ0E7QUFDRDs7QUFFRCxTQUFPQSxHQUFQO0FBQ0E7QUFFTSxTQUFTcUIsT0FBVCxDQUFrQnJCLEdBQWxCLEVBQXVCb0IsUUFBdkIsRUFBaUM7QUFDdkMsTUFBSVAsTUFBTSxHQUFHLEVBQWI7QUFHQXJGLFNBQU8sQ0FBQ3dFLEdBQUQsRUFBTSxVQUFBUSxHQUFHLEVBQUk7QUFDbkIsUUFBSUYsR0FBRyxHQUFHLE9BQU9jLFFBQVAsS0FBb0IsUUFBcEIsR0FBK0JaLEdBQUcsQ0FBQ1ksUUFBRCxDQUFsQyxHQUErQ0EsUUFBUSxDQUFDWixHQUFELENBQWpFO0FBRUFLLFVBQU0sQ0FBQ1AsR0FBRCxDQUFOLEdBQWNPLE1BQU0sQ0FBQ1AsR0FBRCxDQUFOLElBQWUsRUFBN0I7QUFDQU8sVUFBTSxDQUFDUCxHQUFELENBQU4sQ0FBWWdCLElBQVosQ0FBaUJkLEdBQWpCO0FBQ0EsR0FMTSxDQUFQO0FBT0EsU0FBT0ssTUFBUDtBQUNBO0FBRU0sU0FBU1UsUUFBVCxDQUFtQnpMLEtBQW5CLEVBQTBCO0FBQ2hDLFNBQU9BLEtBQVA7QUFDQTtBQUVNLFNBQVMxRyxHQUFULENBQWM0USxHQUFkLEVBQW1Cb0IsUUFBbkIsRUFBNkI7QUFDbkMsTUFBSVAsTUFBTSxHQUFHLEVBQWI7O0FBRUEsTUFBSUgsS0FBSyxDQUFDQyxPQUFOLENBQWNYLEdBQWQsQ0FBSixFQUF3QjtBQUN2QjtBQUNBLFdBQU9BLEdBQUcsQ0FBQzVRLEdBQUosQ0FBUWdTLFFBQVIsQ0FBUDtBQUNBLEdBSEQsTUFJSztBQUNKNUYsV0FBTyxDQUFDd0UsR0FBRCxFQUFNLFVBQUNsSyxLQUFELEVBQVF3SyxHQUFSLEVBQWdCO0FBQzVCTyxZQUFNLENBQUNTLElBQVAsQ0FBWUYsUUFBUSxDQUFDdEwsS0FBRCxFQUFRd0ssR0FBUixFQUFhTixHQUFiLENBQXBCO0FBQ0EsS0FGTSxDQUFQO0FBR0E7O0FBRUQsU0FBT2EsTUFBUDtBQUNBOztBQUVELFNBQVNXLFFBQVQsQ0FBbUJ4QixHQUFuQixFQUF3QjtBQUN2QixTQUFPQSxHQUFHLElBQUssUUFBT0EsR0FBUCxNQUFlLFFBQXZCLElBQW9DLENBQUNVLEtBQUssQ0FBQ0MsT0FBTixDQUFjWCxHQUFkLENBQXJDLEdBQTBELElBQTFELEdBQWlFLEtBQXhFO0FBQ0E7O0FBRUQsU0FBUzVPLEdBQVQsQ0FBYzRPLEdBQWQsRUFBbUJtQixJQUFuQixFQUF5QjtBQUN4QixTQUFPbkIsR0FBRyxJQUFJQSxHQUFHLENBQUN5QixjQUFKLENBQW1CTixJQUFuQixDQUFkO0FBQ0E7O0FBRU0sU0FBU08sTUFBVCxDQUFpQjFCLEdBQWpCLEVBQXNCb0IsUUFBdEIsRUFBZ0M7QUFDdEMsTUFBSVAsTUFBTSxHQUFHLEVBQWI7O0FBRUEsTUFBSUgsS0FBSyxDQUFDQyxPQUFOLENBQWNYLEdBQWQsQ0FBSixFQUF3QjtBQUN2QnhFLFdBQU8sQ0FBQ3dFLEdBQUQsRUFBTSxVQUFDbEssS0FBRCxFQUFROEIsS0FBUixFQUFrQjtBQUM5QixVQUFJK0osUUFBUSxHQUFHUCxRQUFRLENBQUN0TCxLQUFELEVBQVE4QixLQUFSLEVBQWVvSSxHQUFmLENBQXZCOztBQUVBLFVBQUl3QixRQUFRLENBQUNHLFFBQUQsQ0FBUixJQUFzQnZRLEdBQUcsQ0FBQ3VRLFFBQUQsRUFBVyxLQUFYLENBQXpCLElBQThDdlEsR0FBRyxDQUFDdVEsUUFBRCxFQUFXLE9BQVgsQ0FBckQsRUFBMEU7QUFDekVkLGNBQU0sQ0FBQ2MsUUFBUSxDQUFDckIsR0FBVixDQUFOLEdBQXVCcUIsUUFBUSxDQUFDN0wsS0FBaEM7QUFDQSxPQUZELE1BR0s7QUFDSitLLGNBQU0sQ0FBQ2pKLEtBQUQsQ0FBTixHQUFnQitKLFFBQWhCO0FBQ0E7QUFDRCxLQVRNLENBQVA7QUFVQSxHQVhELE1BWUs7QUFDSm5HLFdBQU8sQ0FBQ3dFLEdBQUQsRUFBTSxVQUFDbEssS0FBRCxFQUFRd0ssR0FBUixFQUFnQjtBQUM1QixVQUFJcUIsUUFBUSxHQUFHUCxRQUFRLENBQUN0TCxLQUFELEVBQVF3SyxHQUFSLEVBQWFOLEdBQWIsQ0FBdkI7O0FBRUEsVUFBSXdCLFFBQVEsQ0FBQ0csUUFBRCxDQUFSLElBQXNCdlEsR0FBRyxDQUFDdVEsUUFBRCxFQUFXLEtBQVgsQ0FBekIsSUFBOEN2USxHQUFHLENBQUN1USxRQUFELEVBQVcsT0FBWCxDQUFyRCxFQUEwRTtBQUN6RWQsY0FBTSxDQUFDYyxRQUFRLENBQUNyQixHQUFWLENBQU4sR0FBdUJxQixRQUFRLENBQUM3TCxLQUFoQztBQUNBLE9BRkQsTUFHSztBQUNKK0ssY0FBTSxDQUFDUCxHQUFELENBQU4sR0FBY3FCLFFBQWQ7QUFDQTtBQUNELEtBVE0sQ0FBUDtBQVVBOztBQUVELFNBQU9kLE1BQVA7QUFDQTtBQUVNLFNBQVNsUSxHQUFULEdBQWtDO0FBQUEsTUFBcEJxUCxHQUFvQix1RUFBZCxFQUFjO0FBQUEsTUFBVm9CLFFBQVU7QUFDeEMsTUFBSXpRLEdBQUcsR0FBRyxDQUFDaVIsUUFBWDs7QUFFQSxNQUFJLENBQUNSLFFBQUwsRUFBZTtBQUNkNUYsV0FBTyxDQUFDd0UsR0FBRCxFQUFNLFVBQUFsSyxLQUFLO0FBQUEsYUFBSW5GLEdBQUcsR0FBR21GLEtBQUssR0FBR25GLEdBQVIsR0FBY21GLEtBQWQsR0FBc0JuRixHQUFoQztBQUFBLEtBQVgsQ0FBUDtBQUNBLEdBRkQsTUFHSztBQUNKLFFBQUlrUixZQUFZLEdBQUcsQ0FBQ0QsUUFBcEI7QUFFQXBHLFdBQU8sQ0FBQ3dFLEdBQUQsRUFBTSxVQUFDbEssS0FBRCxFQUFROEIsS0FBUixFQUFla0ssSUFBZixFQUF3QjtBQUNwQyxVQUFJQyxRQUFRLEdBQUdYLFFBQVEsQ0FBQ3RMLEtBQUQsRUFBUThCLEtBQVIsRUFBZWtLLElBQWYsQ0FBdkI7O0FBRUEsVUFBSUMsUUFBUSxHQUFHRixZQUFYLElBQTJCRSxRQUFRLEtBQUssQ0FBQ0gsUUFBZCxJQUEwQmpSLEdBQUcsS0FBSyxDQUFDaVIsUUFBbEUsRUFBNEU7QUFDM0VqUixXQUFHLEdBQUdtRixLQUFOO0FBQ0ErTCxvQkFBWSxHQUFHRSxRQUFmO0FBQ0E7QUFDRCxLQVBNLENBQVA7QUFRQTs7QUFFRCxTQUFPcFIsR0FBUDtBQUNBO0FBRU0sU0FBU2tDLEdBQVQsR0FBa0M7QUFBQSxNQUFwQm1OLEdBQW9CLHVFQUFkLEVBQWM7QUFBQSxNQUFWb0IsUUFBVTtBQUN4QyxNQUFJdk8sR0FBRyxHQUFHK08sUUFBVjs7QUFFQSxNQUFJLENBQUNSLFFBQUwsRUFBZTtBQUNkNUYsV0FBTyxDQUFDd0UsR0FBRCxFQUFNLFVBQUFsSyxLQUFLO0FBQUEsYUFBSWpELEdBQUcsR0FBR2lELEtBQUssR0FBR2pELEdBQVIsR0FBY2lELEtBQWQsR0FBc0JqRCxHQUFoQztBQUFBLEtBQVgsQ0FBUDtBQUNBLEdBRkQsTUFHSztBQUNKLFFBQUlnUCxZQUFZLEdBQUdELFFBQW5CO0FBRUFwRyxXQUFPLENBQUN3RSxHQUFELEVBQU0sVUFBQ2xLLEtBQUQsRUFBUThCLEtBQVIsRUFBZWtLLElBQWYsRUFBd0I7QUFDcEMsVUFBSUMsUUFBUSxHQUFHWCxRQUFRLENBQUN0TCxLQUFELEVBQVE4QixLQUFSLEVBQWVrSyxJQUFmLENBQXZCOztBQUVBLFVBQUlDLFFBQVEsR0FBR0YsWUFBWCxJQUEyQkUsUUFBUSxLQUFLSCxRQUFiLElBQXlCL08sR0FBRyxLQUFLK08sUUFBaEUsRUFBMEU7QUFDekUvTyxXQUFHLEdBQUdpRCxLQUFOO0FBQ0ErTCxvQkFBWSxHQUFHRSxRQUFmO0FBQ0E7QUFDRCxLQVBNLENBQVA7QUFRQTs7QUFFRCxTQUFPbFAsR0FBUDtBQUNBO0FBRU0sU0FBU21QLElBQVQsQ0FBZWhDLEdBQWYsRUFBb0JpQyxJQUFwQixFQUEwQjtBQUNoQyxNQUFJcEIsTUFBTSxHQUFHLEVBQWI7QUFFQXJGLFNBQU8sQ0FBQ3dFLEdBQUQsRUFBTSxVQUFDbEssS0FBRCxFQUFRd0ssR0FBUixFQUFnQjtBQUM1QixRQUFJLENBQUNHLFFBQVEsQ0FBQ3dCLElBQUQsRUFBTzNCLEdBQVAsQ0FBYixFQUEwQjtBQUN6Qk8sWUFBTSxDQUFDUCxHQUFELENBQU4sR0FBY3hLLEtBQWQ7QUFDQTtBQUNELEdBSk0sQ0FBUDtBQU1BLFNBQU8rSyxNQUFQO0FBQ0E7QUFFTSxTQUFTcFIsSUFBVCxDQUFldVEsR0FBZixFQUFvQmlDLElBQXBCLEVBQTBCO0FBQ2hDLE1BQUlwQixNQUFNLEdBQUcsRUFBYjtBQUVBb0IsTUFBSSxDQUFDekcsT0FBTCxDQUFhLFVBQUE4RSxHQUFHLEVBQUk7QUFDbkIsUUFBSU4sR0FBRyxDQUFDeUIsY0FBSixDQUFtQm5CLEdBQW5CLENBQUosRUFBNkI7QUFDNUJPLFlBQU0sQ0FBQ1AsR0FBRCxDQUFOLEdBQWNOLEdBQUcsQ0FBQ00sR0FBRCxDQUFqQjtBQUNBO0FBQ0QsR0FKRDtBQU1BLFNBQU9PLE1BQVA7QUFDQTtBQUVNLFNBQVN0RixLQUFULENBQWdCMkcsSUFBaEIsRUFBMkM7QUFBQSxNQUFyQmQsUUFBcUIsdUVBQVZHLFFBQVU7QUFFakQsU0FBT2IsS0FBSyxDQUFDeUIsSUFBTixDQUFXekIsS0FBSyxDQUFDd0IsSUFBRCxDQUFoQixFQUF3QixVQUFDcE0sS0FBRCxFQUFROEIsS0FBUjtBQUFBLFdBQWtCd0osUUFBUSxDQUFDeEosS0FBRCxDQUExQjtBQUFBLEdBQXhCLENBQVA7QUFDQTtBQUVNLFNBQVNtSixNQUFULEdBQXlFO0FBQUEsTUFBeERmLEdBQXdELHVFQUFsRCxFQUFrRDtBQUFBLE1BQTlDb0IsUUFBOEM7QUFBQSxNQUFwQ0osSUFBb0MsdUVBQTdCaEIsR0FBRyxDQUFDLENBQUQsQ0FBSCxJQUFVLElBQVYsR0FBaUJBLEdBQUcsQ0FBQyxDQUFELENBQXBCLEdBQTBCLENBQUc7O0FBQy9FLE1BQUlVLEtBQUssQ0FBQ0MsT0FBTixDQUFjWCxHQUFkLENBQUosRUFBd0I7QUFDdkIsV0FBT0EsR0FBRyxDQUFDZSxNQUFKLENBQVdLLFFBQVgsRUFBcUJKLElBQXJCLENBQVA7QUFDQSxHQUZELE1BR0s7QUFDSnhGLFdBQU8sQ0FBQ3dFLEdBQUQsRUFBTSxVQUFDUSxHQUFELEVBQU1GLEdBQU4sRUFBV04sR0FBWCxFQUFtQjtBQUMvQmdCLFVBQUksR0FBR0ksUUFBUSxDQUFDSixJQUFELEVBQU9SLEdBQVAsRUFBWUYsR0FBWixFQUFpQk4sR0FBakIsQ0FBZjtBQUNBLEtBRk0sQ0FBUDtBQUdBOztBQUVELFNBQU9nQixJQUFQO0FBQ0E7QUFFTSxTQUFTb0IsTUFBVCxDQUFpQnBDLEdBQWpCLEVBQXNCRyxTQUF0QixFQUFpQztBQUN2QyxTQUFPWixNQUFNLENBQUNTLEdBQUQsRUFBTSxVQUFDUSxHQUFELEVBQU1GLEdBQU4sRUFBV04sR0FBWDtBQUFBLFdBQW1CLENBQUNHLFNBQVMsQ0FBQ0ssR0FBRCxFQUFNRixHQUFOLEVBQVdOLEdBQVgsQ0FBN0I7QUFBQSxHQUFOLENBQWI7QUFDQTtBQUVNLFNBQVNxQyxJQUFULENBQWVyQyxHQUFmLEVBQTBDO0FBQUEsTUFBdEJHLFNBQXNCLHVFQUFWb0IsUUFBVTtBQUNoRCxTQUFPVCxJQUFJLENBQUNkLEdBQUQsRUFBTUcsU0FBTixDQUFKLEdBQXVCLElBQXZCLEdBQThCLEtBQXJDO0FBQ0E7QUFFTSxJQUFJRSxDQUFDLEdBQUc7QUFDZEUsU0FBTyxFQUFQQSxPQURjO0FBRWRFLFVBQVEsRUFBUkEsUUFGYztBQUdkbEIsUUFBTSxFQUFOQSxNQUhjO0FBSWR1QixNQUFJLEVBQUpBLElBSmM7QUFLZGxMLFNBQU8sRUFBUEEsT0FMYztBQU1kNEYsU0FBTyxFQUFQQSxPQU5jO0FBT2Q2RixTQUFPLEVBQVBBLE9BUGM7QUFRZEUsVUFBUSxFQUFSQSxRQVJjO0FBU2RuUyxLQUFHLEVBQUhBLEdBVGM7QUFVZHNTLFFBQU0sRUFBTkEsTUFWYztBQVdkL1EsS0FBRyxFQUFIQSxHQVhjO0FBWWRrQyxLQUFHLEVBQUhBLEdBWmM7QUFhZG1QLE1BQUksRUFBSkEsSUFiYztBQWNkdlMsTUFBSSxFQUFKQSxJQWRjO0FBZWQ4TCxPQUFLLEVBQUxBLEtBZmM7QUFnQmR3RixRQUFNLEVBQU5BLE1BaEJjO0FBaUJkcUIsUUFBTSxFQUFOQSxNQWpCYztBQWtCZEMsTUFBSSxFQUFKQTtBQWxCYyxDQUFSLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JRUDs7QUFFQSxTQUFTQyxRQUFULENBQWtCck8sQ0FBbEIsRUFBcUJpQyxDQUFyQixFQUF3QjtBQUN2QixTQUFPLENBQUNqQyxDQUFELEdBQUtpQyxDQUFaO0FBQ0EsQyxDQUVEO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTcU0sUUFBVCxDQUFrQmhNLEdBQWxCLEVBQXVCO0FBQ3RCLE1BQUlpTSxFQUFFLEdBQUc5UixJQUFJLENBQUMrUixLQUFMLENBQVdsTSxHQUFHLENBQUN0QyxDQUFmLENBQVQ7QUFDQSxNQUFJeU8sRUFBRSxHQUFHaFMsSUFBSSxDQUFDK1IsS0FBTCxDQUFXbE0sR0FBRyxDQUFDcEMsQ0FBZixDQUFUO0FBQ0EsTUFBSXdPLEVBQUUsR0FBR2pTLElBQUksQ0FBQytSLEtBQUwsQ0FBV2xNLEdBQUcsQ0FBQ0wsQ0FBZixDQUFUO0FBRUEsTUFBSTBNLEtBQUssR0FBR2xTLElBQUksQ0FBQytELEdBQUwsQ0FBUytOLEVBQUUsR0FBR2pNLEdBQUcsQ0FBQ3RDLENBQWxCLENBQVo7QUFDQSxNQUFJNE8sS0FBSyxHQUFHblMsSUFBSSxDQUFDK0QsR0FBTCxDQUFTaU8sRUFBRSxHQUFHbk0sR0FBRyxDQUFDcEMsQ0FBbEIsQ0FBWjtBQUNBLE1BQUkyTyxLQUFLLEdBQUdwUyxJQUFJLENBQUMrRCxHQUFMLENBQVNrTyxFQUFFLEdBQUdwTSxHQUFHLENBQUNMLENBQWxCLENBQVo7O0FBRUEsTUFBSzBNLEtBQUssR0FBR0MsS0FBVCxJQUFvQkQsS0FBSyxHQUFHRSxLQUFoQyxFQUF3QztBQUN2Q04sTUFBRSxHQUFHLENBQUNFLEVBQUQsR0FBSUMsRUFBVDtBQUNBLEdBRkQsTUFHSyxJQUFJRSxLQUFLLEdBQUdDLEtBQVosRUFBbUI7QUFDdkJKLE1BQUUsR0FBRyxDQUFDRixFQUFELEdBQUlHLEVBQVQ7QUFDQSxHQUZJLE1BR0E7QUFDSkEsTUFBRSxHQUFHLENBQUNILEVBQUQsR0FBSUUsRUFBVDtBQUNBOztBQUVEbk0sS0FBRyxDQUFDdEMsQ0FBSixHQUFRdU8sRUFBRSxLQUFLLENBQUMsQ0FBUixHQUFZLENBQVosR0FBZ0JBLEVBQXhCO0FBQ0FqTSxLQUFHLENBQUNwQyxDQUFKLEdBQVF1TyxFQUFFLEtBQUssQ0FBQyxDQUFSLEdBQVksQ0FBWixHQUFnQkEsRUFBeEI7QUFDQW5NLEtBQUcsQ0FBQ0wsQ0FBSixHQUFReU0sRUFBRSxLQUFLLENBQUMsQ0FBUixHQUFZLENBQVosR0FBZ0JBLEVBQXhCO0FBRUEsU0FBT3BNLEdBQVA7QUFDQTs7SUFFb0JQLEc7Ozs7Ozs7NkJBQ0hVLEMsRUFBR0MsQyxFQUFHO0FBQ3RCLGFBQU87QUFDTjFDLFNBQUMsRUFBRXlDLENBREc7QUFFTnZDLFNBQUMsRUFBRW1PLFFBQVEsQ0FBQzVMLENBQUQsRUFBSUMsQ0FBSixDQUZMO0FBR05ULFNBQUMsRUFBRVM7QUFIRyxPQUFQO0FBS0E7OztzQ0FFOEI7QUFBQSxVQUFWMUMsQ0FBVSxRQUFWQSxDQUFVO0FBQUEsVUFBUEUsQ0FBTyxRQUFQQSxDQUFPO0FBQUEsVUFBSitCLENBQUksUUFBSkEsQ0FBSTtBQUM5QixVQUFNZ0IsR0FBRyxHQUFHakQsQ0FBQyxHQUFHLENBQUNpQyxDQUFDLElBQUlBLENBQUMsR0FBRyxDQUFSLENBQUYsSUFBZ0IsQ0FBaEM7QUFBa0M7QUFDbEMsVUFBTWlCLEdBQUcsR0FBR2pCLENBQVo7QUFFQSxhQUFPO0FBQUNnQixXQUFHLEVBQUhBLEdBQUQ7QUFBTUMsV0FBRyxFQUFIQTtBQUFOLE9BQVA7QUFDQTs7O2dDQUVtQkQsRyxFQUFLQyxHLEVBQUs7QUFDN0IsVUFBTWxELENBQUMsR0FBR2lELEdBQUcsR0FBRyxDQUFDQyxHQUFHLElBQUlBLEdBQUcsR0FBRyxDQUFWLENBQUosSUFBb0IsQ0FBcEM7QUFBc0M7QUFDdEMsVUFBTWpCLENBQUMsR0FBR2lCLEdBQVY7QUFDQSxVQUFNaEQsQ0FBQyxHQUFHLENBQUNGLENBQUQsR0FBS2lDLENBQWY7QUFFQSxhQUFPLElBQUlGLEdBQUosQ0FBUS9CLENBQVIsRUFBV0UsQ0FBWCxFQUFjK0IsQ0FBZCxDQUFQO0FBQ0E7Ozt1Q0FFOEI7QUFBQSxVQUFWakMsQ0FBVSxTQUFWQSxDQUFVO0FBQUEsVUFBUEUsQ0FBTyxTQUFQQSxDQUFPO0FBQUEsVUFBSitCLENBQUksU0FBSkEsQ0FBSTtBQUM5QixVQUFNZ0IsR0FBRyxHQUFHakQsQ0FBWjtBQUNBLFVBQU1rRCxHQUFHLEdBQUdqQixDQUFDLEdBQUcsQ0FBQ2pDLENBQUMsSUFBSUEsQ0FBQyxHQUFHLENBQVIsQ0FBRixJQUFnQixDQUFoQztBQUVBLGFBQU87QUFBQ2lELFdBQUcsRUFBSEEsR0FBRDtBQUFNQyxXQUFHLEVBQUhBO0FBQU4sT0FBUDtBQUNBOzs7Z0NBRW1CRCxHLEVBQUtDLEcsRUFBSztBQUM3QixVQUFNbEQsQ0FBQyxHQUFHaUQsR0FBVjtBQUNBLFVBQU1oQixDQUFDLEdBQUdpQixHQUFHLEdBQUcsQ0FBQ0QsR0FBRyxJQUFJQSxHQUFHLEdBQUcsQ0FBVixDQUFKLElBQW9CLENBQXBDO0FBQ0EsVUFBTS9DLENBQUMsR0FBRyxDQUFDRixDQUFELEdBQUtpQyxDQUFmO0FBRUEsYUFBTyxJQUFJRixHQUFKLENBQVEvQixDQUFSLEVBQVdFLENBQVgsRUFBYytCLENBQWQsQ0FBUDtBQUNBOzs7QUFFRCxpQkFBYztBQUFBOztBQUFBOztBQUNiOztBQUVBLFFBQUlsQyxTQUFTLENBQUN1RSxNQUFWLEtBQXFCLENBQXpCLEVBQTRCO0FBQUEsd0JBQ0F2RSxTQUFTLENBQUMsQ0FBRCxDQURUO0FBQUEsVUFDcEIwQyxDQURvQixlQUNwQkEsQ0FEb0I7QUFBQSxVQUNqQkMsQ0FEaUIsZUFDakJBLENBRGlCO0FBQUEsc0NBQ2RvTSxDQURjO0FBQUEsVUFDZEEsQ0FEYyw4QkFDVixDQUFDck0sQ0FBRCxHQUFLQyxDQURLO0FBQUEseUJBRUEzQyxTQUFTLENBQUMsQ0FBRCxDQUZUO0FBQUEsVUFFcEJDLENBRm9CLGdCQUVwQkEsQ0FGb0I7QUFBQSxVQUVqQmlDLENBRmlCLGdCQUVqQkEsQ0FGaUI7QUFBQSx3Q0FFZC9CLENBRmM7QUFBQSxVQUVkQSxDQUZjLCtCQUVWLENBQUNGLENBQUQsR0FBS2lDLENBRks7QUFJM0IsWUFBS2pDLENBQUwsR0FBUyxDQUFDK08sS0FBSyxDQUFDdE0sQ0FBRCxDQUFOLEdBQVlBLENBQVosR0FBZ0J6QyxDQUF6QjtBQUNBLFlBQUtFLENBQUwsR0FBUyxDQUFDNk8sS0FBSyxDQUFDRCxDQUFELENBQU4sR0FBWUEsQ0FBWixHQUFnQjVPLENBQXpCO0FBQ0EsWUFBSytCLENBQUwsR0FBUyxDQUFDOE0sS0FBSyxDQUFDck0sQ0FBRCxDQUFOLEdBQVlBLENBQVosR0FBZ0JULENBQXpCO0FBQ0EsS0FQRCxNQVFLLElBQUlsQyxTQUFTLENBQUN1RSxNQUFWLEtBQXFCLENBQXpCLEVBQTRCO0FBQUU7QUFDbEMsWUFBS3RFLENBQUwsR0FBU0QsU0FBUyxDQUFDLENBQUQsQ0FBbEI7QUFDQSxZQUFLa0MsQ0FBTCxHQUFTbEMsU0FBUyxDQUFDLENBQUQsQ0FBbEI7QUFDQSxZQUFLRyxDQUFMLEdBQVNtTyxRQUFRLENBQUMsTUFBS3JPLENBQU4sRUFBUyxNQUFLaUMsQ0FBZCxDQUFqQjtBQUNBLEtBSkksTUFLQSxJQUFJbEMsU0FBUyxDQUFDdUUsTUFBVixLQUFxQixDQUF6QixFQUE0QjtBQUFFO0FBQ2xDLFlBQUt0RSxDQUFMLEdBQVNELFNBQVMsQ0FBQyxDQUFELENBQWxCO0FBQ0EsWUFBS0csQ0FBTCxHQUFTSCxTQUFTLENBQUMsQ0FBRCxDQUFsQjtBQUNBLFlBQUtrQyxDQUFMLEdBQVNsQyxTQUFTLENBQUMsQ0FBRCxDQUFsQjtBQUNBOztBQUVEdU8sWUFBUSx1REFBUjtBQXRCYTtBQXVCYjs7OzsyQkFFTTtBQUFDLGFBQU8sS0FBS3RPLENBQVo7QUFBZTs7OzJCQUNoQjtBQUFDLGFBQU8sS0FBS0UsQ0FBWjtBQUFlOzs7MkJBQ2hCO0FBQUMsYUFBTyxLQUFLK0IsQ0FBWjtBQUFlOzs7eUJBRWpCMUUsSSxFQUFNO0FBQUMsV0FBS3lDLENBQUwsR0FBU3pDLElBQVQ7QUFBZSxhQUFPLElBQVA7QUFBYTs7O3lCQUNuQ0UsSSxFQUFNO0FBQUMsV0FBS3lDLENBQUwsR0FBU3pDLElBQVQ7QUFBZSxhQUFPLElBQVA7QUFBYTs7O3lCQUNuQ3VSLEksRUFBTTtBQUFDLFdBQUsvTSxDQUFMLEdBQVMrTSxJQUFUO0FBQWUsYUFBTyxJQUFQO0FBQWE7OzswQkFFbENDLEcsRUFBSztBQUFDLFdBQUtqUCxDQUFMLElBQVVpUCxHQUFWO0FBQWUsYUFBTyxJQUFQO0FBQWE7OzswQkFDbENDLEcsRUFBSztBQUFDLFdBQUtoUCxDQUFMLElBQVVnUCxHQUFWO0FBQWUsYUFBTyxJQUFQO0FBQWE7OzswQkFDbENDLEcsRUFBSztBQUFDLFdBQUtsTixDQUFMLElBQVVrTixHQUFWO0FBQWUsYUFBTyxJQUFQO0FBQWE7OzsyQkFFakM7QUFBQyxhQUFPLEtBQUtuUCxDQUFaO0FBQWU7OzsyQkFDaEI7QUFBQyxhQUFPLEtBQUtpQyxDQUFaO0FBQWU7Ozt5QkFFbEJtTixJLEVBQU07QUFDWCxXQUFLcFAsQ0FBTCxHQUFTb1AsSUFBVDtBQUNBLFdBQUtsUCxDQUFMLEdBQVNtTyxRQUFRLENBQUMsS0FBS3JPLENBQU4sRUFBUyxLQUFLaUMsQ0FBZCxDQUFqQjtBQUNBLGFBQU8sSUFBUDtBQUNBOzs7eUJBRUtvTixJLEVBQU07QUFDWCxXQUFLcE4sQ0FBTCxHQUFTb04sSUFBVDtBQUNBLFdBQUtuUCxDQUFMLEdBQVNtTyxRQUFRLENBQUMsS0FBS3JPLENBQU4sRUFBUyxLQUFLaUMsQ0FBZCxDQUFqQjtBQUNBLGFBQU8sSUFBUDtBQUNBOzs7MEJBRU1xTixHLEVBQUs7QUFDWCxXQUFLdFAsQ0FBTCxJQUFVc1AsR0FBVjtBQUNBLFdBQUtwUCxDQUFMLEdBQVNtTyxRQUFRLENBQUMsS0FBS3JPLENBQU4sRUFBUyxLQUFLaUMsQ0FBZCxDQUFqQjtBQUNBLGFBQU8sSUFBUDtBQUNBOzs7MEJBRU1zTixHLEVBQUs7QUFDWCxXQUFLdE4sQ0FBTCxJQUFVc04sR0FBVjtBQUNBLFdBQUtyUCxDQUFMLEdBQVNtTyxRQUFRLENBQUMsS0FBS3JPLENBQU4sRUFBUyxLQUFLaUMsQ0FBZCxDQUFqQjtBQUNBLGFBQU8sSUFBUDtBQUNBOzs7K0JBRVc7QUFBRSxhQUFPO0FBQUNqQyxTQUFDLEVBQUUsS0FBS0EsQ0FBVDtBQUFZRSxTQUFDLEVBQUUsS0FBS0EsQ0FBcEI7QUFBdUIrQixTQUFDLEVBQUUsS0FBS0E7QUFBL0IsT0FBUDtBQUEyQzs7OzJCQUVqRHVOLE0sRUFBUTtBQUNmLFdBQUt4UCxDQUFMLEdBQVN3UCxNQUFNLENBQUN4UCxDQUFoQjtBQUNBLFdBQUtFLENBQUwsR0FBU3NQLE1BQU0sQ0FBQ3RQLENBQWhCO0FBQ0EsV0FBSytCLENBQUwsR0FBU3VOLE1BQU0sQ0FBQ3ZOLENBQWhCO0FBQ0EsYUFBTyxJQUFQO0FBQ0E7Ozs0QkFDUXdOLEssRUFBTztBQUNmLFdBQUt6UCxDQUFMLElBQVV5UCxLQUFLLENBQUN6UCxDQUFoQjtBQUNBLFdBQUtFLENBQUwsSUFBVXVQLEtBQUssQ0FBQ3ZQLENBQWhCO0FBQ0EsV0FBSytCLENBQUwsSUFBVXdOLEtBQUssQ0FBQ3hOLENBQWhCO0FBQ0EsYUFBTyxJQUFQO0FBQ0E7OztnQ0FFWUssRyxFQUFLO0FBQ2pCLFdBQUt0QyxDQUFMLElBQVVzQyxHQUFHLENBQUN0QyxDQUFkO0FBQ0EsV0FBS0UsQ0FBTCxJQUFVb0MsR0FBRyxDQUFDcEMsQ0FBZDtBQUNBLFdBQUsrQixDQUFMLElBQVVLLEdBQUcsQ0FBQ0wsQ0FBZDtBQUVBLGFBQU8sSUFBUDtBQUNBOzs7K0JBRVc7QUFBQyxhQUFPO0FBQUNRLFNBQUMsRUFBRSxLQUFLekMsQ0FBVDtBQUFZMEMsU0FBQyxFQUFFLEtBQUtUO0FBQXBCLE9BQVA7QUFBK0I7Ozs2QkFFbEN5TixRLEVBQVU7QUFDbkIsV0FBSzFQLENBQUwsR0FBUzBQLFFBQVEsQ0FBQ2pOLENBQWxCO0FBQ0EsV0FBS1IsQ0FBTCxHQUFTeU4sUUFBUSxDQUFDaE4sQ0FBbEI7QUFDQSxXQUFLeEMsQ0FBTCxHQUFTbU8sUUFBUSxDQUFDLEtBQUtyTyxDQUFOLEVBQVMsS0FBS0UsQ0FBZCxDQUFqQjtBQUNBLGFBQU8sSUFBUDtBQUNBOzs7OEJBRVV5UCxPLEVBQVM7QUFDbkIsV0FBSzNQLENBQUwsSUFBVTJQLE9BQU8sQ0FBQ2xOLENBQWxCO0FBQ0EsV0FBS1IsQ0FBTCxJQUFVME4sT0FBTyxDQUFDak4sQ0FBbEI7QUFDQSxXQUFLeEMsQ0FBTCxHQUFTbU8sUUFBUSxDQUFDLEtBQUtyTyxDQUFOLEVBQVMsS0FBS2lDLENBQWQsQ0FBakI7QUFDQSxhQUFPLElBQVA7QUFDQTs7OzZCQUVTSyxHLEVBQUs7QUFDZCxhQUFPN0YsSUFBSSxDQUFDQyxHQUFMLENBQVNELElBQUksQ0FBQytELEdBQUwsQ0FBUyxLQUFLUixDQUFMLEdBQVNzQyxHQUFHLENBQUN0QyxDQUF0QixDQUFULEVBQW1DdkQsSUFBSSxDQUFDK0QsR0FBTCxDQUFTLEtBQUtOLENBQUwsR0FBU29DLEdBQUcsQ0FBQ3BDLENBQXRCLENBQW5DLEVBQTZEekQsSUFBSSxDQUFDK0QsR0FBTCxDQUFTLEtBQUt5QixDQUFMLEdBQVNLLEdBQUcsQ0FBQ0wsQ0FBdEIsQ0FBN0QsQ0FBUDtBQUNBOzs7O0VBaEorQjdCLGlEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcENqQztBQUVBLElBQU13UCxNQUFNLEdBQUcsT0FBZjtBQUVBLElBQU1oVixRQUFRLEdBQUc7QUFDaEJpVixPQUFLLEVBQUUsS0FEUztBQUdoQjdDLFNBQU8sRUFBRThDLFFBQVEsQ0FBQ3pILElBSEY7QUFLaEIwSCxjQUFZLEVBQUUsS0FMRTtBQU9oQkMsS0FBRyxFQUFTQyw4Q0FQSTtBQVFoQkMsVUFBUSxFQUFJRCw4Q0FSSTtBQVNoQnBSLE1BQUksRUFBUW9SLDhDQVRJO0FBVWhCRSxXQUFTLEVBQUdGLDhDQVZJO0FBV2hCRyxPQUFLLEVBQU9ILDhDQVhJO0FBWWhCSSxZQUFVLEVBQUVKLDhDQVpJO0FBYWhCSyxNQUFJLEVBQVFMLDhDQWJJO0FBZWhCTSxlQUFhLEVBQUUsQ0FmQztBQWdCaEJDLG9CQUFrQixFQUFFLEdBaEJKO0FBaUJoQkMsZ0JBQWMsRUFBRSxHQWpCQTtBQW1CaEJDLGFBQVcsRUFBRSxDQUFDO0FBbkJFLENBQWpCO0FBc0JBLElBQU1DLE1BQU0sR0FBRyxDQUNkLGFBRGMsRUFHZCxXQUhjLEVBSWQsU0FKYyxFQUtkLFdBTGMsRUFPZCxZQVBjLEVBUWQsVUFSYyxFQVNkLFdBVGMsRUFVZCxhQVZjLEVBWWQsT0FaYyxDQUFmO0FBZUEsSUFBTUMsT0FBTyxHQUFHLENBQ2YsY0FEZSxFQUdmLFVBSGUsRUFJZixZQUplLEVBS2R6SCxNQUxjLENBS1B3SCxNQUxPLENBQWhCOztJQU9xQkUsSzs7O0FBQ3BCLGlCQUFZM1YsUUFBWixFQUFzQjtBQUFBOztBQUFBOztBQUNyQixTQUFLQSxRQUFMLEdBQWdCSSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCWCxRQUFsQixFQUE0Qk0sUUFBNUIsQ0FBaEI7QUFFQSxTQUFLNFYsS0FBTCxHQUFhO0FBQ1pDLGtCQUFZLEVBQUU7QUFERixLQUFiO0FBSUFILFdBQU8sQ0FBQ3JKLE9BQVIsQ0FBZ0IsVUFBQW5NLE1BQU07QUFBQSxhQUFJLEtBQUksQ0FBQ0EsTUFBRCxDQUFKLEdBQWUsS0FBSSxDQUFDQSxNQUFELENBQUosQ0FBYUMsSUFBYixDQUFrQixLQUFsQixDQUFuQjtBQUFBLEtBQXRCO0FBQ0FzVixVQUFNLENBQUNwSixPQUFQLENBQWUsVUFBQXlKLFNBQVM7QUFBQSxhQUFJLEtBQUksQ0FBQzlWLFFBQUwsQ0FBYzhSLE9BQWQsQ0FBc0JpRSxnQkFBdEIsQ0FBdUNELFNBQXZDLEVBQWtELFVBQUE5VCxLQUFLO0FBQUEsZUFBSSxLQUFJLENBQUNnVSxZQUFMLENBQWtCaFUsS0FBbEIsRUFBeUI4VCxTQUF6QixDQUFKO0FBQUEsT0FBdkQsQ0FBSjtBQUFBLEtBQXhCO0FBQ0E7Ozs7aUNBRWE5VCxLLEVBQU84VCxTLEVBQVc7QUFDL0I5VCxXQUFLLENBQUNpVSxZQUFOLEdBQXFCQyxJQUFJLENBQUNDLEdBQUwsRUFBckI7QUFFQSxVQUFJLEtBQUtuVyxRQUFMLENBQWMyVSxLQUFsQixFQUF5QjFELE9BQU8sQ0FBQzBELEtBQVIsWUFBbUJELE1BQW5CLGVBQWdDb0IsU0FBaEMsUUFBK0M5VCxLQUEvQztBQUV6QixXQUFLOFQsU0FBTCxFQUFnQjlULEtBQWhCO0FBQ0E7OztnQ0FFV0EsSyxFQUFPO0FBQ2xCQSxXQUFLLENBQUNvVSxjQUFOO0FBQ0E7Ozs2QkFFUXBVLEssRUFBTztBQUFBOztBQUNmLFVBQUksQ0FBQyxLQUFLNFQsS0FBTCxDQUFXQyxZQUFoQixFQUE4QjtBQUFBLFlBQ3RCUSxNQURzQixHQUNaclUsS0FEWSxDQUN0QnFVLE1BRHNCO0FBRTdCLGFBQUtULEtBQUwsQ0FBV0MsWUFBWCxHQUEwQjdULEtBQUssQ0FBQ2lVLFlBQWhDOztBQUVBLFlBQUlJLE1BQU0sSUFBSSxLQUFLclcsUUFBTCxDQUFjNlUsWUFBNUIsRUFBMEM7QUFDekN5QixzQkFBWSxDQUFDLEtBQUtWLEtBQUwsQ0FBV1csT0FBWixDQUFaO0FBRUEsZUFBS1gsS0FBTCxDQUFXVyxPQUFYLEdBQXFCQyxVQUFVLENBQUMsWUFBTTtBQUNyQyxrQkFBSSxDQUFDckIsVUFBTCxDQUFnQjtBQUNma0Isb0JBQU0sRUFBTkEsTUFEZTtBQUVmSiwwQkFBWSxFQUFFQyxJQUFJLENBQUNDLEdBQUwsRUFGQztBQUdmdlMscUJBQU8sRUFBRSxNQUFJLENBQUNnUyxLQUFMLENBQVdhLEtBSEw7QUFJZjVTLHFCQUFPLEVBQUUsTUFBSSxDQUFDK1IsS0FBTCxDQUFXYztBQUpMLGFBQWhCO0FBTUEsV0FQOEIsRUFPNUIsS0FBSzFXLFFBQUwsQ0FBY3VWLGNBUGMsQ0FBL0I7QUFRQTs7QUFFRCxhQUFLdlYsUUFBTCxDQUFjZ1YsUUFBZCxDQUF1QmhULEtBQXZCO0FBQ0E7QUFDRDs7OzhCQUVTQSxLLEVBQU87QUFDaEI1QixZQUFNLENBQUNDLE1BQVAsQ0FBYzJCLEtBQWQsRUFBcUI7QUFDcEJxVSxjQUFNLEVBQUU7QUFEWSxPQUFyQjtBQUlBLFdBQUtULEtBQUwsQ0FBV2EsS0FBWCxHQUFtQnpVLEtBQUssQ0FBQzRCLE9BQXpCO0FBQ0EsV0FBS2dTLEtBQUwsQ0FBV2MsS0FBWCxHQUFtQjFVLEtBQUssQ0FBQzZCLE9BQXpCOztBQUVBLFVBQUk3QixLQUFLLENBQUMyVSxLQUFOLElBQWUzVSxLQUFLLENBQUMyVSxLQUFOLEtBQWdCLENBQW5DLEVBQXNDO0FBQ3JDLGFBQUszVyxRQUFMLENBQWNtVixVQUFkLENBQXlCblQsS0FBekI7QUFDQSxPQUZELE1BR0s7QUFDSixhQUFLZ1QsUUFBTCxDQUFjaFQsS0FBZDtBQUNBO0FBQ0Q7OzsrQkFFVUEsSyxFQUFPO0FBQ2pCQSxXQUFLLENBQUNvVSxjQUFOO0FBRUFoVyxZQUFNLENBQUNDLE1BQVAsQ0FBYzJCLEtBQWQsRUFBcUI7QUFDcEJxVSxjQUFNLEVBQUU7QUFEWSxPQUFyQjs7QUFJQSxVQUFNTyxPQUFPLHNCQUFPNVUsS0FBSyxDQUFDNFUsT0FBYixDQUFiOztBQUNBNVUsV0FBSyxDQUFDNEIsT0FBTixHQUFnQmdULE9BQU8sQ0FBQ2hGLE1BQVIsQ0FBZSxVQUFDQyxJQUFELEVBQU9nRixLQUFQO0FBQUEsZUFBaUJoRixJQUFJLEdBQUdnRixLQUFLLENBQUNDLEtBQTlCO0FBQUEsT0FBZixFQUFvRCxDQUFwRCxJQUF5REYsT0FBTyxDQUFDeE4sTUFBakY7QUFDQXBILFdBQUssQ0FBQzZCLE9BQU4sR0FBZ0IrUyxPQUFPLENBQUNoRixNQUFSLENBQWUsVUFBQ0MsSUFBRCxFQUFPZ0YsS0FBUDtBQUFBLGVBQWlCaEYsSUFBSSxHQUFHZ0YsS0FBSyxDQUFDRSxLQUE5QjtBQUFBLE9BQWYsRUFBb0QsQ0FBcEQsSUFBeURILE9BQU8sQ0FBQ3hOLE1BQWpGO0FBRUEsV0FBS3dNLEtBQUwsQ0FBV2EsS0FBWCxHQUFtQnpVLEtBQUssQ0FBQzRCLE9BQXpCO0FBQ0EsV0FBS2dTLEtBQUwsQ0FBV2MsS0FBWCxHQUFtQjFVLEtBQUssQ0FBQzZCLE9BQXpCOztBQUVBLFVBQUk3QixLQUFLLENBQUM0VSxPQUFOLENBQWN4TixNQUFkLEdBQXVCLENBQTNCLEVBQThCO0FBQzdCLGFBQUt3TSxLQUFMLENBQVdvQixVQUFYLEdBQXdCQyw0REFBVSxDQUFDTCxPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVdFLEtBQVgsR0FBbUJGLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBV0UsS0FBL0IsRUFBc0NGLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBV0csS0FBWCxHQUFtQkgsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRyxLQUFwRSxDQUFsQztBQUNBLGFBQUtuQixLQUFMLENBQVdzQixRQUFYLEdBQXNCLElBQXRCO0FBQ0EsYUFBS3RCLEtBQUwsQ0FBV3VCLFNBQVgsR0FBdUIsQ0FBdkI7QUFFQWIsb0JBQVksQ0FBQyxLQUFLVixLQUFMLENBQVdXLE9BQVosQ0FBWjtBQUNBOztBQUVELFdBQUt2QixRQUFMLENBQWNoVCxLQUFkO0FBQ0E7OzsrQkFFVUEsSyxFQUFPO0FBQ2pCLFdBQUtoQyxRQUFMLENBQWNtVixVQUFkLENBQXlCblQsS0FBekI7QUFDQTs7OzRCQUVPQSxLLEVBQU87QUFDZDVCLFlBQU0sQ0FBQ0MsTUFBUCxDQUFjMkIsS0FBZCxFQUFxQjtBQUNwQnFVLGNBQU0sRUFBRSxLQURZO0FBRXBCZSxnQkFBUSxFQUFFcFYsS0FBSyxDQUFDaVUsWUFBTixHQUFxQixLQUFLTCxLQUFMLENBQVdDO0FBRnRCLE9BQXJCOztBQUtBLFVBQUksQ0FBQyxLQUFLRCxLQUFMLENBQVd5QixNQUFoQixFQUF3QjtBQUN2QixZQUFNQyxVQUFVLEdBQUl0VixLQUFLLENBQUMyVSxLQUFOLElBQWUzVSxLQUFLLENBQUMyVSxLQUFOLEtBQWdCLENBQWhDLElBQXNDM1UsS0FBSyxDQUFDdVYsTUFBNUMsSUFBc0R2VixLQUFLLENBQUN3VixPQUE1RCxJQUF1RXhWLEtBQUssQ0FBQ3lWLE9BQWhHO0FBQ0EsWUFBTXZDLEtBQUssR0FBRyxLQUFLbFYsUUFBTCxDQUFjNlUsWUFBZCxJQUE4QjdTLEtBQUssQ0FBQ29WLFFBQU4sSUFBa0IsS0FBS3BYLFFBQUwsQ0FBY3VWLGNBQTVFOztBQUVBLFlBQUkrQixVQUFVLElBQUlwQyxLQUFsQixFQUF5QjtBQUN4QixlQUFLbFYsUUFBTCxDQUFja1YsS0FBZCxDQUFvQmxULEtBQXBCO0FBQ0EsU0FGRCxNQUdLO0FBQ0pzVSxzQkFBWSxDQUFDLEtBQUtWLEtBQUwsQ0FBV1csT0FBWixDQUFaO0FBQ0EsZUFBS3ZXLFFBQUwsQ0FBYzhVLEdBQWQsQ0FBa0I5UyxLQUFsQjtBQUNBO0FBQ0Q7O0FBRUQsV0FBSzRULEtBQUwsQ0FBV3lCLE1BQVgsR0FBb0IsSUFBcEI7QUFDQSxXQUFLekIsS0FBTCxDQUFXYSxLQUFYLEdBQW1CLElBQW5CO0FBQ0EsV0FBS2IsS0FBTCxDQUFXYyxLQUFYLEdBQW1CLElBQW5CO0FBQ0EsV0FBS2QsS0FBTCxDQUFXQyxZQUFYLEdBQTBCLElBQTFCO0FBQ0FTLGtCQUFZLENBQUMsS0FBS1YsS0FBTCxDQUFXVyxPQUFaLENBQVo7QUFDQTs7OzZCQUVRdlUsSyxFQUFPO0FBQ2ZBLFdBQUssQ0FBQ29VLGNBQU47QUFFQWhXLFlBQU0sQ0FBQ0MsTUFBUCxDQUFjMkIsS0FBZCxFQUFxQjtBQUNwQnFVLGNBQU0sRUFBRSxJQURZO0FBRXBCZSxnQkFBUSxFQUFFcFYsS0FBSyxDQUFDaVUsWUFBTixHQUFxQixLQUFLTCxLQUFMLENBQVdDO0FBRnRCLE9BQXJCOztBQUtBLFVBQU1lLE9BQU8sc0JBQU81VSxLQUFLLENBQUM0VSxPQUFiLENBQWI7O0FBRUEsVUFBSUEsT0FBTyxDQUFDeE4sTUFBWixFQUFvQjtBQUNuQnBILGFBQUssQ0FBQzRCLE9BQU4sR0FBZ0JnVCxPQUFPLENBQUNoRixNQUFSLENBQWUsVUFBQ0MsSUFBRCxFQUFPZ0YsS0FBUDtBQUFBLGlCQUFpQmhGLElBQUksR0FBR2dGLEtBQUssQ0FBQ0MsS0FBOUI7QUFBQSxTQUFmLEVBQW9ELENBQXBELElBQXlERixPQUFPLENBQUN4TixNQUFqRjtBQUNBcEgsYUFBSyxDQUFDNkIsT0FBTixHQUFnQitTLE9BQU8sQ0FBQ2hGLE1BQVIsQ0FBZSxVQUFDQyxJQUFELEVBQU9nRixLQUFQO0FBQUEsaUJBQWlCaEYsSUFBSSxHQUFHZ0YsS0FBSyxDQUFDRSxLQUE5QjtBQUFBLFNBQWYsRUFBb0QsQ0FBcEQsSUFBeURILE9BQU8sQ0FBQ3hOLE1BQWpGO0FBRUEsYUFBS3dNLEtBQUwsQ0FBV2EsS0FBWCxHQUFtQnpVLEtBQUssQ0FBQzRCLE9BQXpCO0FBQ0EsYUFBS2dTLEtBQUwsQ0FBV2MsS0FBWCxHQUFtQjFVLEtBQUssQ0FBQzZCLE9BQXpCO0FBQ0EsT0FORCxNQU9LO0FBQ0o3QixhQUFLLENBQUM0QixPQUFOLEdBQWdCLEtBQUtnUyxLQUFMLENBQVdhLEtBQTNCO0FBQ0F6VSxhQUFLLENBQUM2QixPQUFOLEdBQWdCLEtBQUsrUixLQUFMLENBQVdjLEtBQTNCO0FBQ0E7O0FBRUQsVUFBSSxFQUFFLEtBQUtkLEtBQUwsQ0FBV3lCLE1BQVgsSUFBcUIsS0FBS3pCLEtBQUwsQ0FBV3NCLFFBQWxDLENBQUosRUFBaUQ7QUFDaEQsWUFBSWxWLEtBQUssQ0FBQ29WLFFBQU4sSUFBa0IsS0FBS3BYLFFBQUwsQ0FBY3VWLGNBQXBDLEVBQW9EO0FBQ25ELGVBQUt2VixRQUFMLENBQWNrVixLQUFkLENBQW9CbFQsS0FBcEI7QUFDQSxTQUZELE1BR0s7QUFDSnNVLHNCQUFZLENBQUMsS0FBS1YsS0FBTCxDQUFXVyxPQUFaLENBQVo7QUFDQSxlQUFLdlcsUUFBTCxDQUFjOFUsR0FBZCxDQUFrQjlTLEtBQWxCO0FBQ0E7QUFDRDs7QUFFRCxVQUFJQSxLQUFLLENBQUM0VSxPQUFOLENBQWN4TixNQUFkLElBQXdCLENBQTVCLEVBQStCO0FBQzlCLGFBQUt3TSxLQUFMLENBQVdzQixRQUFYLEdBQXNCLEtBQXRCO0FBQ0EsYUFBS3RCLEtBQUwsQ0FBV29CLFVBQVgsR0FBd0IsSUFBeEI7QUFDQSxhQUFLcEIsS0FBTCxDQUFXdUIsU0FBWCxHQUF1QixJQUF2QjtBQUNBOztBQUVELFVBQUluVixLQUFLLENBQUM0VSxPQUFOLENBQWN4TixNQUFkLEtBQXlCLENBQTdCLEVBQWdDO0FBQy9CLGFBQUt3TSxLQUFMLENBQVd5QixNQUFYLEdBQW9CLElBQXBCO0FBQ0EsYUFBS3pCLEtBQUwsQ0FBV2EsS0FBWCxHQUFtQixJQUFuQjtBQUNBLGFBQUtiLEtBQUwsQ0FBV2MsS0FBWCxHQUFtQixJQUFuQjtBQUNBLGFBQUtkLEtBQUwsQ0FBV0MsWUFBWCxHQUEwQixJQUExQjtBQUNBO0FBQ0Q7Ozs4QkFFUzdULEssRUFBTztBQUNoQixVQUFJLEtBQUs0VCxLQUFMLENBQVdDLFlBQWYsRUFBNkI7QUFDNUIsWUFBSSxDQUFDLEtBQUtELEtBQUwsQ0FBV3lCLE1BQWhCLEVBQXdCO0FBQ3ZCLGNBQUs5VixJQUFJLENBQUMrRCxHQUFMLENBQVN0RCxLQUFLLENBQUM0QixPQUFOLEdBQWdCLEtBQUtnUyxLQUFMLENBQVdhLEtBQXBDLElBQTZDLEtBQUt6VyxRQUFMLENBQWNxVixhQUE1RCxJQUNBOVQsSUFBSSxDQUFDK0QsR0FBTCxDQUFTdEQsS0FBSyxDQUFDNkIsT0FBTixHQUFnQixLQUFLK1IsS0FBTCxDQUFXYyxLQUFwQyxJQUE2QyxLQUFLMVcsUUFBTCxDQUFjcVYsYUFEL0QsRUFDK0U7QUFDOUUsaUJBQUtPLEtBQUwsQ0FBV3lCLE1BQVgsR0FBb0IsSUFBcEI7QUFDQWYsd0JBQVksQ0FBQyxLQUFLVixLQUFMLENBQVdXLE9BQVosQ0FBWjtBQUNBO0FBQ0Q7O0FBRUQsWUFBSSxLQUFLWCxLQUFMLENBQVd5QixNQUFmLEVBQXVCO0FBQ3RCalgsZ0JBQU0sQ0FBQ0MsTUFBUCxDQUFjMkIsS0FBZCxFQUFxQjtBQUNwQnFVLGtCQUFNLEVBQUUsS0FEWTtBQUVwQi9ULGtCQUFNLEVBQUVOLEtBQUssQ0FBQzRCLE9BQU4sR0FBZ0IsS0FBS2dTLEtBQUwsQ0FBV2EsS0FGZjtBQUdwQmpVLGtCQUFNLEVBQUVSLEtBQUssQ0FBQzZCLE9BQU4sR0FBZ0IsS0FBSytSLEtBQUwsQ0FBV2M7QUFIZixXQUFyQjtBQU1BLGVBQUsxVyxRQUFMLENBQWMyRCxJQUFkLENBQW1CM0IsS0FBbkI7QUFFQSxlQUFLNFQsS0FBTCxDQUFXYSxLQUFYLEdBQW1CelUsS0FBSyxDQUFDNEIsT0FBekI7QUFDQSxlQUFLZ1MsS0FBTCxDQUFXYyxLQUFYLEdBQW1CMVUsS0FBSyxDQUFDNkIsT0FBekI7QUFDQTtBQUNEO0FBQ0Q7Ozs4QkFFUzdCLEssRUFBTztBQUNoQkEsV0FBSyxDQUFDb1UsY0FBTjs7QUFFQSxVQUFJLEtBQUtSLEtBQUwsQ0FBV0MsWUFBZixFQUE2QjtBQUM1QixZQUFNZSxPQUFPLHNCQUFPNVUsS0FBSyxDQUFDNFUsT0FBYixDQUFiOztBQUVBLFlBQUksQ0FBQzNVLHFEQUFHLENBQUNELEtBQUQsRUFBUSxPQUFSLENBQVIsRUFBMEI7QUFDekJBLGVBQUssQ0FBQ3BDLEtBQU4sR0FBY2dYLE9BQU8sQ0FBQ3hOLE1BQVIsR0FBaUIsQ0FBakIsR0FBcUIsQ0FBckIsR0FDYjZOLDREQUFVLENBQUNMLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBV0UsS0FBWCxHQUFtQkYsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRSxLQUEvQixFQUFzQ0YsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRyxLQUFYLEdBQW1CSCxPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVdHLEtBQXBFLENBQVYsR0FBdUYsS0FBS25CLEtBQUwsQ0FBV29CLFVBRG5HO0FBRUE7O0FBRUQ1VyxjQUFNLENBQUNDLE1BQVAsQ0FBYzJCLEtBQWQsRUFBcUI7QUFDcEI0QixpQkFBTyxFQUFFZ1QsT0FBTyxDQUFDaEYsTUFBUixDQUFlLFVBQUNDLElBQUQsRUFBT2dGLEtBQVA7QUFBQSxtQkFBaUJoRixJQUFJLEdBQUdnRixLQUFLLENBQUNDLEtBQTlCO0FBQUEsV0FBZixFQUFvRCxDQUFwRCxJQUF5REYsT0FBTyxDQUFDeE4sTUFEdEQ7QUFFcEJ2RixpQkFBTyxFQUFFK1MsT0FBTyxDQUFDaEYsTUFBUixDQUFlLFVBQUNDLElBQUQsRUFBT2dGLEtBQVA7QUFBQSxtQkFBaUJoRixJQUFJLEdBQUdnRixLQUFLLENBQUNFLEtBQTlCO0FBQUEsV0FBZixFQUFvRCxDQUFwRCxJQUF5REgsT0FBTyxDQUFDeE4sTUFGdEQ7QUFHcEIzRixtQkFBUyxFQUFFekIsS0FBSyxDQUFDcEMsS0FBTixHQUFjLEtBQUtnVyxLQUFMLENBQVd1QixTQUhoQjtBQUlwQmQsZ0JBQU0sRUFBRTtBQUpZLFNBQXJCOztBQU9BLFlBQUksS0FBS1QsS0FBTCxDQUFXc0IsUUFBZixFQUF5QjtBQUV4QixlQUFLbFgsUUFBTCxDQUFjb1YsSUFBZCxDQUFtQnBULEtBQW5CO0FBRUEsZUFBSzRULEtBQUwsQ0FBV3VCLFNBQVgsR0FBdUJuVixLQUFLLENBQUNwQyxLQUE3QjtBQUNBOztBQUVELFlBQUksQ0FBQyxLQUFLZ1csS0FBTCxDQUFXeUIsTUFBaEIsRUFBd0I7QUFDdkIsY0FBSzlWLElBQUksQ0FBQytELEdBQUwsQ0FBU3RELEtBQUssQ0FBQzRCLE9BQU4sR0FBZ0IsS0FBS2dTLEtBQUwsQ0FBV2EsS0FBcEMsSUFBNkMsS0FBS3pXLFFBQUwsQ0FBY3FWLGFBQTVELElBQ0E5VCxJQUFJLENBQUMrRCxHQUFMLENBQVN0RCxLQUFLLENBQUM2QixPQUFOLEdBQWdCLEtBQUsrUixLQUFMLENBQVdjLEtBQXBDLElBQTZDLEtBQUsxVyxRQUFMLENBQWNxVixhQUQvRCxFQUMrRTtBQUM5RSxpQkFBS08sS0FBTCxDQUFXeUIsTUFBWCxHQUFvQixJQUFwQjtBQUNBZix3QkFBWSxDQUFDLEtBQUtWLEtBQUwsQ0FBV1csT0FBWixDQUFaO0FBQ0E7QUFDRDs7QUFFRCxZQUFJLEtBQUtYLEtBQUwsQ0FBV3lCLE1BQWYsRUFBdUI7QUFDdEJqWCxnQkFBTSxDQUFDQyxNQUFQLENBQWMyQixLQUFkLEVBQXFCO0FBQ3BCTSxrQkFBTSxFQUFFTixLQUFLLENBQUM0QixPQUFOLEdBQWdCLEtBQUtnUyxLQUFMLENBQVdhLEtBRGY7QUFFcEJqVSxrQkFBTSxFQUFFUixLQUFLLENBQUM2QixPQUFOLEdBQWdCLEtBQUsrUixLQUFMLENBQVdjO0FBRmYsV0FBckI7QUFLQSxlQUFLMVcsUUFBTCxDQUFjMkQsSUFBZCxDQUFtQjNCLEtBQW5CO0FBRUEsZUFBSzRULEtBQUwsQ0FBV2EsS0FBWCxHQUFtQnpVLEtBQUssQ0FBQzRCLE9BQXpCO0FBQ0EsZUFBS2dTLEtBQUwsQ0FBV2MsS0FBWCxHQUFtQjFVLEtBQUssQ0FBQzZCLE9BQXpCO0FBQ0E7QUFDRDtBQUNEOzs7Z0NBRVc3QixLLEVBQU87QUFDbEJpUCxhQUFPLENBQUNGLEdBQVIsQ0FBWSxhQUFaLEVBQTJCL08sS0FBM0I7QUFDQTs7OzBCQUVLQSxLLEVBQU87QUFDWjVCLFlBQU0sQ0FBQ0MsTUFBUCxDQUFjMkIsS0FBZCxFQUFxQjtBQUNwQnlCLGlCQUFTLEVBQUUsSUFBS3pCLEtBQUssQ0FBQ1EsTUFBTixHQUFlLEtBQUt4QyxRQUFMLENBQWN3VixXQUR6QjtBQUVwQmEsY0FBTSxFQUFFO0FBRlksT0FBckI7QUFLQSxXQUFLclcsUUFBTCxDQUFjb1YsSUFBZCxDQUFtQnBULEtBQW5CO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNyU21Ca0QsSzs7O0FBQ3BCLGlCQUFZSixDQUFaLEVBQWVFLENBQWYsRUFBa0I7QUFBQTs7QUFDakIsUUFBSSxRQUFPRixDQUFQLE1BQWEsUUFBakIsRUFBMkI7QUFDMUJFLE9BQUMsR0FBR0YsQ0FBQyxDQUFDRSxDQUFOO0FBQ0FGLE9BQUMsR0FBR0EsQ0FBQyxDQUFDQSxDQUFOO0FBQ0EsS0FKZ0IsQ0FNakI7OztBQUNBLFNBQUtBLENBQUwsR0FBU3ZELElBQUksQ0FBQytSLEtBQUwsQ0FBV3hPLENBQVgsSUFBZ0IsQ0FBekI7QUFDQSxTQUFLRSxDQUFMLEdBQVN6RCxJQUFJLENBQUMrUixLQUFMLENBQVd0TyxDQUFYLElBQWdCLENBQXpCO0FBQ0E7Ozs7MkJBRU07QUFBRSxhQUFPLEtBQUtGLENBQVo7QUFBZ0I7OzsyQkFDbEI7QUFBRSxhQUFPLEtBQUtFLENBQVo7QUFBZ0I7Ozt5QkFFcEIzQyxJLEVBQU07QUFBRSxXQUFLeUMsQ0FBTCxHQUFTekMsSUFBVDtBQUFnQjs7O3lCQUN4QkUsSSxFQUFNO0FBQUUsV0FBS3lDLENBQUwsR0FBU3pDLElBQVQ7QUFBZ0I7OzsrQkFFbEI7QUFBRSxhQUFPO0FBQUN1QyxTQUFDLEVBQUUsS0FBS0EsQ0FBVDtBQUFZRSxTQUFDLEVBQUUsS0FBS0E7QUFBcEIsT0FBUDtBQUFnQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkI5Qzs7SUFFcUIwUyxNOzs7QUFDcEIsa0JBQWExWCxRQUFiLEVBQXVCO0FBQUE7O0FBQUE7O0FBQ3RCLFNBQUsyWCxPQUFMLEdBQWUsSUFBZjtBQUVBLEtBQ0MsWUFERCxFQUVDLFNBRkQsRUFHQyxVQUhELEVBSUMsUUFKRCxFQUtFMVgsR0FMRixDQUtNLFVBQUFDLE1BQU07QUFBQSxhQUFJLEtBQUksQ0FBQ0EsTUFBRCxDQUFKLEdBQWUsS0FBSSxDQUFDQSxNQUFELENBQUosQ0FBYUMsSUFBYixDQUFrQixLQUFsQixDQUFuQjtBQUFBLEtBTFo7QUFPQSxTQUFLeVgsSUFBTCxHQUFZNVgsUUFBUSxDQUFDNFgsSUFBVCxJQUFpQjdDLDhDQUE3QjtBQUNBLFNBQUs4QyxNQUFMLEdBQWM3WCxRQUFRLENBQUM2WCxNQUFULElBQW1COUMsOENBQWpDO0FBQ0EsU0FBSytDLFNBQUwsR0FBaUI5WCxRQUFRLENBQUM4UixPQUFULElBQW9COEMsUUFBUSxDQUFDekgsSUFBOUM7QUFFQTRLLFVBQU0sQ0FBQ2hDLGdCQUFQLENBQXdCLFFBQXhCLEVBQWtDLEtBQUtpQyxRQUF2QztBQUVBLFNBQUtDLE1BQUwsR0FBY3JELFFBQVEsQ0FBQ3NELGFBQVQsQ0FBdUIsUUFBdkIsQ0FBZDtBQUNBLFNBQUtELE1BQUwsQ0FBWTFYLEtBQVosR0FBb0IsS0FBS3VYLFNBQUwsQ0FBZTFWLFdBQW5DO0FBQ0EsU0FBSzZWLE1BQUwsQ0FBWXpYLE1BQVosR0FBcUIsS0FBS3NYLFNBQUwsQ0FBZTNWLFlBQXBDO0FBRUEsU0FBSytJLE9BQUwsR0FBZSxLQUFLK00sTUFBTCxDQUFZRSxVQUFaLENBQXVCLElBQXZCLENBQWY7QUFFQSxTQUFLTCxTQUFMLENBQWVNLFdBQWYsQ0FBMkIsS0FBS0gsTUFBaEM7QUFFQUkseUJBQXFCLENBQUMsS0FBS0MsTUFBTixDQUFyQjtBQUNBOzs7O2lDQUVhO0FBQ2IsYUFBTyxLQUFLcE4sT0FBWjtBQUNBOzs7OEJBRVU7QUFDVixhQUFPO0FBQ050SyxtQkFBVyxFQUFFLEtBQUtrWCxTQUFMLENBQWUxVixXQUR0QjtBQUVOekIsb0JBQVksRUFBRSxLQUFLbVgsU0FBTCxDQUFlM1Y7QUFGdkIsT0FBUDtBQUlBOzs7NkJBRVNILEssRUFBTztBQUNoQixVQUFNekIsS0FBSyxHQUFHLEtBQUt1WCxTQUFMLENBQWUxVixXQUE3QjtBQUNBLFVBQU01QixNQUFNLEdBQUcsS0FBS3NYLFNBQUwsQ0FBZTNWLFlBQTlCO0FBRUEsVUFBTW9XLFFBQVEsR0FBRyxLQUFLTixNQUFMLENBQVkxWCxLQUE3QjtBQUNBLFVBQU1pWSxTQUFTLEdBQUcsS0FBS1AsTUFBTCxDQUFZelgsTUFBOUI7QUFFQSxVQUFNOEIsTUFBTSxHQUFHL0IsS0FBSyxHQUFHZ1ksUUFBdkI7QUFDQSxVQUFNL1YsTUFBTSxHQUFHaEMsTUFBTSxHQUFHZ1ksU0FBeEI7QUFFQSxXQUFLUCxNQUFMLENBQVkxWCxLQUFaLEdBQW9CQSxLQUFwQjtBQUNBLFdBQUswWCxNQUFMLENBQVl6WCxNQUFaLEdBQXFCQSxNQUFyQjtBQUVBSixZQUFNLENBQUNDLE1BQVAsQ0FBYzJCLEtBQWQsRUFBcUI7QUFDcEJ4QixjQUFNLEVBQU5BLE1BRG9CO0FBQ1pELGFBQUssRUFBTEEsS0FEWTtBQUVwQmlZLGlCQUFTLEVBQVRBLFNBRm9CO0FBRVRELGdCQUFRLEVBQVJBLFFBRlM7QUFHcEJqVyxjQUFNLEVBQU5BLE1BSG9CO0FBR1pFLGNBQU0sRUFBTkE7QUFIWSxPQUFyQjtBQU1BLFdBQUtxVixNQUFMLENBQVk3VixLQUFaO0FBQ0E7OzsyQkFFT21VLEcsRUFBSztBQUFBOztBQUNaLFdBQUtqTCxPQUFMLENBQWF1TixPQUFiLEdBQXVCLEtBQUt2TixPQUFMLENBQWF3TixHQUFiLElBQW9CLElBQTNDO0FBQ0EsV0FBS3hOLE9BQUwsQ0FBYXdOLEdBQWIsR0FBbUJ4QyxJQUFJLENBQUNDLEdBQUwsRUFBbkI7QUFFQSxXQUFLakwsT0FBTCxDQUFhaUwsR0FBYixHQUFtQkEsR0FBbkI7QUFDQSxXQUFLakwsT0FBTCxDQUFheU0sT0FBYixHQUF1QixLQUFLQSxPQUE1QjtBQUVBLFVBQU1nQixTQUFTLEdBQUcsS0FBS2YsSUFBTCxDQUFVLEtBQUsxTSxPQUFmLENBQWxCO0FBRUEsV0FBS3lNLE9BQUwsR0FBZXhCLEdBQWY7QUFFQSxVQUFJd0MsU0FBSixFQUFlbkMsVUFBVSxDQUFDO0FBQUEsZUFBTTZCLHFCQUFxQixDQUFDLE1BQUksQ0FBQ0MsTUFBTixDQUEzQjtBQUFBLE9BQUQsRUFBMkNLLFNBQTNDLENBQVYsQ0FBZixLQUNLTixxQkFBcUIsQ0FBQyxLQUFLQyxNQUFOLENBQXJCO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUVGOztJQUVxQmxVLE07Ozs7O0FBQ3BCLGtCQUFZVSxDQUFaLEVBQWVFLENBQWYsRUFBa0I7QUFBQTs7QUFBQSwrRUFDWEYsQ0FEVyxFQUNSRSxDQURRO0FBRWpCOzs7RUFIa0NFLGlEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZwQztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFVQSxJQUFNMFQsS0FBSyx5Q0FDVDVPLCtDQURTLEVBQ0EsSUFBSTZCLHVEQUFKLEVBREEsMkJBRVRwQixrREFGUyxFQUVBLElBQUlRLHNEQUFKLEVBRkEsMkJBR1RQLGtEQUhTLEVBR0EsSUFBSTJGLHNEQUFKLEVBSEEsVUFBWDtBQU1BLElBQU13SSxNQUFNLEdBQUcsSUFBSTFLLHNEQUFKLEVBQWY7QUFFQSxJQUFNek8sUUFBUSxHQUFHO0FBQ2hCeUUsTUFBSSxFQUFFNkYsK0NBRFU7QUFFaEI4TyxPQUFLLEVBQUU5TywrQ0FGUztBQUdoQkgsYUFBVyxFQUFFQyxnREFIRztBQUloQnJJLGVBQWEsRUFBRSxJQUpDO0FBTWhCcVQsS0FBRyxFQUFFaUUsMkNBTlc7QUFPaEI1RCxZQUFVLEVBQUU0RCwyQ0FQSTtBQVFoQjdELE9BQUssRUFBRTZELDJDQVJTO0FBVWhCbkIsTUFBSSxFQUFFbUIsMkNBQVVoRTtBQVZBLENBQWpCOztBQWFBLFNBQVNpRSxrQkFBVCxDQUE0QkYsS0FBNUIsRUFBbUNqUCxXQUFuQyxFQUFnRDtBQUMvQyxVQUFRaVAsS0FBUjtBQUNDLFNBQUs5TywrQ0FBTDtBQUNDLGNBQVFILFdBQVI7QUFDQyxhQUFLQyxnREFBTDtBQUFXLGlCQUFPOUMsZ0VBQVA7O0FBQ1gsYUFBSzZELGtEQUFMO0FBQWEsaUJBQU92QixrRUFBUDtBQUZkOztBQUlELFNBQUtvQixrREFBTDtBQUNDLGNBQVFiLFdBQVI7QUFDQyxhQUFLQyxnREFBTDtBQUFXLGlCQUFPeEYsK0RBQVA7O0FBQ1gsYUFBS3VHLGtEQUFMO0FBQWEsaUJBQU9oQyxpRUFBUDtBQUZkOztBQVBGO0FBWUE7O0FBRU0sSUFBTW9RLFVBQWI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUNpQztBQUFDLGFBQU90Tyx1REFBUDtBQUFtQjtBQURyRDtBQUFBO0FBQUEsd0JBRWlDO0FBQUMsYUFBT0Msd0RBQVA7QUFBb0I7QUFGdEQ7QUFBQTtBQUFBLHdCQUdpQztBQUFDLGFBQU9FLDhEQUFQO0FBQTBCO0FBSDVEO0FBQUE7QUFBQSx3QkFJaUM7QUFBQyxhQUFPRSx1REFBUDtBQUFtQjtBQUpyRDtBQUFBO0FBQUEsd0JBTXFCO0FBQUMsYUFBTzROLEtBQVA7QUFBYTtBQU5uQztBQUFBO0FBQUEsd0JBT3FCO0FBQUMsYUFBT3BPLGdEQUFQO0FBQVk7QUFQbEM7QUFBQTtBQUFBLHdCQVFxQjtBQUFDLGFBQU9xTyxNQUFQO0FBQWM7QUFScEM7QUFBQTtBQUFBLHdCQVVvQjtBQUFDLGFBQU9FLG1DQUFQO0FBQWE7QUFWbEM7QUFBQTtBQUFBLHdCQVdvQjtBQUFDLGFBQU92UyxtQ0FBUDtBQUFhO0FBWGxDOztBQWFDLHNCQUFheEcsUUFBYixFQUF1QjtBQUFBOztBQUFBOztBQUN0QixLQUNDLGVBREQsRUFFQyxLQUZELEVBR0MsV0FIRCxFQUlDLFlBSkQsRUFLQyxPQUxELEVBTUMsTUFORCxFQU9DLE1BUEQsRUFRQyxhQVJELEVBU0MsYUFURCxFQVVDLGlCQVZELEVBV0MsTUFYRCxFQVlDLFFBWkQsRUFhQyxPQWJELEVBY0VDLEdBZEYsQ0FjTSxVQUFBQyxNQUFNLEVBQUk7QUFBQyxXQUFJLENBQUNBLE1BQUQsQ0FBSixHQUFlLEtBQUksQ0FBQ0EsTUFBRCxDQUFKLENBQWFDLElBQWIsQ0FBa0IsS0FBbEIsQ0FBZjtBQUF1QyxLQWR4RDtBQWdCQSxTQUFLK1ksVUFBTCxHQUFrQmhELElBQUksQ0FBQ0MsR0FBTCxFQUFsQjtBQUVBLFNBQUtnRCxhQUFMLENBQW1CblosUUFBbkI7QUFFQSxTQUFLb1osTUFBTCxHQUFjLElBQUkxQixrREFBSixDQUFXO0FBQ3hCNUYsYUFBTyxFQUFFLEtBQUs5UixRQUFMLENBQWM4UixPQURDO0FBRXhCOEYsVUFBSSxFQUFFLEtBQUtBLElBRmE7QUFHeEJDLFlBQU0sRUFBRSxLQUFLQTtBQUhXLEtBQVgsQ0FBZDtBQU1BLFNBQUt3QixLQUFMLEdBQWEsSUFBSTFELGlEQUFKLENBQVV2VixNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNwQ3lSLGFBQU8sRUFBRSxLQUFLOVIsUUFBTCxDQUFjOFIsT0FEYTtBQUVwQ2dELFNBQUcsRUFBRSxLQUFLQSxHQUYwQjtBQUdwQ0csZUFBUyxFQUFFLEtBQUtBLFNBSG9CO0FBSXBDRSxnQkFBVSxFQUFFLEtBQUtBLFVBSm1CO0FBS3BDRCxXQUFLLEVBQUUsS0FBS0EsS0FMd0I7QUFNcEN2UixVQUFJLEVBQUUsS0FBS0EsSUFOeUI7QUFPcEN5UixVQUFJLEVBQUUsS0FBS0E7QUFQeUIsS0FBZCxFQVFwQjVPLDJDQUFBLENBQVcsS0FBS3hHLFFBQWhCLEVBQTBCLENBQUMsY0FBRCxFQUFpQixlQUFqQixFQUFrQyxvQkFBbEMsRUFBd0QsZ0JBQXhELEVBQTBFLGFBQTFFLENBQTFCLENBUm9CLENBQVYsQ0FBYjtBQVVBLFFBQU1zWixZQUFZLEdBQUdOLGtCQUFrQixDQUFDLEtBQUtoWixRQUFMLENBQWM4WSxLQUFmLEVBQXNCLEtBQUs5WSxRQUFMLENBQWM2SixXQUFwQyxDQUF2QztBQUNBLFNBQUt5UCxZQUFMLEdBQW9CLElBQUlBLFlBQUosQ0FBaUJsWixNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLK1ksTUFBTCxDQUFZRyxPQUFaLEVBQWQsRUFBcUMvUywyQ0FBQSxDQUFXLEtBQUt4RyxRQUFoQixFQUEwQixDQUNuRyxnQkFEbUcsRUFFbkcsU0FGbUcsRUFHbkcsU0FIbUcsRUFJbkcsUUFKbUcsRUFLbkcsZUFMbUcsRUFNbkcsUUFObUcsRUFPbkcsT0FQbUcsRUFRbkcsT0FSbUcsRUFTbkcsTUFUbUcsQ0FBMUIsQ0FBckMsQ0FBakIsQ0FBcEI7QUFXQTs7QUE5REY7QUFBQTtBQUFBLGtDQWdFZ0JBLFFBaEVoQixFQWdFMEI7QUFFeEIsV0FBS0EsUUFBTCxHQUFnQkksTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQlgsUUFBbEIsRUFBNEJNLFFBQTVCLENBQWhCO0FBQ0EsV0FBS0EsUUFBTCxDQUFjOFIsT0FBZCxHQUF3QixLQUFLOVIsUUFBTCxDQUFjOFIsT0FBZCxZQUFpQzBILFdBQWpDLEdBQStDLEtBQUt4WixRQUFMLENBQWM4UixPQUE3RCxHQUN2QjhDLFFBQVEsQ0FBQzZFLGFBQVQsQ0FBdUIsS0FBS3paLFFBQUwsQ0FBYzhSLE9BQXJDLENBREQ7O0FBR0EsVUFBSSxLQUFLOVIsUUFBTCxDQUFjaUgsTUFBbEIsRUFBMEI7QUFDekIsYUFBS2pILFFBQUwsQ0FBY1EsTUFBZCxHQUF1QixLQUFLUixRQUFMLENBQWNpSCxNQUFkLEdBQXVCLENBQXZCLEdBQTJCLENBQWxEO0FBQ0EsYUFBS2pILFFBQUwsQ0FBY08sS0FBZCxHQUFzQixLQUFLUCxRQUFMLENBQWNpSCxNQUFkLEdBQXVCLENBQXZCLEdBQTJCLENBQWpEO0FBQ0E7O0FBRUQsVUFBSSxLQUFLakgsUUFBTCxDQUFjeUIsYUFBbEIsRUFBaUM7QUFDaEMsWUFBSSxLQUFLekIsUUFBTCxDQUFjUSxNQUFkLElBQXlCLEtBQUtSLFFBQUwsQ0FBY1EsTUFBZCxHQUF1QixDQUF2QixLQUE2QixDQUExRCxFQUE4RDtBQUM3RCxlQUFLUixRQUFMLENBQWNRLE1BQWQ7QUFDQTs7QUFFRCxZQUFJLEtBQUtSLFFBQUwsQ0FBY08sS0FBZCxJQUF3QixLQUFLUCxRQUFMLENBQWNPLEtBQWQsR0FBc0IsQ0FBdEIsS0FBNEIsQ0FBeEQsRUFBNEQ7QUFDM0QsZUFBS1AsUUFBTCxDQUFjTyxLQUFkO0FBQ0E7QUFDRDtBQUNEO0FBcEZGO0FBQUE7QUFBQSx3QkFzRk15QixLQXRGTixFQXNGYTtBQUNYLFVBQU1tRCxLQUFLLEdBQUcsSUFBSUQsaURBQUosQ0FBVWxELEtBQUssQ0FBQzRCLE9BQWhCLEVBQXlCNUIsS0FBSyxDQUFDNkIsT0FBL0IsQ0FBZDtBQUNBLFVBQU1NLElBQUksR0FBRyxLQUFLbVYsWUFBTCxDQUFrQnZULFdBQWxCLENBQThCWixLQUE5QixDQUFiO0FBQ0EsVUFBTWQsT0FBTyxHQUFHLEtBQUtpVixZQUFMLENBQWtCOVQsUUFBbEIsQ0FBMkJyQixJQUEzQixDQUFoQjtBQUVBLFdBQUsrVSxVQUFMLEdBQWtCaEQsSUFBSSxDQUFDQyxHQUFMLEVBQWxCO0FBRUEsV0FBS25XLFFBQUwsQ0FBYzhVLEdBQWQsQ0FBa0I7QUFDakI5UyxhQUFLLEVBQUxBLEtBRGlCO0FBRWpCcUMsZUFBTyxFQUFQQSxPQUZpQjtBQUdqQmMsYUFBSyxFQUFMQSxLQUhpQjtBQUlqQmhCLFlBQUksRUFBSkE7QUFKaUIsT0FBbEI7QUFNQTtBQW5HRjtBQUFBO0FBQUEsOEJBcUdZbkMsS0FyR1osRUFxR21CO0FBQ2pCaVAsYUFBTyxDQUFDRixHQUFSLENBQVksV0FBWixFQUF5Qi9PLEtBQXpCO0FBQ0EsVUFBTW1ELEtBQUssR0FBRyxJQUFJRCxpREFBSixDQUFVbEQsS0FBSyxDQUFDNEIsT0FBaEIsRUFBeUI1QixLQUFLLENBQUM2QixPQUEvQixDQUFkO0FBQ0EsVUFBTU0sSUFBSSxHQUFHLEtBQUttVixZQUFMLENBQWtCdlQsV0FBbEIsQ0FBOEJaLEtBQTlCLENBQWI7QUFDQSxVQUFNZCxPQUFPLEdBQUcsS0FBS2lWLFlBQUwsQ0FBa0I5VCxRQUFsQixDQUEyQnJCLElBQTNCLENBQWhCO0FBRUEsV0FBSytVLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxXQUFLQSxVQUFMLEdBQWtCaEQsSUFBSSxDQUFDQyxHQUFMLEVBQWxCO0FBRUEsVUFBSXJCLEdBQUcsR0FBRztBQUNUOVMsYUFBSyxFQUFMQSxLQURTO0FBRVQvQixXQUFHLEVBQUhBLEdBRlM7QUFHVG9FLGVBQU8sRUFBUEEsT0FIUztBQUlUYyxhQUFLLEVBQUxBLEtBSlM7QUFLVGhCLFlBQUksRUFBSkE7QUFMUyxPQUFWO0FBUUE4TSxhQUFPLENBQUNGLEdBQVIsQ0FBWStELEdBQVo7QUFDQTtBQXZIRjtBQUFBO0FBQUEsK0JBeUhhOVMsS0F6SGIsRUF5SG9CO0FBQ2xCLFVBQU1tRCxLQUFLLEdBQUcsSUFBSUQsaURBQUosQ0FBVWxELEtBQUssQ0FBQzRCLE9BQWhCLEVBQXlCNUIsS0FBSyxDQUFDNkIsT0FBL0IsQ0FBZDtBQUNBLFVBQU1NLElBQUksR0FBRyxLQUFLbVYsWUFBTCxDQUFrQnZULFdBQWxCLENBQThCWixLQUE5QixDQUFiO0FBQ0EsVUFBTWQsT0FBTyxHQUFHLEtBQUtpVixZQUFMLENBQWtCOVQsUUFBbEIsQ0FBMkJyQixJQUEzQixDQUFoQjtBQUVBLFdBQUsrVSxVQUFMLEdBQWtCLElBQWxCO0FBQ0EsV0FBS0EsVUFBTCxHQUFrQmhELElBQUksQ0FBQ0MsR0FBTCxFQUFsQjtBQUVBLFdBQUtuVyxRQUFMLENBQWNtVixVQUFkLENBQXlCO0FBQ3hCblQsYUFBSyxFQUFMQSxLQUR3QjtBQUV4QnFDLGVBQU8sRUFBUEEsT0FGd0I7QUFHeEJjLGFBQUssRUFBTEEsS0FId0I7QUFJeEJoQixZQUFJLEVBQUpBO0FBSndCLE9BQXpCO0FBTUE7QUF2SUY7QUFBQTtBQUFBLDBCQXlJUW5DLEtBeklSLEVBeUllO0FBQ2IsVUFBTW1ELEtBQUssR0FBRyxJQUFJRCxpREFBSixDQUFVbEQsS0FBSyxDQUFDNEIsT0FBaEIsRUFBeUI1QixLQUFLLENBQUM2QixPQUEvQixDQUFkO0FBQ0EsVUFBTU0sSUFBSSxHQUFHLEtBQUttVixZQUFMLENBQWtCdlQsV0FBbEIsQ0FBOEJaLEtBQTlCLENBQWI7QUFDQSxVQUFNZCxPQUFPLEdBQUcsS0FBS2lWLFlBQUwsQ0FBa0I5VCxRQUFsQixDQUEyQnJCLElBQTNCLENBQWhCO0FBRUEsV0FBSytVLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxXQUFLQSxVQUFMLEdBQWtCaEQsSUFBSSxDQUFDQyxHQUFMLEVBQWxCO0FBRUEsV0FBS25XLFFBQUwsQ0FBY2tWLEtBQWQsQ0FBb0I7QUFDbkJsVCxhQUFLLEVBQUxBLEtBRG1CO0FBRW5CcUMsZUFBTyxFQUFQQSxPQUZtQjtBQUduQmMsYUFBSyxFQUFMQSxLQUhtQjtBQUluQmhCLFlBQUksRUFBSkE7QUFKbUIsT0FBcEI7QUFNQTtBQXZKRjtBQUFBO0FBQUEseUJBeUpPbkMsS0F6SlAsRUF5SmM7QUFDWixXQUFLa1gsVUFBTCxHQUFrQmhELElBQUksQ0FBQ0MsR0FBTCxFQUFsQjtBQUNBLGFBQU8sS0FBS21ELFlBQUwsQ0FBa0IzVixJQUFsQixDQUF1QjNCLEtBQXZCLENBQVA7QUFDQTtBQTVKRjtBQUFBO0FBQUEseUJBOEpPQSxLQTlKUCxFQThKYztBQUNaLFdBQUtrWCxVQUFMLEdBQWtCaEQsSUFBSSxDQUFDQyxHQUFMLEVBQWxCO0FBQ0EsV0FBS21ELFlBQUwsQ0FBa0JsRSxJQUFsQixDQUF1QnBULEtBQXZCO0FBQ0E7QUFqS0Y7QUFBQTtBQUFBLGdDQW1LYzhDLENBbktkLEVBbUtpQkUsQ0FuS2pCLEVBbUtvQjtBQUNsQixhQUFPLEtBQUtzVSxZQUFMLENBQWtCdlQsV0FBbEIsQ0FBOEJqQixDQUE5QixFQUFpQ0UsQ0FBakMsQ0FBUDtBQUNBO0FBcktGO0FBQUE7QUFBQSxnQ0F1S2NoQixTQXZLZCxFQXVLeUI7QUFDdkIsYUFBTyxLQUFLc1YsWUFBTCxDQUFrQi9TLFdBQWxCLENBQThCdkMsU0FBOUIsQ0FBUDtBQUNBO0FBektGO0FBQUE7QUFBQSxnQ0EyS2MwVixPQTNLZCxFQTJLdUI7QUFBQTs7QUFDckIsV0FBS0MsWUFBTCxHQUFvQixLQUFLQSxZQUFMLElBQXFCLEVBQXpDO0FBRUEsVUFBTUMsZUFBZSxHQUFHYiw2Q0FBQSxDQUFhO0FBQ3BDblosYUFBSyxFQUFFLEtBQUswWixZQUFMLENBQWtCTyxRQUFsQixFQUQ2QjtBQUVwQzVZLGVBQU8sRUFBRSxLQUFLcVksWUFBTCxDQUFrQlEsVUFBbEIsRUFGMkI7QUFHcEM1WSxlQUFPLEVBQUUsS0FBS29ZLFlBQUwsQ0FBa0JTLFVBQWxCO0FBSDJCLE9BQWIsRUFJckJMLE9BSnFCLENBQXhCO0FBTUEsVUFBTU0sT0FBTyxHQUFHeFQsNkNBQUEsQ0FBYW9ULGVBQWIsRUFBOEIsVUFBQ0ssSUFBRCxFQUFPNUksR0FBUCxFQUFZRixHQUFaO0FBQUEsZUFBb0I4SSxJQUFJLElBQUksTUFBSSxDQUFDTixZQUFMLENBQWtCeEksR0FBbEIsTUFBMkJFLEdBQXZEO0FBQUEsT0FBOUIsRUFBMEYsS0FBMUYsQ0FBaEI7QUFFQSxXQUFLc0ksWUFBTCxHQUFvQkMsZUFBcEI7QUFFQSxhQUFPSSxPQUFQO0FBQ0E7QUF6TEY7QUFBQTtBQUFBLG9DQTJMa0JOLE9BM0xsQixFQTJMMkI7QUFBQSxVQUNsQlEsVUFEa0IsR0FDa0NSLE9BRGxDLENBQ2xCUSxVQURrQjtBQUFBLFVBQ05DLFVBRE0sR0FDa0NULE9BRGxDLENBQ05TLFVBRE07QUFBQSxVQUNNQyxXQUROLEdBQ2tDVixPQURsQyxDQUNNVSxXQUROO0FBQUEsVUFDbUJDLFdBRG5CLEdBQ2tDWCxPQURsQyxDQUNtQlcsV0FEbkI7QUFHekIsVUFBTUMsU0FBUyxHQUFJLElBQUlwVixpREFBSixDQUFVZ1YsVUFBVixFQUFzQkMsVUFBdEIsQ0FBbkI7QUFDQSxVQUFNSSxVQUFVLEdBQUcsSUFBSXJWLGlEQUFKLENBQVVrVixXQUFWLEVBQXVCLENBQXZCLENBQW5CO0FBQ0EsVUFBTUksU0FBUyxHQUFJLElBQUl0VixpREFBSixDQUFVLENBQVYsRUFBYW1WLFdBQWIsQ0FBbkI7QUFDQSxVQUFNSSxVQUFVLEdBQUcsSUFBSXZWLGlEQUFKLENBQVVrVixXQUFWLEVBQXVCQyxXQUF2QixDQUFuQjtBQUVBLGFBQU8sS0FBS2YsWUFBTCxDQUFrQm9CLFdBQWxCLENBQThCSixTQUE5QixFQUF5Q0MsVUFBekMsRUFBcURDLFNBQXJELEVBQWdFQyxVQUFoRSxDQUFQO0FBQ0E7QUFwTUY7QUFBQTtBQUFBLHlCQXNNT3ZQLE9BdE1QLEVBc01nQjtBQUNkLFVBQU0rTSxNQUFNLEdBQUcvTSxPQUFPLENBQUMrTSxNQUF2QjtBQUNBLFVBQU16WCxNQUFNLEdBQUd5WCxNQUFNLENBQUN6WCxNQUF0QjtBQUNBLFVBQU1ELEtBQUssR0FBRzBYLE1BQU0sQ0FBQzFYLEtBQXJCO0FBRUEsVUFBTW1aLE9BQU8sR0FBRztBQUNmUSxrQkFBVSxFQUFFLENBREc7QUFFZkMsa0JBQVUsRUFBRSxDQUZHO0FBR2ZDLG1CQUFXLEVBQUU3WixLQUhFO0FBSWY4WixtQkFBVyxFQUFFN1o7QUFKRSxPQUFoQjtBQU9BLFVBQU1tYSxLQUFLLEdBQUcsS0FBS0MsV0FBTCxDQUFpQmxCLE9BQWpCLENBQWQ7QUFDQSxXQUFLbUIsWUFBTCxHQUFvQkYsS0FBSyxHQUFHLEtBQUtHLGVBQUwsQ0FBcUJwQixPQUFyQixDQUFILEdBQW1DLEtBQUttQixZQUFqRTtBQUVBLGFBQU8sS0FBSzdhLFFBQUwsQ0FBYzRYLElBQWQsQ0FBbUI7QUFDekIxTSxlQUFPLEVBQVBBLE9BRHlCO0FBR3pCMUssY0FBTSxFQUFOQSxNQUh5QjtBQUdqQkQsYUFBSyxFQUFMQSxLQUhpQjtBQUl6QlgsYUFBSyxFQUFFLEtBQUswWixZQUFMLENBQWtCTyxRQUFsQixFQUprQjtBQU16QmxDLGVBQU8sRUFBRXpNLE9BQU8sQ0FBQ3VOLE9BTlE7QUFPekJ0QyxXQUFHLEVBQUVqTCxPQUFPLENBQUN3TixHQVBZO0FBU3pCaUMsYUFBSyxFQUFMQSxLQVR5QjtBQVV6QnpCLGtCQUFVLEVBQUUsS0FBS0EsVUFWUTtBQVd6QjJCLG9CQUFZLEVBQUUsS0FBS0E7QUFYTSxPQUFuQixDQUFQO0FBYUE7QUFsT0Y7QUFBQTtBQUFBLDJCQW9PUzdZLEtBcE9ULEVBb09nQjtBQUNkLFVBQU1mLE9BQU8sR0FBRyxLQUFLcVksWUFBTCxDQUFrQlEsVUFBbEIsRUFBaEI7QUFDQSxVQUFNNVksT0FBTyxHQUFHLEtBQUtvWSxZQUFMLENBQWtCUyxVQUFsQixFQUFoQjtBQUNBLFVBQU14VyxTQUFTLEdBQUcsS0FBSytWLFlBQUwsQ0FBa0JPLFFBQWxCLEVBQWxCO0FBRUEsVUFBTWtCLGFBQWEsR0FBRzNhLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IyQixLQUFsQixFQUF5QjtBQUM5Q00sY0FBTSxFQUFFTixLQUFLLENBQUNNLE1BQU4sR0FBZSxDQUR1QjtBQUU5Q0UsY0FBTSxFQUFFUixLQUFLLENBQUNRLE1BQU4sR0FBZTtBQUZ1QixPQUF6QixDQUF0QjtBQUtBLFdBQUttQixJQUFMLENBQVVvWCxhQUFWO0FBRUEsV0FBS3pCLFlBQUwsQ0FBa0I1WSxVQUFsQixDQUE2QnNCLEtBQUssQ0FBQ3hCLE1BQW5DLEVBQTJDd0IsS0FBSyxDQUFDekIsS0FBakQ7QUFFQSxVQUFNTyxPQUFPLEdBQUdrQixLQUFLLENBQUN6QixLQUFOLEdBQWMsQ0FBOUI7QUFDQSxVQUFNUyxPQUFPLEdBQUdnQixLQUFLLENBQUN4QixNQUFOLEdBQWUsQ0FBL0I7QUFDQSxVQUFNd2EsUUFBUSxHQUFHLEtBQUsxQixZQUFMLENBQWtCTyxRQUFsQixFQUFqQjtBQUVBLFVBQU1vQixZQUFZLEdBQUc7QUFDcEIzWSxjQUFNLEVBQUksQ0FBQ3hCLE9BQU8sR0FBR0csT0FBWCxJQUFzQnNDLFNBQXZCLElBQXFDQSxTQUFTLEdBQUd5WCxRQUFqRCxDQURXO0FBRXBCeFksY0FBTSxFQUFJLENBQUN4QixPQUFPLEdBQUdFLE9BQVgsSUFBc0JxQyxTQUF2QixJQUFxQ0EsU0FBUyxHQUFHeVgsUUFBakQsQ0FGVztBQUdwQnhhLGNBQU0sRUFBRXdCLEtBQUssQ0FBQ3hCLE1BSE07QUFJcEJELGFBQUssRUFBRXlCLEtBQUssQ0FBQ3pCO0FBSk8sT0FBckI7QUFPQSxXQUFLb0QsSUFBTCxDQUFVc1gsWUFBVjtBQUNBO0FBOVBGO0FBQUE7QUFBQSxnQ0FnUXlCO0FBQUEsVUFBaEJ6YSxNQUFnQixRQUFoQkEsTUFBZ0I7QUFBQSxVQUFSRCxLQUFRLFFBQVJBLEtBQVE7QUFDdkIsV0FBSytZLFlBQUwsQ0FBa0I0QixLQUFsQixDQUF3QjlhLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ3JDRyxjQUFNLEVBQU5BLE1BRHFDO0FBRXJDRCxhQUFLLEVBQUxBO0FBRnFDLE9BQWQsRUFHckIsS0FBSzZZLE1BQUwsQ0FBWUcsT0FBWixFQUhxQixDQUF4QjtBQUlBO0FBclFGOztBQUFBO0FBQUEsSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRUE7QUFFTyxTQUFTeEUsSUFBVCxHQUFnQixDQUFFO0FBQUEsQyxDQUV6Qjs7QUFDTyxJQUFNak0sS0FBSyxHQUFHdkgsSUFBSSxDQUFDNFosSUFBTCxDQUFVLENBQVYsQ0FBZCxDLENBRVA7QUFDQTs7QUFDTyxJQUFNaFUsS0FBSyxHQUFHNUYsSUFBSSxDQUFDNFosSUFBTCxDQUFVLENBQVYsQ0FBZCxDLENBRVA7O0FBQ08sSUFBTTFXLFFBQVEsR0FBRyxJQUFJcUUsS0FBckI7QUFFQSxTQUFTc1MsS0FBVCxDQUFldkssR0FBZixFQUFvQjtBQUMxQixTQUFPd0ssSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsU0FBTCxDQUFlMUssR0FBZixDQUFYLENBQVA7QUFDQTtBQUVNLFNBQVM1TyxHQUFULENBQWE0TyxHQUFiLEVBQWtCbUIsSUFBbEIsRUFBd0I7QUFDOUIsU0FBT25CLEdBQUcsS0FBS0EsR0FBRyxDQUFDeUIsY0FBSixDQUFtQk4sSUFBbkIsS0FBNkJBLElBQUksSUFBSW5CLEdBQTFDLENBQVY7QUFDQTtBQUVNLFNBQVNvRyxVQUFULENBQW9CdUUsQ0FBcEIsRUFBdUJDLENBQXZCLEVBQTBCO0FBQ2hDLE1BQUlBLENBQUMsSUFBSSxJQUFULEVBQWVBLENBQUMsR0FBR0QsQ0FBSjtBQUVmLFNBQU9qYSxJQUFJLENBQUM0WixJQUFMLENBQVVLLENBQUMsR0FBQ0EsQ0FBRixHQUFNQyxDQUFDLEdBQUNBLENBQWxCLENBQVA7QUFDQTtBQUVNLFNBQVNwSixRQUFULENBQW1CeEIsR0FBbkIsRUFBd0I7QUFDOUIsU0FBT0EsR0FBRyxJQUFLLFFBQU9BLEdBQVAsTUFBZSxRQUF2QixJQUFvQyxDQUFDVSxLQUFLLENBQUNDLE9BQU4sQ0FBY1gsR0FBZCxDQUFyQyxHQUEwRCxJQUExRCxHQUFpRSxLQUF4RTtBQUNBO0FBRU0sU0FBUzZLLE1BQVQsQ0FBZ0JoWSxHQUFoQixFQUFxQmxDLEdBQXJCLEVBQTBCO0FBQ2hDLE1BQUkrUCxLQUFLLENBQUNDLE9BQU4sQ0FBYzlOLEdBQWQsQ0FBSixFQUF3QjtBQUN2QixXQUFPQSxHQUFHLENBQUNnWSxNQUFNLENBQUNoWSxHQUFHLENBQUMwRixNQUFKLEdBQWEsQ0FBZCxDQUFQLENBQVY7QUFDQTs7QUFFRCxNQUFJLFFBQU8xRixHQUFQLE1BQWUsUUFBbkIsRUFBNkI7QUFDNUIsV0FBT0EsR0FBRyxDQUFDZ1ksTUFBTSxDQUFDdGIsTUFBTSxDQUFDMFMsSUFBUCxDQUFZcFAsR0FBWixDQUFELENBQVAsQ0FBVjtBQUNBOztBQUVELE1BQUlsQyxHQUFHLElBQUksSUFBWCxFQUFpQjtBQUNoQkEsT0FBRyxHQUFHa0MsR0FBTjtBQUNBQSxPQUFHLEdBQUcsQ0FBTjtBQUNBOztBQUVELFNBQU9BLEdBQUcsR0FBR25DLElBQUksQ0FBQ2dFLEtBQUwsQ0FBV2hFLElBQUksQ0FBQ21hLE1BQUwsTUFBaUJsYSxHQUFHLEdBQUdrQyxHQUFOLEdBQVksQ0FBN0IsQ0FBWCxDQUFiO0FBQ0E7QUFFTSxTQUFTMEksS0FBVCxDQUFnQnVQLEtBQWhCLEVBQXVCQyxHQUF2QixFQUE0QjtBQUNsQyxNQUFJQSxHQUFHLElBQUksSUFBWCxFQUFpQjtBQUNoQkEsT0FBRyxHQUFHRCxLQUFOO0FBQ0FBLFNBQUssR0FBRyxDQUFSO0FBQ0E7O0FBRUQsTUFBSUEsS0FBSyxHQUFHQyxHQUFaLEVBQWlCO0FBQ2hCLFFBQU1DLElBQUksR0FBR0YsS0FBYjtBQUVBQSxTQUFLLEdBQUdDLEdBQVI7QUFDQUEsT0FBRyxHQUFHQyxJQUFOO0FBQ0E7O0FBRUQsU0FBT3RLLEtBQUssQ0FBQ3lCLElBQU4sQ0FBV3pCLEtBQUssQ0FBQ2hRLElBQUksQ0FBQytELEdBQUwsQ0FBU3NXLEdBQUcsR0FBR0QsS0FBZixDQUFELENBQWhCLEVBQXlDLFVBQUNHLE1BQUQsRUFBU3JULEtBQVQ7QUFBQSxXQUFtQkEsS0FBSyxHQUFHa1QsS0FBM0I7QUFBQSxHQUF6QyxDQUFQO0FBQ0E7QUFFTSxTQUFTeFYsY0FBVCxDQUF3QndWLEtBQXhCLEVBQStCQyxHQUEvQixFQUFvQztBQUMxQyxNQUFJQSxHQUFHLElBQUksSUFBWCxFQUFpQjtBQUNoQkEsT0FBRyxHQUFHRCxLQUFOO0FBQ0FBLFNBQUssR0FBRyxDQUFSO0FBQ0E7O0FBRUQsU0FBT3ZQLEtBQUssQ0FBQzdLLElBQUksQ0FBQ21DLEdBQUwsQ0FBU2lZLEtBQVQsRUFBZ0JDLEdBQWhCLENBQUQsRUFBdUJyYSxJQUFJLENBQUNDLEdBQUwsQ0FBU21hLEtBQVQsRUFBZ0JDLEdBQWhCLElBQXFCLENBQTVDLENBQVo7QUFDQTtBQUVNLFNBQVNHLHdCQUFULEdBQThHO0FBQUEsTUFBM0VDLFdBQTJFLHVFQUE3RHBILFFBQVEsQ0FBQ3FILFFBQVQsQ0FBa0JDLE1BQTJDO0FBQUEsTUFBbkNDLFNBQW1DLHVFQUF2QixHQUF1QjtBQUFBLE1BQWxCQyxVQUFrQix1RUFBTCxHQUFLO0FBQ3BILE1BQUlDLFVBQVUsR0FBRyxFQUFqQjtBQUVBTCxhQUFXLENBQ1ZNLE9BREQsQ0FDUyxPQURULEVBQ2lCLEVBRGpCLEVBRUNDLEtBRkQsQ0FFT0osU0FGUCxFQUdDOVAsT0FIRCxDQUdTLFVBQUFtUSxJQUFJLEVBQUk7QUFDaEJBLFFBQUksR0FBR0EsSUFBSSxDQUFDRCxLQUFMLENBQVdILFVBQVgsQ0FBUDtBQUNBQyxjQUFVLENBQUNHLElBQUksQ0FBQyxDQUFELENBQUwsQ0FBVixHQUFzQkEsSUFBSSxDQUFDLENBQUQsQ0FBMUI7QUFDQSxHQU5EO0FBUUEsU0FBT0gsVUFBUDtBQUNBO0FBRU0sU0FBU0ksaUJBQVQsR0FBdUc7QUFBQSxNQUEzRVQsV0FBMkUsdUVBQTdEcEgsUUFBUSxDQUFDcUgsUUFBVCxDQUFrQkMsTUFBMkM7QUFBQSxNQUFuQ0MsU0FBbUMsdUVBQXZCLEdBQXVCO0FBQUEsTUFBbEJDLFVBQWtCLHVFQUFMLEdBQUs7QUFDN0csU0FBTzdKLHdEQUFNLENBQUN3Six3QkFBd0IsQ0FBQ0MsV0FBRCxFQUFjRyxTQUFkLEVBQXlCQyxVQUF6QixDQUF6QixFQUErRE0sV0FBL0QsQ0FBYjtBQUNBO0FBRUQsSUFBTUMsTUFBTSxHQUFHLFFBQWY7QUFDQSxJQUFNQyxTQUFTLEdBQUcsVUFBbEI7QUFFTyxTQUFTRixXQUFULENBQXNCRyxHQUF0QixFQUEyQjtBQUNqQyxTQUFPLE9BQU9BLEdBQVAsS0FBZSxRQUFmLEdBQTBCQSxHQUExQixHQUNOQSxHQUFHLENBQUNDLFdBQUosT0FBc0IsTUFBdEIsR0FBK0IsSUFBL0IsR0FDQUQsR0FBRyxDQUFDQyxXQUFKLE9BQXNCLE9BQXRCLEdBQWdDLEtBQWhDLEdBQ0FELEdBQUcsQ0FBQ0MsV0FBSixPQUFzQixNQUF0QixHQUErQixJQUEvQixHQUNBRCxHQUFHLENBQUNDLFdBQUosT0FBc0IsV0FBdEIsR0FBb0NDLFNBQXBDLEdBQ0EsQ0FBQ2xKLEtBQUssQ0FBQ21KLE1BQU0sQ0FBQ0gsR0FBRCxDQUFQLENBQU4sR0FBc0JHLE1BQU0sQ0FBQ0gsR0FBRCxDQUE1QixHQUNBRixNQUFNLENBQUNNLElBQVAsQ0FBWUosR0FBWixLQUFvQkQsU0FBUyxDQUFDSyxJQUFWLENBQWVKLEdBQWYsQ0FBcEIsR0FBMEN4QixJQUFJLENBQUNDLEtBQUwsQ0FBVzRCLGtCQUFrQixDQUFDTCxHQUFELENBQTdCLENBQTFDLEdBQ0FBLEdBUEQ7QUFRQTtBQUVNLFNBQVN0USxPQUFULENBQWlCNFEsTUFBakIsRUFBd0Q7QUFBQSxNQUEvQkMsU0FBK0IsdUVBQW5CLENBQW1CO0FBQUEsTUFBaEJDLFFBQWdCLHVFQUFMQyxHQUFLO0FBQzlELFNBQU8sT0FBT0gsTUFBUCxLQUFrQixRQUFsQixJQUE4QixDQUFDdEosS0FBSyxDQUFDc0osTUFBRCxDQUFwQyxHQUErQ0gsTUFBTSxDQUFDRyxNQUFNLENBQUM1USxPQUFQLENBQWU2USxTQUFmLENBQUQsQ0FBckQsR0FBbUZDLFFBQTFGO0FBQ0E7QUFFTSxTQUFTN1IsUUFBVCxPQUE4QztBQUFBLE1BQTFCcEIsR0FBMEIsUUFBMUJBLEdBQTBCO0FBQUEsTUFBckJDLEtBQXFCLFFBQXJCQSxLQUFxQjtBQUFBLE1BQWRDLElBQWMsUUFBZEEsSUFBYztBQUFBLE1BQVJDLEtBQVEsUUFBUkEsS0FBUTtBQUNwRCxTQUFPQSxLQUFLLElBQUksSUFBVCxrQkFBeUJILEdBQXpCLGVBQW1DQyxLQUFuQyxlQUErQ0MsSUFBL0MsZUFBMERDLEtBQTFELHVCQUNFSCxHQURGLGVBQ1lDLEtBRFosZUFDd0JDLElBRHhCLE1BQVA7QUFFQTtBQUVELElBQU1pVCxXQUFXLEdBQUc7QUFDbkJuVCxLQUFHLEVBQUUsS0FEYztBQUVuQkMsT0FBSyxFQUFFLEtBRlk7QUFHbkJDLE1BQUksRUFBRTtBQUhhLENBQXBCLEMsQ0FNQTs7QUFDTyxTQUFTa1QsU0FBVCxRQUF3QztBQUFBLE1BQW5CcFQsR0FBbUIsU0FBbkJBLEdBQW1CO0FBQUEsTUFBZEMsS0FBYyxTQUFkQSxLQUFjO0FBQUEsTUFBUEMsSUFBTyxTQUFQQSxJQUFPO0FBQzlDLFNBQU9pVCxXQUFXLENBQUNuVCxHQUFaLEdBQWtCQSxHQUFsQixHQUNKbVQsV0FBVyxDQUFDbFQsS0FBWixHQUFvQkEsS0FEaEIsR0FFSmtULFdBQVcsQ0FBQ2pULElBQVosR0FBbUJBLElBRnRCO0FBR0E7QUFFTSxTQUFTbVQsTUFBVCxDQUFpQjVNLEdBQWpCLEVBQWtDO0FBQ3hDLE1BQU02TSxRQUFRLEdBQUd0ZCxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCd1EsR0FBbEIsQ0FBakI7O0FBRHdDLG9DQUFUOE0sT0FBUztBQUFUQSxXQUFTO0FBQUE7O0FBR3hDQSxTQUFPLENBQUN0UixPQUFSLENBQWdCLFVBQUF1UixHQUFHLEVBQUk7QUFDdEJ2Uiw2REFBTyxDQUFDdVIsR0FBRCxFQUFNLFVBQUNqWCxLQUFELEVBQVF3SyxHQUFSLEVBQWdCO0FBQzVCLFVBQUlsUCxHQUFHLENBQUMyYixHQUFELEVBQU16TSxHQUFOLENBQVAsRUFBbUI7QUFDbEIsWUFBSWtCLFFBQVEsQ0FBQzFMLEtBQUQsQ0FBUixJQUFtQjBMLFFBQVEsQ0FBQ3FMLFFBQVEsQ0FBQ3ZNLEdBQUQsQ0FBVCxDQUEvQixFQUFnRDtBQUMvQ3VNLGtCQUFRLENBQUN2TSxHQUFELENBQVIsR0FBZ0JzTSxNQUFNLENBQUNDLFFBQVEsQ0FBQ3ZNLEdBQUQsQ0FBVCxFQUFnQnhLLEtBQWhCLENBQXRCO0FBQ0EsU0FGRCxNQUdLO0FBQ0orVyxrQkFBUSxDQUFDdk0sR0FBRCxDQUFSLEdBQWdCeEssS0FBaEI7QUFDQTtBQUNEO0FBQ0QsS0FUTSxDQUFQO0FBVUEsR0FYRDtBQWFBLFNBQU8rVyxRQUFQO0FBQ0E7QUFFTSxTQUFTeE8sV0FBVCxDQUFzQjBJLElBQXRCLEVBQTRCcFgsTUFBNUIsRUFBb0Q7QUFBQSxNQUFoQkQsS0FBZ0IsdUVBQVJDLE1BQVE7QUFDMUQsTUFBTXlYLE1BQU0sR0FBR3JELFFBQVEsQ0FBQ3NELGFBQVQsQ0FBdUIsUUFBdkIsQ0FBZjtBQUNBRCxRQUFNLENBQUN6WCxNQUFQLEdBQWdCQSxNQUFoQjtBQUNBeVgsUUFBTSxDQUFDMVgsS0FBUCxHQUFlQSxLQUFmO0FBRUFxWCxNQUFJLENBQUNLLE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQixJQUFsQixDQUFELEVBQTBCRixNQUFNLENBQUN6WCxNQUFqQyxFQUF5Q3lYLE1BQU0sQ0FBQzFYLEtBQWhELENBQUo7QUFFQSxTQUFPMFgsTUFBUDtBQUNBLEMiLCJmaWxlIjoidGVzc2VsbGF0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcbiIsImltcG9ydCB7aGFzfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7cGlja30gZnJvbSAnLi9mdW5reSc7XG5cbmNvbnN0IERFRkFVTFRTID0ge1xuXHRhZGp1c3RTY2FsZU1pbjogdHJ1ZSxcblxuXHQvLyBpbiBwaXhlbHNcblx0c2NhbGU6IDUwLFxuXHRzY2FsZU1pbjogMTAsXG5cdHNjYWxlTWF4OiAyNTAsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJ0b2dyYXBoZXIge1xuXHRjb25zdHJ1Y3RvciAoc2V0dGluZ3MpIHtcblx0XHRbXG5cdFx0XHQnZ2V0T3JpZ2luWCcsXG5cdFx0XHQnZ2V0T3JpZ2luWScsXG5cblx0XHRcdCdnZXRTY2FsZScsXG5cblx0XHRcdCdtb3ZlJyxcblx0XHRcdCdfY2hlY2tNb3ZlJyxcblx0XHRcdCdzZXRPcmlnaW5YJyxcblx0XHRcdCdzZXRPcmlnaW5ZJyxcblxuXHRcdFx0J3pvb20nLFxuXG5cdFx0XHQncmVtYXAnLFxuXHRcdF0ubWFwKG1ldGhvZCA9PiB0aGlzW21ldGhvZF0gPSB0aGlzW21ldGhvZF0uYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVFMsIHNldHRpbmdzKTtcblxuXHRcdE9iamVjdC5hc3NpZ24odGhpcywgcGljayh0aGlzLnNldHRpbmdzLCBbXG5cdFx0XHQnaGVpZ2h0Jyxcblx0XHRcdCduZWdhdGl2ZVRpbGVzJyxcblx0XHRcdCdyYWRpdXMnLFxuXHRcdFx0J3dpZHRoJyxcblx0XHRcdCd3cmFwJyxcblx0XHRdKSk7XG5cblx0XHRpZiAoIXRoaXMud2lkdGggfHwgIXRoaXMuaGVpZ2h0KSBkZWxldGUgdGhpcy53cmFwO1xuXG5cdFx0dGhpcy5jaGVja1NjYWxlKHRoaXMuc2V0dGluZ3MuY2FudmFzSGVpZ2h0LCB0aGlzLnNldHRpbmdzLmNhbnZhc1dpZHRoKTtcblxuXHRcdHRoaXMuc2V0T3JpZ2luWCh0aGlzLnNldHRpbmdzLmNhbnZhc1dpZHRoLCB0aGlzLnNldHRpbmdzLmNlbnRlclgpO1xuXHRcdHRoaXMuc2V0T3JpZ2luWSh0aGlzLnNldHRpbmdzLmNhbnZhc0hlaWdodCwgdGhpcy5zZXR0aW5ncy5jZW50ZXJZKTtcblx0fVxuXG5cdGdldE9yaWdpblggKCkge3JldHVybiB0aGlzLm9yaWdpblg7fVxuXHRnZXRPcmlnaW5ZICgpIHtyZXR1cm4gdGhpcy5vcmlnaW5ZO31cblxuXHRnZXRTY2FsZSAoKSB7cmV0dXJuIHRoaXMuc2NhbGU7fVxuXG5cdGNoZWNrU2NhbGUgKGNhbnZhc0hlaWdodCwgY2FudmFzV2lkdGgpIHtcblx0XHRjb25zdCBoZWlnaHRNaW4gPSB0aGlzLmhlaWdodCA/IHRoaXMuY2FsY3VsYXRlVmVydGljYWxTY2FsZShjYW52YXNIZWlnaHQsIHRoaXMuaGVpZ2h0KSA6IDA7XG5cdFx0Y29uc3Qgd2lkdGhNaW4gPSB0aGlzLndpZHRoID8gdGhpcy5jYWxjdWxhdGVIb3Jpem9udGFsU2NhbGUoY2FudmFzV2lkdGgsIHRoaXMud2lkdGgpIDogMDtcblxuXHRcdHRoaXMuc2NhbGVNYXggPSB0aGlzLnNldHRpbmdzLnNjYWxlTWF4O1xuXHRcdHRoaXMuc2NhbGVNaW4gPSB0aGlzLnNldHRpbmdzLmFkanVzdFNjYWxlTWluID8gTWF0aC5tYXgodGhpcy5zZXR0aW5ncy5zY2FsZU1pbiwgaGVpZ2h0TWluLCB3aWR0aE1pbikgOiB0aGlzLnNldHRpbmdzLnNjYWxlTWluO1xuXG5cdFx0dGhpcy5zY2FsZSA9IHRoaXMuc2NhbGVNaW4gPiB0aGlzLnNldHRpbmdzLnNjYWxlID8gdGhpcy5zY2FsZU1pbiA6IHRoaXMuc2V0dGluZ3Muc2NhbGU7XG5cdH1cblxuXHRzZXRPcmlnaW5YIChjYW52YXNXaWR0aCwgY2VudGVyWCkge1xuXHRcdHRoaXMub3JpZ2luWCA9IGNlbnRlclggPyBjZW50ZXJYIC0gY2FudmFzV2lkdGggLyAyIDpcblx0XHRcdHRoaXMubmVnYXRpdmVUaWxlcyA/IHBhcnNlSW50KGNhbnZhc1dpZHRoIC8gMikgOlxuXHRcdFx0dGhpcy53aWR0aCA/ICgodGhpcy53aWR0aCAqIHRoaXMuaG9yaXpvbnRhbERpc3RhbmNlKCkpIC8gLTIpICsgKGNhbnZhc1dpZHRoIC8gMikgKyAodGhpcy5ob3Jpem9udGFsRGlzdGFuY2UoKSAvIDIpIDpcblx0XHRcdHRoaXMudGlsZVdpZHRoKCkgLyAyO1xuXHR9XG5cblx0c2V0T3JpZ2luWSAoY2FudmFzSGVpZ2h0LCBjZW50ZXJZKSB7XG5cdFx0Y29uc3QgYm9hcmRIZWlnaHQgPSB0aGlzLmhlaWdodCAqIHRoaXMudmVydGljYWxEaXN0YW5jZSgpO1xuXG5cdFx0dGhpcy5vcmlnaW5ZID0gY2VudGVyWSA/IGNlbnRlclkgKyBjYW52YXNIZWlnaHQgLyAyIDpcblx0XHRcdHRoaXMubmVnYXRpdmVUaWxlcyA/IHBhcnNlSW50KGNhbnZhc0hlaWdodCAvIDIpIDpcblx0XHRcdHRoaXMuaGVpZ2h0ID8gKGJvYXJkSGVpZ2h0KSAtICgoYm9hcmRIZWlnaHQgLSBjYW52YXNIZWlnaHQpIC8gMikgLSAodGhpcy52ZXJ0aWNhbERpc3RhbmNlKCkgLyAyKSA6XG5cdFx0XHRjYW52YXNIZWlnaHQgLSAodGhpcy50aWxlSGVpZ2h0KCkgLyAyKTtcblx0fVxuXG5cdG1vdmUgKGV2ZW50KSB7XG5cdFx0aWYgKCFoYXMoZXZlbnQsICdoZWlnaHQnKSkgZXZlbnQuaGVpZ2h0ID0gZXZlbnQudGFyZ2V0Lm9mZnNldEhlaWdodDtcblx0XHRpZiAoIWhhcyhldmVudCwgJ3dpZHRoJykpIGV2ZW50LndpZHRoID0gZXZlbnQudGFyZ2V0Lm9mZnNldFdpZHRoO1xuXG5cdFx0Y29uc3QgbmV3WCA9IHRoaXMub3JpZ2luWCArIGV2ZW50LmRlbHRhWDtcblx0XHRjb25zdCBuZXdZID0gdGhpcy5vcmlnaW5ZICsgZXZlbnQuZGVsdGFZO1xuXG5cdFx0dGhpcy5vcmlnaW5YID0gbmV3WDtcblx0XHR0aGlzLm9yaWdpblkgPSBuZXdZO1xuXG5cdFx0dGhpcy5fY2hlY2tNb3ZlKGV2ZW50KTtcblxuXHRcdC8vIHJldHVybiBpZiB0aGUgbW92ZSBzdWNjZWVkZWQgb3Igbm90XG5cdFx0cmV0dXJuIHRoaXMub3JpZ2luWCA9PT0gbmV3WCAmJiB0aGlzLm9yaWdpblkgPT09IG5ld1k7XG5cdH1cblxuXHRfY2hlY2tNb3ZlIChldmVudCkge1xuXHRcdGlmICh0aGlzLm5lZ2F0aXZlVGlsZXMpIHtcblx0XHRcdHRoaXMuX2NoZWNrTW92ZU5lZ2F0aXZlVGlsZXMoZXZlbnQpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuX2NoZWNrTW92ZVBvc2l0aXZlVGlsZXMoZXZlbnQpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja01vdmVQb3NpdGl2ZVRpbGVzIChldmVudCkge1xuXHRcdGNvbnN0IGNhbnZhc1dpZHRoID0gZXZlbnQud2lkdGg7XG5cdFx0Y29uc3QgY2FudmFzSGVpZ2h0ID0gZXZlbnQuaGVpZ2h0O1xuXG5cdFx0Y29uc3QgY29sV2lkdGggPSB0aGlzLmhvcml6b250YWxEaXN0YW5jZSgpO1xuXHRcdGNvbnN0IHJvd0hlaWdodCA9IHRoaXMudmVydGljYWxEaXN0YW5jZSgpO1xuXG5cdFx0Y29uc3QgbWF4WCA9IHRoaXMudGlsZVdpZHRoKCkgLyAyO1xuXHRcdGNvbnN0IG1pblkgPSBjYW52YXNIZWlnaHQgLSAodGhpcy50aWxlSGVpZ2h0KCkgLyAyKTtcblxuXHRcdGlmICghdGhpcy53cmFwKSB7XG5cdFx0XHR0aGlzLm9yaWdpblggPSB0aGlzLm9yaWdpblggPiBtYXhYID8gbWF4WCA6IHRoaXMub3JpZ2luWDtcblx0XHRcdHRoaXMub3JpZ2luWSA9IHRoaXMub3JpZ2luWSA8IG1pblkgPyBtaW5ZIDogdGhpcy5vcmlnaW5ZO1xuXG5cdFx0XHRpZiAodGhpcy53aWR0aCkge1xuXHRcdFx0XHRjb25zdCBib2FyZFdpZHRoID0gdGhpcy53aWR0aCAqIGNvbFdpZHRoICsgdGhpcy5ob3Jpem9udGFsT3ZlcmhhbmcoKTtcblx0XHRcdFx0Y29uc3QgbWluWCA9IG1heFggLSAoYm9hcmRXaWR0aCAtIGNhbnZhc1dpZHRoKTtcblxuXHRcdFx0XHR0aGlzLm9yaWdpblggPSB0aGlzLm9yaWdpblggPCBtaW5YID8gbWluWCA6IHRoaXMub3JpZ2luWDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaGVpZ2h0KSB7XG5cdFx0XHRcdGNvbnN0IGJvYXJkSGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiByb3dIZWlnaHQgKyB0aGlzLnZlcnRpY2FsT3ZlcmhhbmcoKTtcblx0XHRcdFx0Y29uc3QgbWF4WSA9IGJvYXJkSGVpZ2h0IC0gKHRoaXMudGlsZUhlaWdodCgpIC8gMik7XG5cblx0XHRcdFx0dGhpcy5vcmlnaW5ZID0gdGhpcy5vcmlnaW5ZID4gbWF4WSA/IG1heFkgOiB0aGlzLm9yaWdpblk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2NoZWNrTW92ZU5lZ2F0aXZlVGlsZXMgKGV2ZW50KSB7XG5cdFx0Y29uc3QgY29sV2lkdGggPSB0aGlzLmhvcml6b250YWxEaXN0YW5jZSgpO1xuXHRcdGNvbnN0IHJvd0hlaWdodCA9IHRoaXMudmVydGljYWxEaXN0YW5jZSgpO1xuXG5cdFx0aWYgKCF0aGlzLndyYXApIHtcblx0XHRcdGlmICh0aGlzLndpZHRoKSB7XG5cdFx0XHRcdGNvbnN0IGNhbnZhc1dpZHRoID0gZXZlbnQud2lkdGg7XG5cdFx0XHRcdGNvbnN0IGhhbGZCb2FyZFdpZHRoID0gKHRoaXMud2lkdGggKiBjb2xXaWR0aCArIHRoaXMuaG9yaXpvbnRhbE92ZXJoYW5nKCkpIC8gMjtcblxuXHRcdFx0XHR0aGlzLm9yaWdpblggPSB0aGlzLm9yaWdpblggPiBoYWxmQm9hcmRXaWR0aCA/IGhhbGZCb2FyZFdpZHRoIDpcblx0XHRcdFx0XHQoY2FudmFzV2lkdGggLSB0aGlzLm9yaWdpblgpID4gaGFsZkJvYXJkV2lkdGggPyBjYW52YXNXaWR0aCAtIGhhbGZCb2FyZFdpZHRoIDpcblx0XHRcdFx0XHR0aGlzLm9yaWdpblg7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhlaWdodCkge1xuXHRcdFx0XHRjb25zdCBjYW52YXNIZWlnaHQgPSBldmVudC5oZWlnaHQ7XG5cdFx0XHRcdGNvbnN0IGhhbGZCb2FyZEhlaWdodCA9ICh0aGlzLmhlaWdodCAqIHJvd0hlaWdodCArIHRoaXMudmVydGljYWxPdmVyaGFuZygpKSAvIDI7XG5cblx0XHRcdFx0dGhpcy5vcmlnaW5ZID0gdGhpcy5vcmlnaW5ZID4gaGFsZkJvYXJkSGVpZ2h0ID8gaGFsZkJvYXJkSGVpZ2h0IDpcblx0XHRcdFx0XHQoY2FudmFzSGVpZ2h0IC0gdGhpcy5vcmlnaW5ZKSA+IGhhbGZCb2FyZEhlaWdodCA/IGNhbnZhc0hlaWdodCAtIGhhbGZCb2FyZEhlaWdodCA6XG5cdFx0XHRcdFx0dGhpcy5vcmlnaW5ZO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHpvb20gKGV2ZW50KSB7XG5cdFx0Y29uc3Qgc2NhbGVPcmlnID0gdGhpcy5zY2FsZTtcblxuXHRcdGxldCBzY2FsZVRlbXAgPSBzY2FsZU9yaWcgKiBldmVudC5zY2FsZVN0ZXA7XG5cblx0XHRzY2FsZVRlbXAgPSBNYXRoLm1heChzY2FsZVRlbXAsIHRoaXMuc2NhbGVNaW4pO1xuXHRcdHNjYWxlVGVtcCA9IE1hdGgubWluKHNjYWxlVGVtcCwgdGhpcy5zY2FsZU1heCk7XG5cblx0XHRpZiAoc2NhbGVPcmlnICE9PSBzY2FsZVRlbXApIHtcblx0XHRcdHRoaXMuc2NhbGUgPSBzY2FsZVRlbXA7XG5cblx0XHRcdC8vIHpvb20gdG8gdGhlIGN1cnJlbnQgbW91c2UgbG9jYXRpb25cblx0XHRcdHRoaXMubW92ZSh7XG5cdFx0XHRcdGRlbHRhWDogKCgoZXZlbnQub2Zmc2V0WCAtIHRoaXMub3JpZ2luWCkgLyBzY2FsZU9yaWcpICogKHNjYWxlT3JpZyAtIHNjYWxlVGVtcCkpLFxuXHRcdFx0XHRkZWx0YVk6ICgoKGV2ZW50Lm9mZnNldFkgLSB0aGlzLm9yaWdpblkpIC8gc2NhbGVPcmlnKSAqIChzY2FsZU9yaWcgLSBzY2FsZVRlbXApKSxcblx0XHRcdFx0d2lkdGg6IGV2ZW50LnRhcmdldC5vZmZzZXRXaWR0aCxcblx0XHRcdFx0aGVpZ2h0OiBldmVudC50YXJnZXQub2Zmc2V0SGVpZ2h0LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cmVtYXAgKGNvbmZpZykge1xuXHRcdE9iamVjdC5hc3NpZ24odGhpcywgcGljayhjb25maWcsIFsnaGVpZ2h0JywgJ3dpZHRoJywgJ25lZ2F0aXZlVGlsZXMnXSkpO1xuXG5cdFx0dGhpcy5jaGVja1NjYWxlKGNvbmZpZy5jYW52YXNIZWlnaHQsIGNvbmZpZy5jYW52YXNXaWR0aCk7XG5cblx0XHR0aGlzLnNldE9yaWdpblgoY29uZmlnLmNhbnZhc1dpZHRoLCBjb25maWcuY2VudGVyWCk7XG5cdFx0dGhpcy5zZXRPcmlnaW5ZKGNvbmZpZy5jYW52YXNIZWlnaHQsIGNvbmZpZy5jZW50ZXJZKTtcblx0fVxufVxuIiwiaW1wb3J0IENhcnRvZ3JhcGhlciBmcm9tICcuL2NhcnRvZ3JhcGhlci5qcyc7XG5cbmltcG9ydCAqIGFzIGZ1bmt5IGZyb20gJy4vZnVua3knO1xuaW1wb3J0IHtyYW5nZUluY2x1c2l2ZSwgaW52U3FydDJ9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnLi9wb2ludC5qcyc7XG5pbXBvcnQgU3F1YXJlIGZyb20gJy4vc3F1YXJlLmpzJztcblxuY29uc3QgdGlsZVBvaW50VG9TcXVhcmUgPSAoe3RpbGVQb2ludCwgbWFwUG9pbnQsIHBpeGVsUG9pbnR9KSA9PiAoe1xuXHR0aWxlOiB0aWxlUG9pbnQgaW5zdGFuY2VvZiBTcXVhcmUgPyB0aWxlUG9pbnQgOiBuZXcgU3F1YXJlKHRpbGVQb2ludCksXG5cdG1hcFRpbGU6IG1hcFBvaW50IGluc3RhbmNlb2YgU3F1YXJlID8gbWFwUG9pbnQgOlxuXHRcdG1hcFBvaW50ID8gbmV3IFNxdWFyZShtYXBQb2ludCkgOlxuXHRcdG1hcFBvaW50LFxuXHRwaXhlbFBvaW50LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcnRvZ3JhcGhlckZsYXRYWSBleHRlbmRzIENhcnRvZ3JhcGhlciB7XG5cdGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG5cdFx0c3VwZXIoc2V0dGluZ3MpO1xuXG5cdFx0W1xuXHRcdFx0J3RpbGVIZWlnaHQnLFxuXHRcdFx0J3RpbGVXaWR0aCcsXG5cblx0XHRcdCdtYXhXaWR0aCcsXG5cdFx0XHQnbWluV2lkdGgnLFxuXG5cdFx0XHQnaG9yaXpvbnRhbE92ZXJoYW5nJyxcblx0XHRcdCd2ZXJ0aWNhbE92ZXJoYW5nJyxcblxuXHRcdFx0J2hvcml6b250YWxEaXN0YW5jZScsXG5cdFx0XHQndmVydGljYWxEaXN0YW5jZScsXG5cblx0XHRcdCdjYWxjdWxhdGVIb3Jpem9udGFsU2NhbGUnLFxuXHRcdFx0J2NhbGN1bGF0ZVZlcnRpY2FsU2NhbGUnLFxuXG5cdFx0XHQndGlsZVRvUGl4ZWwnLFxuXHRcdFx0J3BpeGVsVG9UaWxlJyxcblx0XHRcdCd0ZWxlcG9ydCcsXG5cblx0XHRcdCdpbkJvdW5kcycsXG5cdFx0XHQnZW5mb3JjZUJvdW5kcmllcycsXG5cdFx0XHQnYm91bmRpbmdCb3gnLFxuXHRcdF0ubWFwKG1ldGhvZCA9PiB0aGlzW21ldGhvZF0gPSB0aGlzW21ldGhvZF0uYmluZCh0aGlzKSk7XG5cdH1cblxuXHR0aWxlSGVpZ2h0KCkge1xuXHRcdHJldHVybiB0aGlzLm1pbldpZHRoKCk7XG5cdH1cblxuXHR0aWxlV2lkdGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWluV2lkdGgoKTtcblx0fVxuXG5cdG1heFdpZHRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNjYWxlICogMjtcblx0fVxuXG5cdG1pbldpZHRoKCkge1xuXHRcdHJldHVybiB0aGlzLm1heFdpZHRoKCkgKiBpbnZTcXJ0Mjtcblx0fVxuXG5cdGhvcml6b250YWxPdmVyaGFuZygpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHZlcnRpY2FsT3ZlcmhhbmcoKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRob3Jpem9udGFsRGlzdGFuY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWluV2lkdGgoKTtcblx0fVxuXG5cdHZlcnRpY2FsRGlzdGFuY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWluV2lkdGgoKTtcblx0fVxuXG5cdGNhbGN1bGF0ZUhvcml6b250YWxTY2FsZShwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvIHRpbGVzIC8gaW52U3FydDIgLyAyO1xuXHR9XG5cblx0Y2FsY3VsYXRlVmVydGljYWxTY2FsZShwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvIHRpbGVzIC8gaW52U3FydDIgLyAyO1xuXHR9XG5cblx0dGlsZVRvUGl4ZWwoc3F1YXJlKSB7XG5cdFx0c3F1YXJlID0gc3F1YXJlIGluc3RhbmNlb2YgU3F1YXJlID8gc3F1YXJlIDogbmV3IFNxdWFyZSguLi5hcmd1bWVudHMpO1xuXG5cdFx0Y29uc3QgeCA9IChzcXVhcmUuZ2V0WCgpICogdGhpcy5taW5XaWR0aCgpKSArIHRoaXMub3JpZ2luWDtcblx0XHRjb25zdCB5ID0gdGhpcy5vcmlnaW5ZIC0gKHNxdWFyZS5nZXRZKCkgKiB0aGlzLm1pbldpZHRoKCkpO1xuXG5cdFx0cmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcblx0fVxuXG5cdHBpeGVsVG9UaWxlIChwb2ludCkge1xuXHRcdHBvaW50ID0gcG9pbnQgaW5zdGFuY2VvZiBQb2ludCA/IHBvaW50IDogbmV3IFBvaW50KC4uLmFyZ3VtZW50cyk7XG5cblx0XHRjb25zdCBwaXhlbFggPSBwb2ludC5nZXRYKCkgLSB0aGlzLm9yaWdpblg7XG5cdFx0Y29uc3QgcGl4ZWxZID0gdGhpcy5vcmlnaW5ZIC0gcG9pbnQuZ2V0WSgpO1xuXG5cdFx0Y29uc3QgeCA9IHBpeGVsWCAvIHRoaXMubWluV2lkdGgoKTtcblx0XHRjb25zdCB5ID0gcGl4ZWxZIC8gdGhpcy5taW5XaWR0aCgpO1xuXG5cdFx0cmV0dXJuIG5ldyBTcXVhcmUoeCwgeSk7XG5cdH1cblxuXHR0ZWxlcG9ydCAoe3gsIHl9KSB7XG5cdFx0aWYgKCF0aGlzLndyYXApIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG5cblx0XHR4ID0geCAlIHRoaXMud2lkdGg7XG5cdFx0eSA9IHkgJSB0aGlzLmhlaWdodDtcblxuXHRcdHggPSB4IDwgMCA/IHRoaXMud2lkdGggKyB4IDogeDtcblx0XHR5ID0geSA8IDAgPyB0aGlzLmhlaWdodCArIHkgOiB5O1xuXG5cdFx0cmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcblx0fVxuXG5cdGluQm91bmRzICh7eCwgeX0pIHtcblx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRyZXR1cm4gKCF0aGlzLndpZHRoIHx8IE1hdGguYWJzKHgpIDw9IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDIpKVxuXHRcdFx0XHQmJiAoIXRoaXMuaGVpZ2h0IHx8IE1hdGguYWJzKHkpIDw9IE1hdGguZmxvb3IodGhpcy5oZWlnaHQgLyAyKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0cmV0dXJuICghdGhpcy53aWR0aCB8fCAoeCA+PSAwICYmIHggPCB0aGlzLndpZHRoKSlcblx0XHRcdFx0JiYgKCF0aGlzLmhlaWdodCB8fCAoeSA+PSAwICYmIHkgPCB0aGlzLmhlaWdodCkpO1xuXHRcdH1cblx0fVxuXG5cdGVuZm9yY2VCb3VuZHJpZXMgKHt0aWxlUG9pbnQsIHBpeGVsUG9pbnR9KSB7XG5cdFx0cmV0dXJuIHRoaXMud3JhcCA/IHt0aWxlUG9pbnQsIG1hcFBvaW50OiB0aGlzLnRlbGVwb3J0KHRpbGVQb2ludCksIHBpeGVsUG9pbnR9IDpcblx0XHRcdHRoaXMuaW5Cb3VuZHModGlsZVBvaW50KSA/IHt0aWxlUG9pbnQsIG1hcFBvaW50OiB0aWxlUG9pbnQsIHBpeGVsUG9pbnR9IDpcblx0XHRcdHt0aWxlUG9pbnQsIG1hcFBvaW50OiBudWxsLCBwaXhlbFBvaW50fTtcblx0fVxuXG5cdGJvdW5kaW5nQm94KHVwcGVyTGVmdFBvaW50LCB1cHBlclJpZ2h0UG9pbnQsIGxvd2VyTGVmdFBvaW50LCBsb3dlclJpZ2h0UG9pbnQpIHtcblx0XHRjb25zdCB1cHBlckxlZnRUaWxlID0gdGhpcy5waXhlbFRvVGlsZSh1cHBlckxlZnRQb2ludCk7XG5cdFx0Y29uc3QgbG93ZXJSaWdodFRpbGUgPSB0aGlzLnBpeGVsVG9UaWxlKGxvd2VyUmlnaHRQb2ludCk7XG5cdFx0Y29uc3QgdXBwZXJSaWdodFRpbGUgPSB0aGlzLnBpeGVsVG9UaWxlKHVwcGVyUmlnaHRQb2ludCk7XG5cblx0XHRjb25zdCBjb2x1bW5zID0gcmFuZ2VJbmNsdXNpdmUodXBwZXJMZWZ0VGlsZS5nZXRYKCksIHVwcGVyUmlnaHRUaWxlLmdldFgoKSk7XG5cdFx0Y29uc3Qgcm93cyA9IHJhbmdlSW5jbHVzaXZlKGxvd2VyUmlnaHRUaWxlLmdldFkoKSwgdXBwZXJMZWZ0VGlsZS5nZXRZKCkpO1xuXG5cdFx0Y29uc3QgbWFrZUFQb2ludCA9IHggPT4gcm93cy5tYXAoeSA9PiAoe3gsIHl9KSk7XG5cdFx0Y29uc3QgbWFrZUFQb2ludFBhaXIgPSB0aWxlUG9pbnQgPT4gKHt0aWxlUG9pbnQsIHBpeGVsUG9pbnQ6IHRoaXMudGlsZVRvUGl4ZWwodGlsZVBvaW50KX0pO1xuXG5cdFx0cmV0dXJuIGZ1bmt5LmNoYWluKGNvbHVtbnMpXG5cdFx0Lm1hcChtYWtlQVBvaW50KVxuXHRcdC5mbGF0dGVuKClcblx0XHQubWFwKG1ha2VBUG9pbnRQYWlyKVxuXHRcdC5tYXAodGhpcy5lbmZvcmNlQm91bmRyaWVzKVxuXHRcdC5tYXAodGlsZVBvaW50VG9TcXVhcmUpXG5cdFx0LnZhbHVlKCk7XG5cdH1cbn1cbiIsImltcG9ydCBDYXJ0b2dyYXBoZXIgZnJvbSAnLi9jYXJ0b2dyYXBoZXIuanMnO1xuXG5pbXBvcnQgKiBhcyBmdW5reSBmcm9tICcuL2Z1bmt5JztcbmltcG9ydCB7cmFuZ2VJbmNsdXNpdmUsIHNxcnQzfSBmcm9tICcuL3V0aWxzLmpzJztcblxuaW1wb3J0IEhleCBmcm9tICcuL2hleC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnLi9wb2ludC5qcyc7XG5cbmNvbnN0IHRpbGVQb2ludFRvSGV4ID0gKHt0aWxlUG9pbnQsIG1hcFBvaW50LCBwaXhlbFBvaW50fSkgPT4gKHtcblx0dGlsZTogdGlsZVBvaW50IGluc3RhbmNlb2YgSGV4ID8gdGlsZVBvaW50IDogbmV3IEhleCh0aWxlUG9pbnQpLFxuXHRtYXBUaWxlOiBtYXBQb2ludCBpbnN0YW5jZW9mIEhleCA/IG1hcFBvaW50IDpcblx0XHRtYXBQb2ludCA/IG5ldyBIZXgobWFwUG9pbnQpIDpcblx0XHRtYXBQb2ludCxcblx0cGl4ZWxQb2ludCxcbn0pO1xuXG5jb25zdCB6ZXJvWmVyb1plcm8gPSBuZXcgSGV4KHt4OiAwLCB5OiAwLCB6OiAwfSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcnRvZ3JhcGhlckZsYXRYWVogZXh0ZW5kcyBDYXJ0b2dyYXBoZXIge1xuXHRjb25zdHJ1Y3RvciAoc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cblx0XHRbXG5cdFx0XHQndGlsZUhlaWdodCcsXG5cdFx0XHQndGlsZVdpZHRoJyxcblxuXHRcdFx0J21heFdpZHRoJyxcblx0XHRcdCdtaW5XaWR0aCcsXG5cblx0XHRcdCdob3Jpem9udGFsT3ZlcmhhbmcnLFxuXHRcdFx0J3ZlcnRpY2FsT3ZlcmhhbmcnLFxuXG5cdFx0XHQnaG9yaXpvbnRhbERpc3RhbmNlJyxcblx0XHRcdCd2ZXJ0aWNhbERpc3RhbmNlJyxcblxuXHRcdFx0J2NhbGN1bGF0ZUhvcml6b250YWxTY2FsZScsXG5cdFx0XHQnY2FsY3VsYXRlVmVydGljYWxTY2FsZScsXG5cblx0XHRcdCd0aWxlVG9QaXhlbCcsXG5cdFx0XHQncGl4ZWxUb1RpbGUnLFxuXHRcdFx0J3RlbGVwb3J0JyxcblxuXHRcdFx0J2luQm91bmRzJyxcblx0XHRcdCdlbmZvcmNlQm91bmRyaWVzJyxcblx0XHRcdCdib3VuZGluZ0JveCcsXG5cdFx0XS5tYXAobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblxuXHRcdGlmICh0aGlzLnJhZGl1cykge1xuXHRcdFx0dGhpcy5taXJyb3JzID0gW1xuXHRcdFx0XHRuZXcgSGV4KHsgLy8gRWFzdFxuXHRcdFx0XHRcdHg6IDIgKiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdFx0eTogLXRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0XHR6OiAtdGhpcy5yYWRpdXMsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRuZXcgSGV4KHsgLy8gTm9ydGggRWFzdFxuXHRcdFx0XHRcdHg6IHRoaXMucmFkaXVzICsgMSxcblx0XHRcdFx0XHR5OiB0aGlzLnJhZGl1cyxcblx0XHRcdFx0XHR6OiAtMiAqIHRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5ldyBIZXgoeyAvLyBOb3J0aCBXZXN0XG5cdFx0XHRcdFx0eDogLXRoaXMucmFkaXVzLFxuXHRcdFx0XHRcdHk6IDIgKiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdFx0ejogLXRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5ldyBIZXggKHsgLy8gV2VzdFxuXHRcdFx0XHRcdHg6IC0yICogdGhpcy5yYWRpdXMgLSAxLFxuXHRcdFx0XHRcdHk6IHRoaXMucmFkaXVzICsgMSxcblx0XHRcdFx0XHR6OiB0aGlzLnJhZGl1cyxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5ldyBIZXggKHsgLy8gU291dGggV2VzdFxuXHRcdFx0XHRcdHg6IC10aGlzLnJhZGl1cyAtIDEsXG5cdFx0XHRcdFx0eTogLXRoaXMucmFkaXVzLFxuXHRcdFx0XHRcdHo6IDIgKiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRuZXcgSGV4ICh7IC8vIFNvdXRoIEVhc3Rcblx0XHRcdFx0XHR4OiB0aGlzLnJhZGl1cyxcblx0XHRcdFx0XHR5OiAtMiAqIHRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0XHR6OiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XTtcblx0XHR9XG5cdH1cblxuXHR0aWxlSGVpZ2h0ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5taW5XaWR0aCgpO1xuXHR9XG5cblx0dGlsZVdpZHRoICgpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhXaWR0aCgpO1xuXHR9XG5cblx0bWF4V2lkdGggKCkge1xuXHRcdHJldHVybiB0aGlzLnNjYWxlICogMjtcblx0fVxuXG5cdG1pbldpZHRoICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zY2FsZSAqIHNxcnQzO1xuXHR9XG5cblx0aG9yaXpvbnRhbE92ZXJoYW5nICgpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhXaWR0aCgpICogMC4yNTtcblx0fVxuXG5cdHZlcnRpY2FsT3ZlcmhhbmcgKCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aG9yaXpvbnRhbERpc3RhbmNlICgpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhXaWR0aCgpICogKDMvNCk7XG5cdH1cblxuXHR2ZXJ0aWNhbERpc3RhbmNlICgpIHtcblx0XHRyZXR1cm4gdGhpcy5taW5XaWR0aCgpO1xuXHR9XG5cblx0Y2FsY3VsYXRlSG9yaXpvbnRhbFNjYWxlIChwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvICh0aWxlcyAqIDAuNzUgKyAwLjI1KSAvIDI7XG5cdH1cblxuXHRjYWxjdWxhdGVWZXJ0aWNhbFNjYWxlIChwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvIHRpbGVzIC8gc3FydDM7XG5cdH1cblxuXHR0aWxlVG9QaXhlbCAoaGV4KSB7XG5cdFx0aGV4ID0gaGV4IGluc3RhbmNlb2YgSGV4ID8gaGV4IDogbmV3IEhleCguLi5hcmd1bWVudHMpO1xuXG5cdFx0Y29uc3QgcGl4ZWxYID0gdGhpcy5zY2FsZSAqIDMvMiAqIGhleC5nZXRRKCkgKyB0aGlzLm9yaWdpblg7XG5cdFx0Y29uc3QgcGl4ZWxZID0gdGhpcy5zY2FsZSAqIHNxcnQzICogKGhleC5nZXRSKCkgKyAoaGV4LmdldFEoKSAvIDIpKSArIHRoaXMub3JpZ2luWTtcblxuXHRcdHJldHVybiBuZXcgUG9pbnQocGl4ZWxYLCBwaXhlbFkpO1xuXHR9XG5cblx0cGl4ZWxUb1RpbGUgKHBvaW50KSB7XG5cdFx0cG9pbnQgPSBwb2ludCBpbnN0YW5jZW9mIFBvaW50ID8gcG9pbnQgOiBuZXcgUG9pbnQoLi4uYXJndW1lbnRzKTtcblxuXHRcdGNvbnN0IHBpeGVsWCA9IHBvaW50LmdldFgoKSAtIHRoaXMub3JpZ2luWDtcblx0XHRjb25zdCBwaXhlbFkgPSBwb2ludC5nZXRZKCkgLSB0aGlzLm9yaWdpblk7XG5cblx0XHRjb25zdCBxID0gKHBpeGVsWCAqICgyIC8gMykpIC8gdGhpcy5zY2FsZTtcblx0XHRjb25zdCByID0gKChwaXhlbFkgKiAoc3FydDMgLyAzKSkgLSAocGl4ZWxYIC8gMykpIC8gdGhpcy5zY2FsZTtcblxuXHRcdHJldHVybiBuZXcgSGV4KHEsIHIpO1xuXHR9XG5cblx0dGVsZXBvcnQgKGhleCkge1xuXHRcdGlmICghdGhpcy53cmFwKSByZXR1cm4gaGV4O1xuXG5cdFx0aGV4ICA9IGhleCBpbnN0YW5jZW9mIEhleCA/IGhleCA6IG5ldyBIZXgoaGV4KTtcblxuXHRcdGlmICh0aGlzLnJhZGl1cykge1xuXHRcdFx0aWYgKGhleC5kaXN0YW5jZSh6ZXJvWmVyb1plcm8pIDw9IHRoaXMucmFkaXVzKSByZXR1cm4gaGV4O1xuXG5cdFx0XHRjb25zdCBkaXN0YW5jZXMgPSB0aGlzLm1pcnJvcnMubWFwKG1pcnJvciA9PiBoZXguZGlzdGFuY2UobWlycm9yKSk7XG5cdFx0XHRjb25zdCBtaXJyb3IgPSB0aGlzLm1pcnJvcnNbZGlzdGFuY2VzLmluZGV4T2YoTWF0aC5taW4oLi4uZGlzdGFuY2VzKSldO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50ZWxlcG9ydChoZXguc3VidHJhY3RIZXgobWlycm9yKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IHtjb2wsIHJvd30gPSBIZXguY3ViZVRvRXZlblEoaGV4KTtcblxuXHRcdFx0Ly8gZW5zdXJlIG9kZC13aWR0aCBtYXBzIHdyYXAgcHJvcGVybHlcblx0XHRcdGlmICh0aGlzLndpZHRoICUgMikge1xuXHRcdFx0XHRjb25zdCBvZmZzZXQgPSBNYXRoLmZsb29yKGNvbCAvIHRoaXMud2lkdGgpO1xuXG5cdFx0XHRcdGxldCB2ZXJ0aWNhbEFkanVzdCA9IG9mZnNldCAvIDI7XG5cdFx0XHRcdHZlcnRpY2FsQWRqdXN0ID0gb2Zmc2V0ICUgMiA9PT0gMCA/IHZlcnRpY2FsQWRqdXN0IDpcblx0XHRcdFx0XHRjb2wgJSAyID8gTWF0aC5jZWlsKHZlcnRpY2FsQWRqdXN0KSA6XG5cdFx0XHRcdFx0TWF0aC5mbG9vcih2ZXJ0aWNhbEFkanVzdCk7XG5cblx0XHRcdFx0cm93IC09IHZlcnRpY2FsQWRqdXN0O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYWxmV2lkdGggPSAgTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gMik7XG5cdFx0XHRjb25zdCBoYWxmSGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLmhlaWdodCAvIDIpO1xuXG5cdFx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRcdGNvbCArPSBoYWxmV2lkdGg7XG5cdFx0XHRcdHJvdyArPSBoYWxmSGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRjb2wgPSBjb2wgJSB0aGlzLndpZHRoO1xuXHRcdFx0cm93ID0gcm93ICUgdGhpcy5oZWlnaHQ7XG5cblx0XHRcdGNvbCA9IGNvbCA8IDAgPyBjb2wgKyB0aGlzLndpZHRoIDogY29sO1xuXHRcdFx0cm93ID0gcm93IDwgMCA/IHJvdyArIHRoaXMuaGVpZ2h0IDogcm93O1xuXG5cdFx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRcdGNvbCAtPSBoYWxmV2lkdGg7XG5cdFx0XHRcdHJvdyAtPSBoYWxmSGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gSGV4LmV2ZW5RVG9DdWJlKGNvbCwgcm93KTtcblx0XHR9XG5cdH1cblxuXHRpbkJvdW5kcyAoe3gsIHosIHkgPSAteCAtIHp9KSB7XG5cdFx0aWYgKHRoaXMucmFkaXVzKSB7XG5cdFx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLm1heChNYXRoLmFicyh4KSwgTWF0aC5hYnMoeSksIE1hdGguYWJzKHopKSA8PSBNYXRoLmZsb29yKHRoaXMucmFkaXVzKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoeCAtIHRoaXMucmFkaXVzKSwgTWF0aC5hYnMoeSArIHRoaXMucmFkaXVzKSwgTWF0aC5hYnMoeikpIDw9IHRoaXMucmFkaXVzO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLndpZHRoIHx8IHRoaXMuaGVpZ2h0KSB7XG5cdFx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRcdHJldHVybiAoIXRoaXMud2lkdGggfHwgKE1hdGguYWJzKHgpIDwgdGhpcy53aWR0aCAvIDIpKVxuXHRcdFx0XHRcdCYmICghdGhpcy5oZWlnaHQgfHwgKE1hdGguYWJzKC15IC0gTWF0aC5mbG9vcih4IC8gMikpIDwgKHRoaXMuaGVpZ2h0IC8gMikpKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gKCF0aGlzLndpZHRoIHx8ICh4ID49IDAgJiYgeCA8IHRoaXMud2lkdGgpKVxuXHRcdFx0XHRcdCYmICghdGhpcy5oZWlnaHQgfHwgKHkgPD0gKE1hdGguZmxvb3IoeCAvIDIpICogLTEpICYmICgteSAtIE1hdGguZmxvb3IoeCAvIDIpKSA8IHRoaXMuaGVpZ2h0KSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0ZW5mb3JjZUJvdW5kcmllcyAoe3RpbGVQb2ludCwgcGl4ZWxQb2ludH0pIHtcblx0XHRyZXR1cm4gdGhpcy53cmFwID8ge3RpbGVQb2ludCwgbWFwUG9pbnQ6IHRoaXMudGVsZXBvcnQodGlsZVBvaW50KSwgcGl4ZWxQb2ludH0gOlxuXHRcdFx0dGhpcy5pbkJvdW5kcyh0aWxlUG9pbnQpID8ge3RpbGVQb2ludCwgbWFwUG9pbnQ6IHRpbGVQb2ludCwgcGl4ZWxQb2ludH0gOlxuXHRcdFx0e3RpbGVQb2ludCwgbWFwUG9pbnQ6IG51bGwsIHBpeGVsUG9pbnR9O1xuXHR9XG5cblx0Ym91bmRpbmdCb3ggKHVwcGVyTGVmdFBvaW50LCB1cHBlclJpZ2h0UG9pbnQsIGxvd2VyTGVmdFBvaW50LCBsb3dlclJpZ2h0UG9pbnQpIHtcblx0XHRjb25zdCB1cHBlckxlZnRUaWxlID0gdGhpcy5waXhlbFRvVGlsZSh1cHBlckxlZnRQb2ludCk7XG5cdFx0Y29uc3QgbG93ZXJMZWZ0VGlsZSA9IHRoaXMucGl4ZWxUb1RpbGUobG93ZXJMZWZ0UG9pbnQpO1xuXHRcdGNvbnN0IGxvd2VyUmlnaHRUaWxlID0gdGhpcy5waXhlbFRvVGlsZShsb3dlclJpZ2h0UG9pbnQpO1xuXHRcdGNvbnN0IHVwcGVyUmlnaHRUaWxlID0gdGhpcy5waXhlbFRvVGlsZSh1cHBlclJpZ2h0UG9pbnQpO1xuXG5cdFx0Y29uc3QgY29sdW1ucyA9IHJhbmdlSW5jbHVzaXZlKHVwcGVyTGVmdFRpbGUuZ2V0USgpIC0gMSwgdXBwZXJSaWdodFRpbGUuZ2V0USgpICsgMSk7XG5cblx0XHRjb25zdCBoZWlnaHQgPSBsb3dlclJpZ2h0VGlsZS5nZXRSKCkgLSB1cHBlclJpZ2h0VGlsZS5nZXRSKCk7XG5cblx0XHRjb25zdCBtYWtlQVBvaW50UGFpciA9IHRpbGVQb2ludCA9PiAoe3RpbGVQb2ludCwgcGl4ZWxQb2ludDogdGhpcy50aWxlVG9QaXhlbCh0aWxlUG9pbnQpfSk7XG5cblx0XHRjb25zdCBwcm9jZXNzUm93ID0gKHEsIGluZGV4KSA9PiB7XG5cdFx0XHRjb25zdCB0b3AgPSB1cHBlckxlZnRUaWxlLmdldFIoKSAtIE1hdGguZmxvb3IoaW5kZXggLyAyKTtcblx0XHRcdGNvbnN0IGJvdHRvbSA9IHRvcCArIGhlaWdodDtcblx0XHRcdGNvbnN0IHJvd3MgPSByYW5nZUluY2x1c2l2ZSh0b3AsIGJvdHRvbSArIDEpO1xuXG5cdFx0XHRjb25zdCBtYWtlQVBvaW50ID0gciA9PiBIZXgucXJUb0N1YmUocSwgcik7XG5cblx0XHRcdHJldHVybiBmdW5reS5jaGFpbihyb3dzKVxuXHRcdFx0Lm1hcChtYWtlQVBvaW50KVxuXHRcdFx0Lm1hcChtYWtlQVBvaW50UGFpcilcblx0XHRcdC5tYXAodGhpcy5lbmZvcmNlQm91bmRyaWVzKVxuXHRcdFx0Lm1hcCh0aWxlUG9pbnRUb0hleClcblx0XHRcdC52YWx1ZSgpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gZnVua3kuY2hhaW4oY29sdW1ucylcblx0XHQubWFwKHByb2Nlc3NSb3cpXG5cdFx0LmZsYXR0ZW4oKVxuXHRcdC52YWx1ZSgpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ2FydG9ncmFwaGVyIGZyb20gJy4vY2FydG9ncmFwaGVyLmpzJztcblxuaW1wb3J0ICogYXMgZnVua3kgZnJvbSAnLi9mdW5reSc7XG5pbXBvcnQge3JhbmdlSW5jbHVzaXZlLCBpbnZTcXJ0Miwgc3FydDJ9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5pbXBvcnQgU3F1YXJlIGZyb20gJy4vc3F1YXJlLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICcuL3BvaW50LmpzJztcblxuY29uc3QgdGlsZVBvaW50VG9TcXVhcmUgPSAoe3RpbGVQb2ludCwgbWFwUG9pbnQsIHBpeGVsUG9pbnR9KSA9PiAoe1xuXHR0aWxlOiB0aWxlUG9pbnQgaW5zdGFuY2VvZiBTcXVhcmUgPyB0aWxlUG9pbnQgOiBuZXcgU3F1YXJlKHRpbGVQb2ludCksXG5cdG1hcFRpbGU6IG1hcFBvaW50IGluc3RhbmNlb2YgU3F1YXJlID8gbWFwUG9pbnQgOlxuXHRcdG1hcFBvaW50ID8gbmV3IFNxdWFyZShtYXBQb2ludCkgOlxuXHRcdG1hcFBvaW50LFxuXHRwaXhlbFBvaW50LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcnRvZ3JhcGhlclBvaW50eVhZIGV4dGVuZHMgQ2FydG9ncmFwaGVyIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cblx0XHRbXG5cdFx0XHQndGlsZUhlaWdodCcsXG5cdFx0XHQndGlsZVdpZHRoJyxcblxuXHRcdFx0J21heFdpZHRoJyxcblx0XHRcdCdtaW5XaWR0aCcsXG5cblx0XHRcdCdob3Jpem9udGFsT3ZlcmhhbmcnLFxuXHRcdFx0J3ZlcnRpY2FsT3ZlcmhhbmcnLFxuXG5cdFx0XHQnaG9yaXpvbnRhbERpc3RhbmNlJyxcblx0XHRcdCd2ZXJ0aWNhbERpc3RhbmNlJyxcblxuXHRcdFx0J2NhbGN1bGF0ZUhvcml6b250YWxTY2FsZScsXG5cdFx0XHQnY2FsY3VsYXRlVmVydGljYWxTY2FsZScsXG5cblx0XHRcdCd0aWxlVG9QaXhlbCcsXG5cdFx0XHQncGl4ZWxUb1RpbGUnLFxuXHRcdFx0J3RlbGVwb3J0JyxcblxuXHRcdFx0J2luQm91bmRzJyxcblx0XHRcdCdlbmZvcmNlQm91bmRyaWVzJyxcblx0XHRcdCdib3VuZGluZ0JveCcsXG5cdFx0XS5tYXAobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblx0fVxuXG5cdHRpbGVIZWlnaHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWF4V2lkdGgoKTtcblx0fVxuXG5cdHRpbGVXaWR0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhXaWR0aCgpO1xuXHR9XG5cblx0bWF4V2lkdGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2NhbGUgKiAyO1xuXHR9XG5cblx0bWluV2lkdGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWF4V2lkdGgoKSAqIGludlNxcnQyO1xuXHR9XG5cblx0aG9yaXpvbnRhbE92ZXJoYW5nKCkge1xuXHRcdHJldHVybiB0aGlzLm1heFdpZHRoKCkgKiAwLjU7XG5cdH1cblxuXHR2ZXJ0aWNhbE92ZXJoYW5nKCkge1xuXHRcdHJldHVybiB0aGlzLm1heFdpZHRoKCkgKiAwLjU7XG5cdH1cblxuXHRob3Jpem9udGFsRGlzdGFuY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWF4V2lkdGgoKSAvIDI7XG5cdH1cblxuXHR2ZXJ0aWNhbERpc3RhbmNlKCkge1xuXHRcdHJldHVybiB0aGlzLm1heFdpZHRoKCkgLyAyO1xuXHR9XG5cblx0Y2FsY3VsYXRlSG9yaXpvbnRhbFNjYWxlKHBpeGVscywgdGlsZXMpIHtcblx0XHRyZXR1cm4gcGl4ZWxzIC8gKHRpbGVzIC8gMikgLyAyO1xuXHR9XG5cblx0Y2FsY3VsYXRlVmVydGljYWxTY2FsZShwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvICh0aWxlcyAvIDIpIC8gMjtcblx0fVxuXG5cdHRpbGVUb1BpeGVsKHNxdWFyZSkge1xuXHRcdHNxdWFyZSA9IHNxdWFyZSBpbnN0YW5jZW9mIFNxdWFyZSA/IHNxdWFyZSA6IG5ldyBTcXVhcmUoLi4uYXJndW1lbnRzKTtcblxuXHRcdGNvbnN0IHggPSBzcXVhcmUuZ2V0WCgpO1xuXHRcdGNvbnN0IHkgPSBzcXVhcmUuZ2V0WSgpO1xuXG5cdFx0Ly8gKGFib3ZlL2JlbG93IGF4aXMpICogKGRpc3RhbmNlIGZyb20gYXhpcykgLyAoc2l6ZSlcblx0XHRjb25zdCBwaXhlbFggPSAgKHggPCB5ID8gLTEgOiAxKSAgKiAgKE1hdGguYWJzKHkgLSB4KSAvIHNxcnQyKSAgKiAgdGhpcy5taW5XaWR0aCgpICsgdGhpcy5vcmlnaW5YO1xuXHRcdGNvbnN0IHBpeGVsWSA9IHRoaXMub3JpZ2luWSAtICgteCA8IHkgPyAxIDogLTEpICAqICAoTWF0aC5hYnMoeCArIHkpIC8gc3FydDIpICAqICB0aGlzLm1pbldpZHRoKCk7XG5cblx0XHRyZXR1cm4gbmV3IFBvaW50KHBpeGVsWCwgcGl4ZWxZKTtcblx0fVxuXG5cdHBpeGVsVG9UaWxlIChwb2ludCkge1xuXHRcdHBvaW50ID0gcG9pbnQgaW5zdGFuY2VvZiBQb2ludCA/IHBvaW50IDogbmV3IFBvaW50KC4uLmFyZ3VtZW50cyk7XG5cblx0XHRjb25zdCBwaXhlbFggPSBwb2ludC5nZXRYKCkgLSB0aGlzLm9yaWdpblg7XG5cdFx0Y29uc3QgcGl4ZWxZID0gdGhpcy5vcmlnaW5ZIC0gcG9pbnQuZ2V0WSgpO1xuXG5cdFx0Ly8gKGFib3ZlL2JlbG93IGF4aXMpICogKGRpc3RhbmNlIGZyb20gYXhpcykgLyAoc2l6ZSlcblx0XHRjb25zdCB4ID0gKC1waXhlbFggPCBwaXhlbFkgPyAxIDogLTEpICAqICAoTWF0aC5hYnMocGl4ZWxYICsgcGl4ZWxZKSAvIHNxcnQyKSAgLyAgdGhpcy5taW5XaWR0aCgpO1xuXHRcdGNvbnN0IHkgPSAgKHBpeGVsWCA8IHBpeGVsWSA/IDEgOiAtMSkgICogIChNYXRoLmFicyhwaXhlbFkgLSBwaXhlbFgpIC8gc3FydDIpICAvICB0aGlzLm1pbldpZHRoKCk7XG5cblx0XHRyZXR1cm4gbmV3IFNxdWFyZSh4LCB5KTtcblx0fVxuXG5cdHRlbGVwb3J0ICh7eCwgeX0pIHtcblx0XHRpZiAoIXRoaXMud3JhcCkgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcblxuXHRcdHggPSB4ICUgdGhpcy53aWR0aDtcblx0XHR5ID0geSAlIHRoaXMuaGVpZ2h0O1xuXG5cdFx0eCA9IHggPCAwID8gdGhpcy53aWR0aCArIHggOiB4O1xuXHRcdHkgPSB5IDwgMCA/IHRoaXMuaGVpZ2h0ICsgeSA6IHk7XG5cblx0XHRyZXR1cm4gbmV3IFBvaW50KHgsIHkpO1xuXHR9XG5cblx0aW5Cb3VuZHMgKHt4LCB5fSkge1xuXHRcdGlmICh0aGlzLm5lZ2F0aXZlVGlsZXMpIHtcblx0XHRcdHJldHVybiAoIXRoaXMud2lkdGggfHwgTWF0aC5hYnMoeCkgPD0gTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gMikpXG5cdFx0XHRcdCYmICghdGhpcy5oZWlnaHQgfHwgTWF0aC5hYnMoeSkgPD0gTWF0aC5mbG9vcih0aGlzLmhlaWdodCAvIDIpKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRyZXR1cm4gKCF0aGlzLndpZHRoIHx8ICh4ID49IDAgJiYgeCA8IHRoaXMud2lkdGgpKVxuXHRcdFx0XHQmJiAoIXRoaXMuaGVpZ2h0IHx8ICh5ID49IDAgJiYgeSA8IHRoaXMuaGVpZ2h0KSk7XG5cdFx0fVxuXHR9XG5cblx0ZW5mb3JjZUJvdW5kcmllcyAoe3RpbGVQb2ludCwgcGl4ZWxQb2ludH0pIHtcblx0XHRyZXR1cm4gdGhpcy53cmFwID8ge3RpbGVQb2ludCwgbWFwUG9pbnQ6IHRoaXMudGVsZXBvcnQodGlsZVBvaW50KSwgcGl4ZWxQb2ludH0gOlxuXHRcdFx0dGhpcy5pbkJvdW5kcyh0aWxlUG9pbnQpID8ge3RpbGVQb2ludCwgbWFwUG9pbnQ6IHRpbGVQb2ludCwgcGl4ZWxQb2ludH0gOlxuXHRcdFx0e3RpbGVQb2ludCwgbWFwUG9pbnQ6IG51bGwsIHBpeGVsUG9pbnR9O1xuXHR9XG5cblx0Ym91bmRpbmdCb3godXBwZXJMZWZ0UG9pbnQsIHVwcGVyUmlnaHRQb2ludCwgbG93ZXJMZWZ0UG9pbnQsIGxvd2VyUmlnaHRQb2ludCkge1xuXHRcdGNvbnN0IHVwcGVyTGVmdFRpbGUgPSB0aGlzLnBpeGVsVG9UaWxlKHVwcGVyTGVmdFBvaW50KTtcblx0XHRjb25zdCBsb3dlclJpZ2h0VGlsZSA9IHRoaXMucGl4ZWxUb1RpbGUobG93ZXJSaWdodFBvaW50KTtcblx0XHRjb25zdCB1cHBlclJpZ2h0VGlsZSA9IHRoaXMucGl4ZWxUb1RpbGUodXBwZXJSaWdodFBvaW50KTtcblx0XHRjb25zdCBsb3dlckxlZnRUaWxlID0gdGhpcy5waXhlbFRvVGlsZShsb3dlckxlZnRQb2ludCk7XG5cblx0XHRjb25zdCBjb2x1bW5zID0gcmFuZ2VJbmNsdXNpdmUobG93ZXJMZWZ0VGlsZS5nZXRYKCksIHVwcGVyUmlnaHRUaWxlLmdldFgoKSk7XG5cblx0XHRjb25zdCB1cHBlckxlZnRJbnRlcmNlcHQgPSB1cHBlckxlZnRUaWxlLmdldFkoKSAtIHVwcGVyTGVmdFRpbGUuZ2V0WCgpO1xuXHRcdGNvbnN0IHVwcGVyUmlnaHRJbnRlcmNlcHQgPSB1cHBlckxlZnRUaWxlLmdldFkoKSArIHVwcGVyTGVmdFRpbGUuZ2V0WCgpO1xuXG5cdFx0Y29uc3QgbG93ZXJMZWZ0SW50ZXJjZXB0ID0gbG93ZXJSaWdodFRpbGUuZ2V0WSgpIC0gbG93ZXJSaWdodFRpbGUuZ2V0WCgpO1xuXHRcdGNvbnN0IGxvd2VyUmlnaHRJbnRlcmNlcHQgPSBsb3dlclJpZ2h0VGlsZS5nZXRZKCkgKyBsb3dlclJpZ2h0VGlsZS5nZXRYKCk7XG5cblx0XHRjb25zdCBhYm91dEhhbGYgPSBNYXRoLmZsb29yKGNvbHVtbnMubGVuZ3RoIC8gMik7XG5cdFx0Y29uc3QgbWlkd2F5ID0gY29sdW1ucy5sZW5ndGggJSAyID8gY29sdW1uc1thYm91dEhhbGZdIDpcblx0XHRcdChjb2x1bW5zW2Fib3V0SGFsZiAtIDFdICsgY29sdW1uc1thYm91dEhhbGZdKSAvIDI7XG5cblx0XHRjb25zdCBtYWtlQVBvaW50UGFpciA9IHRpbGVQb2ludCA9PiAoe3RpbGVQb2ludCwgcGl4ZWxQb2ludDogdGhpcy50aWxlVG9QaXhlbCh0aWxlUG9pbnQpfSk7XG5cblx0XHRjb25zdCBwcm9jZXNzUm93ID0geCA9PiB7XG5cdFx0XHRsZXQgdG9wID0gICAgeCA8IG1pZHdheSA/ICB1cHBlckxlZnRJbnRlcmNlcHQgKyB4IDogdXBwZXJSaWdodEludGVyY2VwdCAtIHg7XG5cdFx0XHRsZXQgYm90dG9tID0geCA8IG1pZHdheSA/IGxvd2VyUmlnaHRJbnRlcmNlcHQgLSB4IDogIGxvd2VyTGVmdEludGVyY2VwdCArIHg7XG5cblx0XHRcdGJvdHRvbSA9IE1hdGgubWluKGJvdHRvbSwgdG9wKTtcblx0XHRcdHRvcCA9ICAgIE1hdGgubWF4KGJvdHRvbSwgdG9wKTtcblxuXHRcdFx0Ly8gcHVzaCBvdXQgYnkgMSBvbiBlaXRoZXIgZW5kIHRvIGFjY291bnQgZm9yIGludGVybG9ja2luZyB0aWxlc1xuXHRcdFx0Y29uc3Qgcm93ID0gcmFuZ2VJbmNsdXNpdmUoYm90dG9tIC0gMSwgdG9wICsgMSk7XG5cblx0XHRcdGNvbnN0IG1ha2VBUG9pbnQgPSB5ID0+ICh7eCwgeX0pO1xuXG5cdFx0XHRyZXR1cm4gZnVua3kuY2hhaW4ocm93KVxuXHRcdFx0Lm1hcChtYWtlQVBvaW50KVxuXHRcdFx0Lm1hcChtYWtlQVBvaW50UGFpcilcblx0XHRcdC5tYXAodGhpcy5lbmZvcmNlQm91bmRyaWVzKVxuXHRcdFx0Lm1hcCh0aWxlUG9pbnRUb1NxdWFyZSlcblx0XHRcdC52YWx1ZSgpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gZnVua3kuY2hhaW4oY29sdW1ucylcblx0XHQubWFwKHByb2Nlc3NSb3cpXG5cdFx0LmZsYXR0ZW4oKVxuXHRcdC52YWx1ZSgpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ2FydG9ncmFwaGVyIGZyb20gJy4vY2FydG9ncmFwaGVyLmpzJztcblxuaW1wb3J0ICogYXMgZnVua3kgZnJvbSAnLi9mdW5reSc7XG5pbXBvcnQge3JhbmdlSW5jbHVzaXZlLCBzcXJ0M30gZnJvbSAnLi91dGlscy5qcyc7XG5cbmltcG9ydCBIZXggZnJvbSAnLi9oZXguanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJy4vcG9pbnQuanMnO1xuXG5jb25zdCB0aWxlUG9pbnRUb0hleCA9ICh7dGlsZVBvaW50LCBtYXBQb2ludCwgcGl4ZWxQb2ludH0pID0+ICh7XG5cdHRpbGU6IHRpbGVQb2ludCBpbnN0YW5jZW9mIEhleCA/IHRpbGVQb2ludCA6IG5ldyBIZXgodGlsZVBvaW50KSxcblx0bWFwVGlsZTogbWFwUG9pbnQgaW5zdGFuY2VvZiBIZXggPyBtYXBQb2ludCA6XG5cdFx0bWFwUG9pbnQgPyBuZXcgSGV4KG1hcFBvaW50KSA6XG5cdFx0bWFwUG9pbnQsXG5cdHBpeGVsUG9pbnQsXG59KTtcblxuY29uc3QgemVyb1plcm9aZXJvID0gbmV3IEhleCh7eDogMCwgeTogMCwgejogMH0pO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJ0b2dyYXBoZXJQb2ludHlYWVogZXh0ZW5kcyBDYXJ0b2dyYXBoZXIge1xuXHRjb25zdHJ1Y3RvciAoc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cblx0XHRbXG5cdFx0XHQndGlsZUhlaWdodCcsXG5cdFx0XHQndGlsZVdpZHRoJyxcblxuXHRcdFx0J21heFdpZHRoJyxcblx0XHRcdCdtaW5XaWR0aCcsXG5cblx0XHRcdCdob3Jpem9udGFsT3ZlcmhhbmcnLFxuXHRcdFx0J3ZlcnRpY2FsT3ZlcmhhbmcnLFxuXG5cdFx0XHQnaG9yaXpvbnRhbERpc3RhbmNlJyxcblx0XHRcdCd2ZXJ0aWNhbERpc3RhbmNlJyxcblxuXHRcdFx0J2NhbGN1bGF0ZUhvcml6b250YWxTY2FsZScsXG5cdFx0XHQnY2FsY3VsYXRlVmVydGljYWxTY2FsZScsXG5cblx0XHRcdCd0aWxlVG9QaXhlbCcsXG5cdFx0XHQncGl4ZWxUb1RpbGUnLFxuXHRcdFx0J3RlbGVwb3J0JyxcblxuXHRcdFx0J2luQm91bmRzJyxcblx0XHRcdCdlbmZvcmNlQm91bmRyaWVzJyxcblx0XHRcdCdib3VuZGluZ0JveCcsXG5cdFx0XS5tYXAobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblxuXHRcdGlmICh0aGlzLnJhZGl1cykge1xuXHRcdFx0dGhpcy5taXJyb3JzID0gW1xuXHRcdFx0XHRuZXcgSGV4KHsgLy8gRWFzdFxuXHRcdFx0XHRcdHg6IDIgKiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdFx0eTogLXRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0XHR6OiAtdGhpcy5yYWRpdXMsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRuZXcgSGV4KHsgLy8gTm9ydGggRWFzdFxuXHRcdFx0XHRcdHg6IHRoaXMucmFkaXVzICsgMSxcblx0XHRcdFx0XHR5OiB0aGlzLnJhZGl1cyxcblx0XHRcdFx0XHR6OiAtMiAqIHRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5ldyBIZXgoeyAvLyBOb3J0aCBXZXN0XG5cdFx0XHRcdFx0eDogLXRoaXMucmFkaXVzLFxuXHRcdFx0XHRcdHk6IDIgKiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdFx0ejogLXRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5ldyBIZXggKHsgLy8gV2VzdFxuXHRcdFx0XHRcdHg6IC0yICogdGhpcy5yYWRpdXMgLSAxLFxuXHRcdFx0XHRcdHk6IHRoaXMucmFkaXVzICsgMSxcblx0XHRcdFx0XHR6OiB0aGlzLnJhZGl1cyxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5ldyBIZXggKHsgLy8gU291dGggV2VzdFxuXHRcdFx0XHRcdHg6IC10aGlzLnJhZGl1cyAtIDEsXG5cdFx0XHRcdFx0eTogLXRoaXMucmFkaXVzLFxuXHRcdFx0XHRcdHo6IDIgKiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRuZXcgSGV4ICh7IC8vIFNvdXRoIEVhc3Rcblx0XHRcdFx0XHR4OiB0aGlzLnJhZGl1cyxcblx0XHRcdFx0XHR5OiAtMiAqIHRoaXMucmFkaXVzIC0gMSxcblx0XHRcdFx0XHR6OiB0aGlzLnJhZGl1cyArIDEsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XTtcblx0XHR9XG5cdH1cblxuXHR0aWxlSGVpZ2h0ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhXaWR0aCgpO1xuXHR9XG5cblx0dGlsZVdpZHRoICgpIHtcblx0XHRyZXR1cm4gdGhpcy5taW5XaWR0aCgpO1xuXHR9XG5cblx0bWF4V2lkdGggKCkge1xuXHRcdHJldHVybiB0aGlzLnNjYWxlICogMjtcblx0fVxuXG5cdG1pbldpZHRoICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zY2FsZSAqIHNxcnQzO1xuXHR9XG5cblx0aG9yaXpvbnRhbE92ZXJoYW5nICgpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHZlcnRpY2FsT3ZlcmhhbmcgKCkge1xuXHRcdHJldHVybiB0aGlzLm1heFdpZHRoKCkgKiAwLjI1O1xuXHR9XG5cblx0aG9yaXpvbnRhbERpc3RhbmNlICgpIHtcblx0XHRyZXR1cm4gdGhpcy5taW5XaWR0aCgpO1xuXHR9XG5cblx0dmVydGljYWxEaXN0YW5jZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWF4V2lkdGgoKSAqICgzLzQpO1xuXHR9XG5cblx0Y2FsY3VsYXRlSG9yaXpvbnRhbFNjYWxlIChwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvIHRpbGVzIC8gc3FydDM7XG5cdH1cblxuXHRjYWxjdWxhdGVWZXJ0aWNhbFNjYWxlIChwaXhlbHMsIHRpbGVzKSB7XG5cdFx0cmV0dXJuIHBpeGVscyAvICh0aWxlcyAqIDAuNzUgKyAwLjI1KSAvIDI7XG5cdH1cblxuXHR0aWxlVG9QaXhlbCAoaGV4KSB7XG5cdFx0aGV4ID0gaGV4IGluc3RhbmNlb2YgSGV4ID8gaGV4IDogbmV3IEhleCguLi5hcmd1bWVudHMpO1xuXG5cdFx0Y29uc3QgcGl4ZWxYID0gdGhpcy5zY2FsZSAqIHNxcnQzICogKGhleC5nZXRRKCkgKyAoaGV4LmdldFIoKSAvIDIpKTtcblx0XHRjb25zdCBwaXhlbFkgPSB0aGlzLnNjYWxlICogMy8yICogaGV4LmdldFIoKTtcblxuXHRcdHJldHVybiBuZXcgUG9pbnQocGl4ZWxYICsgdGhpcy5vcmlnaW5YLCBwaXhlbFkgKyB0aGlzLm9yaWdpblkpO1xuXHR9XG5cblx0cGl4ZWxUb1RpbGUgKHBvaW50KSB7XG5cdFx0cG9pbnQgPSBwb2ludCBpbnN0YW5jZW9mIFBvaW50ID8gcG9pbnQgOiBuZXcgUG9pbnQoLi4uYXJndW1lbnRzKTtcblxuXHRcdGNvbnN0IHBpeGVsWCA9IHBvaW50LmdldFgoKSAtIHRoaXMub3JpZ2luWDtcblx0XHRjb25zdCBwaXhlbFkgPSBwb2ludC5nZXRZKCkgLSB0aGlzLm9yaWdpblk7XG5cblx0XHRjb25zdCBxID0gKChwaXhlbFggKiAoc3FydDMgLyAzKSkgLSAocGl4ZWxZIC8gMykpIC8gdGhpcy5zY2FsZTtcblx0XHRjb25zdCByID0gKHBpeGVsWSAqICgyIC8gMykpIC8gdGhpcy5zY2FsZTtcblxuXHRcdHJldHVybiBuZXcgSGV4KHEsIHIpO1xuXHR9XG5cblx0dGVsZXBvcnQgKGhleCkge1xuXHRcdGlmICghdGhpcy53cmFwKSByZXR1cm4gaGV4O1xuXG5cdFx0aGV4ICA9IGhleCBpbnN0YW5jZW9mIEhleCA/IGhleCA6IG5ldyBIZXgoaGV4KTtcblxuXHRcdGlmICh0aGlzLnJhZGl1cykge1xuXHRcdFx0aWYgKGhleC5kaXN0YW5jZSh6ZXJvWmVyb1plcm8pIDw9IHRoaXMucmFkaXVzKSByZXR1cm4gaGV4O1xuXG5cdFx0XHRjb25zdCBkaXN0YW5jZXMgPSB0aGlzLm1pcnJvcnMubWFwKG1pcnJvciA9PiBoZXguZGlzdGFuY2UobWlycm9yKSk7XG5cdFx0XHRjb25zdCBtaXJyb3IgPSB0aGlzLm1pcnJvcnNbZGlzdGFuY2VzLmluZGV4T2YoTWF0aC5taW4oLi4uZGlzdGFuY2VzKSldO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50ZWxlcG9ydChoZXguc3VidHJhY3RIZXgobWlycm9yKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IHtjb2wsIHJvd30gPSBIZXguY3ViZVRvRXZlblIoaGV4KTtcblxuXHRcdFx0Ly8gZW5zdXJlIG9kZC13aWR0aCBtYXBzIHdyYXAgcHJvcGVybHlcblx0XHRcdGlmICh0aGlzLmhlaWdodCAlIDIpIHtcblx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gTWF0aC5mbG9vcihyb3cgLyB0aGlzLmhlaWdodCk7XG5cblx0XHRcdFx0bGV0IGhvcml6b250YWxBZGp1c3QgPSBvZmZzZXQgLyAyO1xuXHRcdFx0XHRob3Jpem9udGFsQWRqdXN0ID0gb2Zmc2V0ICUgMiA9PT0gMCA/IGhvcml6b250YWxBZGp1c3QgOlxuXHRcdFx0XHRcdHJvdyAlIDIgPyBNYXRoLmNlaWwoaG9yaXpvbnRhbEFkanVzdCkgOlxuXHRcdFx0XHRcdE1hdGguZmxvb3IoaG9yaXpvbnRhbEFkanVzdCk7XG5cblx0XHRcdFx0Y29sIC09IGhvcml6b250YWxBZGp1c3Q7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGhhbGZXaWR0aCA9ICBNYXRoLmZsb29yKHRoaXMud2lkdGggLyAyKTtcblx0XHRcdGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0IC8gMik7XG5cblx0XHRcdGlmICh0aGlzLm5lZ2F0aXZlVGlsZXMpIHtcblx0XHRcdFx0Y29sICs9IGhhbGZXaWR0aDtcblx0XHRcdFx0cm93ICs9IGhhbGZIZWlnaHQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbCA9IGNvbCAlIHRoaXMud2lkdGg7XG5cdFx0XHRyb3cgPSByb3cgJSB0aGlzLmhlaWdodDtcblxuXHRcdFx0Y29sID0gY29sIDwgMCA/IGNvbCArIHRoaXMud2lkdGggOiBjb2w7XG5cdFx0XHRyb3cgPSByb3cgPCAwID8gcm93ICsgdGhpcy5oZWlnaHQgOiByb3c7XG5cblx0XHRcdGlmICh0aGlzLm5lZ2F0aXZlVGlsZXMpIHtcblx0XHRcdFx0Y29sIC09IGhhbGZXaWR0aDtcblx0XHRcdFx0cm93IC09IGhhbGZIZWlnaHQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBIZXguZXZlblJUb0N1YmUoY29sLCByb3cpO1xuXHRcdH1cblx0fVxuXG5cdGluQm91bmRzIChoZXgpIHtcblx0XHRoZXggID0gaGV4IGluc3RhbmNlb2YgSGV4ID8gaGV4IDogbmV3IEhleChoZXgpO1xuXG5cdFx0aWYgKHRoaXMucmFkaXVzKSB7XG5cdFx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLm1heChNYXRoLmFicyhoZXgueCksIE1hdGguYWJzKGhleC55KSwgTWF0aC5hYnMoaGV4LnopKSA8PSBNYXRoLmZsb29yKHRoaXMucmFkaXVzKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoaGV4LnggLSB0aGlzLnJhZGl1cyksIE1hdGguYWJzKGhleC55ICsgdGhpcy5yYWRpdXMpLCBNYXRoLmFicyhoZXgueikpIDw9IHRoaXMucmFkaXVzO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLndpZHRoIHx8IHRoaXMuaGVpZ2h0KSB7XG5cdFx0XHRpZiAodGhpcy5uZWdhdGl2ZVRpbGVzKSB7XG5cdFx0XHRcdHJldHVybiAoIXRoaXMud2lkdGggfHwgKE1hdGguYWJzKGhleC54KSA8IHRoaXMud2lkdGggLyAyKSlcblx0XHRcdFx0XHQmJiAoIXRoaXMuaGVpZ2h0IHx8IChNYXRoLmFicygtaGV4LnkgLSBNYXRoLmZsb29yKGhleC54IC8gMikpIDwgKHRoaXMuaGVpZ2h0IC8gMikpKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gKCF0aGlzLndpZHRoIHx8IChoZXgueCA+PSAwICYmIGhleC54IDwgdGhpcy53aWR0aCkpXG5cdFx0XHRcdFx0JiYgKCF0aGlzLmhlaWdodCB8fCAoaGV4LnkgPD0gKE1hdGguZmxvb3IoaGV4LnggLyAyKSAqIC0xKSAmJiAoLWhleC55IC0gTWF0aC5mbG9vcihoZXgueCAvIDIpKSA8IHRoaXMuaGVpZ2h0KSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0ZW5mb3JjZUJvdW5kcmllcyAoe3RpbGVQb2ludCwgcGl4ZWxQb2ludH0pIHtcblx0XHRyZXR1cm4gdGhpcy53cmFwID8ge3RpbGVQb2ludCwgbWFwUG9pbnQ6IHRoaXMudGVsZXBvcnQodGlsZVBvaW50KSwgcGl4ZWxQb2ludH0gOlxuXHRcdFx0dGhpcy5pbkJvdW5kcyh0aWxlUG9pbnQpID8ge3RpbGVQb2ludCwgbWFwUG9pbnQ6IHRpbGVQb2ludCwgcGl4ZWxQb2ludH0gOlxuXHRcdFx0e3RpbGVQb2ludCwgbWFwUG9pbnQ6IG51bGwsIHBpeGVsUG9pbnR9O1xuXHR9XG5cblx0Ym91bmRpbmdCb3ggKHVwcGVyTGVmdFBvaW50LCB1cHBlclJpZ2h0UG9pbnQsIGxvd2VyTGVmdFBvaW50LCBsb3dlclJpZ2h0UG9pbnQpIHtcblx0XHRjb25zdCB1cHBlckxlZnRUaWxlID0gdGhpcy5waXhlbFRvVGlsZSh1cHBlckxlZnRQb2ludCk7XG5cdFx0Y29uc3QgbG93ZXJMZWZ0VGlsZSA9IHRoaXMucGl4ZWxUb1RpbGUobG93ZXJMZWZ0UG9pbnQpO1xuXHRcdGNvbnN0IGxvd2VyUmlnaHRUaWxlID0gdGhpcy5waXhlbFRvVGlsZShsb3dlclJpZ2h0UG9pbnQpO1xuXHRcdGNvbnN0IHVwcGVyUmlnaHRUaWxlID0gdGhpcy5waXhlbFRvVGlsZSh1cHBlclJpZ2h0UG9pbnQpO1xuXG5cdFx0Y29uc3Qgcm93cyA9IHJhbmdlSW5jbHVzaXZlKHVwcGVyTGVmdFRpbGUuZ2V0UigpIC0xICwgbG93ZXJMZWZ0VGlsZS5nZXRSKCkgKyAxKTtcblxuXHRcdGNvbnN0IHdpZHRoID0gdXBwZXJSaWdodFRpbGUuZ2V0USgpIC0gdXBwZXJMZWZ0VGlsZS5nZXRRKCk7XG5cblx0XHRjb25zdCBtYWtlQVBvaW50UGFpciA9IHRpbGVQb2ludCA9PiAoe3RpbGVQb2ludCwgcGl4ZWxQb2ludDogdGhpcy50aWxlVG9QaXhlbCh0aWxlUG9pbnQpfSk7XG5cblx0XHRjb25zdCBwcm9jZXNzQ29sdW1uID0gKHIsIGluZGV4KSA9PiB7XG5cdFx0XHRjb25zdCBsZWZ0ID0gdXBwZXJMZWZ0VGlsZS5nZXRRKCkgLSBNYXRoLmZsb29yKGluZGV4IC8gMik7XG5cdFx0XHRjb25zdCByaWdodCA9IGxlZnQgKyB3aWR0aDtcblx0XHRcdGNvbnN0IGNvbHVtbnMgPSByYW5nZUluY2x1c2l2ZShsZWZ0LCByaWdodCArIDEpO1xuXG5cdFx0XHRjb25zdCBtYWtlQVBvaW50ID0gcSA9PiBIZXgucXJUb0N1YmUocSwgcik7IC8vKHt4OiBxLCB6OiByLCB5OiAtcSAtIHJ9KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmt5LmNoYWluKGNvbHVtbnMpXG5cdFx0XHQubWFwKG1ha2VBUG9pbnQpXG5cdFx0XHQubWFwKG1ha2VBUG9pbnRQYWlyKVxuXHRcdFx0Lm1hcCh0aGlzLmVuZm9yY2VCb3VuZHJpZXMpXG5cdFx0XHQubWFwKHRpbGVQb2ludFRvSGV4KVxuXHRcdFx0LnZhbHVlKCk7XG5cdFx0fTtcblxuXHRcdHJldHVybiBmdW5reS5jaGFpbihyb3dzKVxuXHRcdC5tYXAocHJvY2Vzc0NvbHVtbilcblx0XHQuZmxhdHRlbigpXG5cdFx0LnZhbHVlKCk7XG5cdH1cbn1cbiIsImltcG9ydCB7cmFuZG9tfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7XG5cdEhFWCwgQ0lSQ0xFLCBTUVVBUkUsXG5cdEZMQVQsIFBPSU5UWSxcblx0RklMTCwgT1VUTElORSxcbn0gZnJvbSAnLi9jb25zdHMuanMnO1xuXG5jb25zdCBERUZBVUxUUyA9IHtcblx0eDogMCxcblx0eTogMCxcblxuXHRzY2FsZTogMTAsXG5cdG9yaWVudGF0aW9uOiBGTEFULFxuXHR0aWxlU3R5bGU6IEhFWCxcblx0ZHJhd1N0eWxlOiBGSUxMLFxuXHR3aWR0aDogMSxcblxuXHRjb2xvcjoge1xuXHRcdHJlZDogMCxcblx0XHRncmVlbjogMCxcblx0XHRibHVlOiAwLFxuXHRcdGFscGhhOiAwLjUsXG5cdH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDZWxsIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRPYmplY3QuYXNzaWduKHRoaXMsIERFRkFVTFRTLCBzZXR0aW5ncyk7XG5cdH1cbn1cblxuIiwiZXhwb3J0IGNvbnN0IEhFWCA9ICdoZXgnO1xuZXhwb3J0IGNvbnN0IENJUkNMRSA9ICdjaXJjbGUnO1xuZXhwb3J0IGNvbnN0IFNRVUFSRSA9ICdzcXVhcmUnO1xuXG5leHBvcnQgY29uc3QgVElMRV9TVFlMRVMgPSB7SEVYLCBDSVJDTEUsIFNRVUFSRX07XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9TVFlMRVMgPSB7XG5cdEhFWCxcblx0U1FVQVJFLFxufTtcblxuZXhwb3J0IGNvbnN0IEZMQVQgPSAnZmxhdCc7XG5leHBvcnQgY29uc3QgUE9JTlRZID0gJ3BvaW50eSc7XG5cbmV4cG9ydCBjb25zdCBPUklFTlRBVElPTl9TVFlMRVMgPSB7XG5cdEZMQVQsXG5cdFBPSU5UWSxcbn07XG5cbmV4cG9ydCBjb25zdCBGSUxMID0gJ2ZpbGwnO1xuZXhwb3J0IGNvbnN0IE9VVExJTkUgPSAnb3V0bGluZSc7XG5leHBvcnQgY29uc3QgRFJBV19TVFlMRVMgPSB7XG5cdEZJTEwsXG5cdE9VVExJTkUsXG59O1xuIiwiaW1wb3J0IHtnZXRDb2xvcn0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdDaXJjbGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHR9XG5cblx0ZmlsbChjb250ZXh0LCBzY2FsZSwgeCwgeSwgY2VsbCkge1xuXHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cdFx0Y29udGV4dC5hcmMoeCwgeSwgc2NhbGUgKiBjZWxsLnNjYWxlLCAwLCAyKk1hdGguUEksIGZhbHNlKTtcblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9IGdldENvbG9yKGNlbGwuY29sb3IpO1xuXHRcdGNvbnRleHQuZmlsbCgpO1xuXHR9XG5cblx0b3V0bGluZShjb250ZXh0LCBzY2FsZSwgeCwgeSwgY2VsbCkge1xuXHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cdFx0Y29udGV4dC5hcmMoeCwgeSwgc2NhbGUgKiBjZWxsLnNjYWxlLCAwLCAyKk1hdGguUEksIGZhbHNlKTtcblx0XHRjb250ZXh0LmxpbmVXaWR0aCA9IGNlbGwud2lkdGg7XG5cdFx0Y29udGV4dC5zdHJva2VTdHlsZSA9IGdldENvbG9yKGNlbGwuY29sb3IpO1xuXHRcdGNvbnRleHQuc3Ryb2tlKCk7XG5cdH1cbn1cblxuIiwiaW1wb3J0IHtGTEFULCBQT0lOVFl9IGZyb20gJy4vY29uc3RzLmpzJztcbmltcG9ydCB7Z2V0Q29sb3IsIHJhbmdlLCB0b0ZpeGVkLCBxdWlja0NhbnZhc30gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdIZXhhZ29uIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZ3MpO1xuXG5cdFx0dGhpcy5mbGF0VG9wQ29ybmVyWCA9IFtdO1xuXHRcdHRoaXMuZmxhdFRvcENvcm5lclkgPSBbXTtcblx0XHR0aGlzLnBvaW50eVRvcENvcm5lclggPSBbXTtcblx0XHR0aGlzLnBvaW50eVRvcENvcm5lclkgPSBbXTtcblxuXHRcdGNvbnN0IGhleFNpZGVzID0gNjtcblx0XHRjb25zdCBoZXhTbGljZXMgPSAyNDtcblxuXHRcdHJhbmdlKGhleFNsaWNlcykuZm9yRWFjaChoZXhTbGljZSA9PiB7XG5cdFx0XHRjb25zdCB4ID0gdG9GaXhlZChNYXRoLmNvcygoKGhleFNsaWNlIC8gaGV4U2xpY2VzKSAqIGhleFNpZGVzKSAqICgyICogTWF0aC5QSSkgLyBoZXhTaWRlcykpO1xuXHRcdFx0Y29uc3QgeSA9IHRvRml4ZWQoTWF0aC5zaW4oKChoZXhTbGljZSAvIGhleFNsaWNlcykgKiBoZXhTaWRlcykgKiAoMiAqIE1hdGguUEkpIC8gaGV4U2lkZXMpKTtcblxuXHRcdFx0aWYgKChoZXhTbGljZSAlIDQpID09PSAwKSB7XG5cdFx0XHRcdGNvbnN0IGN1ciA9IGhleFNsaWNlIC8gNDtcblx0XHRcdFx0dGhpcy5mbGF0VG9wQ29ybmVyWFtjdXJdID0geDtcblx0XHRcdFx0dGhpcy5mbGF0VG9wQ29ybmVyWVtjdXJdID0geTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCgoaGV4U2xpY2UtMikgJSA0KSA9PT0gMCkge1xuXHRcdFx0XHRjb25zdCBjdXIgPSAoaGV4U2xpY2UtMikgLyA0O1xuXHRcdFx0XHR0aGlzLnBvaW50eVRvcENvcm5lclhbY3VyXSA9IHg7XG5cdFx0XHRcdHRoaXMucG9pbnR5VG9wQ29ybmVyWVtjdXJdID0geTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdG91dGxpbmUoY29udGV4dCwgc2NhbGUsIHgsIHksIGNlbGwpIHtcblx0XHRzY2FsZSA9IHNjYWxlICogY2VsbC5zY2FsZTtcblx0XHRsZXQgaGV4Q29ybmVyWCA9IGNlbGwub3JpZW50YXRpb24gPT09IFBPSU5UWSA/IHRoaXMucG9pbnR5VG9wQ29ybmVyWCA6IHRoaXMuZmxhdFRvcENvcm5lclg7XG5cdFx0bGV0IGhleENvcm5lclkgPSBjZWxsLm9yaWVudGF0aW9uID09PSBQT0lOVFkgPyB0aGlzLnBvaW50eVRvcENvcm5lclkgOiB0aGlzLmZsYXRUb3BDb3JuZXJZO1xuXG5cdFx0Y29udGV4dC5iZWdpblBhdGgoKTtcblx0XHRjb250ZXh0Lm1vdmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzBdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzBdKTtcblx0XHRjb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzFdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzFdKTtcblx0XHRjb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzJdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzJdKTtcblx0XHRjb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzNdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzNdKTtcblx0XHRjb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzRdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzRdKTtcblx0XHRjb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzVdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzVdKTtcblx0XHRjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG5cdFx0Y29udGV4dC5saW5lV2lkdGggPSBjZWxsLndpZHRoO1xuXHRcdGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBnZXRDb2xvcihjZWxsLmNvbG9yKTtcblx0XHRjb250ZXh0LnN0cm9rZSgpO1xuXHR9XG5cbi8vXHRmaWxsKGNvbnRleHQsIHNjYWxlLCB4LCB5LCBjZWxsKSB7XG4vL1x0XHRpZiAoY2VsbC5jYWNoZVNjYWxlICE9PSBzY2FsZSkge1xuLy9cdFx0XHRjZWxsLmNhY2hlU2NhbGUgPSBzY2FsZTtcbi8vXHRcdFx0c2NhbGUgPSBzY2FsZSAqIGNlbGwuc2NhbGU7XG4vL1xuLy9cdFx0XHRjZWxsLmNhY2hlSGFsZldpZHRoID0gc2NhbGU7XG4vL1x0XHRcdGNlbGwuY2FjaGVIYWxmSGVpZ2h0ID0gc2NhbGU7XG4vL1xuLy9cdFx0XHRjZWxsLmNhY2hlSGV4ID0gcXVpY2tDYW52YXMoKGNvbnRleHQsIGhlaWdodCwgd2lkdGgpID0+IHtcbi8vXHRcdFx0XHRjb25zdCBoZXhDb3JuZXJYID0gY2VsbC5vcmllbnRhdGlvbiA9PT0gUE9JTlRZID8gdGhpcy5wb2ludHlUb3BDb3JuZXJYIDogdGhpcy5mbGF0VG9wQ29ybmVyWDtcbi8vXHRcdFx0XHRjb25zdCBoZXhDb3JuZXJZID0gY2VsbC5vcmllbnRhdGlvbiA9PT0gUE9JTlRZID8gdGhpcy5wb2ludHlUb3BDb3JuZXJZIDogdGhpcy5mbGF0VG9wQ29ybmVyWTtcbi8vXG4vL1x0XHRcdFx0Y29udGV4dC5iZWdpblBhdGgoKTtcbi8vXHRcdFx0XHRjb250ZXh0Lm1vdmVUbyhzY2FsZSArIHNjYWxlICogaGV4Q29ybmVyWFswXSwgc2NhbGUgKyBzY2FsZSAqIGhleENvcm5lcllbMF0pO1xuLy9cdFx0XHRcdGNvbnRleHQubGluZVRvKHNjYWxlICsgc2NhbGUgKiBoZXhDb3JuZXJYWzFdLCBzY2FsZSArIHNjYWxlICogaGV4Q29ybmVyWVsxXSk7XG4vL1x0XHRcdFx0Y29udGV4dC5saW5lVG8oc2NhbGUgKyBzY2FsZSAqIGhleENvcm5lclhbMl0sIHNjYWxlICsgc2NhbGUgKiBoZXhDb3JuZXJZWzJdKTtcbi8vXHRcdFx0XHRjb250ZXh0LmxpbmVUbyhzY2FsZSArIHNjYWxlICogaGV4Q29ybmVyWFszXSwgc2NhbGUgKyBzY2FsZSAqIGhleENvcm5lcllbM10pO1xuLy9cdFx0XHRcdGNvbnRleHQubGluZVRvKHNjYWxlICsgc2NhbGUgKiBoZXhDb3JuZXJYWzRdLCBzY2FsZSArIHNjYWxlICogaGV4Q29ybmVyWVs0XSk7XG4vL1x0XHRcdFx0Y29udGV4dC5saW5lVG8oc2NhbGUgKyBzY2FsZSAqIGhleENvcm5lclhbNV0sIHNjYWxlICsgc2NhbGUgKiBoZXhDb3JuZXJZWzVdKTtcbi8vXG4vL1x0XHRcdFx0Y29udGV4dC5maWxsU3R5bGUgPSBnZXRDb2xvcihjZWxsLmNvbG9yKTtcbi8vXHRcdFx0XHRjb250ZXh0LmZpbGwoKTtcbi8vXHRcdFx0fSwgc2NhbGUgKiAyKTtcbi8vXHRcdH1cbi8vXG4vL1x0XHRjb250ZXh0LmRyYXdJbWFnZShjZWxsLmNhY2hlSGV4LCB4IC0gY2VsbC5jYWNoZUhhbGZXaWR0aCwgeSAtIGNlbGwuY2FjaGVIYWxmSGVpZ2h0KTtcbi8vXHR9XG5cblx0ZmlsbChjb250ZXh0LCBzY2FsZSwgeCwgeSwgY2VsbCkge1xuXHRcdHNjYWxlID0gc2NhbGUgKiBjZWxsLnNjYWxlO1xuXHRcdGxldCBoZXhDb3JuZXJYID0gY2VsbC5vcmllbnRhdGlvbiA9PT0gUE9JTlRZID8gdGhpcy5wb2ludHlUb3BDb3JuZXJYIDogdGhpcy5mbGF0VG9wQ29ybmVyWDtcblx0XHRsZXQgaGV4Q29ybmVyWSA9IGNlbGwub3JpZW50YXRpb24gPT09IFBPSU5UWSA/IHRoaXMucG9pbnR5VG9wQ29ybmVyWSA6IHRoaXMuZmxhdFRvcENvcm5lclk7XG5cblx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdGNvbnRleHQubW92ZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMF0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMF0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMV0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMV0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMl0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMl0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbM10sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbM10pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbNF0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbNF0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbNV0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbNV0pO1xuXG5cdFx0Y29udGV4dC5maWxsU3R5bGUgPSBnZXRDb2xvcihjZWxsLmNvbG9yKTtcblx0XHRjb250ZXh0LmZpbGwoKTtcblx0fVxufVxuXG4iLCJpbXBvcnQge2dldENvbG9yLCBxdWlja0NhbnZhcywgcmFuZ2UsIGludlNxcnQyLCB0b0ZpeGVkfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7SEVYLCBTUVVBUkUsIEZMQVQsIFBPSU5UWX0gZnJvbSAnLi9jb25zdHMuanMnO1xuXG5jb25zdCBERUZBVUxUUyA9IHtcblx0bWluZToge1xuXHRcdGJvcmRlcjoge1xuXHRcdFx0c2NhbGU6IDAuMzgsXG5cblx0XHRcdGNvbG9yOiB7XG5cdFx0XHRcdHJlZDogMjU1LFxuXHRcdFx0XHRibHVlOiAyNTUsXG5cdFx0XHRcdGdyZWVuOiAyNTUsXG5cdFx0XHRcdGFscGhhOiAwLjgsXG5cdFx0XHR9LFxuXG5cdFx0XHRob3Juczoge1xuXHRcdFx0XHRzY2FsZTogMC4wNyxcblx0XHRcdFx0ZGlzdGFuY2U6IDAuMzYsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0Ym9keToge1xuXHRcdFx0c2NhbGU6IDAuMzYsXG5cblx0XHRcdGNvbG9yOiB7XG5cdFx0XHRcdHJlZDogMzIsXG5cdFx0XHRcdGJsdWU6IDMyLFxuXHRcdFx0XHRncmVlbjogMzIsXG5cdFx0XHR9LFxuXG5cdFx0XHRob3Juczoge1xuXHRcdFx0XHRzY2FsZTogMC4wNSxcblx0XHRcdFx0ZGlzdGFuY2U6IDAuMzYsXG5cdFx0XHR9LFxuXHRcdH1cblx0fSxcblxuXHRwaXA6IHtcblx0XHRib3JkZXI6IHtcblx0XHRcdHNjYWxlOiAwLjE3LFxuXHRcdFx0Y29sb3I6IHtcblx0XHRcdFx0cmVkOiAyNTUsXG5cdFx0XHRcdGJsdWU6IDI1NSxcblx0XHRcdFx0Z3JlZW46IDI1NSxcblx0XHRcdFx0YWxwaGE6IDAuOSxcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRib2R5OiB7XG5cdFx0XHRzY2FsZTogMC4xNSxcblx0XHRcdGNvbG9yOiB7XG5cdFx0XHRcdHJlZDogMCxcblx0XHRcdFx0Ymx1ZTogMCxcblx0XHRcdFx0Z3JlZW46IDAsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0ZGlzdGFuY2U6IDAuNixcblx0fSxcblxuXHRzaWRlczogNixcblx0c2xpY2VzOiAyNCxcbn07XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRmxhdFNxdWFyZVBpcHMgKCkge1xuXHRjb25zdCBwaXBzID0gW107XG5cdGNvbnN0IHBpcFggPSBbMCwgaW52U3FydDIsIGludlNxcnQyLCAtaW52U3FydDIsIC1pbnZTcXJ0MiwgaW52U3FydDIsIC1pbnZTcXJ0MiwgMCwgMF07XG5cdGNvbnN0IHBpcFkgPSBbMCwgaW52U3FydDIsIC1pbnZTcXJ0MiwgLWludlNxcnQyLCBpbnZTcXJ0MiwgMCwgMCwgLWludlNxcnQyLCBpbnZTcXJ0Ml07XG5cblx0Y29uc3QgZ2V0VmVydGV4ID0gbiA9PiBbcGlwWFtuXSwgcGlwWVtuXV07XG5cblx0cGlwc1sxXSA9IFswXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1syXSA9IFsxLCAzXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1szXSA9IFswLCAxLCAzXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s0XSA9IFsxLCAyLCAzLCA0XS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s1XSA9IFswLCAxLCAyLCAzLCA0XS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s2XSA9IFsxLCAyLCAzLCA0LCA1LCA2XS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s3XSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2XS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s4XSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4XS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s5XSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4XS5tYXAoZ2V0VmVydGV4KTtcblxuXHRyZXR1cm4gcGlwcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb2ludHlTcXVhcmVQaXBzICgpIHtcblx0Y29uc3QgcGlwcyA9IFtdO1xuXHRjb25zdCBwaXBYID0gWzAsIDEsIDAsIC0xLCAwLCAwLjUsIC0wLjUsIDAuNSwgLTAuNV07XG5cdGNvbnN0IHBpcFkgPSBbMCwgMCwgLTEsIDAsIDEsIC0wLjUsIDAuNSwgMC41LCAtMC41XTtcblxuXHRjb25zdCBnZXRWZXJ0ZXggPSBuID0+IFtwaXBYW25dLCBwaXBZW25dXTtcblxuXHRwaXBzWzFdID0gWzBdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzJdID0gWzEsIDNdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzNdID0gWzAsIDEsIDNdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzRdID0gWzEsIDIsIDMsIDRdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzVdID0gWzAsIDEsIDIsIDMsIDRdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzZdID0gWzEsIDIsIDMsIDQsIDUsIDZdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzddID0gWzAsIDEsIDIsIDMsIDQsIDUsIDZdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzhdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzldID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLm1hcChnZXRWZXJ0ZXgpO1xuXG5cdHJldHVybiBwaXBzO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZsYXRIZXhQaXBzIChzbGljZXNYLCBzbGljZXNZKSB7XG5cdGNvbnN0IHBpcHMgPSBbXVxuXHRzbGljZXNYID0gWzBdLmNvbmNhdChzbGljZXNYKTtcblx0c2xpY2VzWSA9IFswXS5jb25jYXQoc2xpY2VzWSk7XG5cblx0Y29uc3QgZ2V0VmVydGV4ID0gbiA9PiBbc2xpY2VzWFtuXSwgc2xpY2VzWVtuXV07XG5cblx0cGlwc1sxXSA9IFswXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1syXSA9IFsxLCAxM10ubWFwKGdldFZlcnRleCk7XG5cdHBpcHNbM10gPSBbNSwgMTMsIDIxXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s0XSA9IFswLCAxLCA5LCAxN10ubWFwKGdldFZlcnRleCk7XG5cdHBpcHNbNV0gPSBbMCwgNSwgOSwgMTcsIDIxXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s2XSA9IFsxLCA1LCA5LCAxMywgMTcsIDIxXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s3XSA9IFswLCAxLCA1LCA5LCAxMywgMTcsIDIxXS5tYXAoZ2V0VmVydGV4KTtcblxuXHRyZXR1cm4gcGlwcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb2ludHlIZXhQaXBzIChzbGljZXNYLCBzbGljZXNZKSB7XG5cdGNvbnN0IHBpcHMgPSBbXVxuXHRzbGljZXNYID0gWzBdLmNvbmNhdChzbGljZXNYKTtcblx0c2xpY2VzWSA9IFswXS5jb25jYXQoc2xpY2VzWSk7XG5cblx0Y29uc3QgZ2V0VmVydGV4ID0gbiA9PiBbc2xpY2VzWFtuXSwgc2xpY2VzWVtuXV07XG5cblx0cGlwc1sxXSA9IFswXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1syXSA9IFs3LCAxOV0ubWFwKGdldFZlcnRleCk7XG5cdHBpcHNbM10gPSBbNywgMTUsIDIzXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s0XSA9IFswLCAzLCAxMSwgMTldLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzVdID0gWzAsIDMsIDExLCAxNSwgMjNdLm1hcChnZXRWZXJ0ZXgpO1xuXHRwaXBzWzZdID0gWzMsIDcsIDExLCAxNSwgMTksIDIzXS5tYXAoZ2V0VmVydGV4KTtcblx0cGlwc1s3XSA9IFswLCAzLCA3LCAxMSwgMTUsIDE5LCAyM10ubWFwKGdldFZlcnRleCk7XG5cblx0cmV0dXJuIHBpcHM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdTaGFwZXMge1xuXHRjb25zdHJ1Y3RvciAoc2V0dGluZ3MpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVFMsIHNldHRpbmdzKTtcblxuXHRcdGNvbnN0IHNpZGVzID0gdGhpcy5zZXR0aW5ncy5zaWRlcztcblx0XHRjb25zdCBzbGljZXMgPSB0aGlzLnNldHRpbmdzLnNsaWNlcztcblx0XHR0aGlzLnNsaWNlc1ggPSByYW5nZShzbGljZXMpLm1hcChzbGljZSA9PiB0b0ZpeGVkKE1hdGguY29zKCgoc2xpY2UgLyBzbGljZXMpICogc2lkZXMpICogKDIgKiBNYXRoLlBJKSAvIHNpZGVzKSkpO1xuXHRcdHRoaXMuc2xpY2VzWSA9IHJhbmdlKHNsaWNlcykubWFwKHNsaWNlID0+IHRvRml4ZWQoTWF0aC5zaW4oKChzbGljZSAvIHNsaWNlcykgKiBzaWRlcykgKiAoMiAqIE1hdGguUEkpIC8gc2lkZXMpKSk7XG5cblx0XHR0aGlzLnBpcENhY2hlID0ge307XG5cdFx0dGhpcy5taW5lQ2FjaGUgPSB7fTtcblxuXHRcdHRoaXMucGlwVmVydGljZXMgPSB7XG5cdFx0XHRbSEVYXToge1xuXHRcdFx0XHRbRkxBVF06IGdlbmVyYXRlRmxhdEhleFBpcHModGhpcy5zbGljZXNYLCB0aGlzLnNsaWNlc1kpLFxuXHRcdFx0XHRbUE9JTlRZXTogZ2VuZXJhdGVQb2ludHlIZXhQaXBzKHRoaXMuc2xpY2VzWCwgdGhpcy5zbGljZXNZKSxcblx0XHRcdH0sXG5cdFx0XHRbU1FVQVJFXToge1xuXHRcdFx0XHRbRkxBVF06IGdlbmVyYXRlRmxhdFNxdWFyZVBpcHMoKSxcblx0XHRcdFx0W1BPSU5UWV06IGdlbmVyYXRlUG9pbnR5U3F1YXJlUGlwcygpLFxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmhvcm5zID0gdGhpcy5waXBWZXJ0aWNlc1tIRVhdW0ZMQVRdWzZdLmNvbmNhdCh0aGlzLnBpcFZlcnRpY2VzW0hFWF1bUE9JTlRZXVs2XSk7XG5cdH1cblxuXHRiYWNrZ3JvdW5kIChjb250ZXh0LCBoZWlnaHQsIHdpZHRoLCBjb2xvcikge1xuXHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cdFx0Y29udGV4dC5yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gZ2V0Q29sb3IoY29sb3IpO1xuXHRcdGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cdFx0Y29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRwaXAgKGNvbnRleHQsIHNjYWxlLCBjZWxsWCwgY2VsbFksIHZlcnRleFgsIHZlcnRleFksIHBpcFJhZGl1cywgcGlwRGlzdGFuY2UpIHtcblx0XHRjb25zdCB4ID0gY2VsbFggKyAocGlwRGlzdGFuY2UgKiB2ZXJ0ZXhYKTtcblx0XHRjb25zdCB5ID0gY2VsbFkgKyAocGlwRGlzdGFuY2UgKiB2ZXJ0ZXhZKTtcblxuXHRcdGNvbnRleHQubW92ZVRvKHgsIHkpO1xuXHRcdGNvbnRleHQuYXJjKHgsIHksIHBpcFJhZGl1cywgMCwgTWF0aC5QSSoyLCB0cnVlKTtcblx0fVxuXG5cdHNldFBpcENhY2hlIChwaXBzLCBzY2FsZSkge1xuXHRcdGNvbnN0IHBpcERpc3RhbmNlID0gc2NhbGUgKiB0aGlzLnNldHRpbmdzLnBpcC5kaXN0YW5jZTsgLy8qIGNlbGwuc2NhbGU7XG5cdFx0Y29uc3QgcGlwQm9keVJhZGl1cyA9IHNjYWxlICogdGhpcy5zZXR0aW5ncy5waXAuYm9keS5zY2FsZTtcblx0XHRjb25zdCBwaXBCb3JkZXJSYWRpdXMgPSBzY2FsZSAqIHRoaXMuc2V0dGluZ3MucGlwLmJvcmRlci5zY2FsZTtcblxuXHRcdHRoaXMucGlwQ2FjaGUuc2NhbGUgPSBzY2FsZTtcblx0XHR0aGlzLnBpcENhY2hlLmhlaWdodCA9IChNYXRoLmNlaWwocGlwQm9yZGVyUmFkaXVzKSArIDEpICogMjtcblx0XHR0aGlzLnBpcENhY2hlLndpZHRoID0gdGhpcy5waXBDYWNoZS5oZWlnaHQ7XG5cblx0XHRjb25zdCBwaXBDZW50ZXIgPSB0aGlzLnBpcENhY2hlLmhlaWdodCAvIDI7XG5cblx0XHR0aGlzLnBpcENhY2hlLnBpcCA9IHF1aWNrQ2FudmFzKChjb250ZXh0LCBoZWlnaHQsIHdpZHRoKSA9PiB7XG5cdFx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y29udGV4dC5hcmMocGlwQ2VudGVyLCBwaXBDZW50ZXIsIHBpcEJvcmRlclJhZGl1cywgMCwgTWF0aC5QSSoyLCB0cnVlKTtcblx0XHRcdGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cdFx0XHRjb250ZXh0LmZpbGxTdHlsZSA9IGdldENvbG9yKHRoaXMuc2V0dGluZ3MucGlwLmJvcmRlci5jb2xvcik7XG5cdFx0XHRjb250ZXh0LmZpbGwoKTtcblxuXHRcdFx0Y29udGV4dC5iZWdpblBhdGgoKTtcblx0XHRcdGNvbnRleHQuYXJjKHBpcENlbnRlciwgcGlwQ2VudGVyLCBwaXBCb2R5UmFkaXVzLCAwLCBNYXRoLlBJKjIsIHRydWUpO1xuXHRcdFx0Y29udGV4dC5jbG9zZVBhdGgoKTtcblx0XHRcdGNvbnRleHQuZmlsbFN0eWxlID0gZ2V0Q29sb3IodGhpcy5zZXR0aW5ncy5waXAuYm9keS5jb2xvcik7XG5cdFx0XHRjb250ZXh0LmZpbGwoKTtcblx0XHR9LCB0aGlzLnBpcENhY2hlLmhlaWdodCwgdGhpcy5waXBDYWNoZS53aWR0aCk7XG5cblx0XHRjb25zdCBwaXBzQ2VudGVyID0gc2NhbGUgLSBwaXBDZW50ZXI7XG5cblx0XHR0aGlzLnBpcENhY2hlLnBpcHMgPSBwaXBzLm1hcCh2ZXJ0aWNlcyA9PiB7XG5cdFx0XHRyZXR1cm4gcXVpY2tDYW52YXMoY29udGV4dCA9PiB7XG5cdFx0XHRcdHZlcnRpY2VzLmZvckVhY2goKFtwaXBYLCBwaXBZXSkgPT4gY29udGV4dC5kcmF3SW1hZ2UodGhpcy5waXBDYWNoZS5waXAsIHBpcHNDZW50ZXIgKyAocGlwRGlzdGFuY2UgKiBwaXBYKSwgcGlwc0NlbnRlciArIChwaXBEaXN0YW5jZSAqIHBpcFkpKSk7XG5cdFx0XHR9LCBzY2FsZSAqIDIpO1xuXHRcdH0pO1xuXHR9XG5cblx0cGlwcyAoY29udGV4dCwgc2NhbGUsIHgsIHksIGNlbGwsIGFscGhhID0gMSkge1xuXHRcdGNvbnN0IHt0aWxlU3R5bGUsIG9yaWVudGF0aW9uLCBwaXBzfSA9IGNlbGw7XG5cblx0XHRpZiAodGhpcy5waXBWZXJ0aWNlc1t0aWxlU3R5bGVdXG5cdFx0JiYgdGhpcy5waXBWZXJ0aWNlc1t0aWxlU3R5bGVdW29yaWVudGF0aW9uXVxuXHRcdCYmIHRoaXMucGlwVmVydGljZXNbdGlsZVN0eWxlXVtvcmllbnRhdGlvbl1bcGlwc10pIHtcblxuXHRcdFx0aWYgKHNjYWxlICE9PSB0aGlzLnBpcENhY2hlLnNjYWxlKSB7XG5cdFx0XHRcdHRoaXMuc2V0UGlwQ2FjaGUodGhpcy5waXBWZXJ0aWNlc1t0aWxlU3R5bGVdW29yaWVudGF0aW9uXSwgc2NhbGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzY2FsZVdpZHRoID0gKHNjYWxlICogMikgKiBjZWxsLnNjYWxlO1xuXHRcdFx0Y29uc3Qgc2NhbGVIZWlnaHQgPSAoc2NhbGUgKiAyKSAqIGNlbGwuc2NhbGU7XG5cblx0XHRcdGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBhbHBoYTtcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKHRoaXMucGlwQ2FjaGUucGlwc1twaXBzXSwgeCAtIChzY2FsZVdpZHRoIC8gMiksIHkgLSAoc2NhbGVIZWlnaHQgLyAyKSwgc2NhbGVXaWR0aCwgc2NhbGVIZWlnaHQpO1xuXHRcdFx0Y29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG5cdFx0fVxuXHR9XG5cblx0bWluZSAoY29udGV4dCwgc2NhbGUsIHgsIHksIG1pbmUgPSB0aGlzLnNldHRpbmdzLm1pbmUpIHtcblx0XHRpZiAoc2NhbGUgIT09IHRoaXMubWluZUNhY2hlLnNjYWxlKSB7XG5cdFx0XHR0aGlzLnNldE1pbmVDYWNoZShzY2FsZSk7XG5cdFx0fVxuXG5cdFx0Y29udGV4dC5kcmF3SW1hZ2UodGhpcy5taW5lQ2FjaGUubWluZSwgeCAtIHNjYWxlLCB5IC0gc2NhbGUsIHNjYWxlICogMiwgc2NhbGUgKiAyKTtcblx0fVxuXG5cdHNldE1pbmVDYWNoZSAoc2NhbGUpIHtcblx0XHR0aGlzLm1pbmVDYWNoZS5zY2FsZSA9IHNjYWxlO1xuXG5cdFx0dGhpcy5taW5lQ2FjaGUubWluZSA9IHF1aWNrQ2FudmFzKGNvbnRleHQgPT4ge1xuXHRcdFx0dGhpcy5fbWluZShjb250ZXh0LCBzY2FsZSwgc2NhbGUsIHNjYWxlLCB0aGlzLnNldHRpbmdzLm1pbmUuYm9yZGVyKTtcblx0XHRcdHRoaXMuX2hvcm5zKGNvbnRleHQsIHNjYWxlLCBzY2FsZSwgc2NhbGUsIHRoaXMuc2V0dGluZ3MubWluZS5ib3JkZXIuaG9ybnMsIHRoaXMuc2V0dGluZ3MubWluZS5ib3JkZXIuY29sb3IpO1xuXHRcdFx0dGhpcy5fbWluZShjb250ZXh0LCBzY2FsZSwgc2NhbGUsIHNjYWxlLCB0aGlzLnNldHRpbmdzLm1pbmUuYm9keSk7XG5cdFx0XHR0aGlzLl9ob3Jucyhjb250ZXh0LCBzY2FsZSwgc2NhbGUsIHNjYWxlLCB0aGlzLnNldHRpbmdzLm1pbmUuYm9keS5ob3JucywgdGhpcy5zZXR0aW5ncy5taW5lLmJvZHkuY29sb3IpO1xuXHRcdH0sIHNjYWxlICogMik7XG5cdH1cblxuXHRfbWluZSAoY29udGV4dCwgc2NhbGUsIHgsIHksIG1pbmUpIHtcblx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdGNvbnRleHQubW92ZVRvKHgsIHkpO1xuXG5cdFx0Y29udGV4dC5hcmMoeCwgeSwgc2NhbGUgKiBtaW5lLnNjYWxlLCAwLCBNYXRoLlBJKjIsIHRydWUpO1xuXG5cdFx0Y29udGV4dC5jbG9zZVBhdGgoKTtcblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9IGdldENvbG9yKG1pbmUuY29sb3IpO1xuXHRcdGNvbnRleHQuZmlsbCgpO1xuXHR9XG5cblx0X2hvcm5zIChjb250ZXh0LCBzY2FsZSwgeCwgeSwgaG9ybiwgY29sb3IpIHtcblx0XHRjb25zdCBob3JuUmFkaXVzID0gc2NhbGUgKiBob3JuLnNjYWxlO1xuXHRcdGNvbnN0IGhvcm5EaXN0YW5jZSA9IHNjYWxlICogaG9ybi5kaXN0YW5jZTtcblxuXHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cblx0XHR0aGlzLmhvcm5zXG5cdFx0LmZvckVhY2goKFtob3JuWCwgaG9yblldKSA9PiB0aGlzLnBpcChjb250ZXh0LCBzY2FsZSwgeCx5LCBob3JuWCwgaG9yblksIGhvcm5SYWRpdXMsIGhvcm5EaXN0YW5jZSkpO1xuXG5cdFx0Y29udGV4dC5jbG9zZVBhdGgoKTtcblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9IGdldENvbG9yKGNvbG9yKTtcblx0XHRjb250ZXh0LmZpbGwoKTtcblx0fVxuXG5cdGV4cGxvc2lvbiAoY29udGV4dCwgc2NhbGUsIHgsIHkpIHtcblx0XHR2YXIgcGVhayA9IHNjYWxlICogMC42Njc7XG5cdFx0dmFyIHZhbGxleSA9IHNjYWxlICogMC4zMzM7XG5cblx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdGNvbnRleHQubW92ZVRvKHgseSk7XG5cblx0XHRjb250ZXh0Lm1vdmVUbyh4ICsgcGVhayAqIHRoaXMuc2xpY2VzWFswXSwgeSArIHBlYWsgKiB0aGlzLnNsaWNlc1lbMF0pO1xuXHRcdHJhbmdlKHRoaXMuc2V0dGluZ3Muc2xpY2VzKS5maWx0ZXIoc2xpY2UgPT4gc2xpY2UgJSAyID09PSAxKS5mb3JFYWNoKHNsaWNlID0+IHtcblx0XHRcdGNvbnRleHQubGluZVRvKHggKyB2YWxsZXkgKiB0aGlzLnNsaWNlc1hbc2xpY2VdLCB5ICsgdmFsbGV5ICogdGhpcy5zbGljZXNZW3NsaWNlXSk7XG5cdFx0XHRjb250ZXh0LmxpbmVUbyh4ICsgcGVhayAqIHRoaXMuc2xpY2VzWFtzbGljZSsxXSwgeSArIHBlYWsgKiB0aGlzLnNsaWNlc1lbc2xpY2UrMV0pO1xuXHRcdH0pO1xuXG5cdFx0Y29udGV4dC5jbG9zZVBhdGgoKTtcblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2IoMjU1LDAsMCknO1xuXHRcdGNvbnRleHQuZmlsbCgpO1xuXHR9XG59XG5cbiIsImltcG9ydCB7Z2V0Q29sb3IsIGludlNxcnQyLCBzcXJ0Mn0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQge0ZMQVQsIFBPSU5UWX0gZnJvbSAnLi9jb25zdHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmF3U3F1YXJlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZ3MpO1xuXG5cdFx0dGhpcy5zcXVhcmVYID0gW2ludlNxcnQyLCBpbnZTcXJ0MiwgLWludlNxcnQyLCAtaW52U3FydDJdO1xuXHRcdHRoaXMuc3F1YXJlWSA9IFtpbnZTcXJ0MiwgLWludlNxcnQyLCAtaW52U3FydDIsIGludlNxcnQyXTtcblx0XHR0aGlzLmRpYW1vbmRYID0gWzEsIDAsIC0xLCAwLCAwLjUsIC0wLjVdO1xuXHRcdHRoaXMuZGlhbW9uZFkgPSBbMCwgLTEsIDAsIDEsIC0wLjUsIDAuNV07XG5cdH1cblxuXHRmaWxsKGNvbnRleHQsIHNjYWxlLCB4LCB5LCBjZWxsKSB7XG5cdFx0c2NhbGUgPSBzY2FsZSAqIGNlbGwuc2NhbGU7XG5cdFx0bGV0IHNxdWFyZUNvcm5lclggPSBjZWxsLm9yaWVudGF0aW9uID09PSBQT0lOVFkgPyB0aGlzLmRpYW1vbmRYIDogdGhpcy5zcXVhcmVYO1xuXHRcdGxldCBzcXVhcmVDb3JuZXJZID0gY2VsbC5vcmllbnRhdGlvbiA9PT0gUE9JTlRZID8gdGhpcy5kaWFtb25kWSA6IHRoaXMuc3F1YXJlWTtcblxuXHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cdFx0Y29udGV4dC5tb3ZlVG8oeCArIHNjYWxlICogc3F1YXJlQ29ybmVyWFswXSwgeSArIHNjYWxlICogc3F1YXJlQ29ybmVyWVswXSk7XG5cdFx0Y29udGV4dC5saW5lVG8oeCArIHNjYWxlICogc3F1YXJlQ29ybmVyWFsxXSwgeSArIHNjYWxlICogc3F1YXJlQ29ybmVyWVsxXSk7XG5cdFx0Y29udGV4dC5saW5lVG8oeCArIHNjYWxlICogc3F1YXJlQ29ybmVyWFsyXSwgeSArIHNjYWxlICogc3F1YXJlQ29ybmVyWVsyXSk7XG5cdFx0Y29udGV4dC5saW5lVG8oeCArIHNjYWxlICogc3F1YXJlQ29ybmVyWFszXSwgeSArIHNjYWxlICogc3F1YXJlQ29ybmVyWVszXSk7XG5cblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9IGdldENvbG9yKGNlbGwuY29sb3IpO1xuXHRcdGNvbnRleHQuZmlsbCgpO1xuXHR9XG5cblx0b3V0bGluZShjb250ZXh0LCBzY2FsZSwgeCwgeSwgY2VsbCkge1xuXHRcdHNjYWxlID0gc2NhbGUgKiBjZWxsLnNjYWxlO1xuXHRcdGxldCBzcXVhcmVDb3JuZXJYID0gY2VsbC5vcmllbnRhdGlvbiA9PT0gUE9JTlRZID8gdGhpcy5kaWFtb25kWCA6IHRoaXMuc3F1YXJlWDtcblx0XHRsZXQgc3F1YXJlQ29ybmVyWSA9IGNlbGwub3JpZW50YXRpb24gPT09IFBPSU5UWSA/IHRoaXMuZGlhbW9uZFkgOiB0aGlzLnNxdWFyZVk7XG5cblx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdGNvbnRleHQubW92ZVRvKHggKyBzY2FsZSAqIHNxdWFyZUNvcm5lclhbMF0sIHkgKyBzY2FsZSAqIHNxdWFyZUNvcm5lcllbMF0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIHNxdWFyZUNvcm5lclhbMV0sIHkgKyBzY2FsZSAqIHNxdWFyZUNvcm5lcllbMV0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIHNxdWFyZUNvcm5lclhbMl0sIHkgKyBzY2FsZSAqIHNxdWFyZUNvcm5lcllbMl0pO1xuXHRcdGNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIHNxdWFyZUNvcm5lclhbM10sIHkgKyBzY2FsZSAqIHNxdWFyZUNvcm5lcllbM10pO1xuXHRcdGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cblx0XHRjb250ZXh0LmxpbmVXaWR0aCA9IGNlbGwud2lkdGg7XG5cdFx0Y29udGV4dC5zdHJva2VTdHlsZSA9IGdldENvbG9yKGNlbGwuY29sb3IpO1xuXHRcdGNvbnRleHQuc3Ryb2tlKCk7XG5cdH1cbn1cblxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNoYWluIChvYmopIHtcblx0bGV0IGNoYWluSW5zdGFuY2UgPSB7XG5cdFx0bG9nOiBmdW5jdGlvbiAocHJlZGljYXRlID0gKCkgPT4gdHJ1ZSkge1xuXHRcdFx0aWYgKHByZWRpY2F0ZShvYmopKSBjb25zb2xlLmxvZyhvYmopO1xuXHRcdFx0cmV0dXJuIGNoYWluSW5zdGFuY2U7XG5cdFx0fSxcblxuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gb2JqO1xuXHRcdH1cblx0fTtcblxuXHRmb3JFYWNoKF8sIGZ1bmN0aW9uIChtZXRob2QsIGtleSkge1xuXHRcdGNoYWluSW5zdGFuY2Vba2V5XSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdG9iaiA9IG1ldGhvZChvYmosIC4uLmFyZ3VtZW50cyk7XG5cdFx0XHRyZXR1cm4gY2hhaW5JbnN0YW5jZTtcblx0XHR9O1xuXHR9KTtcblxuXHRyZXR1cm4gY2hhaW5JbnN0YW5jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhY3QgKG9iaikge1xuXHRyZXR1cm4gZmlsdGVyKG9iaiwgdmFsID0+IHZhbCAhPSBudWxsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zIChvYmosIHZhbHVlKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcblx0XHRsZXQgbGVuZ3RoID0gb2JqLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpPTA7IGk8bGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChvYmpbaV0gPT09IHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRlbHNlIHtcblx0XHRmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG5cdFx0XHRpZiAob2JqW2tleV0gPT09IHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlciAob2JqLCBwcmVkaWNhdGUpIHtcblx0bGV0IHJlc3VsdCA9IHt9O1xuXG5cdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcblx0XHRyZXR1cm4gb2JqLmZpbHRlcihwcmVkaWNhdGUpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGZvckVhY2gob2JqLCAodmFsLCBrZXkpID0+IHtpZiAocHJlZGljYXRlKHZhbCwga2V5KSkgcmVzdWx0W2tleV0gPSB2YWw7fSk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZCAob2JqLCBwcmVkaWNhdGUpIHtcblxuXHRpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG5cdFx0cmV0dXJuIG9iai5maW5kKHByZWRpY2F0ZSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Zm9yIChsZXQga2V5IGluIG9iaikge1xuXHRcdFx0aWYgKHByZWRpY2F0ZShvYmpba2V5XSkpIHJldHVybiBvYmpba2V5XTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4gKG9iaikge1xuXHRpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG5cdFx0cmV0dXJuIG9iai5yZWR1Y2UoKG1lbW8sIGVsZW1lbnQpID0+IG1lbW8uY29uY2F0KEFycmF5LmlzQXJyYXkoZWxlbWVudCkgPyBmbGF0dGVuKGVsZW1lbnQpIDogZWxlbWVudCksIFtdKTtcblx0fVxuXHRlbHNlIHtcblx0XHRyZXR1cm4gcmVkdWNlKChmbGF0LCBwcm9wKSA9PiBmbGF0LmNvbmNhdChwcm9wKSwgW10pXG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2ggKG9iaiwgaXRlcmF0ZWUpIHtcblx0aWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuXHRcdC8vIG5hdGl2ZSAnZm9yRWFjaCcgYnV0IHRoZSByZXR1cm4gYmVsb3cgYWxsb3dzIHVzIHRvIGNoYWluXG5cdFx0b2JqLmZvckVhY2goaXRlcmF0ZWUpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGZvciAobGV0IGtleSBpbiBvYmopIHtcblx0XHRcdGl0ZXJhdGVlKG9ialtrZXldLCBrZXksIG9iaik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnkgKG9iaiwgaXRlcmF0ZWUpIHtcblx0bGV0IHJlc3VsdCA9IHt9O1xuXG5cblx0Zm9yRWFjaChvYmosIHZhbCA9PiB7XG5cdFx0bGV0IGtleSA9IHR5cGVvZiBpdGVyYXRlZSA9PT0gJ3N0cmluZycgPyB2YWxbaXRlcmF0ZWVdIDogaXRlcmF0ZWUodmFsKTtcblxuXHRcdHJlc3VsdFtrZXldID0gcmVzdWx0W2tleV0gfHwgW107XG5cdFx0cmVzdWx0W2tleV0ucHVzaCh2YWwpO1xuXHR9KTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkgKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcCAob2JqLCBpdGVyYXRlZSkge1xuXHRsZXQgcmVzdWx0ID0gW107XG5cblx0aWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuXHRcdC8vIG5hdGl2ZSAnbWFwJyBidXQgdGhlIHJldHVybiBiZWxvdyBhbGxvd3MgdXMgdG8gY2hhaW5cblx0XHRyZXR1cm4gb2JqLm1hcChpdGVyYXRlZSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Zm9yRWFjaChvYmosICh2YWx1ZSwga2V5KSA9PiB7XG5cdFx0XHRyZXN1bHQucHVzaChpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmopKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcblx0cmV0dXJuIG9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpICYmICFBcnJheS5pc0FycmF5KG9iaikgPyB0cnVlIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhcyAob2JqLCBwcm9wKSB7XG5cdHJldHVybiBvYmogJiYgb2JqLmhhc093blByb3BlcnR5KHByb3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwT2JqIChvYmosIGl0ZXJhdGVlKSB7XG5cdGxldCByZXN1bHQgPSB7fTtcblxuXHRpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG5cdFx0Zm9yRWFjaChvYmosICh2YWx1ZSwgaW5kZXgpID0+IHtcblx0XHRcdGxldCByZXR1cm5lZCA9IGl0ZXJhdGVlKHZhbHVlLCBpbmRleCwgb2JqKTtcblxuXHRcdFx0aWYgKGlzT2JqZWN0KHJldHVybmVkKSAmJiBoYXMocmV0dXJuZWQsICdrZXknKSAmJiBoYXMocmV0dXJuZWQsICd2YWx1ZScpKSB7XG5cdFx0XHRcdHJlc3VsdFtyZXR1cm5lZC5rZXldID0gcmV0dXJuZWQudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2luZGV4XSA9IHJldHVybmVkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGZvckVhY2gob2JqLCAodmFsdWUsIGtleSkgPT4ge1xuXHRcdFx0bGV0IHJldHVybmVkID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqKTtcblxuXHRcdFx0aWYgKGlzT2JqZWN0KHJldHVybmVkKSAmJiBoYXMocmV0dXJuZWQsICdrZXknKSAmJiBoYXMocmV0dXJuZWQsICd2YWx1ZScpKSB7XG5cdFx0XHRcdHJlc3VsdFtyZXR1cm5lZC5rZXldID0gcmV0dXJuZWQudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSByZXR1cm5lZDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXggKG9iaiA9IFtdLCBpdGVyYXRlZSkge1xuXHRsZXQgbWF4ID0gLUluZmluaXR5O1xuXG5cdGlmICghaXRlcmF0ZWUpIHtcblx0XHRmb3JFYWNoKG9iaiwgdmFsdWUgPT4gbWF4ID0gdmFsdWUgPiBtYXggPyB2YWx1ZSA6IG1heCk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0bGV0IGxhc3RDb21wdXRlZCA9IC1JbmZpbml0eTtcblxuXHRcdGZvckVhY2gob2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSA9PiB7XG5cdFx0XHRsZXQgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGxpc3QpO1xuXG5cdFx0XHRpZiAoY29tcHV0ZWQgPiBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IC1JbmZpbml0eSAmJiBtYXggPT09IC1JbmZpbml0eSkge1xuXHRcdFx0XHRtYXggPSB2YWx1ZTtcblx0XHRcdFx0bGFzdENvbXB1dGVkID0gY29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gbWF4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWluIChvYmogPSBbXSwgaXRlcmF0ZWUpIHtcblx0bGV0IG1pbiA9IEluZmluaXR5O1xuXG5cdGlmICghaXRlcmF0ZWUpIHtcblx0XHRmb3JFYWNoKG9iaiwgdmFsdWUgPT4gbWluID0gdmFsdWUgPCBtaW4gPyB2YWx1ZSA6IG1pbik7XG5cdH1cblx0ZWxzZSB7XG5cdFx0bGV0IGxhc3RDb21wdXRlZCA9IEluZmluaXR5O1xuXG5cdFx0Zm9yRWFjaChvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpID0+IHtcblx0XHRcdGxldCBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlLCBpbmRleCwgbGlzdCk7XG5cblx0XHRcdGlmIChjb21wdXRlZCA8IGxhc3RDb21wdXRlZCB8fCBjb21wdXRlZCA9PT0gSW5maW5pdHkgJiYgbWluID09PSBJbmZpbml0eSkge1xuXHRcdFx0XHRtaW4gPSB2YWx1ZTtcblx0XHRcdFx0bGFzdENvbXB1dGVkID0gY29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb21pdCAob2JqLCBrZXlzKSB7XG5cdGxldCByZXN1bHQgPSB7fTtcblxuXHRmb3JFYWNoKG9iaiwgKHZhbHVlLCBrZXkpID0+IHtcblx0XHRpZiAoIWNvbnRhaW5zKGtleXMsIGtleSkpIHtcblx0XHRcdHJlc3VsdFtrZXldID0gdmFsdWU7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGljayAob2JqLCBrZXlzKSB7XG5cdGxldCByZXN1bHQgPSB7fTtcblxuXHRrZXlzLmZvckVhY2goa2V5ID0+IHtcblx0XHRpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHJlc3VsdFtrZXldID0gb2JqW2tleV07XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UgKHNpemUsIGl0ZXJhdGVlID0gaWRlbnRpdHkpIHtcblxuXHRyZXR1cm4gQXJyYXkuZnJvbShBcnJheShzaXplKSwgKHZhbHVlLCBpbmRleCkgPT4gaXRlcmF0ZWUoaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZSAob2JqID0gW10sIGl0ZXJhdGVlLCBtZW1vID0gb2JqWzBdICE9IG51bGwgPyBvYmpbMF0gOiAwKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcblx0XHRyZXR1cm4gb2JqLnJlZHVjZShpdGVyYXRlZSwgbWVtbyk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Zm9yRWFjaChvYmosICh2YWwsIGtleSwgb2JqKSA9PiB7XG5cdFx0XHRtZW1vID0gaXRlcmF0ZWUobWVtbywgdmFsLCBrZXksIG9iaik7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gbWVtbztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdCAob2JqLCBwcmVkaWNhdGUpIHtcblx0cmV0dXJuIGZpbHRlcihvYmosICh2YWwsIGtleSwgb2JqKSA9PiAhcHJlZGljYXRlKHZhbCwga2V5LCBvYmopKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUgKG9iaiwgcHJlZGljYXRlID0gaWRlbnRpdHkpIHtcblx0cmV0dXJuIGZpbmQob2JqLCBwcmVkaWNhdGUpID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG5leHBvcnQgbGV0IF8gPSB7XG5cdGNvbXBhY3QsXG5cdGNvbnRhaW5zLFxuXHRmaWx0ZXIsXG5cdGZpbmQsXG5cdGZsYXR0ZW4sXG5cdGZvckVhY2gsXG5cdGdyb3VwQnksXG5cdGlkZW50aXR5LFxuXHRtYXAsXG5cdG1hcE9iaixcblx0bWF4LFxuXHRtaW4sXG5cdG9taXQsXG5cdHBpY2ssXG5cdHJhbmdlLFxuXHRyZWR1Y2UsXG5cdHJlamVjdCxcblx0c29tZVxufTtcblxuIiwiaW1wb3J0IFBvaW50IGZyb20gJy4vcG9pbnQuanMnO1xuXG5mdW5jdGlvbiBjb21wdXRlWSh4LCB6KSB7XG5cdHJldHVybiAteCAtIHo7XG59XG5cbi8vIGNvbnZlcnQgcmVhbCBudW1iZXJzIHRvIGludGVnZXJzOlxuLy8gICByb3VuZCBvZmYgY29vcmRzXG4vLyAgIHRocm93IG91dCB3aGljaGV2ZXIgb25lIGNoYW5nZWQgdGhlIG1vc3Rcbi8vICAgcmUtZXN0YWJsaXNoIFwieCArIHkgKyB6ID0gMFwiXG5mdW5jdGlvbiByb3VuZE9mZihoZXgpIHtcblx0bGV0IHJYID0gTWF0aC5yb3VuZChoZXgueCk7XG5cdGxldCByWSA9IE1hdGgucm91bmQoaGV4LnkpO1xuXHRsZXQgclogPSBNYXRoLnJvdW5kKGhleC56KTtcblxuXHRsZXQgeERpZmYgPSBNYXRoLmFicyhyWCAtIGhleC54KTtcblx0bGV0IHlEaWZmID0gTWF0aC5hYnMoclkgLSBoZXgueSk7XG5cdGxldCB6RGlmZiA9IE1hdGguYWJzKHJaIC0gaGV4LnopO1xuXG5cdGlmICgoeERpZmYgPiB5RGlmZikgJiYgKHhEaWZmID4gekRpZmYpKSB7XG5cdFx0clggPSAtclktclo7XG5cdH1cblx0ZWxzZSBpZiAoeURpZmYgPiB6RGlmZikge1xuXHRcdHJZID0gLXJYLXJaO1xuXHR9XG5cdGVsc2Uge1xuXHRcdHJaID0gLXJYLXJZO1xuXHR9XG5cblx0aGV4LnggPSByWCA9PT0gLTAgPyAwIDogclg7XG5cdGhleC55ID0gclkgPT09IC0wID8gMCA6IHJZO1xuXHRoZXgueiA9IHJaID09PSAtMCA/IDAgOiByWjtcblxuXHRyZXR1cm4gaGV4O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZXggZXh0ZW5kcyBQb2ludCB7XG5cdHN0YXRpYyBxclRvQ3ViZSAocSwgcikge1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiBxLFxuXHRcdFx0eTogY29tcHV0ZVkocSwgciksXG5cdFx0XHR6OiByLFxuXHRcdH07XG5cdH1cblxuXHRzdGF0aWMgY3ViZVRvRXZlblIgKHt4LCB5LCB6fSkge1xuXHRcdGNvbnN0IGNvbCA9IHggKyAoeiArICh6ICYgMSkpIC8gMjs7XG5cdFx0Y29uc3Qgcm93ID0gejtcblxuXHRcdHJldHVybiB7Y29sLCByb3d9O1xuXHR9XG5cblx0c3RhdGljIGV2ZW5SVG9DdWJlIChjb2wsIHJvdykge1xuXHRcdGNvbnN0IHggPSBjb2wgLSAocm93ICsgKHJvdyAmIDEpKSAvIDI7O1xuXHRcdGNvbnN0IHogPSByb3c7XG5cdFx0Y29uc3QgeSA9IC14IC0gejtcblxuXHRcdHJldHVybiBuZXcgSGV4KHgsIHksIHopO1xuXHR9XG5cblx0c3RhdGljIGN1YmVUb0V2ZW5RICh7eCwgeSwgen0pIHtcblx0XHRjb25zdCBjb2wgPSB4O1xuXHRcdGNvbnN0IHJvdyA9IHogKyAoeCArICh4ICYgMSkpIC8gMjtcblxuXHRcdHJldHVybiB7Y29sLCByb3d9O1xuXHR9XG5cblx0c3RhdGljIGV2ZW5RVG9DdWJlIChjb2wsIHJvdykge1xuXHRcdGNvbnN0IHggPSBjb2w7XG5cdFx0Y29uc3QgeiA9IHJvdyAtIChjb2wgKyAoY29sICYgMSkpIC8gMjtcblx0XHRjb25zdCB5ID0gLXggLSB6O1xuXG5cdFx0cmV0dXJuIG5ldyBIZXgoeCwgeSwgeik7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdGNvbnN0IHtxLCByLCBzID0gLXEgLSByfSA9IGFyZ3VtZW50c1swXTtcblx0XHRcdGNvbnN0IHt4LCB6LCB5ID0gLXggLSB6fSA9IGFyZ3VtZW50c1swXTtcblxuXHRcdFx0dGhpcy54ID0gIWlzTmFOKHEpID8gcSA6IHg7XG5cdFx0XHR0aGlzLnkgPSAhaXNOYU4ocykgPyBzIDogeTtcblx0XHRcdHRoaXMueiA9ICFpc05hTihyKSA/IHIgOiB6O1xuXHRcdH1cblx0XHRlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IC8vIGhleCA9IEhleChxLCByKTtcblx0XHRcdHRoaXMueCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHRoaXMueiA9IGFyZ3VtZW50c1sxXTtcblx0XHRcdHRoaXMueSA9IGNvbXB1dGVZKHRoaXMueCwgdGhpcy56KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgeyAvLyBoZXggPSBIZXgoeCwgeSwgeik7XG5cdFx0XHR0aGlzLnggPSBhcmd1bWVudHNbMF07XG5cdFx0XHR0aGlzLnkgPSBhcmd1bWVudHNbMV07XG5cdFx0XHR0aGlzLnogPSBhcmd1bWVudHNbMl07XG5cdFx0fVxuXG5cdFx0cm91bmRPZmYodGhpcyk7XG5cdH1cblxuXHRnZXRYKCkge3JldHVybiB0aGlzLng7fVxuXHRnZXRZKCkge3JldHVybiB0aGlzLnk7fVxuXHRnZXRaKCkge3JldHVybiB0aGlzLno7fVxuXG5cdHNldFggKG5ld1gpIHt0aGlzLnggPSBuZXdYOyByZXR1cm4gdGhpczt9XG5cdHNldFkgKG5ld1kpIHt0aGlzLnkgPSBuZXdZOyByZXR1cm4gdGhpczt9XG5cdHNldFogKG5ld1opIHt0aGlzLnogPSBuZXdaOyByZXR1cm4gdGhpczt9XG5cblx0bW92ZVggKGJ5WCkge3RoaXMueCArPSBieVg7IHJldHVybiB0aGlzO31cblx0bW92ZVkgKGJ5WSkge3RoaXMueSArPSBieVk7IHJldHVybiB0aGlzO31cblx0bW92ZVogKGJ5Wikge3RoaXMueiArPSBieVo7IHJldHVybiB0aGlzO31cblxuXHRnZXRRICgpIHtyZXR1cm4gdGhpcy54O31cblx0Z2V0UiAoKSB7cmV0dXJuIHRoaXMuejt9XG5cblx0c2V0USAobmV3USkge1xuXHRcdHRoaXMueCA9IG5ld1E7XG5cdFx0dGhpcy55ID0gY29tcHV0ZVkodGhpcy54LCB0aGlzLnopO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0c2V0UiAobmV3Uikge1xuXHRcdHRoaXMueiA9IG5ld1I7XG5cdFx0dGhpcy55ID0gY29tcHV0ZVkodGhpcy54LCB0aGlzLnopO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0bW92ZVEgKGJ5USkge1xuXHRcdHRoaXMueCArPSBieVE7XG5cdFx0dGhpcy55ID0gY29tcHV0ZVkodGhpcy54LCB0aGlzLnopO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0bW92ZVIgKGJ5Uikge1xuXHRcdHRoaXMueiArPSBieVI7XG5cdFx0dGhpcy55ID0gY29tcHV0ZVkodGhpcy54LCB0aGlzLnopO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Z2V0UG9pbnQgKCkgeyByZXR1cm4ge3g6IHRoaXMueCwgeTogdGhpcy55LCB6OiB0aGlzLnp9OyB9XG5cblx0c2V0SGV4IChuZXdIZXgpIHtcblx0XHR0aGlzLnggPSBuZXdIZXgueDtcblx0XHR0aGlzLnkgPSBuZXdIZXgueTsgXG5cdFx0dGhpcy56ID0gbmV3SGV4Lno7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0bW92ZUhleCAoYnlIZXgpIHtcblx0XHR0aGlzLnggKz0gYnlIZXgueDtcblx0XHR0aGlzLnkgKz0gYnlIZXgueTtcblx0XHR0aGlzLnogKz0gYnlIZXguejtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHN1YnRyYWN0SGV4IChoZXgpIHtcblx0XHR0aGlzLnggLT0gaGV4Lng7XG5cdFx0dGhpcy55IC09IGhleC55O1xuXHRcdHRoaXMueiAtPSBoZXguejtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Z2V0QXhpYWwgKCkge3JldHVybiB7cTogdGhpcy54LCByOiB0aGlzLnp9O31cblxuXHRzZXRBeGlhbCAobmV3QXhpYWwpIHtcblx0XHR0aGlzLnggPSBuZXdBeGlhbC5xO1xuXHRcdHRoaXMueiA9IG5ld0F4aWFsLnI7XG5cdFx0dGhpcy55ID0gY29tcHV0ZVkodGhpcy54LCB0aGlzLnkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0bW92ZUF4aWFsIChieUF4aWFsKSB7XG5cdFx0dGhpcy54ICs9IGJ5QXhpYWwucTtcblx0XHR0aGlzLnogKz0gYnlBeGlhbC5yO1xuXHRcdHRoaXMueSA9IGNvbXB1dGVZKHRoaXMueCwgdGhpcy56KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGRpc3RhbmNlIChoZXgpIHtcblx0XHRyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnModGhpcy54IC0gaGV4LngpLCBNYXRoLmFicyh0aGlzLnkgLSBoZXgueSksIE1hdGguYWJzKHRoaXMueiAtIGhleC56KSk7XG5cdH1cbn1cbiIsImltcG9ydCB7aGFzLCBoeXBvdGVudXNlLCBub29wfSBmcm9tICcuL3V0aWxzLmpzJztcblxuY29uc3QgTU9EVUxFID0gJ29uVGFwJztcblxuY29uc3QgREVGQVVMVFMgPSB7XG5cdGRlYnVnOiBmYWxzZSxcblxuXHRlbGVtZW50OiBkb2N1bWVudC5ib2R5LFxuXG5cdGRlc2t0b3BQcmVzczogZmFsc2UsXG5cblx0dGFwOiAgICAgICAgbm9vcCxcblx0dGFwU3RhcnQ6ICAgbm9vcCxcblx0bW92ZTogICAgICAgbm9vcCxcblx0ZG91YmxldGFwOiAgbm9vcCxcblx0cHJlc3M6ICAgICAgbm9vcCxcblx0cHJlc3NTdGFydDogbm9vcCxcblx0em9vbTogICAgICAgbm9vcCxcblxuXHRtb3ZlVGhyZXNob2xkOiA1LFxuXHRkb3VibGV0YXBUaHJlc2hvbGQ6IDUwMCxcblx0cHJlc3NUaHJlc2hvbGQ6IDMwMCxcblxuXHR3aGVlbEZhY3RvcjogLTEwMCxcbn07XG5cbmNvbnN0IGV2ZW50cyA9IFtcblx0J2NvbnRleHRtZW51JyxcblxuXHQnbW91c2Vkb3duJyxcblx0J21vdXNldXAnLFxuXHQnbW91c2Vtb3ZlJyxcblxuXHQndG91Y2hzdGFydCcsXG5cdCd0b3VjaGVuZCcsXG5cdCd0b3VjaG1vdmUnLFxuXHQndG91Y2hjYW5jZWwnLFxuXG5cdCd3aGVlbCcsXG5dO1xuXG5jb25zdCBtZXRob2RzID0gW1xuXHQnZXZlbnRIYW5kbGVyJyxcblxuXHQndGFwU3RhcnQnLFxuXHQncHJlc3NTdGFydCcsXG5dLmNvbmNhdChldmVudHMpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPblRhcCB7XG5cdGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRTLCBzZXR0aW5ncyk7XG5cblx0XHR0aGlzLnN0YXRlID0ge1xuXHRcdFx0dGFwU3RhcnRUaW1lOiBudWxsLFxuXHRcdH07XG5cblx0XHRtZXRob2RzLmZvckVhY2gobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblx0XHRldmVudHMuZm9yRWFjaChldmVudE5hbWUgPT4gdGhpcy5zZXR0aW5ncy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudCA9PiB0aGlzLmV2ZW50SGFuZGxlcihldmVudCwgZXZlbnROYW1lKSkpO1xuXHR9XG5cblx0ZXZlbnRIYW5kbGVyIChldmVudCwgZXZlbnROYW1lKSB7XG5cdFx0ZXZlbnQudGltZVN0YW1wVVRDID0gRGF0ZS5ub3coKTtcblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbJHsgTU9EVUxFIH1dWyR7IGV2ZW50TmFtZSB9XWAsIGV2ZW50KTtcblxuXHRcdHRoaXNbZXZlbnROYW1lXShldmVudCk7XG5cdH1cblxuXHRjb250ZXh0bWVudShldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdH1cblxuXHR0YXBTdGFydChldmVudCkge1xuXHRcdGlmICghdGhpcy5zdGF0ZS50YXBTdGFydFRpbWUpIHtcblx0XHRcdGNvbnN0IHttb2JpbGV9ID0gZXZlbnQ7XG5cdFx0XHR0aGlzLnN0YXRlLnRhcFN0YXJ0VGltZSA9IGV2ZW50LnRpbWVTdGFtcFVUQztcblxuXHRcdFx0aWYgKG1vYmlsZSB8fCB0aGlzLnNldHRpbmdzLmRlc2t0b3BQcmVzcykge1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5zdGF0ZS5wcmVzc1RPKTtcblxuXHRcdFx0XHR0aGlzLnN0YXRlLnByZXNzVE8gPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnByZXNzU3RhcnQoe1xuXHRcdFx0XHRcdFx0bW9iaWxlLFxuXHRcdFx0XHRcdFx0dGltZVN0YW1wVVRDOiBEYXRlLm5vdygpLFxuXHRcdFx0XHRcdFx0b2Zmc2V0WDogdGhpcy5zdGF0ZS5sYXN0WCxcblx0XHRcdFx0XHRcdG9mZnNldFk6IHRoaXMuc3RhdGUubGFzdFksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0sIHRoaXMuc2V0dGluZ3MucHJlc3NUaHJlc2hvbGQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldHRpbmdzLnRhcFN0YXJ0KGV2ZW50KTtcblx0XHR9XG5cdH1cblxuXHRtb3VzZWRvd24oZXZlbnQpIHtcblx0XHRPYmplY3QuYXNzaWduKGV2ZW50LCB7XG5cdFx0XHRtb2JpbGU6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zdGF0ZS5sYXN0WCA9IGV2ZW50Lm9mZnNldFg7XG5cdFx0dGhpcy5zdGF0ZS5sYXN0WSA9IGV2ZW50Lm9mZnNldFk7XG5cblx0XHRpZiAoZXZlbnQud2hpY2ggJiYgZXZlbnQud2hpY2ggIT09IDEpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3MucHJlc3NTdGFydChldmVudCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy50YXBTdGFydChldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0dG91Y2hzdGFydChldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRPYmplY3QuYXNzaWduKGV2ZW50LCB7XG5cdFx0XHRtb2JpbGU6IHRydWUsXG5cdFx0fSk7XG5cblx0XHRjb25zdCB0b3VjaGVzID0gWy4uLmV2ZW50LnRvdWNoZXNdO1xuXHRcdGV2ZW50Lm9mZnNldFggPSB0b3VjaGVzLnJlZHVjZSgobWVtbywgdG91Y2gpID0+IG1lbW8gKyB0b3VjaC5wYWdlWCwgMCkgLyB0b3VjaGVzLmxlbmd0aDtcblx0XHRldmVudC5vZmZzZXRZID0gdG91Y2hlcy5yZWR1Y2UoKG1lbW8sIHRvdWNoKSA9PiBtZW1vICsgdG91Y2gucGFnZVksIDApIC8gdG91Y2hlcy5sZW5ndGg7XG5cblx0XHR0aGlzLnN0YXRlLmxhc3RYID0gZXZlbnQub2Zmc2V0WDtcblx0XHR0aGlzLnN0YXRlLmxhc3RZID0gZXZlbnQub2Zmc2V0WTtcblxuXHRcdGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdHRoaXMuc3RhdGUuc2NhbGVTdGFydCA9IGh5cG90ZW51c2UodG91Y2hlc1swXS5wYWdlWCAtIHRvdWNoZXNbMV0ucGFnZVgsIHRvdWNoZXNbMF0ucGFnZVkgLSB0b3VjaGVzWzFdLnBhZ2VZKTtcblx0XHRcdHRoaXMuc3RhdGUucGluY2hpbmcgPSB0cnVlO1xuXHRcdFx0dGhpcy5zdGF0ZS5sYXN0UGluY2ggPSAxO1xuXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5zdGF0ZS5wcmVzc1RPKTtcblx0XHR9XG5cblx0XHR0aGlzLnRhcFN0YXJ0KGV2ZW50KTtcblx0fVxuXG5cdHByZXNzU3RhcnQoZXZlbnQpIHtcblx0XHR0aGlzLnNldHRpbmdzLnByZXNzU3RhcnQoZXZlbnQpO1xuXHR9XG5cblx0bW91c2V1cChldmVudCkge1xuXHRcdE9iamVjdC5hc3NpZ24oZXZlbnQsIHtcblx0XHRcdG1vYmlsZTogZmFsc2UsXG5cdFx0XHRkdXJhdGlvbjogZXZlbnQudGltZVN0YW1wVVRDIC0gdGhpcy5zdGF0ZS50YXBTdGFydFRpbWUsXG5cdFx0fSk7XG5cblx0XHRpZiAoIXRoaXMuc3RhdGUubW92aW5nKSB7XG5cdFx0XHRjb25zdCByaWdodENsaWNrID0gKGV2ZW50LndoaWNoICYmIGV2ZW50LndoaWNoICE9PSAxKSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5O1xuXHRcdFx0Y29uc3QgcHJlc3MgPSB0aGlzLnNldHRpbmdzLmRlc2t0b3BQcmVzcyAmJiBldmVudC5kdXJhdGlvbiA+PSB0aGlzLnNldHRpbmdzLnByZXNzVGhyZXNob2xkO1xuXG5cdFx0XHRpZiAocmlnaHRDbGljayB8fCBwcmVzcykge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnByZXNzKGV2ZW50KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5zdGF0ZS5wcmVzc1RPKTtcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy50YXAoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuc3RhdGUubW92aW5nID0gbnVsbDtcblx0XHR0aGlzLnN0YXRlLmxhc3RYID0gbnVsbDtcblx0XHR0aGlzLnN0YXRlLmxhc3RZID0gbnVsbDtcblx0XHR0aGlzLnN0YXRlLnRhcFN0YXJ0VGltZSA9IG51bGw7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuc3RhdGUucHJlc3NUTyk7XG5cdH1cblxuXHR0b3VjaGVuZChldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRPYmplY3QuYXNzaWduKGV2ZW50LCB7XG5cdFx0XHRtb2JpbGU6IHRydWUsXG5cdFx0XHRkdXJhdGlvbjogZXZlbnQudGltZVN0YW1wVVRDIC0gdGhpcy5zdGF0ZS50YXBTdGFydFRpbWUsXG5cdFx0fSk7XG5cblx0XHRjb25zdCB0b3VjaGVzID0gWy4uLmV2ZW50LnRvdWNoZXNdO1xuXG5cdFx0aWYgKHRvdWNoZXMubGVuZ3RoKSB7XG5cdFx0XHRldmVudC5vZmZzZXRYID0gdG91Y2hlcy5yZWR1Y2UoKG1lbW8sIHRvdWNoKSA9PiBtZW1vICsgdG91Y2gucGFnZVgsIDApIC8gdG91Y2hlcy5sZW5ndGg7XG5cdFx0XHRldmVudC5vZmZzZXRZID0gdG91Y2hlcy5yZWR1Y2UoKG1lbW8sIHRvdWNoKSA9PiBtZW1vICsgdG91Y2gucGFnZVksIDApIC8gdG91Y2hlcy5sZW5ndGg7XG5cblx0XHRcdHRoaXMuc3RhdGUubGFzdFggPSBldmVudC5vZmZzZXRYO1xuXHRcdFx0dGhpcy5zdGF0ZS5sYXN0WSA9IGV2ZW50Lm9mZnNldFk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZXZlbnQub2Zmc2V0WCA9IHRoaXMuc3RhdGUubGFzdFg7XG5cdFx0XHRldmVudC5vZmZzZXRZID0gdGhpcy5zdGF0ZS5sYXN0WTtcblx0XHR9XG5cblx0XHRpZiAoISh0aGlzLnN0YXRlLm1vdmluZyB8fCB0aGlzLnN0YXRlLnBpbmNoaW5nKSkge1xuXHRcdFx0aWYgKGV2ZW50LmR1cmF0aW9uID49IHRoaXMuc2V0dGluZ3MucHJlc3NUaHJlc2hvbGQpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5wcmVzcyhldmVudCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuc3RhdGUucHJlc3NUTyk7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MudGFwKGV2ZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPD0gMSkge1xuXHRcdFx0dGhpcy5zdGF0ZS5waW5jaGluZyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zdGF0ZS5zY2FsZVN0YXJ0ID0gbnVsbDtcblx0XHRcdHRoaXMuc3RhdGUubGFzdFBpbmNoID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMuc3RhdGUubW92aW5nID0gbnVsbDtcblx0XHRcdHRoaXMuc3RhdGUubGFzdFggPSBudWxsO1xuXHRcdFx0dGhpcy5zdGF0ZS5sYXN0WSA9IG51bGw7XG5cdFx0XHR0aGlzLnN0YXRlLnRhcFN0YXJ0VGltZSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0bW91c2Vtb3ZlKGV2ZW50KSB7XG5cdFx0aWYgKHRoaXMuc3RhdGUudGFwU3RhcnRUaW1lKSB7XG5cdFx0XHRpZiAoIXRoaXMuc3RhdGUubW92aW5nKSB7XG5cdFx0XHRcdGlmICgoTWF0aC5hYnMoZXZlbnQub2Zmc2V0WCAtIHRoaXMuc3RhdGUubGFzdFgpID4gdGhpcy5zZXR0aW5ncy5tb3ZlVGhyZXNob2xkKVxuXHRcdFx0XHR8fCAoTWF0aC5hYnMoZXZlbnQub2Zmc2V0WSAtIHRoaXMuc3RhdGUubGFzdFkpID4gdGhpcy5zZXR0aW5ncy5tb3ZlVGhyZXNob2xkKSkge1xuXHRcdFx0XHRcdHRoaXMuc3RhdGUubW92aW5nID0gdHJ1ZTtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5zdGF0ZS5wcmVzc1RPKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZS5tb3ZpbmcpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihldmVudCwge1xuXHRcdFx0XHRcdG1vYmlsZTogZmFsc2UsXG5cdFx0XHRcdFx0ZGVsdGFYOiBldmVudC5vZmZzZXRYIC0gdGhpcy5zdGF0ZS5sYXN0WCxcblx0XHRcdFx0XHRkZWx0YVk6IGV2ZW50Lm9mZnNldFkgLSB0aGlzLnN0YXRlLmxhc3RZLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLm1vdmUoZXZlbnQpO1xuXG5cdFx0XHRcdHRoaXMuc3RhdGUubGFzdFggPSBldmVudC5vZmZzZXRYO1xuXHRcdFx0XHR0aGlzLnN0YXRlLmxhc3RZID0gZXZlbnQub2Zmc2V0WTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0b3VjaG1vdmUoZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKHRoaXMuc3RhdGUudGFwU3RhcnRUaW1lKSB7XG5cdFx0XHRjb25zdCB0b3VjaGVzID0gWy4uLmV2ZW50LnRvdWNoZXNdO1xuXG5cdFx0XHRpZiAoIWhhcyhldmVudCwgJ3NjYWxlJykpIHtcblx0XHRcdFx0ZXZlbnQuc2NhbGUgPSB0b3VjaGVzLmxlbmd0aCA8IDIgPyAxIDpcblx0XHRcdFx0XHRoeXBvdGVudXNlKHRvdWNoZXNbMF0ucGFnZVggLSB0b3VjaGVzWzFdLnBhZ2VYLCB0b3VjaGVzWzBdLnBhZ2VZIC0gdG91Y2hlc1sxXS5wYWdlWSkgLyB0aGlzLnN0YXRlLnNjYWxlU3RhcnQ7XG5cdFx0XHR9XG5cblx0XHRcdE9iamVjdC5hc3NpZ24oZXZlbnQsIHtcblx0XHRcdFx0b2Zmc2V0WDogdG91Y2hlcy5yZWR1Y2UoKG1lbW8sIHRvdWNoKSA9PiBtZW1vICsgdG91Y2gucGFnZVgsIDApIC8gdG91Y2hlcy5sZW5ndGgsXG5cdFx0XHRcdG9mZnNldFk6IHRvdWNoZXMucmVkdWNlKChtZW1vLCB0b3VjaCkgPT4gbWVtbyArIHRvdWNoLnBhZ2VZLCAwKSAvIHRvdWNoZXMubGVuZ3RoLFxuXHRcdFx0XHRzY2FsZVN0ZXA6IGV2ZW50LnNjYWxlIC8gdGhpcy5zdGF0ZS5sYXN0UGluY2gsXG5cdFx0XHRcdG1vYmlsZTogdHJ1ZSxcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZS5waW5jaGluZykge1xuXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3Muem9vbShldmVudCk7XG5cblx0XHRcdFx0dGhpcy5zdGF0ZS5sYXN0UGluY2ggPSBldmVudC5zY2FsZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLnN0YXRlLm1vdmluZykge1xuXHRcdFx0XHRpZiAoKE1hdGguYWJzKGV2ZW50Lm9mZnNldFggLSB0aGlzLnN0YXRlLmxhc3RYKSA+IHRoaXMuc2V0dGluZ3MubW92ZVRocmVzaG9sZClcblx0XHRcdFx0fHwgKE1hdGguYWJzKGV2ZW50Lm9mZnNldFkgLSB0aGlzLnN0YXRlLmxhc3RZKSA+IHRoaXMuc2V0dGluZ3MubW92ZVRocmVzaG9sZCkpIHtcblx0XHRcdFx0XHR0aGlzLnN0YXRlLm1vdmluZyA9IHRydWU7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuc3RhdGUucHJlc3NUTyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuc3RhdGUubW92aW5nKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24oZXZlbnQsIHtcblx0XHRcdFx0XHRkZWx0YVg6IGV2ZW50Lm9mZnNldFggLSB0aGlzLnN0YXRlLmxhc3RYLFxuXHRcdFx0XHRcdGRlbHRhWTogZXZlbnQub2Zmc2V0WSAtIHRoaXMuc3RhdGUubGFzdFksXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MubW92ZShldmVudCk7XG5cblx0XHRcdFx0dGhpcy5zdGF0ZS5sYXN0WCA9IGV2ZW50Lm9mZnNldFg7XG5cdFx0XHRcdHRoaXMuc3RhdGUubGFzdFkgPSBldmVudC5vZmZzZXRZO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRvdWNoY2FuY2VsKGV2ZW50KSB7XG5cdFx0Y29uc29sZS5sb2coJ3RvdWNoY2FuY2VsJywgZXZlbnQpO1xuXHR9XG5cblx0d2hlZWwoZXZlbnQpIHtcblx0XHRPYmplY3QuYXNzaWduKGV2ZW50LCB7XG5cdFx0XHRzY2FsZVN0ZXA6IDEgKyAoZXZlbnQuZGVsdGFZIC8gdGhpcy5zZXR0aW5ncy53aGVlbEZhY3RvciksXG5cdFx0XHRtb2JpbGU6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zZXR0aW5ncy56b29tKGV2ZW50KTtcblx0fVxufVxuXG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50IHtcblx0Y29uc3RydWN0b3IoeCwgeSkge1xuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdHkgPSB4Lnk7XG5cdFx0XHR4ID0geC54O1xuXHRcdH1cblxuXHRcdC8vIGFkZCB6ZXJvIHRvIHR1cm4gLTAgaW50byAwXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCh4KSArIDA7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCh5KSArIDA7XG5cdH1cblxuXHRnZXRYKCkgeyByZXR1cm4gdGhpcy54OyB9XG5cdGdldFkoKSB7IHJldHVybiB0aGlzLnk7IH1cblxuXHRzZXRYKG5ld1gpIHsgdGhpcy54ID0gbmV3WDsgfVxuXHRzZXRZKG5ld1kpIHsgdGhpcy55ID0gbmV3WTsgfVxuXG5cdGdldFBvaW50KCkgeyByZXR1cm4ge3g6IHRoaXMueCwgeTogdGhpcy55fTsgfVxufVxuIiwiaW1wb3J0IHtnZXRDb2xvciwgbm9vcH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNrZXRjaCB7XG5cdGNvbnN0cnVjdG9yIChzZXR0aW5ncykge1xuXHRcdHRoaXMubGFzdE5vdyA9IG51bGw7XG5cblx0XHRbXG5cdFx0XHQnZ2V0Q29udGV4dCcsXG5cdFx0XHQnZ2V0U2l6ZScsXG5cdFx0XHQnb25SZXNpemUnLFxuXHRcdFx0J3JlbmRlcicsXG5cdFx0XS5tYXAobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuZHJhdyA9IHNldHRpbmdzLmRyYXcgfHwgbm9vcDtcblx0XHR0aGlzLnJlc2l6ZSA9IHNldHRpbmdzLnJlc2l6ZSB8fCBub29wO1xuXHRcdHRoaXMuY29udGFpbmVyID0gc2V0dGluZ3MuZWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25SZXNpemUpO1xuXG5cdFx0dGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblx0XHR0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoO1xuXHRcdHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcblxuXHRcdHRoaXMuY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cblx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIpO1xuXHR9XG5cblx0Z2V0Q29udGV4dCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29udGV4dDtcblx0fVxuXG5cdGdldFNpemUgKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjYW52YXNXaWR0aDogdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGgsXG5cdFx0XHRjYW52YXNIZWlnaHQ6IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodCxcblx0XHR9XG5cdH1cblxuXHRvblJlc2l6ZSAoZXZlbnQpIHtcblx0XHRjb25zdCB3aWR0aCA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoO1xuXHRcdGNvbnN0IGhlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcblxuXHRcdGNvbnN0IG9sZFdpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG5cdFx0Y29uc3Qgb2xkSGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG5cdFx0Y29uc3QgZGVsdGFYID0gd2lkdGggLSBvbGRXaWR0aDtcblx0XHRjb25zdCBkZWx0YVkgPSBoZWlnaHQgLSBvbGRIZWlnaHQ7XG5cblx0XHR0aGlzLmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuXHRcdHRoaXMuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuXHRcdE9iamVjdC5hc3NpZ24oZXZlbnQsIHtcblx0XHRcdGhlaWdodCwgd2lkdGgsXG5cdFx0XHRvbGRIZWlnaHQsIG9sZFdpZHRoLFxuXHRcdFx0ZGVsdGFYLCBkZWx0YVksXG5cdFx0fSk7XG5cblx0XHR0aGlzLnJlc2l6ZShldmVudCk7XG5cdH1cblxuXHRyZW5kZXIgKG5vdykge1xuXHRcdHRoaXMuY29udGV4dC5sYXN0VVRDID0gdGhpcy5jb250ZXh0LnV0YyB8fCBudWxsO1xuXHRcdHRoaXMuY29udGV4dC51dGMgPSBEYXRlLm5vdygpO1xuXG5cdFx0dGhpcy5jb250ZXh0Lm5vdyA9IG5vdztcblx0XHR0aGlzLmNvbnRleHQubGFzdE5vdyA9IHRoaXMubGFzdE5vdztcblxuXHRcdGNvbnN0IGRyYXdEZWxheSA9IHRoaXMuZHJhdyh0aGlzLmNvbnRleHQpO1xuXG5cdFx0dGhpcy5sYXN0Tm93ID0gbm93O1xuXG5cdFx0aWYgKGRyYXdEZWxheSkgc2V0VGltZW91dCgoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIpLCBkcmF3RGVsYXkpO1xuXHRcdGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyKTtcblx0fVxufVxuXG4iLCJpbXBvcnQgUG9pbnQgZnJvbSAnLi9wb2ludC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNxdWFyZSBleHRlbmRzIFBvaW50IHtcblx0Y29uc3RydWN0b3IoeCwgeSkge1xuXHRcdHN1cGVyKHgsIHkpO1xuXHR9XG59XG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCAqIGFzIGZ1bmt5IGZyb20gJy4vZnVua3knO1xuXG5pbXBvcnQgT25UYXAgZnJvbSAnLi9vblRhcC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnLi9wb2ludC5qcyc7XG5pbXBvcnQgU2tldGNoIGZyb20gJy4vc2tldGNoLmpzJztcblxuaW1wb3J0IERyYXdTaGFwZXMgIGZyb20gJy4vZHJhd1NoYXBlcy5qcyc7XG5pbXBvcnQgRHJhd0NpcmNsZSAgZnJvbSAnLi9kcmF3Q2lyY2xlLmpzJztcbmltcG9ydCBEcmF3U3F1YXJlICBmcm9tICcuL2RyYXdTcXVhcmUuanMnO1xuaW1wb3J0IERyYXdIZXhhZ29uIGZyb20gJy4vZHJhd0hleGFnb24uanMnO1xuXG5pbXBvcnQgQ2VsbCBmcm9tICcuL2NlbGwuanMnO1xuXG5pbXBvcnQgQ2FydG9ncmFwaGVyRmxhdFhZIGZyb20gJy4vY2FydG9ncmFwaGVyRmxhdFhZLmpzJztcbmltcG9ydCBDYXJ0b2dyYXBoZXJQb2ludHlYWSBmcm9tICcuL2NhcnRvZ3JhcGhlclBvaW50eVhZLmpzJztcbmltcG9ydCBDYXJ0b2dyYXBoZXJGbGF0WFlaIGZyb20gJy4vY2FydG9ncmFwaGVyRmxhdFhZWi5qcyc7XG5pbXBvcnQgQ2FydG9ncmFwaGVyUG9pbnR5WFlaIGZyb20gJy4vY2FydG9ncmFwaGVyUG9pbnR5WFlaLmpzJztcblxuaW1wb3J0IHtcblx0SEVYLCBDSVJDTEUsIFNRVUFSRSxcblx0VElMRV9TVFlMRVMsXG5cdEJPQVJEX1NUWUxFUyxcblx0RkxBVCwgUE9JTlRZLFxuXHRPUklFTlRBVElPTl9TVFlMRVMsXG5cdEZJTEwsIE9VVExJTkUsXG5cdERSQVdfU1RZTEVTLFxufSBmcm9tICcuL2NvbnN0cy5qcyc7XG5cbmNvbnN0IFRJTEVTID0ge1xuXHRbSEVYXTogICAgbmV3IERyYXdIZXhhZ29uKCksXG5cdFtDSVJDTEVdOiBuZXcgRHJhd0NpcmNsZSgpLFxuXHRbU1FVQVJFXTogbmV3IERyYXdTcXVhcmUoKSxcbn07XG5cbmNvbnN0IFNoYXBlcyA9IG5ldyBEcmF3U2hhcGVzKCk7XG5cbmNvbnN0IERFRkFVTFRTID0ge1xuXHR0aWxlOiBIRVgsXG5cdGJvYXJkOiBIRVgsXG5cdG9yaWVudGF0aW9uOiBGTEFULFxuXHRuZWdhdGl2ZVRpbGVzOiB0cnVlLFxuXG5cdHRhcDogdXRpbHMubm9vcCxcblx0cHJlc3NTdGFydDogdXRpbHMubm9vcCxcblx0cHJlc3M6IHV0aWxzLm5vb3AsXG5cblx0ZHJhdzogdXRpbHMubm9vcCxcbn07XG5cbmZ1bmN0aW9uIHNlbGVjdENhcnRvZ3JhcGhlcihib2FyZCwgb3JpZW50YXRpb24pIHtcblx0c3dpdGNoIChib2FyZCkge1xuXHRcdGNhc2UgSEVYOlxuXHRcdFx0c3dpdGNoIChvcmllbnRhdGlvbikge1xuXHRcdFx0XHRjYXNlIEZMQVQ6IHJldHVybiBDYXJ0b2dyYXBoZXJGbGF0WFlaO1xuXHRcdFx0XHRjYXNlIFBPSU5UWTogcmV0dXJuIENhcnRvZ3JhcGhlclBvaW50eVhZWjtcblx0XHRcdH1cblx0XHRjYXNlIFNRVUFSRTpcblx0XHRcdHN3aXRjaCAob3JpZW50YXRpb24pIHtcblx0XHRcdFx0Y2FzZSBGTEFUOiByZXR1cm4gQ2FydG9ncmFwaGVyRmxhdFhZO1xuXHRcdFx0XHRjYXNlIFBPSU5UWTogcmV0dXJuIENhcnRvZ3JhcGhlclBvaW50eVhZO1xuXHRcdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBUZXNzZWxsYXRlIHtcblx0c3RhdGljIGdldCBUSUxFX1NUWUxFUygpICAgICAgICB7cmV0dXJuIFRJTEVfU1RZTEVTfVxuXHRzdGF0aWMgZ2V0IEJPQVJEX1NUWUxFUygpICAgICAgIHtyZXR1cm4gQk9BUkRfU1RZTEVTfVxuXHRzdGF0aWMgZ2V0IE9SSUVOVEFUSU9OX1NUWUxFUygpIHtyZXR1cm4gT1JJRU5UQVRJT05fU1RZTEVTfVxuXHRzdGF0aWMgZ2V0IERSQVdfU1RZTEVTKCkgICAgICAgIHtyZXR1cm4gRFJBV19TVFlMRVN9XG5cblx0c3RhdGljIGdldCBUSUxFUygpICB7cmV0dXJuIFRJTEVTfVxuXHRzdGF0aWMgZ2V0IENlbGwoKSAgIHtyZXR1cm4gQ2VsbH1cblx0c3RhdGljIGdldCBTaGFwZXMoKSB7cmV0dXJuIFNoYXBlc31cblxuXHRzdGF0aWMgZ2V0IHV0aWxzKCkge3JldHVybiB1dGlsc31cblx0c3RhdGljIGdldCBmdW5reSgpIHtyZXR1cm4gZnVua3l9XG5cblx0Y29uc3RydWN0b3IgKHNldHRpbmdzKSB7XG5cdFx0W1xuXHRcdFx0J2NoZWNrU2V0dGluZ3MnLFxuXHRcdFx0J3RhcCcsXG5cdFx0XHQnZG91YmxldGFwJyxcblx0XHRcdCdwcmVzc1N0YXJ0Jyxcblx0XHRcdCdwcmVzcycsXG5cdFx0XHQnbW92ZScsXG5cdFx0XHQnem9vbScsXG5cdFx0XHQncGl4ZWxUb1RpbGUnLFxuXHRcdFx0J3RpbGVUb1BpeGVsJyxcblx0XHRcdCdnZXRMb2NhdGlvblNldHMnLFxuXHRcdFx0J2RyYXcnLFxuXHRcdFx0J3Jlc2l6ZScsXG5cdFx0XHQncmVtYXAnLFxuXHRcdF0ubWFwKG1ldGhvZCA9PiB7dGhpc1ttZXRob2RdID0gdGhpc1ttZXRob2RdLmJpbmQodGhpcyl9KTtcblxuXHRcdHRoaXMuaW50ZXJhY3RlZCA9IERhdGUubm93KCk7XG5cblx0XHR0aGlzLmNoZWNrU2V0dGluZ3Moc2V0dGluZ3MpO1xuXG5cdFx0dGhpcy5za2V0Y2ggPSBuZXcgU2tldGNoKHtcblx0XHRcdGVsZW1lbnQ6IHRoaXMuc2V0dGluZ3MuZWxlbWVudCxcblx0XHRcdGRyYXc6IHRoaXMuZHJhdyxcblx0XHRcdHJlc2l6ZTogdGhpcy5yZXNpemUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm9uVGFwID0gbmV3IE9uVGFwKE9iamVjdC5hc3NpZ24oe1xuXHRcdFx0ZWxlbWVudDogdGhpcy5zZXR0aW5ncy5lbGVtZW50LFxuXHRcdFx0dGFwOiB0aGlzLnRhcCxcblx0XHRcdGRvdWJsZXRhcDogdGhpcy5kb3VibGV0YXAsXG5cdFx0XHRwcmVzc1N0YXJ0OiB0aGlzLnByZXNzU3RhcnQsXG5cdFx0XHRwcmVzczogdGhpcy5wcmVzcyxcblx0XHRcdG1vdmU6IHRoaXMubW92ZSxcblx0XHRcdHpvb206IHRoaXMuem9vbSxcblx0XHR9LCBmdW5reS5waWNrKHRoaXMuc2V0dGluZ3MsIFsnZGVza3RvcFByZXNzJywgJ21vdmVUaHJlc2hvbGQnLCAnZG91YmxldGFwVGhyZXNob2xkJywgJ3ByZXNzVGhyZXNob2xkJywgJ3doZWVsRmFjdG9yJ10pKSk7XG5cblx0XHRjb25zdCBjYXJ0b2dyYXBoZXIgPSBzZWxlY3RDYXJ0b2dyYXBoZXIodGhpcy5zZXR0aW5ncy5ib2FyZCwgdGhpcy5zZXR0aW5ncy5vcmllbnRhdGlvbik7XG5cdFx0dGhpcy5jYXJ0b2dyYXBoZXIgPSBuZXcgY2FydG9ncmFwaGVyKE9iamVjdC5hc3NpZ24odGhpcy5za2V0Y2guZ2V0U2l6ZSgpLCBmdW5reS5waWNrKHRoaXMuc2V0dGluZ3MsIFtcblx0XHRcdCdhZGp1c3RTY2FsZU1pbicsXG5cdFx0XHQnY2VudGVyWCcsXG5cdFx0XHQnY2VudGVyWScsXG5cdFx0XHQnaGVpZ2h0Jyxcblx0XHRcdCduZWdhdGl2ZVRpbGVzJyxcblx0XHRcdCdyYWRpdXMnLFxuXHRcdFx0J3NjYWxlJyxcblx0XHRcdCd3aWR0aCcsXG5cdFx0XHQnd3JhcCcsXG5cdFx0XSkpKTtcblx0fVxuXG5cdGNoZWNrU2V0dGluZ3MgKHNldHRpbmdzKSB7XG5cblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVFMsIHNldHRpbmdzKTtcblx0XHR0aGlzLnNldHRpbmdzLmVsZW1lbnQgPSB0aGlzLnNldHRpbmdzLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHRoaXMuc2V0dGluZ3MuZWxlbWVudCA6XG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuc2V0dGluZ3MuZWxlbWVudCk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5yYWRpdXMpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3MuaGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5yYWRpdXMgKiAyICsgMTtcblx0XHRcdHRoaXMuc2V0dGluZ3Mud2lkdGggPSB0aGlzLnNldHRpbmdzLnJhZGl1cyAqIDIgKyAxO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLm5lZ2F0aXZlVGlsZXMpIHtcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmhlaWdodCAmJiAodGhpcy5zZXR0aW5ncy5oZWlnaHQgJSAyID09PSAwKSkge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmhlaWdodCsrO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy53aWR0aCAmJiAodGhpcy5zZXR0aW5ncy53aWR0aCAlIDIgPT09IDApKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3Mud2lkdGgrKztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0YXAgKGV2ZW50KSB7XG5cdFx0Y29uc3QgcG9pbnQgPSBuZXcgUG9pbnQoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG5cdFx0Y29uc3QgdGlsZSA9IHRoaXMuY2FydG9ncmFwaGVyLnBpeGVsVG9UaWxlKHBvaW50KTtcblx0XHRjb25zdCBtYXBUaWxlID0gdGhpcy5jYXJ0b2dyYXBoZXIudGVsZXBvcnQodGlsZSk7XG5cblx0XHR0aGlzLmludGVyYWN0ZWQgPSBEYXRlLm5vdygpO1xuXG5cdFx0dGhpcy5zZXR0aW5ncy50YXAoe1xuXHRcdFx0ZXZlbnQsXG5cdFx0XHRtYXBUaWxlLFxuXHRcdFx0cG9pbnQsXG5cdFx0XHR0aWxlLFxuXHRcdH0pO1xuXHR9XG5cblx0ZG91YmxldGFwIChldmVudCkge1xuXHRcdGNvbnNvbGUubG9nKCdET1VCTEVUQVAnLCBldmVudCk7XG5cdFx0Y29uc3QgcG9pbnQgPSBuZXcgUG9pbnQoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG5cdFx0Y29uc3QgdGlsZSA9IHRoaXMuY2FydG9ncmFwaGVyLnBpeGVsVG9UaWxlKHBvaW50KTtcblx0XHRjb25zdCBtYXBUaWxlID0gdGhpcy5jYXJ0b2dyYXBoZXIudGVsZXBvcnQodGlsZSk7XG5cblx0XHR0aGlzLmludGVyYWN0ZWQgPSB0cnVlO1xuXHRcdHRoaXMuaW50ZXJhY3RlZCA9IERhdGUubm93KCk7XG5cblx0XHRsZXQgdGFwID0ge1xuXHRcdFx0ZXZlbnQsXG5cdFx0XHRtYXAsXG5cdFx0XHRtYXBUaWxlLFxuXHRcdFx0cG9pbnQsXG5cdFx0XHR0aWxlXG5cdFx0fTtcblxuXHRcdGNvbnNvbGUubG9nKHRhcCk7XG5cdH1cblxuXHRwcmVzc1N0YXJ0IChldmVudCkge1xuXHRcdGNvbnN0IHBvaW50ID0gbmV3IFBvaW50KGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuXHRcdGNvbnN0IHRpbGUgPSB0aGlzLmNhcnRvZ3JhcGhlci5waXhlbFRvVGlsZShwb2ludCk7XG5cdFx0Y29uc3QgbWFwVGlsZSA9IHRoaXMuY2FydG9ncmFwaGVyLnRlbGVwb3J0KHRpbGUpO1xuXG5cdFx0dGhpcy5pbnRlcmFjdGVkID0gdHJ1ZTtcblx0XHR0aGlzLmludGVyYWN0ZWQgPSBEYXRlLm5vdygpO1xuXG5cdFx0dGhpcy5zZXR0aW5ncy5wcmVzc1N0YXJ0KHtcblx0XHRcdGV2ZW50LFxuXHRcdFx0bWFwVGlsZSxcblx0XHRcdHBvaW50LFxuXHRcdFx0dGlsZSxcblx0XHR9KTtcblx0fVxuXG5cdHByZXNzIChldmVudCkge1xuXHRcdGNvbnN0IHBvaW50ID0gbmV3IFBvaW50KGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuXHRcdGNvbnN0IHRpbGUgPSB0aGlzLmNhcnRvZ3JhcGhlci5waXhlbFRvVGlsZShwb2ludCk7XG5cdFx0Y29uc3QgbWFwVGlsZSA9IHRoaXMuY2FydG9ncmFwaGVyLnRlbGVwb3J0KHRpbGUpO1xuXG5cdFx0dGhpcy5pbnRlcmFjdGVkID0gdHJ1ZTtcblx0XHR0aGlzLmludGVyYWN0ZWQgPSBEYXRlLm5vdygpO1xuXG5cdFx0dGhpcy5zZXR0aW5ncy5wcmVzcyh7XG5cdFx0XHRldmVudCxcblx0XHRcdG1hcFRpbGUsXG5cdFx0XHRwb2ludCxcblx0XHRcdHRpbGUsXG5cdFx0fSk7XG5cdH1cblxuXHRtb3ZlIChldmVudCkge1xuXHRcdHRoaXMuaW50ZXJhY3RlZCA9IERhdGUubm93KCk7XG5cdFx0cmV0dXJuIHRoaXMuY2FydG9ncmFwaGVyLm1vdmUoZXZlbnQpO1xuXHR9XG5cblx0em9vbSAoZXZlbnQpIHtcblx0XHR0aGlzLmludGVyYWN0ZWQgPSBEYXRlLm5vdygpO1xuXHRcdHRoaXMuY2FydG9ncmFwaGVyLnpvb20oZXZlbnQpO1xuXHR9XG5cblx0cGl4ZWxUb1RpbGUgKHgsIHkpIHtcblx0XHRyZXR1cm4gdGhpcy5jYXJ0b2dyYXBoZXIucGl4ZWxUb1RpbGUoeCwgeSk7XG5cdH1cblxuXHR0aWxlVG9QaXhlbCAodGlsZVBvaW50KSB7XG5cdFx0cmV0dXJuIHRoaXMuY2FydG9ncmFwaGVyLnRpbGVUb1BpeGVsKHRpbGVQb2ludCk7XG5cdH1cblxuXHRuZXdMb2NhdGlvbiAoY29ybmVycykge1xuXHRcdHRoaXMubGFzdExvY2F0aW9uID0gdGhpcy5sYXN0TG9jYXRpb24gfHwge307XG5cblx0XHRjb25zdCBjdXJyZW50TG9jYXRpb24gPSB1dGlscy5leHRlbmQoe1xuXHRcdFx0c2NhbGU6IHRoaXMuY2FydG9ncmFwaGVyLmdldFNjYWxlKCksXG5cdFx0XHRvcmlnaW5YOiB0aGlzLmNhcnRvZ3JhcGhlci5nZXRPcmlnaW5YKCksXG5cdFx0XHRvcmlnaW5ZOiB0aGlzLmNhcnRvZ3JhcGhlci5nZXRPcmlnaW5ZKCksXG5cdFx0fSwgY29ybmVycyk7XG5cblx0XHRjb25zdCBjaGFuZ2VkID0gZnVua3kucmVkdWNlKGN1cnJlbnRMb2NhdGlvbiwgKHNhbWUsIHZhbCwga2V5KSA9PiBzYW1lIHx8IHRoaXMubGFzdExvY2F0aW9uW2tleV0gIT09IHZhbCwgZmFsc2UpO1xuXG5cdFx0dGhpcy5sYXN0TG9jYXRpb24gPSBjdXJyZW50TG9jYXRpb247XG5cblx0XHRyZXR1cm4gY2hhbmdlZDtcblx0fVxuXG5cdGdldExvY2F0aW9uU2V0cyAoY29ybmVycykge1xuXHRcdGNvbnN0IHt1cHBlckxlZnRYLCB1cHBlckxlZnRZLCBsb3dlclJpZ2h0WCwgbG93ZXJSaWdodFl9ID0gY29ybmVycztcblxuXHRcdGNvbnN0IHVwcGVyTGVmdCA9ICBuZXcgUG9pbnQodXBwZXJMZWZ0WCwgdXBwZXJMZWZ0WSk7XG5cdFx0Y29uc3QgdXBwZXJSaWdodCA9IG5ldyBQb2ludChsb3dlclJpZ2h0WCwgMCk7XG5cdFx0Y29uc3QgbG93ZXJMZWZ0ID0gIG5ldyBQb2ludCgwLCBsb3dlclJpZ2h0WSk7XG5cdFx0Y29uc3QgbG93ZXJSaWdodCA9IG5ldyBQb2ludChsb3dlclJpZ2h0WCwgbG93ZXJSaWdodFkpO1xuXG5cdFx0cmV0dXJuIHRoaXMuY2FydG9ncmFwaGVyLmJvdW5kaW5nQm94KHVwcGVyTGVmdCwgdXBwZXJSaWdodCwgbG93ZXJMZWZ0LCBsb3dlclJpZ2h0KTtcblx0fVxuXG5cdGRyYXcgKGNvbnRleHQpIHtcblx0XHRjb25zdCBjYW52YXMgPSBjb250ZXh0LmNhbnZhcztcblx0XHRjb25zdCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXHRcdGNvbnN0IHdpZHRoID0gY2FudmFzLndpZHRoO1xuXG5cdFx0Y29uc3QgY29ybmVycyA9IHtcblx0XHRcdHVwcGVyTGVmdFg6IDAsXG5cdFx0XHR1cHBlckxlZnRZOiAwLFxuXHRcdFx0bG93ZXJSaWdodFg6IHdpZHRoLFxuXHRcdFx0bG93ZXJSaWdodFk6IGhlaWdodFxuXHRcdH07XG5cblx0XHRjb25zdCBtb3ZlZCA9IHRoaXMubmV3TG9jYXRpb24oY29ybmVycyk7XG5cdFx0dGhpcy5sb2NhdGlvblNldHMgPSBtb3ZlZCA/IHRoaXMuZ2V0TG9jYXRpb25TZXRzKGNvcm5lcnMpIDogdGhpcy5sb2NhdGlvblNldHM7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncy5kcmF3KHtcblx0XHRcdGNvbnRleHQsXG5cblx0XHRcdGhlaWdodCwgd2lkdGgsXG5cdFx0XHRzY2FsZTogdGhpcy5jYXJ0b2dyYXBoZXIuZ2V0U2NhbGUoKSxcblxuXHRcdFx0bGFzdE5vdzogY29udGV4dC5sYXN0VVRDLFxuXHRcdFx0bm93OiBjb250ZXh0LnV0YyxcblxuXHRcdFx0bW92ZWQsXG5cdFx0XHRpbnRlcmFjdGVkOiB0aGlzLmludGVyYWN0ZWQsXG5cdFx0XHRsb2NhdGlvblNldHM6IHRoaXMubG9jYXRpb25TZXRzLFxuXHRcdH0pO1xuXHR9XG5cblx0cmVzaXplIChldmVudCkge1xuXHRcdGNvbnN0IG9yaWdpblggPSB0aGlzLmNhcnRvZ3JhcGhlci5nZXRPcmlnaW5YKCk7XG5cdFx0Y29uc3Qgb3JpZ2luWSA9IHRoaXMuY2FydG9ncmFwaGVyLmdldE9yaWdpblkoKTtcblx0XHRjb25zdCBzY2FsZU9yaWcgPSB0aGlzLmNhcnRvZ3JhcGhlci5nZXRTY2FsZSgpO1xuXG5cdFx0Y29uc3QgbW92ZUZvclJlc2l6ZSA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LCB7XG5cdFx0XHRkZWx0YVg6IGV2ZW50LmRlbHRhWCAvIDIsXG5cdFx0XHRkZWx0YVk6IGV2ZW50LmRlbHRhWSAvIDIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vdmUobW92ZUZvclJlc2l6ZSk7XG5cblx0XHR0aGlzLmNhcnRvZ3JhcGhlci5jaGVja1NjYWxlKGV2ZW50LmhlaWdodCwgZXZlbnQud2lkdGgpO1xuXG5cdFx0Y29uc3QgY2VudGVyWCA9IGV2ZW50LndpZHRoIC8gMjtcblx0XHRjb25zdCBjZW50ZXJZID0gZXZlbnQuaGVpZ2h0IC8gMjtcblx0XHRjb25zdCBzY2FsZU5ldyA9IHRoaXMuY2FydG9ncmFwaGVyLmdldFNjYWxlKCk7XG5cblx0XHRjb25zdCBtb3ZlRm9yU2NhbGUgPSB7XG5cdFx0XHRkZWx0YVg6ICgoKGNlbnRlclggLSBvcmlnaW5YKSAvIHNjYWxlT3JpZykgKiAoc2NhbGVPcmlnIC0gc2NhbGVOZXcpKSxcblx0XHRcdGRlbHRhWTogKCgoY2VudGVyWSAtIG9yaWdpblkpIC8gc2NhbGVPcmlnKSAqIChzY2FsZU9yaWcgLSBzY2FsZU5ldykpLFxuXHRcdFx0aGVpZ2h0OiBldmVudC5oZWlnaHQsXG5cdFx0XHR3aWR0aDogZXZlbnQud2lkdGgsXG5cdFx0fTtcblxuXHRcdHRoaXMubW92ZShtb3ZlRm9yU2NhbGUpO1xuXHR9XG5cblx0cmVtYXAgKHtoZWlnaHQsIHdpZHRofSkge1xuXHRcdHRoaXMuY2FydG9ncmFwaGVyLnJlbWFwKE9iamVjdC5hc3NpZ24oe1xuXHRcdFx0aGVpZ2h0LFxuXHRcdFx0d2lkdGgsXG5cdFx0fSwgdGhpcy5za2V0Y2guZ2V0U2l6ZSgpKSk7XG5cdH1cbn1cbiIsImltcG9ydCB7Zm9yRWFjaCwgbWFwT2JqfSBmcm9tICcuL2Z1bmt5LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxuLy8gaHlwb3RlbnVzZSBmYWN0b3Igb2YgaXNvc2NlbGVzZSByaWdodCB0cmlhbmdsZVxuZXhwb3J0IGNvbnN0IHNxcnQyID0gTWF0aC5zcXJ0KDIpO1xuXG4vLyBzaG9ydCB3aWR0aCBmYWN0b3IgZ2l2ZW4gdGhlIGxlbmdodCBvZiBhIGhleGFnb24ncyBzaWRlXG4vLyAoMipTIGdpdmVzIGxvbmcgd2lkdGgpXG5leHBvcnQgY29uc3Qgc3FydDMgPSBNYXRoLnNxcnQoMyk7XG5cbi8vIGxlZyBmYWN0b3Igb2YgaXNvc2NlbGVzZSByaWdodCB0cmlhbmdsZSB3aXRoIHVuaXQgaHlwb3RlbnVzZVxuZXhwb3J0IGNvbnN0IGludlNxcnQyID0gMSAvIHNxcnQyXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShvYmopIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXMob2JqLCBwcm9wKSB7XG5cdHJldHVybiBvYmogJiYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCAocHJvcCBpbiBvYmopKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh5cG90ZW51c2UoYSwgYikge1xuXHRpZiAoYiA9PSBudWxsKSBiID0gYTtcblxuXHRyZXR1cm4gTWF0aC5zcXJ0KGEqYSArIGIqYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7XG5cdHJldHVybiBvYmogJiYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSAmJiAhQXJyYXkuaXNBcnJheShvYmopID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4KSB7XG5cdGlmIChBcnJheS5pc0FycmF5KG1pbikpIHtcblx0XHRyZXR1cm4gbWluW3JhbmRvbShtaW4ubGVuZ3RoIC0gMSldO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtaW4gPT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIG1pbltyYW5kb20oT2JqZWN0LmtleXMobWluKSldO1xuXHR9XG5cblx0aWYgKG1heCA9PSBudWxsKSB7XG5cdFx0bWF4ID0gbWluO1xuXHRcdG1pbiA9IDA7XG5cdH1cblxuXHRyZXR1cm4gbWluICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlIChzdGFydCwgZW5kKSB7XG5cdGlmIChlbmQgPT0gbnVsbCkge1xuXHRcdGVuZCA9IHN0YXJ0O1xuXHRcdHN0YXJ0ID0gMDtcblx0fVxuXG5cdGlmIChzdGFydCA+IGVuZCkge1xuXHRcdGNvbnN0IHN3YXAgPSBzdGFydDtcblxuXHRcdHN0YXJ0ID0gZW5kO1xuXHRcdGVuZCA9IHN3YXA7XG5cdH1cblxuXHRyZXR1cm4gQXJyYXkuZnJvbShBcnJheShNYXRoLmFicyhlbmQgLSBzdGFydCkpLCAoX3ZhbHVlLCBpbmRleCkgPT4gaW5kZXggKyBzdGFydCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5nZUluY2x1c2l2ZShzdGFydCwgZW5kKSB7XG5cdGlmIChlbmQgPT0gbnVsbCkge1xuXHRcdGVuZCA9IHN0YXJ0O1xuXHRcdHN0YXJ0ID0gMDtcblx0fVxuXG5cdHJldHVybiByYW5nZShNYXRoLm1pbihzdGFydCwgZW5kKSwgTWF0aC5tYXgoc3RhcnQsIGVuZCkrMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVN0cmluZ1BhcmFtZXRlcnMgKHF1ZXJ5U3RyaW5nID0gZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLCBzZXBhcmF0b3IgPSAnJicsIGFzc2lnbm1lbnQgPSAnPScpIHtcblx0bGV0IHBhcmFtZXRlcnMgPSB7fTtcblxuXHRxdWVyeVN0cmluZ1xuXHQucmVwbGFjZSgvKF5cXD8pLywnJylcblx0LnNwbGl0KHNlcGFyYXRvcilcblx0LmZvckVhY2gocGFpciA9PiB7XG5cdFx0cGFpciA9IHBhaXIuc3BsaXQoYXNzaWdubWVudCk7XG5cdFx0cGFyYW1ldGVyc1twYWlyWzBdXSA9IHBhaXJbMV07XG5cdH0pO1xuXG5cdHJldHVybiBwYXJhbWV0ZXJzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVlcnlTdHJpbmdPYmogKHF1ZXJ5U3RyaW5nID0gZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLCBzZXBhcmF0b3IgPSAnJicsIGFzc2lnbm1lbnQgPSAnPScpIHtcblx0cmV0dXJuIG1hcE9iaihnZXRRdWVyeVN0cmluZ1BhcmFtZXRlcnMocXVlcnlTdHJpbmcsIHNlcGFyYXRvciwgYXNzaWdubWVudCksIHBhcnNlU3RyaW5nKTtcbn1cblxuY29uc3QgYnJhY2VkID0gL157Lip9JC87XG5jb25zdCBicmFja2V0ZWQgPSAvXlxcWy4qXFxdJC87XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN0cmluZyAoc3RyKSB7XG5cdHJldHVybiB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyA/IHN0ciA6XG5cdFx0c3RyLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyA/IHRydWUgOlxuXHRcdHN0ci50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnID8gZmFsc2UgOlxuXHRcdHN0ci50b0xvd2VyQ2FzZSgpID09PSAnbnVsbCcgPyBudWxsIDpcblx0XHRzdHIudG9Mb3dlckNhc2UoKSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOlxuXHRcdCFpc05hTihOdW1iZXIoc3RyKSkgPyBOdW1iZXIoc3RyKSA6XG5cdFx0YnJhY2VkLnRlc3Qoc3RyKSB8fCBicmFja2V0ZWQudGVzdChzdHIpID8gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoc3RyKSkgOlxuXHRcdHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRml4ZWQobnVtYmVyLCBwcmVjaXNpb24gPSAzLCBmYWxsYmFjayA9IE5hTikge1xuXHRyZXR1cm4gdHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG51bWJlcikgPyBOdW1iZXIobnVtYmVyLnRvRml4ZWQocHJlY2lzaW9uKSkgOiBmYWxsYmFjaztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbG9yICh7cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGF9KSB7XG5cdHJldHVybiBhbHBoYSAhPSBudWxsID8gYHJnYmEoJHsgcmVkIH0sICR7IGdyZWVuIH0sICR7IGJsdWUgfSwgJHsgYWxwaGEgfSlgIDpcblx0XHRgcmdiKCR7IHJlZCB9LCAkeyBncmVlbiB9LCAkeyBibHVlIH0pYDtcbn1cblxuY29uc3QgR1JBWV9GQUNUT1IgPSB7XG5cdHJlZDogMC4yOTksXG5cdGdyZWVuOiAwLjU4Nyxcblx0Ymx1ZTogMC4xMTQsXG59O1xuXG4vLyBncmF5c2NhbGUgYWNjb3VudGluZyBmb3IgbHVtaW5vc2l0eVxuZXhwb3J0IGZ1bmN0aW9uIGdyYXlzY2FsZSAoe3JlZCwgZ3JlZW4sIGJsdWV9KSB7XG5cdHJldHVybiBHUkFZX0ZBQ1RPUi5yZWQgKiByZWRcblx0XHQrIEdSQVlfRkFDVE9SLmdyZWVuICogZ3JlZW5cblx0XHQrIEdSQVlfRkFDVE9SLmJsdWUgKiBibHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kIChvYmosIC4uLnNvdXJjZXMpIHtcblx0Y29uc3QgZXh0ZW5kZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuXG5cdHNvdXJjZXMuZm9yRWFjaChzcmMgPT4ge1xuXHRcdGZvckVhY2goc3JjLCAodmFsdWUsIGtleSkgPT4ge1xuXHRcdFx0aWYgKGhhcyhzcmMsIGtleSkpIHtcblx0XHRcdFx0aWYgKGlzT2JqZWN0KHZhbHVlKSAmJiBpc09iamVjdChleHRlbmRlZFtrZXldKSkge1xuXHRcdFx0XHRcdGV4dGVuZGVkW2tleV0gPSBleHRlbmQoZXh0ZW5kZWRba2V5XSwgdmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGV4dGVuZGVkW2tleV0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHRyZXR1cm4gZXh0ZW5kZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWlja0NhbnZhcyAoZHJhdywgaGVpZ2h0LCB3aWR0aCA9IGhlaWdodCkge1xuXHRjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblx0Y2FudmFzLmhlaWdodCA9IGhlaWdodDtcblx0Y2FudmFzLndpZHRoID0gd2lkdGg7XG5cblx0ZHJhdyhjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSwgY2FudmFzLmhlaWdodCwgY2FudmFzLndpZHRoKTtcblxuXHRyZXR1cm4gY2FudmFzO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==