diff --git a/dist/mapd-draw-dev.js b/dist/mapd-draw-dev.js index 8e8a88d..8e58f4f 100644 --- a/dist/mapd-draw-dev.js +++ b/dist/mapd-draw-dev.js @@ -52,245 +52,191 @@ return /******/ (function(modules) { // webpackBootstrap /************************************************************************/ /******/ ([ /* 0 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* eslint-disable object-curly-spacing*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleHull_2D = exports.Math = exports.Point = exports.PolyLine = exports.Poly = exports.Rect = exports.Circle = exports.Vec2d = exports.BasicStyle = exports.Mat2 = exports.Point2d = exports.Mat2d = exports.AABox2d = exports.DrawEngine = exports.ShapeBuilder = exports.version = undefined;\n\nvar _package = __webpack_require__(39);\n\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function get() {\n return _package.version;\n }\n});\n\nvar _glMatrix = __webpack_require__(1);\n\nObject.defineProperty(exports, \"Mat2\", {\n enumerable: true,\n get: function get() {\n return _glMatrix.mat2;\n }\n});\n\nvar _convexHull = __webpack_require__(15);\n\nObject.defineProperty(exports, \"simpleHull_2D\", {\n enumerable: true,\n get: function get() {\n return _convexHull.simpleHull_2D;\n }\n});\n\nvar _shapeBuilder = __webpack_require__(23);\n\nvar _shapeBuilder2 = _interopRequireDefault(_shapeBuilder);\n\nvar _drawEngine = __webpack_require__(14);\n\nvar _drawEngine2 = _interopRequireDefault(_drawEngine);\n\nvar _aabox2d = __webpack_require__(2);\n\nvar _AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _mat2d = __webpack_require__(5);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _point2d = __webpack_require__(4);\n\nvar _Point2d = _interopRequireWildcard(_point2d);\n\nvar _basicStyle = __webpack_require__(9);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _vec2d = __webpack_require__(10);\n\nvar _vec2d2 = _interopRequireDefault(_vec2d);\n\nvar _circle = __webpack_require__(27);\n\nvar _circle2 = _interopRequireDefault(_circle);\n\nvar _rect = __webpack_require__(16);\n\nvar _rect2 = _interopRequireDefault(_rect);\n\nvar _poly = __webpack_require__(29);\n\nvar _poly2 = _interopRequireDefault(_poly);\n\nvar _polyLine = __webpack_require__(11);\n\nvar _polyLine2 = _interopRequireDefault(_polyLine);\n\nvar _point = __webpack_require__(28);\n\nvar _point2 = _interopRequireDefault(_point);\n\nvar _math = __webpack_require__(6);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.ShapeBuilder = _shapeBuilder2.default;\nexports.DrawEngine = _drawEngine2.default;\nexports.AABox2d = _AABox2d;\nexports.Mat2d = _mat2d2.default;\nexports.Point2d = _Point2d;\nexports.BasicStyle = _basicStyle2.default;\nexports.Vec2d = _vec2d2.default;\nexports.Circle = _circle2.default;\nexports.Rect = _rect2.default;\nexports.Poly = _poly2.default;\nexports.PolyLine = _polyLine2.default;\nexports.Point = _point2.default;\nexports.Math = _math2.default;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9tYXBkLWRyYXcuanM/NGY3OSJdLCJuYW1lcyI6WyJ2ZXJzaW9uIiwibWF0MiIsInNpbXBsZUh1bGxfMkQiLCJTaGFwZUJ1aWxkZXIiLCJEcmF3RW5naW5lIiwiQUFCb3gyZCIsIk1hdDJkIiwiUG9pbnQyZCIsIkJhc2ljU3R5bGUiLCJWZWMyZCIsIkNpcmNsZSIsIlJlY3QiLCJQb2x5IiwiUG9seUxpbmUiLCJQb2ludCIsIk1hdGgiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztvQkFFUUEsTzs7Ozs7Ozs7O3FCQU9BQyxJOzs7Ozs7Ozs7dUJBU0FDLGE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWREQyxZO1FBQ0FDLFU7UUFDS0MsTztRQUNMQyxLO1FBQ0tDLE87UUFFTEMsVTtRQUNBQyxLO1FBQ0FDLE07UUFDQUMsSTtRQUNBQyxJO1FBQ0FDLFE7UUFDQUMsSztRQUNBQyxJIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBvYmplY3QtY3VybHktc3BhY2luZyovXG5cInVzZSBzdHJpY3RcIlxuXG5leHBvcnQge3ZlcnNpb259IGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgU2hhcGVCdWlsZGVyIGZyb20gXCIuL2VuZ2luZS9zaGFwZS1idWlsZGVyXCJcbmV4cG9ydCBEcmF3RW5naW5lIGZyb20gXCIuL2VuZ2luZS9kcmF3LWVuZ2luZVwiXG5leHBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuL2NvcmUvYWFib3gyZFwiXG5leHBvcnQgTWF0MmQgZnJvbSBcIi4vY29yZS9tYXQyZFwiXG5leHBvcnQgKiBhcyBQb2ludDJkIGZyb20gXCIuL2NvcmUvcG9pbnQyZFwiXG5leHBvcnQge21hdDIgYXMgTWF0Mn0gZnJvbSBcImdsLW1hdHJpeFwiXG5leHBvcnQgQmFzaWNTdHlsZSBmcm9tIFwiLi9zdHlsZS9iYXNpYy1zdHlsZVwiXG5leHBvcnQgVmVjMmQgZnJvbSBcIi4vY29yZS92ZWMyZFwiXG5leHBvcnQgQ2lyY2xlIGZyb20gXCIuL3NoYXBlcy9jaXJjbGVcIlxuZXhwb3J0IFJlY3QgZnJvbSBcIi4vc2hhcGVzL3JlY3RcIlxuZXhwb3J0IFBvbHkgZnJvbSBcIi4vc2hhcGVzL3BvbHlcIlxuZXhwb3J0IFBvbHlMaW5lIGZyb20gXCIuL3NoYXBlcy9wb2x5LWxpbmVcIlxuZXhwb3J0IFBvaW50IGZyb20gXCIuL3NoYXBlcy9wb2ludFwiXG5leHBvcnQgTWF0aCBmcm9tIFwiLi9tYXRoL21hdGhcIlxuZXhwb3J0IHtzaW1wbGVIdWxsXzJEfSBmcm9tIFwiLi9tYXRoL2NvbnZleC1odWxsXCJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21hcGQtZHJhdy5qcyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("/* eslint-disable object-curly-spacing*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleHull_2D = exports.Math = exports.Point = exports.PolyLine = exports.Poly = exports.Rect = exports.Circle = exports.Vec2d = exports.BasicStyle = exports.Mat2 = exports.Point2d = exports.Mat2d = exports.AABox2d = exports.DrawEngine = exports.ShapeBuilder = exports.version = undefined;\n\nvar _package = __webpack_require__(30);\n\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function get() {\n return _package.version;\n }\n});\n\nvar _glMatrix = __webpack_require__(1);\n\nObject.defineProperty(exports, \"Mat2\", {\n enumerable: true,\n get: function get() {\n return _glMatrix.mat2;\n }\n});\n\nvar _convexHull = __webpack_require__(14);\n\nObject.defineProperty(exports, \"simpleHull_2D\", {\n enumerable: true,\n get: function get() {\n return _convexHull.simpleHull_2D;\n }\n});\n\nvar _shapeBuilder = __webpack_require__(19);\n\nvar _shapeBuilder2 = _interopRequireDefault(_shapeBuilder);\n\nvar _drawEngine = __webpack_require__(13);\n\nvar _drawEngine2 = _interopRequireDefault(_drawEngine);\n\nvar _aabox2d = __webpack_require__(2);\n\nvar _AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _mat2d = __webpack_require__(4);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _point2d = __webpack_require__(3);\n\nvar _Point2d = _interopRequireWildcard(_point2d);\n\nvar _basicStyle = __webpack_require__(8);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _vec2d = __webpack_require__(9);\n\nvar _vec2d2 = _interopRequireDefault(_vec2d);\n\nvar _circle = __webpack_require__(23);\n\nvar _circle2 = _interopRequireDefault(_circle);\n\nvar _rect = __webpack_require__(15);\n\nvar _rect2 = _interopRequireDefault(_rect);\n\nvar _poly = __webpack_require__(25);\n\nvar _poly2 = _interopRequireDefault(_poly);\n\nvar _polyLine = __webpack_require__(10);\n\nvar _polyLine2 = _interopRequireDefault(_polyLine);\n\nvar _point = __webpack_require__(24);\n\nvar _point2 = _interopRequireDefault(_point);\n\nvar _math = __webpack_require__(5);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.ShapeBuilder = _shapeBuilder2.default;\nexports.DrawEngine = _drawEngine2.default;\nexports.AABox2d = _AABox2d;\nexports.Mat2d = _mat2d2.default;\nexports.Point2d = _Point2d;\nexports.BasicStyle = _basicStyle2.default;\nexports.Vec2d = _vec2d2.default;\nexports.Circle = _circle2.default;\nexports.Rect = _rect2.default;\nexports.Poly = _poly2.default;\nexports.PolyLine = _polyLine2.default;\nexports.Point = _point2.default;\nexports.Math = _math2.default;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9tYXBkLWRyYXcuanM/NGY3OSJdLCJuYW1lcyI6WyJ2ZXJzaW9uIiwibWF0MiIsInNpbXBsZUh1bGxfMkQiLCJTaGFwZUJ1aWxkZXIiLCJEcmF3RW5naW5lIiwiQUFCb3gyZCIsIk1hdDJkIiwiUG9pbnQyZCIsIkJhc2ljU3R5bGUiLCJWZWMyZCIsIkNpcmNsZSIsIlJlY3QiLCJQb2x5IiwiUG9seUxpbmUiLCJQb2ludCIsIk1hdGgiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztvQkFFUUEsTzs7Ozs7Ozs7O3FCQU9BQyxJOzs7Ozs7Ozs7dUJBU0FDLGE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWREQyxZO1FBQ0FDLFU7UUFDS0MsTztRQUNMQyxLO1FBQ0tDLE87UUFFTEMsVTtRQUNBQyxLO1FBQ0FDLE07UUFDQUMsSTtRQUNBQyxJO1FBQ0FDLFE7UUFDQUMsSztRQUNBQyxJIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBvYmplY3QtY3VybHktc3BhY2luZyovXG5cInVzZSBzdHJpY3RcIlxuXG5leHBvcnQge3ZlcnNpb259IGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgU2hhcGVCdWlsZGVyIGZyb20gXCIuL2VuZ2luZS9zaGFwZS1idWlsZGVyXCJcbmV4cG9ydCBEcmF3RW5naW5lIGZyb20gXCIuL2VuZ2luZS9kcmF3LWVuZ2luZVwiXG5leHBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuL2NvcmUvYWFib3gyZFwiXG5leHBvcnQgTWF0MmQgZnJvbSBcIi4vY29yZS9tYXQyZFwiXG5leHBvcnQgKiBhcyBQb2ludDJkIGZyb20gXCIuL2NvcmUvcG9pbnQyZFwiXG5leHBvcnQge21hdDIgYXMgTWF0Mn0gZnJvbSBcImdsLW1hdHJpeFwiXG5leHBvcnQgQmFzaWNTdHlsZSBmcm9tIFwiLi9zdHlsZS9iYXNpYy1zdHlsZVwiXG5leHBvcnQgVmVjMmQgZnJvbSBcIi4vY29yZS92ZWMyZFwiXG5leHBvcnQgQ2lyY2xlIGZyb20gXCIuL3NoYXBlcy9jaXJjbGVcIlxuZXhwb3J0IFJlY3QgZnJvbSBcIi4vc2hhcGVzL3JlY3RcIlxuZXhwb3J0IFBvbHkgZnJvbSBcIi4vc2hhcGVzL3BvbHlcIlxuZXhwb3J0IFBvbHlMaW5lIGZyb20gXCIuL3NoYXBlcy9wb2x5LWxpbmVcIlxuZXhwb3J0IFBvaW50IGZyb20gXCIuL3NoYXBlcy9wb2ludFwiXG5leHBvcnQgTWF0aCBmcm9tIFwiLi9tYXRoL21hdGhcIlxuZXhwb3J0IHtzaW1wbGVIdWxsXzJEfSBmcm9tIFwiLi9tYXRoL2NvbnZleC1odWxsXCJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21hcGQtZHJhdy5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 1 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/**\n * @fileoverview gl-matrix - High performance matrix and vector operations\n * @author Brandon Jones\n * @author Colin MacKenzie IV\n * @version 2.3.2\n */\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n// END HEADER\n\nexports.glMatrix = __webpack_require__(3);\nexports.mat2 = __webpack_require__(34);\nexports.mat2d = __webpack_require__(35);\nexports.mat3 = __webpack_require__(20);\nexports.mat4 = __webpack_require__(36);\nexports.quat = __webpack_require__(37);\nexports.vec2 = __webpack_require__(38);\nexports.vec3 = __webpack_require__(21);\nexports.vec4 = __webpack_require__(22);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC5qcz9jNzBjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGdsLW1hdHJpeCAtIEhpZ2ggcGVyZm9ybWFuY2UgbWF0cml4IGFuZCB2ZWN0b3Igb3BlcmF0aW9uc1xuICogQGF1dGhvciBCcmFuZG9uIEpvbmVzXG4gKiBAYXV0aG9yIENvbGluIE1hY0tlbnppZSBJVlxuICogQHZlcnNpb24gMi4zLjJcbiAqL1xuXG4vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuLy8gRU5EIEhFQURFUlxuXG5leHBvcnRzLmdsTWF0cml4ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L2NvbW1vbi5qc1wiKTtcbmV4cG9ydHMubWF0MiA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCIpO1xuZXhwb3J0cy5tYXQyZCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQyZC5qc1wiKTtcbmV4cG9ydHMubWF0MyA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQzLmpzXCIpO1xuZXhwb3J0cy5tYXQ0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDQuanNcIik7XG5leHBvcnRzLnF1YXQgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvcXVhdC5qc1wiKTtcbmV4cG9ydHMudmVjMiA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWMyLmpzXCIpO1xuZXhwb3J0cy52ZWMzID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzMuanNcIik7XG5leHBvcnRzLnZlYzQgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjNC5qc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9+L2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4LmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); + eval("/*!\n@fileoverview gl-matrix - High performance matrix and vector operations\n@author Brandon Jones\n@author Colin MacKenzie IV\n@version 2.7.0\n\nCopyright (c) 2015-2018, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n!function(t,n){if(true)module.exports=n();else if(\"function\"==typeof define&&define.amd)define([],n);else{var r=n();for(var a in r)(\"object\"==typeof exports?exports:t)[a]=r[a]}}(\"undefined\"!=typeof self?self:this,function(){return function(t){var n={};function r(a){if(n[a])return n[a].exports;var e=n[a]={i:a,l:!1,exports:{}};return t[a].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=t,r.c=n,r.d=function(t,n,a){r.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:a})},r.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},r.t=function(t,n){if(1&n&&(t=r(t)),8&n)return t;if(4&n&&\"object\"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,\"default\",{enumerable:!0,value:t}),2&n&&\"string\"!=typeof t)for(var e in t)r.d(a,e,function(n){return t[n]}.bind(null,e));return a},r.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(n,\"a\",n),n},r.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},r.p=\"\",r(r.s=10)}([function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.setMatrixArrayType=function(t){n.ARRAY_TYPE=t},n.toRadian=function(t){return t*e},n.equals=function(t,n){return Math.abs(t-n)<=a*Math.max(1,Math.abs(t),Math.abs(n))};var a=n.EPSILON=1e-6;n.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array,n.RANDOM=Math.random;var e=Math.PI/180},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.forEach=n.sqrLen=n.len=n.sqrDist=n.dist=n.div=n.mul=n.sub=void 0,n.create=e,n.clone=function(t){var n=new a.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},n.fromValues=function(t,n,r,e){var u=new a.ARRAY_TYPE(4);return u[0]=t,u[1]=n,u[2]=r,u[3]=e,u},n.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},n.set=function(t,n,r,a,e){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t},n.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t},n.subtract=u,n.multiply=o,n.divide=i,n.ceil=function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t[2]=Math.ceil(n[2]),t[3]=Math.ceil(n[3]),t},n.floor=function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t[2]=Math.floor(n[2]),t[3]=Math.floor(n[3]),t},n.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t[2]=Math.min(n[2],r[2]),t[3]=Math.min(n[3],r[3]),t},n.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t[2]=Math.max(n[2],r[2]),t[3]=Math.max(n[3],r[3]),t},n.round=function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t[2]=Math.round(n[2]),t[3]=Math.round(n[3]),t},n.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t},n.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t},n.distance=s,n.squaredDistance=c,n.length=f,n.squaredLength=M,n.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=-n[3],t},n.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t[3]=1/n[3],t},n.normalize=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*r+a*a+e*e+u*u;o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=a*o,t[2]=e*o,t[3]=u*o);return t},n.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]},n.lerp=function(t,n,r,a){var e=n[0],u=n[1],o=n[2],i=n[3];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t[2]=o+a*(r[2]-o),t[3]=i+a*(r[3]-i),t},n.random=function(t,n){var r,e,u,o,i,s;n=n||1;do{r=2*a.RANDOM()-1,e=2*a.RANDOM()-1,i=r*r+e*e}while(i>=1);do{u=2*a.RANDOM()-1,o=2*a.RANDOM()-1,s=u*u+o*o}while(s>=1);var c=Math.sqrt((1-i)/s);return t[0]=n*r,t[1]=n*e,t[2]=n*u*c,t[3]=n*o*c,t},n.transformMat4=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3];return t[0]=r[0]*a+r[4]*e+r[8]*u+r[12]*o,t[1]=r[1]*a+r[5]*e+r[9]*u+r[13]*o,t[2]=r[2]*a+r[6]*e+r[10]*u+r[14]*o,t[3]=r[3]*a+r[7]*e+r[11]*u+r[15]*o,t},n.transformQuat=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],s=r[2],c=r[3],f=c*a+i*u-s*e,M=c*e+s*a-o*u,h=c*u+o*e-i*a,l=-o*a-i*e-s*u;return t[0]=f*c+l*-o+M*-s-h*-i,t[1]=M*c+l*-i+h*-o-f*-s,t[2]=h*c+l*-s+f*-i-M*-o,t[3]=n[3],t},n.str=function(t){return\"vec4(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\")\"},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=t[3],i=n[0],s=n[1],c=n[2],f=n[3];return Math.abs(r-i)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(e-s)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(s))&&Math.abs(u-c)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(c))&&Math.abs(o-f)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(f))};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(){var t=new a.ARRAY_TYPE(4);return a.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function u(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t}function o(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t[3]=n[3]*r[3],t}function i(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t[3]=n[3]/r[3],t}function s(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2],u=n[3]-t[3];return Math.sqrt(r*r+a*a+e*e+u*u)}function c(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2],u=n[3]-t[3];return r*r+a*a+e*e+u*u}function f(t){var n=t[0],r=t[1],a=t[2],e=t[3];return Math.sqrt(n*n+r*r+a*a+e*e)}function M(t){var n=t[0],r=t[1],a=t[2],e=t[3];return n*n+r*r+a*a+e*e}n.sub=u,n.mul=o,n.div=i,n.dist=s,n.sqrDist=c,n.len=f,n.sqrLen=M,n.forEach=function(){var t=e();return function(n,r,a,e,u,o){var i=void 0,s=void 0;for(r||(r=4),a||(a=0),s=e?Math.min(e*r+a,n.length):n.length,i=a;i1?0:e<-1?Math.PI:Math.acos(e)},n.str=function(t){return\"vec3(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=n[0],i=n[1],s=n[2];return Math.abs(r-o)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(e-i)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(i))&&Math.abs(u-s)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(s))};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(){var t=new a.ARRAY_TYPE(3);return a.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function u(t){var n=t[0],r=t[1],a=t[2];return Math.sqrt(n*n+r*r+a*a)}function o(t,n,r){var e=new a.ARRAY_TYPE(3);return e[0]=t,e[1]=n,e[2]=r,e}function i(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t}function s(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t}function c(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t}function f(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2];return Math.sqrt(r*r+a*a+e*e)}function M(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2];return r*r+a*a+e*e}function h(t){var n=t[0],r=t[1],a=t[2];return n*n+r*r+a*a}function l(t,n){var r=n[0],a=n[1],e=n[2],u=r*r+a*a+e*e;return u>0&&(u=1/Math.sqrt(u),t[0]=n[0]*u,t[1]=n[1]*u,t[2]=n[2]*u),t}function v(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}n.sub=i,n.mul=s,n.div=c,n.dist=f,n.sqrDist=M,n.len=u,n.sqrLen=h,n.forEach=function(){var t=e();return function(n,r,a,e,u,o){var i=void 0,s=void 0;for(r||(r=3),a||(a=0),s=e?Math.min(e*r+a,n.length):n.length,i=a;ia.EPSILON?(t[0]=n[0]/e,t[1]=n[1]/e,t[2]=n[2]/e):(t[0]=1,t[1]=0,t[2]=0);return r},n.multiply=f,n.rotateX=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),s=Math.cos(r);return t[0]=a*s+o*i,t[1]=e*s+u*i,t[2]=u*s-e*i,t[3]=o*s-a*i,t},n.rotateY=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),s=Math.cos(r);return t[0]=a*s-u*i,t[1]=e*s+o*i,t[2]=u*s+a*i,t[3]=o*s-e*i,t},n.rotateZ=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),s=Math.cos(r);return t[0]=a*s+e*i,t[1]=e*s-a*i,t[2]=u*s+o*i,t[3]=o*s-u*i,t},n.calculateW=function(t,n){var r=n[0],a=n[1],e=n[2];return t[0]=r,t[1]=a,t[2]=e,t[3]=Math.sqrt(Math.abs(1-r*r-a*a-e*e)),t},n.slerp=M,n.random=function(t){var n=a.RANDOM(),r=a.RANDOM(),e=a.RANDOM(),u=Math.sqrt(1-n),o=Math.sqrt(n);return t[0]=u*Math.sin(2*Math.PI*r),t[1]=u*Math.cos(2*Math.PI*r),t[2]=o*Math.sin(2*Math.PI*e),t[3]=o*Math.cos(2*Math.PI*e),t},n.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*r+a*a+e*e+u*u,i=o?1/o:0;return t[0]=-r*i,t[1]=-a*i,t[2]=-e*i,t[3]=u*i,t},n.conjugate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},n.fromMat3=h,n.fromEuler=function(t,n,r,a){var e=.5*Math.PI/180;n*=e,r*=e,a*=e;var u=Math.sin(n),o=Math.cos(n),i=Math.sin(r),s=Math.cos(r),c=Math.sin(a),f=Math.cos(a);return t[0]=u*s*f-o*i*c,t[1]=o*i*f+u*s*c,t[2]=o*s*c-u*i*f,t[3]=o*s*f+u*i*c,t},n.str=function(t){return\"quat(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\")\"};var a=i(r(0)),e=i(r(5)),u=i(r(2)),o=i(r(1));function i(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}function s(){var t=new a.ARRAY_TYPE(4);return a.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function c(t,n,r){r*=.5;var a=Math.sin(r);return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=Math.cos(r),t}function f(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],s=r[1],c=r[2],f=r[3];return t[0]=a*f+o*i+e*c-u*s,t[1]=e*f+o*s+u*i-a*c,t[2]=u*f+o*c+a*s-e*i,t[3]=o*f-a*i-e*s-u*c,t}function M(t,n,r,e){var u=n[0],o=n[1],i=n[2],s=n[3],c=r[0],f=r[1],M=r[2],h=r[3],l=void 0,v=void 0,d=void 0,b=void 0,m=void 0;return(v=u*c+o*f+i*M+s*h)<0&&(v=-v,c=-c,f=-f,M=-M,h=-h),1-v>a.EPSILON?(l=Math.acos(v),d=Math.sin(l),b=Math.sin((1-e)*l)/d,m=Math.sin(e*l)/d):(b=1-e,m=e),t[0]=b*u+m*c,t[1]=b*o+m*f,t[2]=b*i+m*M,t[3]=b*s+m*h,t}function h(t,n){var r=n[0]+n[4]+n[8],a=void 0;if(r>0)a=Math.sqrt(r+1),t[3]=.5*a,a=.5/a,t[0]=(n[5]-n[7])*a,t[1]=(n[6]-n[2])*a,t[2]=(n[1]-n[3])*a;else{var e=0;n[4]>n[0]&&(e=1),n[8]>n[3*e+e]&&(e=2);var u=(e+1)%3,o=(e+2)%3;a=Math.sqrt(n[3*e+e]-n[3*u+u]-n[3*o+o]+1),t[e]=.5*a,a=.5/a,t[3]=(n[3*u+o]-n[3*o+u])*a,t[u]=(n[3*u+e]+n[3*e+u])*a,t[o]=(n[3*o+e]+n[3*e+o])*a}return t}n.clone=o.clone,n.fromValues=o.fromValues,n.copy=o.copy,n.set=o.set,n.add=o.add,n.mul=f,n.scale=o.scale,n.dot=o.dot,n.lerp=o.lerp;var l=n.length=o.length,v=(n.len=l,n.squaredLength=o.squaredLength),d=(n.sqrLen=v,n.normalize=o.normalize);n.exactEquals=o.exactEquals,n.equals=o.equals,n.rotationTo=function(){var t=u.create(),n=u.fromValues(1,0,0),r=u.fromValues(0,1,0);return function(a,e,o){var i=u.dot(e,o);return i<-.999999?(u.cross(t,n,e),u.len(t)<1e-6&&u.cross(t,r,e),u.normalize(t,t),c(a,t,Math.PI),a):i>.999999?(a[0]=0,a[1]=0,a[2]=0,a[3]=1,a):(u.cross(t,e,o),a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=1+i,d(a,a))}}(),n.sqlerp=function(){var t=s(),n=s();return function(r,a,e,u,o,i){return M(t,a,o,i),M(n,e,u,i),M(r,t,n,2*i*(1-i)),r}}(),n.setAxes=function(){var t=e.create();return function(n,r,a,e){return t[0]=a[0],t[3]=a[1],t[6]=a[2],t[1]=e[0],t[4]=e[1],t[7]=e[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],d(n,h(n,t))}}()},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.sub=n.mul=void 0,n.create=function(){var t=new a.ARRAY_TYPE(16);a.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0);return t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},n.clone=function(t){var n=new a.ARRAY_TYPE(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},n.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},n.fromValues=function(t,n,r,e,u,o,i,s,c,f,M,h,l,v,d,b){var m=new a.ARRAY_TYPE(16);return m[0]=t,m[1]=n,m[2]=r,m[3]=e,m[4]=u,m[5]=o,m[6]=i,m[7]=s,m[8]=c,m[9]=f,m[10]=M,m[11]=h,m[12]=l,m[13]=v,m[14]=d,m[15]=b,m},n.set=function(t,n,r,a,e,u,o,i,s,c,f,M,h,l,v,d,b){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t[4]=u,t[5]=o,t[6]=i,t[7]=s,t[8]=c,t[9]=f,t[10]=M,t[11]=h,t[12]=l,t[13]=v,t[14]=d,t[15]=b,t},n.identity=e,n.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],e=n[3],u=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=r,t[6]=n[9],t[7]=n[13],t[8]=a,t[9]=u,t[11]=n[14],t[12]=e,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},n.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],s=n[6],c=n[7],f=n[8],M=n[9],h=n[10],l=n[11],v=n[12],d=n[13],b=n[14],m=n[15],p=r*i-a*o,P=r*s-e*o,A=r*c-u*o,E=a*s-e*i,O=a*c-u*i,R=e*c-u*s,y=f*d-M*v,q=f*b-h*v,x=f*m-l*v,_=M*b-h*d,Y=M*m-l*d,L=h*m-l*b,S=p*L-P*Y+A*_+E*x-O*q+R*y;if(!S)return null;return S=1/S,t[0]=(i*L-s*Y+c*_)*S,t[1]=(e*Y-a*L-u*_)*S,t[2]=(d*R-b*O+m*E)*S,t[3]=(h*O-M*R-l*E)*S,t[4]=(s*x-o*L-c*q)*S,t[5]=(r*L-e*x+u*q)*S,t[6]=(b*A-v*R-m*P)*S,t[7]=(f*R-h*A+l*P)*S,t[8]=(o*Y-i*x+c*y)*S,t[9]=(a*x-r*Y-u*y)*S,t[10]=(v*O-d*A+m*p)*S,t[11]=(M*A-f*O-l*p)*S,t[12]=(i*q-o*_-s*y)*S,t[13]=(r*_-a*q+e*y)*S,t[14]=(d*P-v*E-b*p)*S,t[15]=(f*E-M*P+h*p)*S,t},n.adjoint=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],s=n[6],c=n[7],f=n[8],M=n[9],h=n[10],l=n[11],v=n[12],d=n[13],b=n[14],m=n[15];return t[0]=i*(h*m-l*b)-M*(s*m-c*b)+d*(s*l-c*h),t[1]=-(a*(h*m-l*b)-M*(e*m-u*b)+d*(e*l-u*h)),t[2]=a*(s*m-c*b)-i*(e*m-u*b)+d*(e*c-u*s),t[3]=-(a*(s*l-c*h)-i*(e*l-u*h)+M*(e*c-u*s)),t[4]=-(o*(h*m-l*b)-f*(s*m-c*b)+v*(s*l-c*h)),t[5]=r*(h*m-l*b)-f*(e*m-u*b)+v*(e*l-u*h),t[6]=-(r*(s*m-c*b)-o*(e*m-u*b)+v*(e*c-u*s)),t[7]=r*(s*l-c*h)-o*(e*l-u*h)+f*(e*c-u*s),t[8]=o*(M*m-l*d)-f*(i*m-c*d)+v*(i*l-c*M),t[9]=-(r*(M*m-l*d)-f*(a*m-u*d)+v*(a*l-u*M)),t[10]=r*(i*m-c*d)-o*(a*m-u*d)+v*(a*c-u*i),t[11]=-(r*(i*l-c*M)-o*(a*l-u*M)+f*(a*c-u*i)),t[12]=-(o*(M*b-h*d)-f*(i*b-s*d)+v*(i*h-s*M)),t[13]=r*(M*b-h*d)-f*(a*b-e*d)+v*(a*h-e*M),t[14]=-(r*(i*b-s*d)-o*(a*b-e*d)+v*(a*s-e*i)),t[15]=r*(i*h-s*M)-o*(a*h-e*M)+f*(a*s-e*i),t},n.determinant=function(t){var n=t[0],r=t[1],a=t[2],e=t[3],u=t[4],o=t[5],i=t[6],s=t[7],c=t[8],f=t[9],M=t[10],h=t[11],l=t[12],v=t[13],d=t[14],b=t[15];return(n*o-r*u)*(M*b-h*d)-(n*i-a*u)*(f*b-h*v)+(n*s-e*u)*(f*d-M*v)+(r*i-a*o)*(c*b-h*l)-(r*s-e*o)*(c*d-M*l)+(a*s-e*i)*(c*v-f*l)},n.multiply=u,n.translate=function(t,n,r){var a=r[0],e=r[1],u=r[2],o=void 0,i=void 0,s=void 0,c=void 0,f=void 0,M=void 0,h=void 0,l=void 0,v=void 0,d=void 0,b=void 0,m=void 0;n===t?(t[12]=n[0]*a+n[4]*e+n[8]*u+n[12],t[13]=n[1]*a+n[5]*e+n[9]*u+n[13],t[14]=n[2]*a+n[6]*e+n[10]*u+n[14],t[15]=n[3]*a+n[7]*e+n[11]*u+n[15]):(o=n[0],i=n[1],s=n[2],c=n[3],f=n[4],M=n[5],h=n[6],l=n[7],v=n[8],d=n[9],b=n[10],m=n[11],t[0]=o,t[1]=i,t[2]=s,t[3]=c,t[4]=f,t[5]=M,t[6]=h,t[7]=l,t[8]=v,t[9]=d,t[10]=b,t[11]=m,t[12]=o*a+f*e+v*u+n[12],t[13]=i*a+M*e+d*u+n[13],t[14]=s*a+h*e+b*u+n[14],t[15]=c*a+l*e+m*u+n[15]);return t},n.scale=function(t,n,r){var a=r[0],e=r[1],u=r[2];return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*e,t[5]=n[5]*e,t[6]=n[6]*e,t[7]=n[7]*e,t[8]=n[8]*u,t[9]=n[9]*u,t[10]=n[10]*u,t[11]=n[11]*u,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},n.rotate=function(t,n,r,e){var u=e[0],o=e[1],i=e[2],s=Math.sqrt(u*u+o*o+i*i),c=void 0,f=void 0,M=void 0,h=void 0,l=void 0,v=void 0,d=void 0,b=void 0,m=void 0,p=void 0,P=void 0,A=void 0,E=void 0,O=void 0,R=void 0,y=void 0,q=void 0,x=void 0,_=void 0,Y=void 0,L=void 0,S=void 0,w=void 0,I=void 0;if(s0?(r[0]=2*(c*s+h*e+f*i-M*u)/l,r[1]=2*(f*s+h*u+M*e-c*i)/l,r[2]=2*(M*s+h*i+c*u-f*e)/l):(r[0]=2*(c*s+h*e+f*i-M*u),r[1]=2*(f*s+h*u+M*e-c*i),r[2]=2*(M*s+h*i+c*u-f*e));return o(t,n,r),t},n.getTranslation=function(t,n){return t[0]=n[12],t[1]=n[13],t[2]=n[14],t},n.getScaling=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[4],o=n[5],i=n[6],s=n[8],c=n[9],f=n[10];return t[0]=Math.sqrt(r*r+a*a+e*e),t[1]=Math.sqrt(u*u+o*o+i*i),t[2]=Math.sqrt(s*s+c*c+f*f),t},n.getRotation=function(t,n){var r=n[0]+n[5]+n[10],a=0;r>0?(a=2*Math.sqrt(r+1),t[3]=.25*a,t[0]=(n[6]-n[9])/a,t[1]=(n[8]-n[2])/a,t[2]=(n[1]-n[4])/a):n[0]>n[5]&&n[0]>n[10]?(a=2*Math.sqrt(1+n[0]-n[5]-n[10]),t[3]=(n[6]-n[9])/a,t[0]=.25*a,t[1]=(n[1]+n[4])/a,t[2]=(n[8]+n[2])/a):n[5]>n[10]?(a=2*Math.sqrt(1+n[5]-n[0]-n[10]),t[3]=(n[8]-n[2])/a,t[0]=(n[1]+n[4])/a,t[1]=.25*a,t[2]=(n[6]+n[9])/a):(a=2*Math.sqrt(1+n[10]-n[0]-n[5]),t[3]=(n[1]-n[4])/a,t[0]=(n[8]+n[2])/a,t[1]=(n[6]+n[9])/a,t[2]=.25*a);return t},n.fromRotationTranslationScale=function(t,n,r,a){var e=n[0],u=n[1],o=n[2],i=n[3],s=e+e,c=u+u,f=o+o,M=e*s,h=e*c,l=e*f,v=u*c,d=u*f,b=o*f,m=i*s,p=i*c,P=i*f,A=a[0],E=a[1],O=a[2];return t[0]=(1-(v+b))*A,t[1]=(h+P)*A,t[2]=(l-p)*A,t[3]=0,t[4]=(h-P)*E,t[5]=(1-(M+b))*E,t[6]=(d+m)*E,t[7]=0,t[8]=(l+p)*O,t[9]=(d-m)*O,t[10]=(1-(M+v))*O,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},n.fromRotationTranslationScaleOrigin=function(t,n,r,a,e){var u=n[0],o=n[1],i=n[2],s=n[3],c=u+u,f=o+o,M=i+i,h=u*c,l=u*f,v=u*M,d=o*f,b=o*M,m=i*M,p=s*c,P=s*f,A=s*M,E=a[0],O=a[1],R=a[2],y=e[0],q=e[1],x=e[2],_=(1-(d+m))*E,Y=(l+A)*E,L=(v-P)*E,S=(l-A)*O,w=(1-(h+m))*O,I=(b+p)*O,N=(v+P)*R,g=(b-p)*R,T=(1-(h+d))*R;return t[0]=_,t[1]=Y,t[2]=L,t[3]=0,t[4]=S,t[5]=w,t[6]=I,t[7]=0,t[8]=N,t[9]=g,t[10]=T,t[11]=0,t[12]=r[0]+y-(_*y+S*q+N*x),t[13]=r[1]+q-(Y*y+w*q+g*x),t[14]=r[2]+x-(L*y+I*q+T*x),t[15]=1,t},n.fromQuat=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r+r,i=a+a,s=e+e,c=r*o,f=a*o,M=a*i,h=e*o,l=e*i,v=e*s,d=u*o,b=u*i,m=u*s;return t[0]=1-M-v,t[1]=f+m,t[2]=h-b,t[3]=0,t[4]=f-m,t[5]=1-c-v,t[6]=l+d,t[7]=0,t[8]=h+b,t[9]=l-d,t[10]=1-c-M,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},n.frustum=function(t,n,r,a,e,u,o){var i=1/(r-n),s=1/(e-a),c=1/(u-o);return t[0]=2*u*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*u*s,t[6]=0,t[7]=0,t[8]=(r+n)*i,t[9]=(e+a)*s,t[10]=(o+u)*c,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*u*2*c,t[15]=0,t},n.perspective=function(t,n,r,a,e){var u=1/Math.tan(n/2),o=void 0;t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=e&&e!==1/0?(o=1/(a-e),t[10]=(e+a)*o,t[14]=2*e*a*o):(t[10]=-1,t[14]=-2*a);return t},n.perspectiveFromFieldOfView=function(t,n,r,a){var e=Math.tan(n.upDegrees*Math.PI/180),u=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),s=2/(o+i),c=2/(e+u);return t[0]=s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=c,t[6]=0,t[7]=0,t[8]=-(o-i)*s*.5,t[9]=(e-u)*c*.5,t[10]=a/(r-a),t[11]=-1,t[12]=0,t[13]=0,t[14]=a*r/(r-a),t[15]=0,t},n.ortho=function(t,n,r,a,e,u,o){var i=1/(n-r),s=1/(a-e),c=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*s,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(n+r)*i,t[13]=(e+a)*s,t[14]=(o+u)*c,t[15]=1,t},n.lookAt=function(t,n,r,u){var o=void 0,i=void 0,s=void 0,c=void 0,f=void 0,M=void 0,h=void 0,l=void 0,v=void 0,d=void 0,b=n[0],m=n[1],p=n[2],P=u[0],A=u[1],E=u[2],O=r[0],R=r[1],y=r[2];if(Math.abs(b-O)0&&(l=1/Math.sqrt(l),f*=l,M*=l,h*=l);var v=s*h-c*M,d=c*f-i*h,b=i*M-s*f;(l=v*v+d*d+b*b)>0&&(l=1/Math.sqrt(l),v*=l,d*=l,b*=l);return t[0]=v,t[1]=d,t[2]=b,t[3]=0,t[4]=M*b-h*d,t[5]=h*v-f*b,t[6]=f*d-M*v,t[7]=0,t[8]=f,t[9]=M,t[10]=h,t[11]=0,t[12]=e,t[13]=u,t[14]=o,t[15]=1,t},n.str=function(t){return\"mat4(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\", \"+t[8]+\", \"+t[9]+\", \"+t[10]+\", \"+t[11]+\", \"+t[12]+\", \"+t[13]+\", \"+t[14]+\", \"+t[15]+\")\"},n.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},n.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t[4]=n[4]+r[4],t[5]=n[5]+r[5],t[6]=n[6]+r[6],t[7]=n[7]+r[7],t[8]=n[8]+r[8],t[9]=n[9]+r[9],t[10]=n[10]+r[10],t[11]=n[11]+r[11],t[12]=n[12]+r[12],t[13]=n[13]+r[13],t[14]=n[14]+r[14],t[15]=n[15]+r[15],t},n.subtract=i,n.multiplyScalar=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=n[7]*r,t[8]=n[8]*r,t[9]=n[9]*r,t[10]=n[10]*r,t[11]=n[11]*r,t[12]=n[12]*r,t[13]=n[13]*r,t[14]=n[14]*r,t[15]=n[15]*r,t},n.multiplyScalarAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t[4]=n[4]+r[4]*a,t[5]=n[5]+r[5]*a,t[6]=n[6]+r[6]*a,t[7]=n[7]+r[7]*a,t[8]=n[8]+r[8]*a,t[9]=n[9]+r[9]*a,t[10]=n[10]+r[10]*a,t[11]=n[11]+r[11]*a,t[12]=n[12]+r[12]*a,t[13]=n[13]+r[13]*a,t[14]=n[14]+r[14]*a,t[15]=n[15]+r[15]*a,t},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=t[3],i=t[4],s=t[5],c=t[6],f=t[7],M=t[8],h=t[9],l=t[10],v=t[11],d=t[12],b=t[13],m=t[14],p=t[15],P=n[0],A=n[1],E=n[2],O=n[3],R=n[4],y=n[5],q=n[6],x=n[7],_=n[8],Y=n[9],L=n[10],S=n[11],w=n[12],I=n[13],N=n[14],g=n[15];return Math.abs(r-P)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(P))&&Math.abs(e-A)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(A))&&Math.abs(u-E)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(E))&&Math.abs(o-O)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(O))&&Math.abs(i-R)<=a.EPSILON*Math.max(1,Math.abs(i),Math.abs(R))&&Math.abs(s-y)<=a.EPSILON*Math.max(1,Math.abs(s),Math.abs(y))&&Math.abs(c-q)<=a.EPSILON*Math.max(1,Math.abs(c),Math.abs(q))&&Math.abs(f-x)<=a.EPSILON*Math.max(1,Math.abs(f),Math.abs(x))&&Math.abs(M-_)<=a.EPSILON*Math.max(1,Math.abs(M),Math.abs(_))&&Math.abs(h-Y)<=a.EPSILON*Math.max(1,Math.abs(h),Math.abs(Y))&&Math.abs(l-L)<=a.EPSILON*Math.max(1,Math.abs(l),Math.abs(L))&&Math.abs(v-S)<=a.EPSILON*Math.max(1,Math.abs(v),Math.abs(S))&&Math.abs(d-w)<=a.EPSILON*Math.max(1,Math.abs(d),Math.abs(w))&&Math.abs(b-I)<=a.EPSILON*Math.max(1,Math.abs(b),Math.abs(I))&&Math.abs(m-N)<=a.EPSILON*Math.max(1,Math.abs(m),Math.abs(N))&&Math.abs(p-g)<=a.EPSILON*Math.max(1,Math.abs(p),Math.abs(g))};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function u(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=n[6],f=n[7],M=n[8],h=n[9],l=n[10],v=n[11],d=n[12],b=n[13],m=n[14],p=n[15],P=r[0],A=r[1],E=r[2],O=r[3];return t[0]=P*a+A*i+E*M+O*d,t[1]=P*e+A*s+E*h+O*b,t[2]=P*u+A*c+E*l+O*m,t[3]=P*o+A*f+E*v+O*p,P=r[4],A=r[5],E=r[6],O=r[7],t[4]=P*a+A*i+E*M+O*d,t[5]=P*e+A*s+E*h+O*b,t[6]=P*u+A*c+E*l+O*m,t[7]=P*o+A*f+E*v+O*p,P=r[8],A=r[9],E=r[10],O=r[11],t[8]=P*a+A*i+E*M+O*d,t[9]=P*e+A*s+E*h+O*b,t[10]=P*u+A*c+E*l+O*m,t[11]=P*o+A*f+E*v+O*p,P=r[12],A=r[13],E=r[14],O=r[15],t[12]=P*a+A*i+E*M+O*d,t[13]=P*e+A*s+E*h+O*b,t[14]=P*u+A*c+E*l+O*m,t[15]=P*o+A*f+E*v+O*p,t}function o(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=a+a,s=e+e,c=u+u,f=a*i,M=a*s,h=a*c,l=e*s,v=e*c,d=u*c,b=o*i,m=o*s,p=o*c;return t[0]=1-(l+d),t[1]=M+p,t[2]=h-m,t[3]=0,t[4]=M-p,t[5]=1-(f+d),t[6]=v+b,t[7]=0,t[8]=h+m,t[9]=v-b,t[10]=1-(f+l),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}function i(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t[4]=n[4]-r[4],t[5]=n[5]-r[5],t[6]=n[6]-r[6],t[7]=n[7]-r[7],t[8]=n[8]-r[8],t[9]=n[9]-r[9],t[10]=n[10]-r[10],t[11]=n[11]-r[11],t[12]=n[12]-r[12],t[13]=n[13]-r[13],t[14]=n[14]-r[14],t[15]=n[15]-r[15],t}n.mul=u,n.sub=i},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.sub=n.mul=void 0,n.create=function(){var t=new a.ARRAY_TYPE(9);a.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0);return t[0]=1,t[4]=1,t[8]=1,t},n.fromMat4=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},n.clone=function(t){var n=new a.ARRAY_TYPE(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},n.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},n.fromValues=function(t,n,r,e,u,o,i,s,c){var f=new a.ARRAY_TYPE(9);return f[0]=t,f[1]=n,f[2]=r,f[3]=e,f[4]=u,f[5]=o,f[6]=i,f[7]=s,f[8]=c,f},n.set=function(t,n,r,a,e,u,o,i,s,c){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t[4]=u,t[5]=o,t[6]=i,t[7]=s,t[8]=c,t},n.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},n.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],e=n[5];t[1]=n[3],t[2]=n[6],t[3]=r,t[5]=n[7],t[6]=a,t[7]=e}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},n.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],s=n[6],c=n[7],f=n[8],M=f*o-i*c,h=-f*u+i*s,l=c*u-o*s,v=r*M+a*h+e*l;if(!v)return null;return v=1/v,t[0]=M*v,t[1]=(-f*a+e*c)*v,t[2]=(i*a-e*o)*v,t[3]=h*v,t[4]=(f*r-e*s)*v,t[5]=(-i*r+e*u)*v,t[6]=l*v,t[7]=(-c*r+a*s)*v,t[8]=(o*r-a*u)*v,t},n.adjoint=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],s=n[6],c=n[7],f=n[8];return t[0]=o*f-i*c,t[1]=e*c-a*f,t[2]=a*i-e*o,t[3]=i*s-u*f,t[4]=r*f-e*s,t[5]=e*u-r*i,t[6]=u*c-o*s,t[7]=a*s-r*c,t[8]=r*o-a*u,t},n.determinant=function(t){var n=t[0],r=t[1],a=t[2],e=t[3],u=t[4],o=t[5],i=t[6],s=t[7],c=t[8];return n*(c*u-o*s)+r*(-c*e+o*i)+a*(s*e-u*i)},n.multiply=e,n.translate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=n[6],f=n[7],M=n[8],h=r[0],l=r[1];return t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=i,t[5]=s,t[6]=h*a+l*o+c,t[7]=h*e+l*i+f,t[8]=h*u+l*s+M,t},n.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=n[6],f=n[7],M=n[8],h=Math.sin(r),l=Math.cos(r);return t[0]=l*a+h*o,t[1]=l*e+h*i,t[2]=l*u+h*s,t[3]=l*o-h*a,t[4]=l*i-h*e,t[5]=l*s-h*u,t[6]=c,t[7]=f,t[8]=M,t},n.scale=function(t,n,r){var a=r[0],e=r[1];return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=e*n[3],t[4]=e*n[4],t[5]=e*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},n.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},n.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=-r,t[4]=a,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},n.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},n.fromMat2d=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},n.fromQuat=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r+r,i=a+a,s=e+e,c=r*o,f=a*o,M=a*i,h=e*o,l=e*i,v=e*s,d=u*o,b=u*i,m=u*s;return t[0]=1-M-v,t[3]=f-m,t[6]=h+b,t[1]=f+m,t[4]=1-c-v,t[7]=l-d,t[2]=h-b,t[5]=l+d,t[8]=1-c-M,t},n.normalFromMat4=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],s=n[6],c=n[7],f=n[8],M=n[9],h=n[10],l=n[11],v=n[12],d=n[13],b=n[14],m=n[15],p=r*i-a*o,P=r*s-e*o,A=r*c-u*o,E=a*s-e*i,O=a*c-u*i,R=e*c-u*s,y=f*d-M*v,q=f*b-h*v,x=f*m-l*v,_=M*b-h*d,Y=M*m-l*d,L=h*m-l*b,S=p*L-P*Y+A*_+E*x-O*q+R*y;if(!S)return null;return S=1/S,t[0]=(i*L-s*Y+c*_)*S,t[1]=(s*x-o*L-c*q)*S,t[2]=(o*Y-i*x+c*y)*S,t[3]=(e*Y-a*L-u*_)*S,t[4]=(r*L-e*x+u*q)*S,t[5]=(a*x-r*Y-u*y)*S,t[6]=(d*R-b*O+m*E)*S,t[7]=(b*A-v*R-m*P)*S,t[8]=(v*O-d*A+m*p)*S,t},n.projection=function(t,n,r){return t[0]=2/n,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/r,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},n.str=function(t){return\"mat3(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\", \"+t[8]+\")\"},n.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},n.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t[4]=n[4]+r[4],t[5]=n[5]+r[5],t[6]=n[6]+r[6],t[7]=n[7]+r[7],t[8]=n[8]+r[8],t},n.subtract=u,n.multiplyScalar=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=n[7]*r,t[8]=n[8]*r,t},n.multiplyScalarAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t[4]=n[4]+r[4]*a,t[5]=n[5]+r[5]*a,t[6]=n[6]+r[6]*a,t[7]=n[7]+r[7]*a,t[8]=n[8]+r[8]*a,t},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=t[3],i=t[4],s=t[5],c=t[6],f=t[7],M=t[8],h=n[0],l=n[1],v=n[2],d=n[3],b=n[4],m=n[5],p=n[6],P=n[7],A=n[8];return Math.abs(r-h)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(h))&&Math.abs(e-l)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(u-v)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(v))&&Math.abs(o-d)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(d))&&Math.abs(i-b)<=a.EPSILON*Math.max(1,Math.abs(i),Math.abs(b))&&Math.abs(s-m)<=a.EPSILON*Math.max(1,Math.abs(s),Math.abs(m))&&Math.abs(c-p)<=a.EPSILON*Math.max(1,Math.abs(c),Math.abs(p))&&Math.abs(f-P)<=a.EPSILON*Math.max(1,Math.abs(f),Math.abs(P))&&Math.abs(M-A)<=a.EPSILON*Math.max(1,Math.abs(M),Math.abs(A))};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=n[6],f=n[7],M=n[8],h=r[0],l=r[1],v=r[2],d=r[3],b=r[4],m=r[5],p=r[6],P=r[7],A=r[8];return t[0]=h*a+l*o+v*c,t[1]=h*e+l*i+v*f,t[2]=h*u+l*s+v*M,t[3]=d*a+b*o+m*c,t[4]=d*e+b*i+m*f,t[5]=d*u+b*s+m*M,t[6]=p*a+P*o+A*c,t[7]=p*e+P*i+A*f,t[8]=p*u+P*s+A*M,t}function u(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t[4]=n[4]-r[4],t[5]=n[5]-r[5],t[6]=n[6]-r[6],t[7]=n[7]-r[7],t[8]=n[8]-r[8],t}n.mul=e,n.sub=u},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.forEach=n.sqrLen=n.sqrDist=n.dist=n.div=n.mul=n.sub=n.len=void 0,n.create=e,n.clone=function(t){var n=new a.ARRAY_TYPE(2);return n[0]=t[0],n[1]=t[1],n},n.fromValues=function(t,n){var r=new a.ARRAY_TYPE(2);return r[0]=t,r[1]=n,r},n.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t},n.set=function(t,n,r){return t[0]=n,t[1]=r,t},n.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t},n.subtract=u,n.multiply=o,n.divide=i,n.ceil=function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t},n.floor=function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t},n.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t},n.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t},n.round=function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t},n.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t},n.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t},n.distance=s,n.squaredDistance=c,n.length=f,n.squaredLength=M,n.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t},n.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t},n.normalize=function(t,n){var r=n[0],a=n[1],e=r*r+a*a;e>0&&(e=1/Math.sqrt(e),t[0]=n[0]*e,t[1]=n[1]*e);return t},n.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]},n.cross=function(t,n,r){var a=n[0]*r[1]-n[1]*r[0];return t[0]=t[1]=0,t[2]=a,t},n.lerp=function(t,n,r,a){var e=n[0],u=n[1];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t},n.random=function(t,n){n=n||1;var r=2*a.RANDOM()*Math.PI;return t[0]=Math.cos(r)*n,t[1]=Math.sin(r)*n,t},n.transformMat2=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[2]*e,t[1]=r[1]*a+r[3]*e,t},n.transformMat2d=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[2]*e+r[4],t[1]=r[1]*a+r[3]*e+r[5],t},n.transformMat3=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[3]*e+r[6],t[1]=r[1]*a+r[4]*e+r[7],t},n.transformMat4=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[4]*e+r[12],t[1]=r[1]*a+r[5]*e+r[13],t},n.rotate=function(t,n,r,a){var e=n[0]-r[0],u=n[1]-r[1],o=Math.sin(a),i=Math.cos(a);return t[0]=e*i-u*o+r[0],t[1]=e*o+u*i+r[1],t},n.angle=function(t,n){var r=t[0],a=t[1],e=n[0],u=n[1],o=r*r+a*a;o>0&&(o=1/Math.sqrt(o));var i=e*e+u*u;i>0&&(i=1/Math.sqrt(i));var s=(r*e+a*u)*o*i;return s>1?0:s<-1?Math.PI:Math.acos(s)},n.str=function(t){return\"vec2(\"+t[0]+\", \"+t[1]+\")\"},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]},n.equals=function(t,n){var r=t[0],e=t[1],u=n[0],o=n[1];return Math.abs(r-u)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(e-o)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(o))};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(){var t=new a.ARRAY_TYPE(2);return a.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0),t}function u(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t}function o(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t}function i(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t}function s(t,n){var r=n[0]-t[0],a=n[1]-t[1];return Math.sqrt(r*r+a*a)}function c(t,n){var r=n[0]-t[0],a=n[1]-t[1];return r*r+a*a}function f(t){var n=t[0],r=t[1];return Math.sqrt(n*n+r*r)}function M(t){var n=t[0],r=t[1];return n*n+r*r}n.len=f,n.sub=u,n.mul=o,n.div=i,n.dist=s,n.sqrDist=c,n.sqrLen=M,n.forEach=function(){var t=e();return function(n,r,a,e,u,o){var i=void 0,s=void 0;for(r||(r=2),a||(a=0),s=e?Math.min(e*r+a,n.length):n.length,i=a;i0){r=Math.sqrt(r);var a=n[0]/r,e=n[1]/r,u=n[2]/r,o=n[3]/r,i=n[4],s=n[5],c=n[6],f=n[7],M=a*i+e*s+u*c+o*f;t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=(i-a*M)/r,t[5]=(s-e*M)/r,t[6]=(c-u*M)/r,t[7]=(f-o*M)/r}return t},n.str=function(t){return\"quat2(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\")\"},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=t[3],i=t[4],s=t[5],c=t[6],f=t[7],M=n[0],h=n[1],l=n[2],v=n[3],d=n[4],b=n[5],m=n[6],p=n[7];return Math.abs(r-M)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(M))&&Math.abs(e-h)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(h))&&Math.abs(u-l)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(l))&&Math.abs(o-v)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(v))&&Math.abs(i-d)<=a.EPSILON*Math.max(1,Math.abs(i),Math.abs(d))&&Math.abs(s-b)<=a.EPSILON*Math.max(1,Math.abs(s),Math.abs(b))&&Math.abs(c-m)<=a.EPSILON*Math.max(1,Math.abs(c),Math.abs(m))&&Math.abs(f-p)<=a.EPSILON*Math.max(1,Math.abs(f),Math.abs(p))};var a=o(r(0)),e=o(r(3)),u=o(r(4));function o(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}function i(t,n,r){var a=.5*r[0],e=.5*r[1],u=.5*r[2],o=n[0],i=n[1],s=n[2],c=n[3];return t[0]=o,t[1]=i,t[2]=s,t[3]=c,t[4]=a*c+e*s-u*i,t[5]=e*c+u*o-a*s,t[6]=u*c+a*i-e*o,t[7]=-a*o-e*i-u*s,t}function s(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}n.getReal=e.copy;n.setReal=e.copy;function c(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[4],s=r[5],c=r[6],f=r[7],M=n[4],h=n[5],l=n[6],v=n[7],d=r[0],b=r[1],m=r[2],p=r[3];return t[0]=a*p+o*d+e*m-u*b,t[1]=e*p+o*b+u*d-a*m,t[2]=u*p+o*m+a*b-e*d,t[3]=o*p-a*d-e*b-u*m,t[4]=a*f+o*i+e*c-u*s+M*p+v*d+h*m-l*b,t[5]=e*f+o*s+u*i-a*c+h*p+v*b+l*d-M*m,t[6]=u*f+o*c+a*s-e*i+l*p+v*m+M*b-h*d,t[7]=o*f-a*i-e*s-u*c+v*p-M*d-h*b-l*m,t}n.mul=c;var f=n.dot=e.dot;var M=n.length=e.length,h=(n.len=M,n.squaredLength=e.squaredLength);n.sqrLen=h},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.sub=n.mul=void 0,n.create=function(){var t=new a.ARRAY_TYPE(6);a.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[4]=0,t[5]=0);return t[0]=1,t[3]=1,t},n.clone=function(t){var n=new a.ARRAY_TYPE(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},n.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},n.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},n.fromValues=function(t,n,r,e,u,o){var i=new a.ARRAY_TYPE(6);return i[0]=t,i[1]=n,i[2]=r,i[3]=e,i[4]=u,i[5]=o,i},n.set=function(t,n,r,a,e,u,o){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t[4]=u,t[5]=o,t},n.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],s=r*u-a*e;if(!s)return null;return s=1/s,t[0]=u*s,t[1]=-a*s,t[2]=-e*s,t[3]=r*s,t[4]=(e*i-u*o)*s,t[5]=(a*o-r*i)*s,t},n.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},n.multiply=e,n.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=Math.sin(r),f=Math.cos(r);return t[0]=a*f+u*c,t[1]=e*f+o*c,t[2]=a*-c+u*f,t[3]=e*-c+o*f,t[4]=i,t[5]=s,t},n.scale=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=r[0],f=r[1];return t[0]=a*c,t[1]=e*c,t[2]=u*f,t[3]=o*f,t[4]=i,t[5]=s,t},n.translate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=r[0],f=r[1];return t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=a*c+u*f+i,t[5]=e*c+o*f+s,t},n.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t[4]=0,t[5]=0,t},n.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},n.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},n.str=function(t){return\"mat2d(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\")\"},n.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},n.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t[4]=n[4]+r[4],t[5]=n[5]+r[5],t},n.subtract=u,n.multiplyScalar=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*r,t[5]=n[5]*r,t},n.multiplyScalarAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t[4]=n[4]+r[4]*a,t[5]=n[5]+r[5]*a,t},n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=t[3],i=t[4],s=t[5],c=n[0],f=n[1],M=n[2],h=n[3],l=n[4],v=n[5];return Math.abs(r-c)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(c))&&Math.abs(e-f)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(f))&&Math.abs(u-M)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(M))&&Math.abs(o-h)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(h))&&Math.abs(i-l)<=a.EPSILON*Math.max(1,Math.abs(i),Math.abs(l))&&Math.abs(s-v)<=a.EPSILON*Math.max(1,Math.abs(s),Math.abs(v))};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],s=n[5],c=r[0],f=r[1],M=r[2],h=r[3],l=r[4],v=r[5];return t[0]=a*c+u*f,t[1]=e*c+o*f,t[2]=a*M+u*h,t[3]=e*M+o*h,t[4]=a*l+u*v+i,t[5]=e*l+o*v+s,t}function u(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t[4]=n[4]-r[4],t[5]=n[5]-r[5],t}n.mul=e,n.sub=u},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.sub=n.mul=void 0,n.create=function(){var t=new a.ARRAY_TYPE(4);a.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0);return t[0]=1,t[3]=1,t},n.clone=function(t){var n=new a.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},n.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},n.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},n.fromValues=function(t,n,r,e){var u=new a.ARRAY_TYPE(4);return u[0]=t,u[1]=n,u[2]=r,u[3]=e,u},n.set=function(t,n,r,a,e){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t},n.transpose=function(t,n){if(t===n){var r=n[1];t[1]=n[2],t[2]=r}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},n.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*u-e*a;if(!o)return null;return o=1/o,t[0]=u*o,t[1]=-a*o,t[2]=-e*o,t[3]=r*o,t},n.adjoint=function(t,n){var r=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=r,t},n.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},n.multiply=e,n.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),s=Math.cos(r);return t[0]=a*s+u*i,t[1]=e*s+o*i,t[2]=a*-i+u*s,t[3]=e*-i+o*s,t},n.scale=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],s=r[1];return t[0]=a*i,t[1]=e*i,t[2]=u*s,t[3]=o*s,t},n.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t},n.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},n.str=function(t){return\"mat2(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\")\"},n.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},n.LDU=function(t,n,r,a){return t[2]=a[2]/a[0],r[0]=a[0],r[1]=a[1],r[3]=a[3]-t[2]*r[1],[t,n,r]},n.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t},n.subtract=u,n.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]},n.equals=function(t,n){var r=t[0],e=t[1],u=t[2],o=t[3],i=n[0],s=n[1],c=n[2],f=n[3];return Math.abs(r-i)<=a.EPSILON*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(e-s)<=a.EPSILON*Math.max(1,Math.abs(e),Math.abs(s))&&Math.abs(u-c)<=a.EPSILON*Math.max(1,Math.abs(u),Math.abs(c))&&Math.abs(o-f)<=a.EPSILON*Math.max(1,Math.abs(o),Math.abs(f))},n.multiplyScalar=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t},n.multiplyScalarAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t};var a=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}(r(0));function e(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],s=r[1],c=r[2],f=r[3];return t[0]=a*i+u*s,t[1]=e*i+o*s,t[2]=a*c+u*f,t[3]=e*c+o*f,t}function u(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t}n.mul=e,n.sub=u},function(t,n,r){\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),n.vec4=n.vec3=n.vec2=n.quat2=n.quat=n.mat4=n.mat3=n.mat2d=n.mat2=n.glMatrix=void 0;var a=l(r(0)),e=l(r(9)),u=l(r(8)),o=l(r(5)),i=l(r(4)),s=l(r(3)),c=l(r(7)),f=l(r(6)),M=l(r(2)),h=l(r(1));function l(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n.default=t,n}n.glMatrix=a,n.mat2=e,n.mat2d=u,n.mat3=o,n.mat4=i,n.quat=s,n.quat2=c,n.vec2=f,n.vec3=M,n.vec4=h}])});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvZGlzdC9nbC1tYXRyaXguanM/NGE1MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSwyQkFBd0UsMkRBQTJELEtBQUssVUFBVSw2REFBNkQsK0NBQStDLG1CQUFtQixTQUFTLGNBQWMsNEJBQTRCLFlBQVkscUJBQXFCLDJEQUEyRCx1Q0FBdUMscUNBQXFDLG9CQUFvQixFQUFFLGlCQUFpQiw0RkFBNEYsZUFBZSx3Q0FBd0MsU0FBUyxFQUFFLG1CQUFtQiw4QkFBOEIscURBQXFELDBCQUEwQiw2Q0FBNkMsc0JBQXNCLDZEQUE2RCxZQUFZLGVBQWUsU0FBUyxpQkFBaUIsaUNBQWlDLGlCQUFpQixZQUFZLFVBQVUsc0JBQXNCLG1CQUFtQixpREFBaUQsa0JBQWtCLGtCQUFrQixhQUFhLHNDQUFzQyxTQUFTLG1DQUFtQyxlQUFlLHdCQUF3QixXQUFXLHdCQUF3Qiw2REFBNkQscUJBQXFCLHNGQUFzRixrQkFBa0IsaUJBQWlCLGFBQWEsc0NBQXNDLFNBQVMsb0dBQW9HLDBCQUEwQixpREFBaUQsZ0NBQWdDLDBCQUEwQixxQ0FBcUMsc0JBQXNCLGlEQUFpRCwyQkFBMkIscUNBQXFDLHVCQUF1QixxRUFBcUUsMkRBQTJELDZGQUE2Rix1QkFBdUIsaUdBQWlHLHVCQUF1Qiw2R0FBNkcsdUJBQXVCLDZHQUE2Ryx1QkFBdUIsaUdBQWlHLHlCQUF5Qix5REFBeUQsaUNBQWlDLDZFQUE2RSxzRkFBc0YscURBQXFELHlCQUF5Qix5REFBeUQsMkJBQTJCLGtEQUFrRCw0REFBNEQsU0FBUyxxQkFBcUIsK0NBQStDLDBCQUEwQixnQ0FBZ0MsaUZBQWlGLHdCQUF3QixnQkFBZ0IsT0FBTyxHQUFHLDRDQUE0QyxZQUFZLEdBQUcsNENBQTRDLFlBQVkseUJBQXlCLGlEQUFpRCxpQ0FBaUMsZ0NBQWdDLG1KQUFtSixpQ0FBaUMsOEdBQThHLDJGQUEyRixtQkFBbUIscURBQXFELDZCQUE2QiwwREFBMEQsd0JBQXdCLDREQUE0RCwrUEFBK1Asa0JBQWtCLDRCQUE0QixTQUFTLGlGQUFpRixxQkFBcUIsT0FBTyxhQUFhLDBCQUEwQixtRUFBbUUsa0JBQWtCLHFFQUFxRSxrQkFBa0IscUVBQXFFLGtCQUFrQixxRUFBcUUsZ0JBQWdCLG9EQUFvRCxrQ0FBa0MsZ0JBQWdCLG9EQUFvRCx1QkFBdUIsY0FBYyxnQ0FBZ0Msa0NBQWtDLGNBQWMsZ0NBQWdDLHVCQUF1QixxRkFBcUYsVUFBVSw2QkFBNkIsc0JBQXNCLGdFQUFnRSxJQUFJLDBHQUEwRyxVQUFVLEdBQUcsaUJBQWlCLGFBQWEsc0NBQXNDLFNBQVMsb0dBQW9HLDBCQUEwQix1Q0FBdUMsZ0RBQWdELHVDQUF1Qyx5QkFBeUIsOEJBQThCLHVCQUF1QixzREFBc0QsMkRBQTJELHdFQUF3RSx1QkFBdUIsMkVBQTJFLHVCQUF1QixvRkFBb0YsdUJBQXVCLG9GQUFvRix1QkFBdUIsMkVBQTJFLHlCQUF5Qiw2Q0FBNkMsaUNBQWlDLDREQUE0RCwyRUFBMkUsMENBQTBDLHlCQUF5Qiw2Q0FBNkMsK0NBQStDLDhDQUE4QyxnREFBZ0QsMEJBQTBCLHlCQUF5QiwrREFBK0QsaUNBQWlDLDBEQUEwRCw0R0FBNEcsZ0NBQWdDLGtEQUFrRCw0R0FBNEcsd0JBQXdCLE9BQU8saUVBQWlFLHdEQUF3RCxpQ0FBaUMsdURBQXVELDZIQUE2SCxpQ0FBaUMseUJBQXlCLHVGQUF1RixpQ0FBaUMsdUhBQXVILHdFQUF3RSw2QkFBNkIsY0FBYywyTEFBMkwsNkJBQTZCLGNBQWMsMkxBQTJMLDZCQUE2QixjQUFjLDJMQUEyTCx1QkFBdUIsNENBQTRDLGNBQWMsYUFBYSx1Q0FBdUMsbUJBQW1CLDJDQUEyQyw2QkFBNkIsNkNBQTZDLHdCQUF3Qiw4Q0FBOEMsaU1BQWlNLGtCQUFrQiw0QkFBNEIsU0FBUyxpRkFBaUYscUJBQXFCLE9BQU8sYUFBYSwwQkFBMEIsNERBQTRELGNBQWMseUJBQXlCLDhCQUE4QixrQkFBa0IsMEJBQTBCLDhCQUE4QixrQkFBa0Isc0RBQXNELGtCQUFrQixzREFBc0Qsa0JBQWtCLHNEQUFzRCxnQkFBZ0Isd0NBQXdDLDhCQUE4QixnQkFBZ0Isd0NBQXdDLG1CQUFtQixjQUFjLHlCQUF5QixtQkFBbUIsZ0JBQWdCLHVDQUF1QyxxRUFBcUUsZ0JBQWdCLHFDQUFxQyxxRkFBcUYsVUFBVSw2QkFBNkIsc0JBQXNCLGdFQUFnRSxJQUFJLGtGQUFrRixVQUFVLEdBQUcsaUJBQWlCLGFBQWEsc0NBQXNDLFNBQVMseU5BQXlOLHFDQUFxQywrQ0FBK0Msd0NBQXdDLHlFQUF5RSxTQUFTLHdDQUF3QyxNQUFNLDREQUE0RCw2REFBNkQsMkJBQTJCLE1BQU0sNERBQTRELDZEQUE2RCwyQkFBMkIsTUFBTSw0REFBNEQsNkRBQTZELDRCQUE0Qix5QkFBeUIsc0VBQXNFLGdDQUFnQywyRUFBMkUsNkhBQTZILHdCQUF3Qiw0REFBNEQsZ0RBQWdELDJCQUEyQixvREFBb0QsNENBQTRDLHFCQUFxQixlQUFlLHdGQUF3Riw2RUFBNkUsbUJBQW1CLHNEQUFzRCw0Q0FBNEMsY0FBYyw0QkFBNEIsU0FBUyxpRkFBaUYscUJBQXFCLGFBQWEsMEJBQTBCLG1FQUFtRSxrQkFBa0IsTUFBTSxrQkFBa0IsOERBQThELGtCQUFrQiw0REFBNEQsNkZBQTZGLG9CQUFvQix5R0FBeUcsK01BQStNLGdCQUFnQiw4QkFBOEIsa0dBQWtHLEtBQUssUUFBUSxzQ0FBc0Msd0JBQXdCLDRJQUE0SSxTQUFTLGtJQUFrSSwyR0FBMkcsc0VBQXNFLDZEQUE2RCx1QkFBdUIsaUJBQWlCLDZNQUE2TSx1QkFBdUIsZ0JBQWdCLDZCQUE2QixtREFBbUQsd0JBQXdCLGlCQUFpQix5QkFBeUIsaUhBQWlILEdBQUcsaUJBQWlCLGFBQWEsc0NBQXNDLFNBQVMseUNBQXlDLDJCQUEyQixzSEFBc0gsdUNBQXVDLHFCQUFxQiwyQkFBMkIscUxBQXFMLHNCQUFzQixxTEFBcUwsd0RBQXdELDJCQUEyQiwrSEFBK0gsbURBQW1ELCtIQUErSCx3Q0FBd0MsVUFBVSwrQ0FBK0MsNkdBQTZHLGlMQUFpTCxTQUFTLHdCQUF3Qiw0UUFBNFEsa0JBQWtCLHFXQUFxVyx5QkFBeUIsMEhBQTBILHVyQkFBdXJCLDJCQUEyQiwwSEFBMEgsOEhBQThILDBDQUEwQyxxSUFBcUksNFpBQTRaLFNBQVMseUJBQXlCLHlCQUF5Qiw2TUFBNk0sNEJBQTRCLDBRQUEwUSwyQkFBMkIsd2ZBQXdmLFNBQVMsMkJBQTJCLDBGQUEwRixpR0FBaUcsbUhBQW1ILDJCQUEyQiwwRkFBMEYsaUdBQWlHLG1IQUFtSCwyQkFBMkIsd0ZBQXdGLHFHQUFxRyxpSEFBaUgsaUNBQWlDLHdJQUF3SSw2QkFBNkIsd0lBQXdJLGdDQUFnQyw2RUFBNkUsMkJBQTJCLHNQQUFzUCwrQkFBK0IsZ0NBQWdDLGdJQUFnSSwrQkFBK0IsZ0NBQWdDLGdJQUFnSSwrQkFBK0IsZ0NBQWdDLGdJQUFnSSx1REFBdUQsdUdBQXVHLG9LQUFvSyxrQkFBa0IsZ0NBQWdDLDBDQUEwQyw0QkFBNEIsb0VBQW9FLDZGQUE2Riw2QkFBNkIsMEJBQTBCLG1iQUFtYixTQUFTLGtEQUFrRCw2SEFBNkgsME1BQTBNLDBEQUEwRCx3UEFBd1Asd0xBQXdMLDBCQUEwQix3R0FBd0csdUpBQXVKLG1DQUFtQyxrQ0FBa0MsZ0tBQWdLLG1DQUFtQywrQkFBK0Isd0xBQXdMLFNBQVMsZ0RBQWdELCtLQUErSyxpS0FBaUssaUNBQWlDLGtDQUFrQyx5SkFBeUosNEJBQTRCLDZKQUE2Six5RkFBeUYsd0pBQXdKLDRGQUE0RixzS0FBc0ssOEJBQThCLHVGQUF1Rix1Q0FBdUMsa0NBQWtDLHFEQUFxRCxpSkFBaUosbUJBQW1CLG1MQUFtTCxvQkFBb0Isd1NBQXdTLHVCQUF1QiwyUUFBMlEsK0NBQStDLHFOQUFxTiwwQ0FBMEMsMlNBQTJTLDZCQUE2QixrT0FBa08sd0JBQXdCLGdQQUFnUCx1K0JBQXUrQixrQkFBa0IsNEJBQTRCLFNBQVMsaUZBQWlGLHFCQUFxQixPQUFPLGNBQWMsK0hBQStILGtCQUFrQixzSkFBc0oseWJBQXliLGtCQUFrQix3R0FBd0csc0tBQXNLLGtCQUFrQiwyUUFBMlEsZ0JBQWdCLGlCQUFpQixhQUFhLHNDQUFzQyxTQUFTLHlDQUF5QywwQkFBMEIsd0VBQXdFLDhCQUE4QiwwQkFBMEIsb0dBQW9HLHFCQUFxQiwwQkFBMEIsbUdBQW1HLHNCQUFzQixtR0FBbUcsMENBQTBDLDBCQUEwQix3RUFBd0UscUNBQXFDLHdFQUF3RSx3QkFBd0Isd0VBQXdFLDJCQUEyQixVQUFVLHlCQUF5QixtREFBbUQsK0ZBQStGLFNBQVMsd0JBQXdCLGdIQUFnSCxrQkFBa0IsbUpBQW1KLHlCQUF5QixtRUFBbUUsOEhBQThILDJCQUEyQixtRUFBbUUsNENBQTRDLDBDQUEwQyxpRkFBaUYsZ0dBQWdHLDBCQUEwQiwrRkFBK0YsNEdBQTRHLHlCQUF5QixrQkFBa0IsK0dBQStHLGlDQUFpQyw4RUFBOEUsOEJBQThCLGdDQUFnQyx5RUFBeUUsNkJBQTZCLDhFQUE4RSwyQkFBMkIsMEZBQTBGLDBCQUEwQix3R0FBd0csZ0dBQWdHLGdDQUFnQyw0UUFBNFEsa0JBQWtCLDRNQUE0TSw4QkFBOEIsOEVBQThFLG1CQUFtQix1R0FBdUcsb0JBQW9CLDJLQUEySyx1QkFBdUIsZ0pBQWdKLCtDQUErQyxxSEFBcUgsMENBQTBDLGtLQUFrSyw2QkFBNkIsMkhBQTJILHdCQUF3QixrSUFBa0kscWpCQUFxakIsa0JBQWtCLDRCQUE0QixTQUFTLGlGQUFpRixxQkFBcUIsT0FBTyxrQkFBa0Isa0lBQWtJLGtLQUFrSyxrQkFBa0IsZ0pBQWdKLGdCQUFnQixpQkFBaUIsYUFBYSxzQ0FBc0MsU0FBUyxvR0FBb0csMEJBQTBCLDZCQUE2Qiw0QkFBNEIsMEJBQTBCLHVCQUF1QixzQkFBc0IsNkJBQTZCLHVCQUF1Qix1QkFBdUIsdUJBQXVCLHVDQUF1QywyREFBMkQsbURBQW1ELHVCQUF1QixxREFBcUQsdUJBQXVCLDJEQUEyRCx1QkFBdUIsMkRBQTJELHVCQUF1QixxREFBcUQseUJBQXlCLGlDQUFpQyxpQ0FBaUMsMkNBQTJDLHNGQUFzRiwrQkFBK0IseUJBQXlCLGlDQUFpQywyQkFBMkIsNEJBQTRCLGdEQUFnRCxTQUFTLHFCQUFxQiwyQkFBMkIseUJBQXlCLDBCQUEwQiw0QkFBNEIsMEJBQTBCLGtCQUFrQiw2Q0FBNkMsd0JBQXdCLE9BQU8sMkJBQTJCLCtDQUErQyxpQ0FBaUMsa0JBQWtCLCtDQUErQyxrQ0FBa0Msa0JBQWtCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCLHlEQUF5RCxpQ0FBaUMsa0JBQWtCLDJEQUEyRCw0QkFBNEIsd0RBQXdELDZDQUE2Qyx1QkFBdUIsMENBQTBDLHdCQUF3QixjQUFjLHdCQUF3QixvQkFBb0IsdUNBQXVDLG1CQUFtQixpQ0FBaUMsNkJBQTZCLGdDQUFnQyx3QkFBd0IsZ0NBQWdDLG1JQUFtSSxrQkFBa0IsNEJBQTRCLFNBQVMsaUZBQWlGLHFCQUFxQixPQUFPLGFBQWEsMEJBQTBCLHFEQUFxRCxrQkFBa0IsdUNBQXVDLGtCQUFrQix1Q0FBdUMsa0JBQWtCLHVDQUF1QyxnQkFBZ0IsNEJBQTRCLDBCQUEwQixnQkFBZ0IsNEJBQTRCLGVBQWUsY0FBYyxrQkFBa0IsMEJBQTBCLGNBQWMsa0JBQWtCLGVBQWUscUZBQXFGLFVBQVUsNkJBQTZCLHNCQUFzQixnRUFBZ0UsSUFBSSwwREFBMEQsVUFBVSxHQUFHLGlCQUFpQixhQUFhLHNDQUFzQyxTQUFTLHFHQUFxRywwQkFBMEIsK0VBQStFLGdCQUFnQixxQkFBcUIsMEJBQTBCLHlGQUF5Rix3Q0FBd0MsMEJBQTBCLGlFQUFpRSx5REFBeUQsMEJBQTBCLDRCQUE0Qix5QkFBeUIsOEVBQThFLDZEQUE2RCxtRkFBbUYsOEJBQThCLDZFQUE2RSwwQkFBMEIsaUJBQWlCLG1CQUFtQiwwQkFBMEIsd0NBQXdDLGlDQUFpQyxpRUFBaUUsbUNBQW1DLGlFQUFpRSx5QkFBeUIsaURBQWlELHlCQUF5QixpREFBaUQsZ0NBQWdDLCtEQUErRCxvRkFBb0YsNkJBQTZCLDBGQUEwRixrSEFBa0gsMkJBQTJCLHVJQUF1SSwwSUFBMEksMkJBQTJCLHVJQUF1SSwwSUFBMEksMkJBQTJCLHVJQUF1SSwwSUFBMEksc0NBQXNDLDREQUE0RCw2TUFBNk0sdUNBQXVDLDREQUE0RCw2TUFBNk0sc0NBQXNDLHVDQUF1QywrQ0FBK0MsTUFBTSw2RkFBNkYsb0ZBQW9GLGdDQUFnQyw2RkFBNkYsdUJBQXVCLGlJQUFpSSxzQ0FBc0MseUdBQXlHLDBCQUEwQixVQUFVLGlCQUFpQixpS0FBaUssd0JBQXdCLFdBQVcsK0dBQStHLDJCQUEyQiwrRkFBK0YsMkJBQTJCLFdBQVcsUUFBUSxlQUFlLHNGQUFzRix3RkFBd0YsU0FBUyxtQkFBbUIsOEZBQThGLDZCQUE2Qiw4R0FBOEcsd0JBQXdCLG9IQUFvSCx1ZkFBdWYsa0NBQWtDLGNBQWMsNEJBQTRCLFNBQVMsaUZBQWlGLHFCQUFxQixrQkFBa0IsOERBQThELDBHQUEwRyxnQkFBZ0IseUZBQXlGLGlCQUFpQixpQkFBaUIsa0JBQWtCLG9IQUFvSCxpUEFBaVAsUUFBUSxrQkFBa0Isb0VBQW9FLFdBQVcsaUJBQWlCLGFBQWEsc0NBQXNDLFNBQVMseUNBQXlDLDBCQUEwQiwwREFBMEQsdUJBQXVCLHFCQUFxQiwwQkFBMEIscUVBQXFFLHNCQUFzQixxRUFBcUUsd0JBQXdCLG1EQUFtRCxvQ0FBb0MsMEJBQTBCLG1EQUFtRCwrQkFBK0IsbURBQW1ELHdCQUF3Qix3REFBd0Qsa0JBQWtCLHVGQUF1RiwyQkFBMkIsMkJBQTJCLHVDQUF1QywwRUFBMEUsNkVBQTZFLHlCQUF5Qiw0REFBNEQsMkRBQTJELDZCQUE2Qiw0REFBNEQsbUVBQW1FLDhCQUE4QixnQ0FBZ0Msb0RBQW9ELDZCQUE2Qix5REFBeUQsaUNBQWlDLHlEQUF5RCxtQkFBbUIsMEVBQTBFLG9CQUFvQiwwSEFBMEgsdUJBQXVCLG1HQUFtRywrQ0FBK0MsaUZBQWlGLDBDQUEwQywrR0FBK0csNkJBQTZCLG9GQUFvRix3QkFBd0Isd0ZBQXdGLDJYQUEyWCxrQkFBa0IsNEJBQTRCLFNBQVMsaUZBQWlGLHFCQUFxQixPQUFPLGtCQUFrQix3RkFBd0YsMkZBQTJGLGtCQUFrQixtR0FBbUcsZ0JBQWdCLGlCQUFpQixhQUFhLHNDQUFzQyxTQUFTLHlDQUF5QywwQkFBMEIsNENBQTRDLHVCQUF1QixxQkFBcUIsMEJBQTBCLGlEQUFpRCxzQkFBc0IsaURBQWlELHdCQUF3QixxQ0FBcUMsZ0NBQWdDLDBCQUEwQixxQ0FBcUMsMkJBQTJCLHFDQUFxQywyQkFBMkIsVUFBVSxXQUFXLGlCQUFpQiw2Q0FBNkMsU0FBUyx3QkFBd0IsMENBQTBDLGtCQUFrQixxREFBcUQseUJBQXlCLFdBQVcsZ0RBQWdELDJCQUEyQiwyQkFBMkIsdUNBQXVDLDREQUE0RCwrREFBK0QseUJBQXlCLDhDQUE4Qyw2Q0FBNkMsOEJBQThCLGdDQUFnQyxzQ0FBc0MsNkJBQTZCLDJDQUEyQyxtQkFBbUIscURBQXFELG9CQUFvQixzRkFBc0YseUJBQXlCLHNFQUFzRSx1QkFBdUIscUVBQXFFLDBDQUEwQywwREFBMEQsd0JBQXdCLDREQUE0RCw4UEFBOFAsa0NBQWtDLHlEQUF5RCwwQ0FBMEMsOEVBQThFLGtCQUFrQiw0QkFBNEIsU0FBUyxpRkFBaUYscUJBQXFCLE9BQU8sa0JBQWtCLDREQUE0RCw2REFBNkQsa0JBQWtCLHFFQUFxRSxnQkFBZ0IsaUJBQWlCLGFBQWEsc0NBQXNDLFNBQVMscUZBQXFGLHdHQUF3RyxjQUFjLDRCQUE0QixTQUFTLGlGQUFpRixxQkFBcUIsZ0dBQWdHLEdBQUciLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuQGZpbGVvdmVydmlldyBnbC1tYXRyaXggLSBIaWdoIHBlcmZvcm1hbmNlIG1hdHJpeCBhbmQgdmVjdG9yIG9wZXJhdGlvbnNcbkBhdXRob3IgQnJhbmRvbiBKb25lc1xuQGF1dGhvciBDb2xpbiBNYWNLZW56aWUgSVZcbkB2ZXJzaW9uIDIuNy4wXG5cbkNvcHlyaWdodCAoYykgMjAxNS0yMDE4LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cbiFmdW5jdGlvbih0LG4pe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPW4oKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sbik7ZWxzZXt2YXIgcj1uKCk7Zm9yKHZhciBhIGluIHIpKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbYV09clthXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj17fTtmdW5jdGlvbiByKGEpe2lmKG5bYV0pcmV0dXJuIG5bYV0uZXhwb3J0czt2YXIgZT1uW2FdPXtpOmEsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFthXS5jYWxsKGUuZXhwb3J0cyxlLGUuZXhwb3J0cyxyKSxlLmw9ITAsZS5leHBvcnRzfXJldHVybiByLm09dCxyLmM9bixyLmQ9ZnVuY3Rpb24odCxuLGEpe3Iubyh0LG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtlbnVtZXJhYmxlOiEwLGdldDphfSl9LHIucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxyLnQ9ZnVuY3Rpb24odCxuKXtpZigxJm4mJih0PXIodCkpLDgmbilyZXR1cm4gdDtpZig0Jm4mJlwib2JqZWN0XCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihyLnIoYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImbiYmXCJzdHJpbmdcIiE9dHlwZW9mIHQpZm9yKHZhciBlIGluIHQpci5kKGEsZSxmdW5jdGlvbihuKXtyZXR1cm4gdFtuXX0uYmluZChudWxsLGUpKTtyZXR1cm4gYX0sci5uPWZ1bmN0aW9uKHQpe3ZhciBuPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiByLmQobixcImFcIixuKSxufSxyLm89ZnVuY3Rpb24odCxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbil9LHIucD1cIlwiLHIoci5zPTEwKX0oW2Z1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnNldE1hdHJpeEFycmF5VHlwZT1mdW5jdGlvbih0KXtuLkFSUkFZX1RZUEU9dH0sbi50b1JhZGlhbj1mdW5jdGlvbih0KXtyZXR1cm4gdCplfSxuLmVxdWFscz1mdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLmFicyh0LW4pPD1hKk1hdGgubWF4KDEsTWF0aC5hYnModCksTWF0aC5hYnMobikpfTt2YXIgYT1uLkVQU0lMT049MWUtNjtuLkFSUkFZX1RZUEU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIEZsb2F0MzJBcnJheT9GbG9hdDMyQXJyYXk6QXJyYXksbi5SQU5ET009TWF0aC5yYW5kb207dmFyIGU9TWF0aC5QSS8xODB9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLmZvckVhY2g9bi5zcXJMZW49bi5sZW49bi5zcXJEaXN0PW4uZGlzdD1uLmRpdj1uLm11bD1uLnN1Yj12b2lkIDAsbi5jcmVhdGU9ZSxuLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBhLkFSUkFZX1RZUEUoNCk7cmV0dXJuIG5bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxufSxuLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxuLHIsZSl7dmFyIHU9bmV3IGEuQVJSQVlfVFlQRSg0KTtyZXR1cm4gdVswXT10LHVbMV09bix1WzJdPXIsdVszXT1lLHV9LG4uY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdH0sbi5zZXQ9ZnVuY3Rpb24odCxuLHIsYSxlKXtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPWEsdFszXT1lLHR9LG4uYWRkPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0sdFsxXT1uWzFdK3JbMV0sdFsyXT1uWzJdK3JbMl0sdFszXT1uWzNdK3JbM10sdH0sbi5zdWJ0cmFjdD11LG4ubXVsdGlwbHk9byxuLmRpdmlkZT1pLG4uY2VpbD1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPU1hdGguY2VpbChuWzBdKSx0WzFdPU1hdGguY2VpbChuWzFdKSx0WzJdPU1hdGguY2VpbChuWzJdKSx0WzNdPU1hdGguY2VpbChuWzNdKSx0fSxuLmZsb29yPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09TWF0aC5mbG9vcihuWzBdKSx0WzFdPU1hdGguZmxvb3IoblsxXSksdFsyXT1NYXRoLmZsb29yKG5bMl0pLHRbM109TWF0aC5mbG9vcihuWzNdKSx0fSxuLm1pbj1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09TWF0aC5taW4oblswXSxyWzBdKSx0WzFdPU1hdGgubWluKG5bMV0sclsxXSksdFsyXT1NYXRoLm1pbihuWzJdLHJbMl0pLHRbM109TWF0aC5taW4oblszXSxyWzNdKSx0fSxuLm1heD1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09TWF0aC5tYXgoblswXSxyWzBdKSx0WzFdPU1hdGgubWF4KG5bMV0sclsxXSksdFsyXT1NYXRoLm1heChuWzJdLHJbMl0pLHRbM109TWF0aC5tYXgoblszXSxyWzNdKSx0fSxuLnJvdW5kPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09TWF0aC5yb3VuZChuWzBdKSx0WzFdPU1hdGgucm91bmQoblsxXSksdFsyXT1NYXRoLnJvdW5kKG5bMl0pLHRbM109TWF0aC5yb3VuZChuWzNdKSx0fSxuLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdKnIsdFsxXT1uWzFdKnIsdFsyXT1uWzJdKnIsdFszXT1uWzNdKnIsdH0sbi5zY2FsZUFuZEFkZD1mdW5jdGlvbih0LG4scixhKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0qYSx0WzFdPW5bMV0rclsxXSphLHRbMl09blsyXStyWzJdKmEsdFszXT1uWzNdK3JbM10qYSx0fSxuLmRpc3RhbmNlPXMsbi5zcXVhcmVkRGlzdGFuY2U9YyxuLmxlbmd0aD1mLG4uc3F1YXJlZExlbmd0aD1NLG4ubmVnYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09LW5bMF0sdFsxXT0tblsxXSx0WzJdPS1uWzJdLHRbM109LW5bM10sdH0sbi5pbnZlcnNlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09MS9uWzBdLHRbMV09MS9uWzFdLHRbMl09MS9uWzJdLHRbM109MS9uWzNdLHR9LG4ubm9ybWFsaXplPWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sZT1uWzJdLHU9blszXSxvPXIqcithKmErZSplK3UqdTtvPjAmJihvPTEvTWF0aC5zcXJ0KG8pLHRbMF09cipvLHRbMV09YSpvLHRbMl09ZSpvLHRbM109dSpvKTtyZXR1cm4gdH0sbi5kb3Q9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl0rdFszXSpuWzNdfSxuLmxlcnA9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9blswXSx1PW5bMV0sbz1uWzJdLGk9blszXTtyZXR1cm4gdFswXT1lK2EqKHJbMF0tZSksdFsxXT11K2EqKHJbMV0tdSksdFsyXT1vK2EqKHJbMl0tbyksdFszXT1pK2EqKHJbM10taSksdH0sbi5yYW5kb209ZnVuY3Rpb24odCxuKXt2YXIgcixlLHUsbyxpLHM7bj1ufHwxO2Rve3I9MiphLlJBTkRPTSgpLTEsZT0yKmEuUkFORE9NKCktMSxpPXIqcitlKmV9d2hpbGUoaT49MSk7ZG97dT0yKmEuUkFORE9NKCktMSxvPTIqYS5SQU5ET00oKS0xLHM9dSp1K28qb313aGlsZShzPj0xKTt2YXIgYz1NYXRoLnNxcnQoKDEtaSkvcyk7cmV0dXJuIHRbMF09bipyLHRbMV09biplLHRbMl09bip1KmMsdFszXT1uKm8qYyx0fSxuLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM107cmV0dXJuIHRbMF09clswXSphK3JbNF0qZStyWzhdKnUrclsxMl0qbyx0WzFdPXJbMV0qYStyWzVdKmUrcls5XSp1K3JbMTNdKm8sdFsyXT1yWzJdKmErcls2XSplK3JbMTBdKnUrclsxNF0qbyx0WzNdPXJbM10qYStyWzddKmUrclsxMV0qdStyWzE1XSpvLHR9LG4udHJhbnNmb3JtUXVhdD1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89clswXSxpPXJbMV0scz1yWzJdLGM9clszXSxmPWMqYStpKnUtcyplLE09YyplK3MqYS1vKnUsaD1jKnUrbyplLWkqYSxsPS1vKmEtaSplLXMqdTtyZXR1cm4gdFswXT1mKmMrbCotbytNKi1zLWgqLWksdFsxXT1NKmMrbCotaStoKi1vLWYqLXMsdFsyXT1oKmMrbCotcytmKi1pLU0qLW8sdFszXT1uWzNdLHR9LG4uc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwidmVjNChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiKVwifSxuLmV4YWN0RXF1YWxzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09PT1uWzBdJiZ0WzFdPT09blsxXSYmdFsyXT09PW5bMl0mJnRbM109PT1uWzNdfSxuLmVxdWFscz1mdW5jdGlvbih0LG4pe3ZhciByPXRbMF0sZT10WzFdLHU9dFsyXSxvPXRbM10saT1uWzBdLHM9blsxXSxjPW5bMl0sZj1uWzNdO3JldHVybiBNYXRoLmFicyhyLWkpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhyKSxNYXRoLmFicyhpKSkmJk1hdGguYWJzKGUtcyk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGUpLE1hdGguYWJzKHMpKSYmTWF0aC5hYnModS1jKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMoYykpJiZNYXRoLmFicyhvLWYpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhvKSxNYXRoLmFicyhmKSl9O3ZhciBhPWZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbj17fTtpZihudWxsIT10KWZvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiYobltyXT10W3JdKTtyZXR1cm4gbi5kZWZhdWx0PXQsbn0ocigwKSk7ZnVuY3Rpb24gZSgpe3ZhciB0PW5ldyBhLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGEuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYodFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0wKSx0fWZ1bmN0aW9uIHUodCxuLHIpe3JldHVybiB0WzBdPW5bMF0tclswXSx0WzFdPW5bMV0tclsxXSx0WzJdPW5bMl0tclsyXSx0WzNdPW5bM10tclszXSx0fWZ1bmN0aW9uIG8odCxuLHIpe3JldHVybiB0WzBdPW5bMF0qclswXSx0WzFdPW5bMV0qclsxXSx0WzJdPW5bMl0qclsyXSx0WzNdPW5bM10qclszXSx0fWZ1bmN0aW9uIGkodCxuLHIpe3JldHVybiB0WzBdPW5bMF0vclswXSx0WzFdPW5bMV0vclsxXSx0WzJdPW5bMl0vclsyXSx0WzNdPW5bM10vclszXSx0fWZ1bmN0aW9uIHModCxuKXt2YXIgcj1uWzBdLXRbMF0sYT1uWzFdLXRbMV0sZT1uWzJdLXRbMl0sdT1uWzNdLXRbM107cmV0dXJuIE1hdGguc3FydChyKnIrYSphK2UqZSt1KnUpfWZ1bmN0aW9uIGModCxuKXt2YXIgcj1uWzBdLXRbMF0sYT1uWzFdLXRbMV0sZT1uWzJdLXRbMl0sdT1uWzNdLXRbM107cmV0dXJuIHIqcithKmErZSplK3UqdX1mdW5jdGlvbiBmKHQpe3ZhciBuPXRbMF0scj10WzFdLGE9dFsyXSxlPXRbM107cmV0dXJuIE1hdGguc3FydChuKm4rcipyK2EqYStlKmUpfWZ1bmN0aW9uIE0odCl7dmFyIG49dFswXSxyPXRbMV0sYT10WzJdLGU9dFszXTtyZXR1cm4gbipuK3IqcithKmErZSplfW4uc3ViPXUsbi5tdWw9byxuLmRpdj1pLG4uZGlzdD1zLG4uc3FyRGlzdD1jLG4ubGVuPWYsbi5zcXJMZW49TSxuLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgdD1lKCk7cmV0dXJuIGZ1bmN0aW9uKG4scixhLGUsdSxvKXt2YXIgaT12b2lkIDAscz12b2lkIDA7Zm9yKHJ8fChyPTQpLGF8fChhPTApLHM9ZT9NYXRoLm1pbihlKnIrYSxuLmxlbmd0aCk6bi5sZW5ndGgsaT1hO2k8cztpKz1yKXRbMF09bltpXSx0WzFdPW5baSsxXSx0WzJdPW5baSsyXSx0WzNdPW5baSszXSx1KHQsdCxvKSxuW2ldPXRbMF0sbltpKzFdPXRbMV0sbltpKzJdPXRbMl0sbltpKzNdPXRbM107cmV0dXJuIG59fSgpfSxmdW5jdGlvbih0LG4scil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksbi5mb3JFYWNoPW4uc3FyTGVuPW4ubGVuPW4uc3FyRGlzdD1uLmRpc3Q9bi5kaXY9bi5tdWw9bi5zdWI9dm9pZCAwLG4uY3JlYXRlPWUsbi5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgYS5BUlJBWV9UWVBFKDMpO3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxufSxuLmxlbmd0aD11LG4uZnJvbVZhbHVlcz1vLG4uY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0fSxuLnNldD1mdW5jdGlvbih0LG4scixhKXtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPWEsdH0sbi5hZGQ9ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPW5bMF0rclswXSx0WzFdPW5bMV0rclsxXSx0WzJdPW5bMl0rclsyXSx0fSxuLnN1YnRyYWN0PWksbi5tdWx0aXBseT1zLG4uZGl2aWRlPWMsbi5jZWlsPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09TWF0aC5jZWlsKG5bMF0pLHRbMV09TWF0aC5jZWlsKG5bMV0pLHRbMl09TWF0aC5jZWlsKG5bMl0pLHR9LG4uZmxvb3I9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1NYXRoLmZsb29yKG5bMF0pLHRbMV09TWF0aC5mbG9vcihuWzFdKSx0WzJdPU1hdGguZmxvb3IoblsyXSksdH0sbi5taW49ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPU1hdGgubWluKG5bMF0sclswXSksdFsxXT1NYXRoLm1pbihuWzFdLHJbMV0pLHRbMl09TWF0aC5taW4oblsyXSxyWzJdKSx0fSxuLm1heD1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09TWF0aC5tYXgoblswXSxyWzBdKSx0WzFdPU1hdGgubWF4KG5bMV0sclsxXSksdFsyXT1NYXRoLm1heChuWzJdLHJbMl0pLHR9LG4ucm91bmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1NYXRoLnJvdW5kKG5bMF0pLHRbMV09TWF0aC5yb3VuZChuWzFdKSx0WzJdPU1hdGgucm91bmQoblsyXSksdH0sbi5zY2FsZT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09blswXSpyLHRbMV09blsxXSpyLHRbMl09blsyXSpyLHR9LG4uc2NhbGVBbmRBZGQ9ZnVuY3Rpb24odCxuLHIsYSl7cmV0dXJuIHRbMF09blswXStyWzBdKmEsdFsxXT1uWzFdK3JbMV0qYSx0WzJdPW5bMl0rclsyXSphLHR9LG4uZGlzdGFuY2U9ZixuLnNxdWFyZWREaXN0YW5jZT1NLG4uc3F1YXJlZExlbmd0aD1oLG4ubmVnYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09LW5bMF0sdFsxXT0tblsxXSx0WzJdPS1uWzJdLHR9LG4uaW52ZXJzZT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPTEvblswXSx0WzFdPTEvblsxXSx0WzJdPTEvblsyXSx0fSxuLm5vcm1hbGl6ZT1sLG4uZG90PXYsbi5jcm9zcz1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89clswXSxpPXJbMV0scz1yWzJdO3JldHVybiB0WzBdPWUqcy11KmksdFsxXT11Km8tYSpzLHRbMl09YSppLWUqbyx0fSxuLmxlcnA9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9blswXSx1PW5bMV0sbz1uWzJdO3JldHVybiB0WzBdPWUrYSooclswXS1lKSx0WzFdPXUrYSooclsxXS11KSx0WzJdPW8rYSooclsyXS1vKSx0fSxuLmhlcm1pdGU9ZnVuY3Rpb24odCxuLHIsYSxlLHUpe3ZhciBvPXUqdSxpPW8qKDIqdS0zKSsxLHM9byoodS0yKSt1LGM9byoodS0xKSxmPW8qKDMtMip1KTtyZXR1cm4gdFswXT1uWzBdKmkrclswXSpzK2FbMF0qYytlWzBdKmYsdFsxXT1uWzFdKmkrclsxXSpzK2FbMV0qYytlWzFdKmYsdFsyXT1uWzJdKmkrclsyXSpzK2FbMl0qYytlWzJdKmYsdH0sbi5iZXppZXI9ZnVuY3Rpb24odCxuLHIsYSxlLHUpe3ZhciBvPTEtdSxpPW8qbyxzPXUqdSxjPWkqbyxmPTMqdSppLE09MypzKm8saD1zKnU7cmV0dXJuIHRbMF09blswXSpjK3JbMF0qZithWzBdKk0rZVswXSpoLHRbMV09blsxXSpjK3JbMV0qZithWzFdKk0rZVsxXSpoLHRbMl09blsyXSpjK3JbMl0qZithWzJdKk0rZVsyXSpoLHR9LG4ucmFuZG9tPWZ1bmN0aW9uKHQsbil7bj1ufHwxO3ZhciByPTIqYS5SQU5ET00oKSpNYXRoLlBJLGU9MiphLlJBTkRPTSgpLTEsdT1NYXRoLnNxcnQoMS1lKmUpKm47cmV0dXJuIHRbMF09TWF0aC5jb3MocikqdSx0WzFdPU1hdGguc2luKHIpKnUsdFsyXT1lKm4sdH0sbi50cmFuc2Zvcm1NYXQ0PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1yWzNdKmErcls3XSplK3JbMTFdKnUrclsxNV07cmV0dXJuIG89b3x8MSx0WzBdPShyWzBdKmErcls0XSplK3JbOF0qdStyWzEyXSkvbyx0WzFdPShyWzFdKmErcls1XSplK3JbOV0qdStyWzEzXSkvbyx0WzJdPShyWzJdKmErcls2XSplK3JbMTBdKnUrclsxNF0pL28sdH0sbi50cmFuc2Zvcm1NYXQzPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl07cmV0dXJuIHRbMF09YSpyWzBdK2UqclszXSt1KnJbNl0sdFsxXT1hKnJbMV0rZSpyWzRdK3Uqcls3XSx0WzJdPWEqclsyXStlKnJbNV0rdSpyWzhdLHR9LG4udHJhbnNmb3JtUXVhdD1mdW5jdGlvbih0LG4scil7dmFyIGE9clswXSxlPXJbMV0sdT1yWzJdLG89clszXSxpPW5bMF0scz1uWzFdLGM9blsyXSxmPWUqYy11KnMsTT11KmktYSpjLGg9YSpzLWUqaSxsPWUqaC11Kk0sdj11KmYtYSpoLGQ9YSpNLWUqZixiPTIqbztyZXR1cm4gZio9YixNKj1iLGgqPWIsbCo9Mix2Kj0yLGQqPTIsdFswXT1pK2YrbCx0WzFdPXMrTSt2LHRbMl09YytoK2QsdH0sbi5yb3RhdGVYPWZ1bmN0aW9uKHQsbixyLGEpe3ZhciBlPVtdLHU9W107cmV0dXJuIGVbMF09blswXS1yWzBdLGVbMV09blsxXS1yWzFdLGVbMl09blsyXS1yWzJdLHVbMF09ZVswXSx1WzFdPWVbMV0qTWF0aC5jb3MoYSktZVsyXSpNYXRoLnNpbihhKSx1WzJdPWVbMV0qTWF0aC5zaW4oYSkrZVsyXSpNYXRoLmNvcyhhKSx0WzBdPXVbMF0rclswXSx0WzFdPXVbMV0rclsxXSx0WzJdPXVbMl0rclsyXSx0fSxuLnJvdGF0ZVk9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9W10sdT1bXTtyZXR1cm4gZVswXT1uWzBdLXJbMF0sZVsxXT1uWzFdLXJbMV0sZVsyXT1uWzJdLXJbMl0sdVswXT1lWzJdKk1hdGguc2luKGEpK2VbMF0qTWF0aC5jb3MoYSksdVsxXT1lWzFdLHVbMl09ZVsyXSpNYXRoLmNvcyhhKS1lWzBdKk1hdGguc2luKGEpLHRbMF09dVswXStyWzBdLHRbMV09dVsxXStyWzFdLHRbMl09dVsyXStyWzJdLHR9LG4ucm90YXRlWj1mdW5jdGlvbih0LG4scixhKXt2YXIgZT1bXSx1PVtdO3JldHVybiBlWzBdPW5bMF0tclswXSxlWzFdPW5bMV0tclsxXSxlWzJdPW5bMl0tclsyXSx1WzBdPWVbMF0qTWF0aC5jb3MoYSktZVsxXSpNYXRoLnNpbihhKSx1WzFdPWVbMF0qTWF0aC5zaW4oYSkrZVsxXSpNYXRoLmNvcyhhKSx1WzJdPWVbMl0sdFswXT11WzBdK3JbMF0sdFsxXT11WzFdK3JbMV0sdFsyXT11WzJdK3JbMl0sdH0sbi5hbmdsZT1mdW5jdGlvbih0LG4pe3ZhciByPW8odFswXSx0WzFdLHRbMl0pLGE9byhuWzBdLG5bMV0sblsyXSk7bChyLHIpLGwoYSxhKTt2YXIgZT12KHIsYSk7cmV0dXJuIGU+MT8wOmU8LTE/TWF0aC5QSTpNYXRoLmFjb3MoZSl9LG4uc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwidmVjMyhcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiKVwifSxuLmV4YWN0RXF1YWxzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09PT1uWzBdJiZ0WzFdPT09blsxXSYmdFsyXT09PW5bMl19LG4uZXF1YWxzPWZ1bmN0aW9uKHQsbil7dmFyIHI9dFswXSxlPXRbMV0sdT10WzJdLG89blswXSxpPW5bMV0scz1uWzJdO3JldHVybiBNYXRoLmFicyhyLW8pPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhyKSxNYXRoLmFicyhvKSkmJk1hdGguYWJzKGUtaSk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGUpLE1hdGguYWJzKGkpKSYmTWF0aC5hYnModS1zKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMocykpfTt2YXIgYT1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIG49e307aWYobnVsbCE9dClmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG4uZGVmYXVsdD10LG59KHIoMCkpO2Z1bmN0aW9uIGUoKXt2YXIgdD1uZXcgYS5BUlJBWV9UWVBFKDMpO3JldHVybiBhLkFSUkFZX1RZUEUhPUZsb2F0MzJBcnJheSYmKHRbMF09MCx0WzFdPTAsdFsyXT0wKSx0fWZ1bmN0aW9uIHUodCl7dmFyIG49dFswXSxyPXRbMV0sYT10WzJdO3JldHVybiBNYXRoLnNxcnQobipuK3IqcithKmEpfWZ1bmN0aW9uIG8odCxuLHIpe3ZhciBlPW5ldyBhLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGVbMF09dCxlWzFdPW4sZVsyXT1yLGV9ZnVuY3Rpb24gaSh0LG4scil7cmV0dXJuIHRbMF09blswXS1yWzBdLHRbMV09blsxXS1yWzFdLHRbMl09blsyXS1yWzJdLHR9ZnVuY3Rpb24gcyh0LG4scil7cmV0dXJuIHRbMF09blswXSpyWzBdLHRbMV09blsxXSpyWzFdLHRbMl09blsyXSpyWzJdLHR9ZnVuY3Rpb24gYyh0LG4scil7cmV0dXJuIHRbMF09blswXS9yWzBdLHRbMV09blsxXS9yWzFdLHRbMl09blsyXS9yWzJdLHR9ZnVuY3Rpb24gZih0LG4pe3ZhciByPW5bMF0tdFswXSxhPW5bMV0tdFsxXSxlPW5bMl0tdFsyXTtyZXR1cm4gTWF0aC5zcXJ0KHIqcithKmErZSplKX1mdW5jdGlvbiBNKHQsbil7dmFyIHI9blswXS10WzBdLGE9blsxXS10WzFdLGU9blsyXS10WzJdO3JldHVybiByKnIrYSphK2UqZX1mdW5jdGlvbiBoKHQpe3ZhciBuPXRbMF0scj10WzFdLGE9dFsyXTtyZXR1cm4gbipuK3IqcithKmF9ZnVuY3Rpb24gbCh0LG4pe3ZhciByPW5bMF0sYT1uWzFdLGU9blsyXSx1PXIqcithKmErZSplO3JldHVybiB1PjAmJih1PTEvTWF0aC5zcXJ0KHUpLHRbMF09blswXSp1LHRbMV09blsxXSp1LHRbMl09blsyXSp1KSx0fWZ1bmN0aW9uIHYodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19bi5zdWI9aSxuLm11bD1zLG4uZGl2PWMsbi5kaXN0PWYsbi5zcXJEaXN0PU0sbi5sZW49dSxuLnNxckxlbj1oLG4uZm9yRWFjaD1mdW5jdGlvbigpe3ZhciB0PWUoKTtyZXR1cm4gZnVuY3Rpb24obixyLGEsZSx1LG8pe3ZhciBpPXZvaWQgMCxzPXZvaWQgMDtmb3Iocnx8KHI9MyksYXx8KGE9MCkscz1lP01hdGgubWluKGUqcithLG4ubGVuZ3RoKTpuLmxlbmd0aCxpPWE7aTxzO2krPXIpdFswXT1uW2ldLHRbMV09bltpKzFdLHRbMl09bltpKzJdLHUodCx0LG8pLG5baV09dFswXSxuW2krMV09dFsxXSxuW2krMl09dFsyXTtyZXR1cm4gbn19KCl9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnNldEF4ZXM9bi5zcWxlcnA9bi5yb3RhdGlvblRvPW4uZXF1YWxzPW4uZXhhY3RFcXVhbHM9bi5ub3JtYWxpemU9bi5zcXJMZW49bi5zcXVhcmVkTGVuZ3RoPW4ubGVuPW4ubGVuZ3RoPW4ubGVycD1uLmRvdD1uLnNjYWxlPW4ubXVsPW4uYWRkPW4uc2V0PW4uY29weT1uLmZyb21WYWx1ZXM9bi5jbG9uZT12b2lkIDAsbi5jcmVhdGU9cyxuLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0sbi5zZXRBeGlzQW5nbGU9YyxuLmdldEF4aXNBbmdsZT1mdW5jdGlvbih0LG4pe3ZhciByPTIqTWF0aC5hY29zKG5bM10pLGU9TWF0aC5zaW4oci8yKTtlPmEuRVBTSUxPTj8odFswXT1uWzBdL2UsdFsxXT1uWzFdL2UsdFsyXT1uWzJdL2UpOih0WzBdPTEsdFsxXT0wLHRbMl09MCk7cmV0dXJuIHJ9LG4ubXVsdGlwbHk9ZixuLnJvdGF0ZVg9ZnVuY3Rpb24odCxuLHIpe3IqPS41O3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT1NYXRoLnNpbihyKSxzPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWEqcytvKmksdFsxXT1lKnMrdSppLHRbMl09dSpzLWUqaSx0WzNdPW8qcy1hKmksdH0sbi5yb3RhdGVZPWZ1bmN0aW9uKHQsbixyKXtyKj0uNTt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9TWF0aC5zaW4ocikscz1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1hKnMtdSppLHRbMV09ZSpzK28qaSx0WzJdPXUqcythKmksdFszXT1vKnMtZSppLHR9LG4ucm90YXRlWj1mdW5jdGlvbih0LG4scil7cio9LjU7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89blszXSxpPU1hdGguc2luKHIpLHM9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09YSpzK2UqaSx0WzFdPWUqcy1hKmksdFsyXT11KnMrbyppLHRbM109bypzLXUqaSx0fSxuLmNhbGN1bGF0ZVc9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPW5bMl07cmV0dXJuIHRbMF09cix0WzFdPWEsdFsyXT1lLHRbM109TWF0aC5zcXJ0KE1hdGguYWJzKDEtcipyLWEqYS1lKmUpKSx0fSxuLnNsZXJwPU0sbi5yYW5kb209ZnVuY3Rpb24odCl7dmFyIG49YS5SQU5ET00oKSxyPWEuUkFORE9NKCksZT1hLlJBTkRPTSgpLHU9TWF0aC5zcXJ0KDEtbiksbz1NYXRoLnNxcnQobik7cmV0dXJuIHRbMF09dSpNYXRoLnNpbigyKk1hdGguUEkqciksdFsxXT11Kk1hdGguY29zKDIqTWF0aC5QSSpyKSx0WzJdPW8qTWF0aC5zaW4oMipNYXRoLlBJKmUpLHRbM109bypNYXRoLmNvcygyKk1hdGguUEkqZSksdH0sbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPW5bMl0sdT1uWzNdLG89cipyK2EqYStlKmUrdSp1LGk9bz8xL286MDtyZXR1cm4gdFswXT0tcippLHRbMV09LWEqaSx0WzJdPS1lKmksdFszXT11KmksdH0sbi5jb25qdWdhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT0tblswXSx0WzFdPS1uWzFdLHRbMl09LW5bMl0sdFszXT1uWzNdLHR9LG4uZnJvbU1hdDM9aCxuLmZyb21FdWxlcj1mdW5jdGlvbih0LG4scixhKXt2YXIgZT0uNSpNYXRoLlBJLzE4MDtuKj1lLHIqPWUsYSo9ZTt2YXIgdT1NYXRoLnNpbihuKSxvPU1hdGguY29zKG4pLGk9TWF0aC5zaW4ocikscz1NYXRoLmNvcyhyKSxjPU1hdGguc2luKGEpLGY9TWF0aC5jb3MoYSk7cmV0dXJuIHRbMF09dSpzKmYtbyppKmMsdFsxXT1vKmkqZit1KnMqYyx0WzJdPW8qcypjLXUqaSpmLHRbM109bypzKmYrdSppKmMsdH0sbi5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJxdWF0KFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIsIFwiK3RbMl0rXCIsIFwiK3RbM10rXCIpXCJ9O3ZhciBhPWkocigwKSksZT1pKHIoNSkpLHU9aShyKDIpKSxvPWkocigxKSk7ZnVuY3Rpb24gaSh0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIG49e307aWYobnVsbCE9dClmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG4uZGVmYXVsdD10LG59ZnVuY3Rpb24gcygpe3ZhciB0PW5ldyBhLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGEuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYodFswXT0wLHRbMV09MCx0WzJdPTApLHRbM109MSx0fWZ1bmN0aW9uIGModCxuLHIpe3IqPS41O3ZhciBhPU1hdGguc2luKHIpO3JldHVybiB0WzBdPWEqblswXSx0WzFdPWEqblsxXSx0WzJdPWEqblsyXSx0WzNdPU1hdGguY29zKHIpLHR9ZnVuY3Rpb24gZih0LG4scil7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89blszXSxpPXJbMF0scz1yWzFdLGM9clsyXSxmPXJbM107cmV0dXJuIHRbMF09YSpmK28qaStlKmMtdSpzLHRbMV09ZSpmK28qcyt1KmktYSpjLHRbMl09dSpmK28qYythKnMtZSppLHRbM109bypmLWEqaS1lKnMtdSpjLHR9ZnVuY3Rpb24gTSh0LG4scixlKXt2YXIgdT1uWzBdLG89blsxXSxpPW5bMl0scz1uWzNdLGM9clswXSxmPXJbMV0sTT1yWzJdLGg9clszXSxsPXZvaWQgMCx2PXZvaWQgMCxkPXZvaWQgMCxiPXZvaWQgMCxtPXZvaWQgMDtyZXR1cm4odj11KmMrbypmK2kqTStzKmgpPDAmJih2PS12LGM9LWMsZj0tZixNPS1NLGg9LWgpLDEtdj5hLkVQU0lMT04/KGw9TWF0aC5hY29zKHYpLGQ9TWF0aC5zaW4obCksYj1NYXRoLnNpbigoMS1lKSpsKS9kLG09TWF0aC5zaW4oZSpsKS9kKTooYj0xLWUsbT1lKSx0WzBdPWIqdSttKmMsdFsxXT1iKm8rbSpmLHRbMl09YippK20qTSx0WzNdPWIqcyttKmgsdH1mdW5jdGlvbiBoKHQsbil7dmFyIHI9blswXStuWzRdK25bOF0sYT12b2lkIDA7aWYocj4wKWE9TWF0aC5zcXJ0KHIrMSksdFszXT0uNSphLGE9LjUvYSx0WzBdPShuWzVdLW5bN10pKmEsdFsxXT0obls2XS1uWzJdKSphLHRbMl09KG5bMV0tblszXSkqYTtlbHNle3ZhciBlPTA7bls0XT5uWzBdJiYoZT0xKSxuWzhdPm5bMyplK2VdJiYoZT0yKTt2YXIgdT0oZSsxKSUzLG89KGUrMiklMzthPU1hdGguc3FydChuWzMqZStlXS1uWzMqdSt1XS1uWzMqbytvXSsxKSx0W2VdPS41KmEsYT0uNS9hLHRbM109KG5bMyp1K29dLW5bMypvK3VdKSphLHRbdV09KG5bMyp1K2VdK25bMyplK3VdKSphLHRbb109KG5bMypvK2VdK25bMyplK29dKSphfXJldHVybiB0fW4uY2xvbmU9by5jbG9uZSxuLmZyb21WYWx1ZXM9by5mcm9tVmFsdWVzLG4uY29weT1vLmNvcHksbi5zZXQ9by5zZXQsbi5hZGQ9by5hZGQsbi5tdWw9ZixuLnNjYWxlPW8uc2NhbGUsbi5kb3Q9by5kb3Qsbi5sZXJwPW8ubGVycDt2YXIgbD1uLmxlbmd0aD1vLmxlbmd0aCx2PShuLmxlbj1sLG4uc3F1YXJlZExlbmd0aD1vLnNxdWFyZWRMZW5ndGgpLGQ9KG4uc3FyTGVuPXYsbi5ub3JtYWxpemU9by5ub3JtYWxpemUpO24uZXhhY3RFcXVhbHM9by5leGFjdEVxdWFscyxuLmVxdWFscz1vLmVxdWFscyxuLnJvdGF0aW9uVG89ZnVuY3Rpb24oKXt2YXIgdD11LmNyZWF0ZSgpLG49dS5mcm9tVmFsdWVzKDEsMCwwKSxyPXUuZnJvbVZhbHVlcygwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKGEsZSxvKXt2YXIgaT11LmRvdChlLG8pO3JldHVybiBpPC0uOTk5OTk5Pyh1LmNyb3NzKHQsbixlKSx1Lmxlbih0KTwxZS02JiZ1LmNyb3NzKHQscixlKSx1Lm5vcm1hbGl6ZSh0LHQpLGMoYSx0LE1hdGguUEkpLGEpOmk+Ljk5OTk5OT8oYVswXT0wLGFbMV09MCxhWzJdPTAsYVszXT0xLGEpOih1LmNyb3NzKHQsZSxvKSxhWzBdPXRbMF0sYVsxXT10WzFdLGFbMl09dFsyXSxhWzNdPTEraSxkKGEsYSkpfX0oKSxuLnNxbGVycD1mdW5jdGlvbigpe3ZhciB0PXMoKSxuPXMoKTtyZXR1cm4gZnVuY3Rpb24ocixhLGUsdSxvLGkpe3JldHVybiBNKHQsYSxvLGkpLE0obixlLHUsaSksTShyLHQsbiwyKmkqKDEtaSkpLHJ9fSgpLG4uc2V0QXhlcz1mdW5jdGlvbigpe3ZhciB0PWUuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKG4scixhLGUpe3JldHVybiB0WzBdPWFbMF0sdFszXT1hWzFdLHRbNl09YVsyXSx0WzFdPWVbMF0sdFs0XT1lWzFdLHRbN109ZVsyXSx0WzJdPS1yWzBdLHRbNV09LXJbMV0sdFs4XT0tclsyXSxkKG4saChuLHQpKX19KCl9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnN1Yj1uLm11bD12b2lkIDAsbi5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYS5BUlJBWV9UWVBFKDE2KTthLkFSUkFZX1RZUEUhPUZsb2F0MzJBcnJheSYmKHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCk7cmV0dXJuIHRbMF09MSx0WzVdPTEsdFsxMF09MSx0WzE1XT0xLHR9LG4uY2xvbmU9ZnVuY3Rpb24odCl7dmFyIG49bmV3IGEuQVJSQVlfVFlQRSgxNik7cmV0dXJuIG5bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNF0sbls1XT10WzVdLG5bNl09dFs2XSxuWzddPXRbN10sbls4XT10WzhdLG5bOV09dFs5XSxuWzEwXT10WzEwXSxuWzExXT10WzExXSxuWzEyXT10WzEyXSxuWzEzXT10WzEzXSxuWzE0XT10WzE0XSxuWzE1XT10WzE1XSxufSxuLmNvcHk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09blsxXSx0WzJdPW5bMl0sdFszXT1uWzNdLHRbNF09bls0XSx0WzVdPW5bNV0sdFs2XT1uWzZdLHRbN109bls3XSx0WzhdPW5bOF0sdFs5XT1uWzldLHRbMTBdPW5bMTBdLHRbMTFdPW5bMTFdLHRbMTJdPW5bMTJdLHRbMTNdPW5bMTNdLHRbMTRdPW5bMTRdLHRbMTVdPW5bMTVdLHR9LG4uZnJvbVZhbHVlcz1mdW5jdGlvbih0LG4scixlLHUsbyxpLHMsYyxmLE0saCxsLHYsZCxiKXt2YXIgbT1uZXcgYS5BUlJBWV9UWVBFKDE2KTtyZXR1cm4gbVswXT10LG1bMV09bixtWzJdPXIsbVszXT1lLG1bNF09dSxtWzVdPW8sbVs2XT1pLG1bN109cyxtWzhdPWMsbVs5XT1mLG1bMTBdPU0sbVsxMV09aCxtWzEyXT1sLG1bMTNdPXYsbVsxNF09ZCxtWzE1XT1iLG19LG4uc2V0PWZ1bmN0aW9uKHQsbixyLGEsZSx1LG8saSxzLGMsZixNLGgsbCx2LGQsYil7cmV0dXJuIHRbMF09bix0WzFdPXIsdFsyXT1hLHRbM109ZSx0WzRdPXUsdFs1XT1vLHRbNl09aSx0WzddPXMsdFs4XT1jLHRbOV09Zix0WzEwXT1NLHRbMTFdPWgsdFsxMl09bCx0WzEzXT12LHRbMTRdPWQsdFsxNV09Yix0fSxuLmlkZW50aXR5PWUsbi50cmFuc3Bvc2U9ZnVuY3Rpb24odCxuKXtpZih0PT09bil7dmFyIHI9blsxXSxhPW5bMl0sZT1uWzNdLHU9bls2XSxvPW5bN10saT1uWzExXTt0WzFdPW5bNF0sdFsyXT1uWzhdLHRbM109blsxMl0sdFs0XT1yLHRbNl09bls5XSx0WzddPW5bMTNdLHRbOF09YSx0WzldPXUsdFsxMV09blsxNF0sdFsxMl09ZSx0WzEzXT1vLHRbMTRdPWl9ZWxzZSB0WzBdPW5bMF0sdFsxXT1uWzRdLHRbMl09bls4XSx0WzNdPW5bMTJdLHRbNF09blsxXSx0WzVdPW5bNV0sdFs2XT1uWzldLHRbN109blsxM10sdFs4XT1uWzJdLHRbOV09bls2XSx0WzEwXT1uWzEwXSx0WzExXT1uWzE0XSx0WzEyXT1uWzNdLHRbMTNdPW5bN10sdFsxNF09blsxMV0sdFsxNV09blsxNV07cmV0dXJuIHR9LG4uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sZT1uWzJdLHU9blszXSxvPW5bNF0saT1uWzVdLHM9bls2XSxjPW5bN10sZj1uWzhdLE09bls5XSxoPW5bMTBdLGw9blsxMV0sdj1uWzEyXSxkPW5bMTNdLGI9blsxNF0sbT1uWzE1XSxwPXIqaS1hKm8sUD1yKnMtZSpvLEE9cipjLXUqbyxFPWEqcy1lKmksTz1hKmMtdSppLFI9ZSpjLXUqcyx5PWYqZC1NKnYscT1mKmItaCp2LHg9ZiptLWwqdixfPU0qYi1oKmQsWT1NKm0tbCpkLEw9aCptLWwqYixTPXAqTC1QKlkrQSpfK0UqeC1PKnErUip5O2lmKCFTKXJldHVybiBudWxsO3JldHVybiBTPTEvUyx0WzBdPShpKkwtcypZK2MqXykqUyx0WzFdPShlKlktYSpMLXUqXykqUyx0WzJdPShkKlItYipPK20qRSkqUyx0WzNdPShoKk8tTSpSLWwqRSkqUyx0WzRdPShzKngtbypMLWMqcSkqUyx0WzVdPShyKkwtZSp4K3UqcSkqUyx0WzZdPShiKkEtdipSLW0qUCkqUyx0WzddPShmKlItaCpBK2wqUCkqUyx0WzhdPShvKlktaSp4K2MqeSkqUyx0WzldPShhKngtcipZLXUqeSkqUyx0WzEwXT0odipPLWQqQSttKnApKlMsdFsxMV09KE0qQS1mKk8tbCpwKSpTLHRbMTJdPShpKnEtbypfLXMqeSkqUyx0WzEzXT0ocipfLWEqcStlKnkpKlMsdFsxNF09KGQqUC12KkUtYipwKSpTLHRbMTVdPShmKkUtTSpQK2gqcCkqUyx0fSxuLmFkam9pbnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPW5bMl0sdT1uWzNdLG89bls0XSxpPW5bNV0scz1uWzZdLGM9bls3XSxmPW5bOF0sTT1uWzldLGg9blsxMF0sbD1uWzExXSx2PW5bMTJdLGQ9blsxM10sYj1uWzE0XSxtPW5bMTVdO3JldHVybiB0WzBdPWkqKGgqbS1sKmIpLU0qKHMqbS1jKmIpK2QqKHMqbC1jKmgpLHRbMV09LShhKihoKm0tbCpiKS1NKihlKm0tdSpiKStkKihlKmwtdSpoKSksdFsyXT1hKihzKm0tYypiKS1pKihlKm0tdSpiKStkKihlKmMtdSpzKSx0WzNdPS0oYSoocypsLWMqaCktaSooZSpsLXUqaCkrTSooZSpjLXUqcykpLHRbNF09LShvKihoKm0tbCpiKS1mKihzKm0tYypiKSt2KihzKmwtYypoKSksdFs1XT1yKihoKm0tbCpiKS1mKihlKm0tdSpiKSt2KihlKmwtdSpoKSx0WzZdPS0ocioocyptLWMqYiktbyooZSptLXUqYikrdiooZSpjLXUqcykpLHRbN109cioocypsLWMqaCktbyooZSpsLXUqaCkrZiooZSpjLXUqcyksdFs4XT1vKihNKm0tbCpkKS1mKihpKm0tYypkKSt2KihpKmwtYypNKSx0WzldPS0ociooTSptLWwqZCktZiooYSptLXUqZCkrdiooYSpsLXUqTSkpLHRbMTBdPXIqKGkqbS1jKmQpLW8qKGEqbS11KmQpK3YqKGEqYy11KmkpLHRbMTFdPS0ociooaSpsLWMqTSktbyooYSpsLXUqTSkrZiooYSpjLXUqaSkpLHRbMTJdPS0obyooTSpiLWgqZCktZiooaSpiLXMqZCkrdiooaSpoLXMqTSkpLHRbMTNdPXIqKE0qYi1oKmQpLWYqKGEqYi1lKmQpK3YqKGEqaC1lKk0pLHRbMTRdPS0ociooaSpiLXMqZCktbyooYSpiLWUqZCkrdiooYSpzLWUqaSkpLHRbMTVdPXIqKGkqaC1zKk0pLW8qKGEqaC1lKk0pK2YqKGEqcy1lKmkpLHR9LG4uZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7dmFyIG49dFswXSxyPXRbMV0sYT10WzJdLGU9dFszXSx1PXRbNF0sbz10WzVdLGk9dFs2XSxzPXRbN10sYz10WzhdLGY9dFs5XSxNPXRbMTBdLGg9dFsxMV0sbD10WzEyXSx2PXRbMTNdLGQ9dFsxNF0sYj10WzE1XTtyZXR1cm4obipvLXIqdSkqKE0qYi1oKmQpLShuKmktYSp1KSooZipiLWgqdikrKG4qcy1lKnUpKihmKmQtTSp2KSsocippLWEqbykqKGMqYi1oKmwpLShyKnMtZSpvKSooYypkLU0qbCkrKGEqcy1lKmkpKihjKnYtZipsKX0sbi5tdWx0aXBseT11LG4udHJhbnNsYXRlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1yWzBdLGU9clsxXSx1PXJbMl0sbz12b2lkIDAsaT12b2lkIDAscz12b2lkIDAsYz12b2lkIDAsZj12b2lkIDAsTT12b2lkIDAsaD12b2lkIDAsbD12b2lkIDAsdj12b2lkIDAsZD12b2lkIDAsYj12b2lkIDAsbT12b2lkIDA7bj09PXQ/KHRbMTJdPW5bMF0qYStuWzRdKmUrbls4XSp1K25bMTJdLHRbMTNdPW5bMV0qYStuWzVdKmUrbls5XSp1K25bMTNdLHRbMTRdPW5bMl0qYStuWzZdKmUrblsxMF0qdStuWzE0XSx0WzE1XT1uWzNdKmErbls3XSplK25bMTFdKnUrblsxNV0pOihvPW5bMF0saT1uWzFdLHM9blsyXSxjPW5bM10sZj1uWzRdLE09bls1XSxoPW5bNl0sbD1uWzddLHY9bls4XSxkPW5bOV0sYj1uWzEwXSxtPW5bMTFdLHRbMF09byx0WzFdPWksdFsyXT1zLHRbM109Yyx0WzRdPWYsdFs1XT1NLHRbNl09aCx0WzddPWwsdFs4XT12LHRbOV09ZCx0WzEwXT1iLHRbMTFdPW0sdFsxMl09byphK2YqZSt2KnUrblsxMl0sdFsxM109aSphK00qZStkKnUrblsxM10sdFsxNF09cyphK2gqZStiKnUrblsxNF0sdFsxNV09YyphK2wqZSttKnUrblsxNV0pO3JldHVybiB0fSxuLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1yWzBdLGU9clsxXSx1PXJbMl07cmV0dXJuIHRbMF09blswXSphLHRbMV09blsxXSphLHRbMl09blsyXSphLHRbM109blszXSphLHRbNF09bls0XSplLHRbNV09bls1XSplLHRbNl09bls2XSplLHRbN109bls3XSplLHRbOF09bls4XSp1LHRbOV09bls5XSp1LHRbMTBdPW5bMTBdKnUsdFsxMV09blsxMV0qdSx0WzEyXT1uWzEyXSx0WzEzXT1uWzEzXSx0WzE0XT1uWzE0XSx0WzE1XT1uWzE1XSx0fSxuLnJvdGF0ZT1mdW5jdGlvbih0LG4scixlKXt2YXIgdT1lWzBdLG89ZVsxXSxpPWVbMl0scz1NYXRoLnNxcnQodSp1K28qbytpKmkpLGM9dm9pZCAwLGY9dm9pZCAwLE09dm9pZCAwLGg9dm9pZCAwLGw9dm9pZCAwLHY9dm9pZCAwLGQ9dm9pZCAwLGI9dm9pZCAwLG09dm9pZCAwLHA9dm9pZCAwLFA9dm9pZCAwLEE9dm9pZCAwLEU9dm9pZCAwLE89dm9pZCAwLFI9dm9pZCAwLHk9dm9pZCAwLHE9dm9pZCAwLHg9dm9pZCAwLF89dm9pZCAwLFk9dm9pZCAwLEw9dm9pZCAwLFM9dm9pZCAwLHc9dm9pZCAwLEk9dm9pZCAwO2lmKHM8YS5FUFNJTE9OKXJldHVybiBudWxsO3UqPXM9MS9zLG8qPXMsaSo9cyxjPU1hdGguc2luKHIpLGY9TWF0aC5jb3MociksTT0xLWYsaD1uWzBdLGw9blsxXSx2PW5bMl0sZD1uWzNdLGI9bls0XSxtPW5bNV0scD1uWzZdLFA9bls3XSxBPW5bOF0sRT1uWzldLE89blsxMF0sUj1uWzExXSx5PXUqdSpNK2YscT1vKnUqTStpKmMseD1pKnUqTS1vKmMsXz11Km8qTS1pKmMsWT1vKm8qTStmLEw9aSpvKk0rdSpjLFM9dSppKk0rbypjLHc9byppKk0tdSpjLEk9aSppKk0rZix0WzBdPWgqeStiKnErQSp4LHRbMV09bCp5K20qcStFKngsdFsyXT12KnkrcCpxK08qeCx0WzNdPWQqeStQKnErUip4LHRbNF09aCpfK2IqWStBKkwsdFs1XT1sKl8rbSpZK0UqTCx0WzZdPXYqXytwKlkrTypMLHRbN109ZCpfK1AqWStSKkwsdFs4XT1oKlMrYip3K0EqSSx0WzldPWwqUyttKncrRSpJLHRbMTBdPXYqUytwKncrTypJLHRbMTFdPWQqUytQKncrUipJLG4hPT10JiYodFsxMl09blsxMl0sdFsxM109blsxM10sdFsxNF09blsxNF0sdFsxNV09blsxNV0pO3JldHVybiB0fSxuLnJvdGF0ZVg9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPU1hdGguc2luKHIpLGU9TWF0aC5jb3MociksdT1uWzRdLG89bls1XSxpPW5bNl0scz1uWzddLGM9bls4XSxmPW5bOV0sTT1uWzEwXSxoPW5bMTFdO24hPT10JiYodFswXT1uWzBdLHRbMV09blsxXSx0WzJdPW5bMl0sdFszXT1uWzNdLHRbMTJdPW5bMTJdLHRbMTNdPW5bMTNdLHRbMTRdPW5bMTRdLHRbMTVdPW5bMTVdKTtyZXR1cm4gdFs0XT11KmUrYyphLHRbNV09byplK2YqYSx0WzZdPWkqZStNKmEsdFs3XT1zKmUraCphLHRbOF09YyplLXUqYSx0WzldPWYqZS1vKmEsdFsxMF09TSplLWkqYSx0WzExXT1oKmUtcyphLHR9LG4ucm90YXRlWT1mdW5jdGlvbih0LG4scil7dmFyIGE9TWF0aC5zaW4ociksZT1NYXRoLmNvcyhyKSx1PW5bMF0sbz1uWzFdLGk9blsyXSxzPW5bM10sYz1uWzhdLGY9bls5XSxNPW5bMTBdLGg9blsxMV07biE9PXQmJih0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFsxMl09blsxMl0sdFsxM109blsxM10sdFsxNF09blsxNF0sdFsxNV09blsxNV0pO3JldHVybiB0WzBdPXUqZS1jKmEsdFsxXT1vKmUtZiphLHRbMl09aSplLU0qYSx0WzNdPXMqZS1oKmEsdFs4XT11KmErYyplLHRbOV09byphK2YqZSx0WzEwXT1pKmErTSplLHRbMTFdPXMqYStoKmUsdH0sbi5yb3RhdGVaPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1NYXRoLnNpbihyKSxlPU1hdGguY29zKHIpLHU9blswXSxvPW5bMV0saT1uWzJdLHM9blszXSxjPW5bNF0sZj1uWzVdLE09bls2XSxoPW5bN107biE9PXQmJih0WzhdPW5bOF0sdFs5XT1uWzldLHRbMTBdPW5bMTBdLHRbMTFdPW5bMTFdLHRbMTJdPW5bMTJdLHRbMTNdPW5bMTNdLHRbMTRdPW5bMTRdLHRbMTVdPW5bMTVdKTtyZXR1cm4gdFswXT11KmUrYyphLHRbMV09byplK2YqYSx0WzJdPWkqZStNKmEsdFszXT1zKmUraCphLHRbNF09YyplLXUqYSx0WzVdPWYqZS1vKmEsdFs2XT1NKmUtaSphLHRbN109aCplLXMqYSx0fSxuLmZyb21UcmFuc2xhdGlvbj1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPW5bMF0sdFsxM109blsxXSx0WzE0XT1uWzJdLHRbMTVdPTEsdH0sbi5mcm9tU2NhbGluZz1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09blsxXSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09blsyXSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbi5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxuLHIpe3ZhciBlPXJbMF0sdT1yWzFdLG89clsyXSxpPU1hdGguc3FydChlKmUrdSp1K28qbykscz12b2lkIDAsYz12b2lkIDAsZj12b2lkIDA7aWYoaTxhLkVQU0lMT04pcmV0dXJuIG51bGw7cmV0dXJuIGUqPWk9MS9pLHUqPWksbyo9aSxzPU1hdGguc2luKG4pLGM9TWF0aC5jb3MobiksZj0xLWMsdFswXT1lKmUqZitjLHRbMV09dSplKmYrbypzLHRbMl09byplKmYtdSpzLHRbM109MCx0WzRdPWUqdSpmLW8qcyx0WzVdPXUqdSpmK2MsdFs2XT1vKnUqZitlKnMsdFs3XT0wLHRbOF09ZSpvKmYrdSpzLHRbOV09dSpvKmYtZSpzLHRbMTBdPW8qbypmK2MsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG4uZnJvbVhSb3RhdGlvbj1mdW5jdGlvbih0LG4pe3ZhciByPU1hdGguc2luKG4pLGE9TWF0aC5jb3Mobik7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hLHRbNl09cix0WzddPTAsdFs4XT0wLHRbOV09LXIsdFsxMF09YSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbi5mcm9tWVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09MCx0WzJdPS1yLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT1yLHRbOV09MCx0WzEwXT1hLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxuLmZyb21aUm90YXRpb249ZnVuY3Rpb24odCxuKXt2YXIgcj1NYXRoLnNpbihuKSxhPU1hdGguY29zKG4pO3JldHVybiB0WzBdPWEsdFsxXT1yLHRbMl09MCx0WzNdPTAsdFs0XT0tcix0WzVdPWEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG4uZnJvbVJvdGF0aW9uVHJhbnNsYXRpb249byxuLmZyb21RdWF0Mj1mdW5jdGlvbih0LG4pe3ZhciByPW5ldyBhLkFSUkFZX1RZUEUoMyksZT0tblswXSx1PS1uWzFdLGk9LW5bMl0scz1uWzNdLGM9bls0XSxmPW5bNV0sTT1uWzZdLGg9bls3XSxsPWUqZSt1KnUraSppK3MqcztsPjA/KHJbMF09MiooYypzK2gqZStmKmktTSp1KS9sLHJbMV09MiooZipzK2gqdStNKmUtYyppKS9sLHJbMl09MiooTSpzK2gqaStjKnUtZiplKS9sKTooclswXT0yKihjKnMraCplK2YqaS1NKnUpLHJbMV09MiooZipzK2gqdStNKmUtYyppKSxyWzJdPTIqKE0qcytoKmkrYyp1LWYqZSkpO3JldHVybiBvKHQsbixyKSx0fSxuLmdldFRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blsxMl0sdFsxXT1uWzEzXSx0WzJdPW5bMTRdLHR9LG4uZ2V0U2NhbGluZz1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLGU9blsyXSx1PW5bNF0sbz1uWzVdLGk9bls2XSxzPW5bOF0sYz1uWzldLGY9blsxMF07cmV0dXJuIHRbMF09TWF0aC5zcXJ0KHIqcithKmErZSplKSx0WzFdPU1hdGguc3FydCh1KnUrbypvK2kqaSksdFsyXT1NYXRoLnNxcnQocypzK2MqYytmKmYpLHR9LG4uZ2V0Um90YXRpb249ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdK25bNV0rblsxMF0sYT0wO3I+MD8oYT0yKk1hdGguc3FydChyKzEpLHRbM109LjI1KmEsdFswXT0obls2XS1uWzldKS9hLHRbMV09KG5bOF0tblsyXSkvYSx0WzJdPShuWzFdLW5bNF0pL2EpOm5bMF0+bls1XSYmblswXT5uWzEwXT8oYT0yKk1hdGguc3FydCgxK25bMF0tbls1XS1uWzEwXSksdFszXT0obls2XS1uWzldKS9hLHRbMF09LjI1KmEsdFsxXT0oblsxXStuWzRdKS9hLHRbMl09KG5bOF0rblsyXSkvYSk6bls1XT5uWzEwXT8oYT0yKk1hdGguc3FydCgxK25bNV0tblswXS1uWzEwXSksdFszXT0obls4XS1uWzJdKS9hLHRbMF09KG5bMV0rbls0XSkvYSx0WzFdPS4yNSphLHRbMl09KG5bNl0rbls5XSkvYSk6KGE9MipNYXRoLnNxcnQoMStuWzEwXS1uWzBdLW5bNV0pLHRbM109KG5bMV0tbls0XSkvYSx0WzBdPShuWzhdK25bMl0pL2EsdFsxXT0obls2XStuWzldKS9hLHRbMl09LjI1KmEpO3JldHVybiB0fSxuLmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGU9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9blswXSx1PW5bMV0sbz1uWzJdLGk9blszXSxzPWUrZSxjPXUrdSxmPW8rbyxNPWUqcyxoPWUqYyxsPWUqZix2PXUqYyxkPXUqZixiPW8qZixtPWkqcyxwPWkqYyxQPWkqZixBPWFbMF0sRT1hWzFdLE89YVsyXTtyZXR1cm4gdFswXT0oMS0oditiKSkqQSx0WzFdPShoK1ApKkEsdFsyXT0obC1wKSpBLHRbM109MCx0WzRdPShoLVApKkUsdFs1XT0oMS0oTStiKSkqRSx0WzZdPShkK20pKkUsdFs3XT0wLHRbOF09KGwrcCkqTyx0WzldPShkLW0pKk8sdFsxMF09KDEtKE0rdikpKk8sdFsxMV09MCx0WzEyXT1yWzBdLHRbMTNdPXJbMV0sdFsxNF09clsyXSx0WzE1XT0xLHR9LG4uZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbj1mdW5jdGlvbih0LG4scixhLGUpe3ZhciB1PW5bMF0sbz1uWzFdLGk9blsyXSxzPW5bM10sYz11K3UsZj1vK28sTT1pK2ksaD11KmMsbD11KmYsdj11Kk0sZD1vKmYsYj1vKk0sbT1pKk0scD1zKmMsUD1zKmYsQT1zKk0sRT1hWzBdLE89YVsxXSxSPWFbMl0seT1lWzBdLHE9ZVsxXSx4PWVbMl0sXz0oMS0oZCttKSkqRSxZPShsK0EpKkUsTD0odi1QKSpFLFM9KGwtQSkqTyx3PSgxLShoK20pKSpPLEk9KGIrcCkqTyxOPSh2K1ApKlIsZz0oYi1wKSpSLFQ9KDEtKGgrZCkpKlI7cmV0dXJuIHRbMF09Xyx0WzFdPVksdFsyXT1MLHRbM109MCx0WzRdPVMsdFs1XT13LHRbNl09SSx0WzddPTAsdFs4XT1OLHRbOV09Zyx0WzEwXT1ULHRbMTFdPTAsdFsxMl09clswXSt5LShfKnkrUypxK04qeCksdFsxM109clsxXStxLShZKnkrdypxK2cqeCksdFsxNF09clsyXSt4LShMKnkrSSpxK1QqeCksdFsxNV09MSx0fSxuLmZyb21RdWF0PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sZT1uWzJdLHU9blszXSxvPXIrcixpPWErYSxzPWUrZSxjPXIqbyxmPWEqbyxNPWEqaSxoPWUqbyxsPWUqaSx2PWUqcyxkPXUqbyxiPXUqaSxtPXUqcztyZXR1cm4gdFswXT0xLU0tdix0WzFdPWYrbSx0WzJdPWgtYix0WzNdPTAsdFs0XT1mLW0sdFs1XT0xLWMtdix0WzZdPWwrZCx0WzddPTAsdFs4XT1oK2IsdFs5XT1sLWQsdFsxMF09MS1jLU0sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG4uZnJ1c3R1bT1mdW5jdGlvbih0LG4scixhLGUsdSxvKXt2YXIgaT0xLyhyLW4pLHM9MS8oZS1hKSxjPTEvKHUtbyk7cmV0dXJuIHRbMF09Mip1KmksdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09Mip1KnMsdFs2XT0wLHRbN109MCx0WzhdPShyK24pKmksdFs5XT0oZSthKSpzLHRbMTBdPShvK3UpKmMsdFsxMV09LTEsdFsxMl09MCx0WzEzXT0wLHRbMTRdPW8qdSoyKmMsdFsxNV09MCx0fSxuLnBlcnNwZWN0aXZlPWZ1bmN0aW9uKHQsbixyLGEsZSl7dmFyIHU9MS9NYXRoLnRhbihuLzIpLG89dm9pZCAwO3RbMF09dS9yLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPXUsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE1XT0wLG51bGwhPWUmJmUhPT0xLzA/KG89MS8oYS1lKSx0WzEwXT0oZSthKSpvLHRbMTRdPTIqZSphKm8pOih0WzEwXT0tMSx0WzE0XT0tMiphKTtyZXR1cm4gdH0sbi5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldz1mdW5jdGlvbih0LG4scixhKXt2YXIgZT1NYXRoLnRhbihuLnVwRGVncmVlcypNYXRoLlBJLzE4MCksdT1NYXRoLnRhbihuLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxvPU1hdGgudGFuKG4ubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLGk9TWF0aC50YW4obi5yaWdodERlZ3JlZXMqTWF0aC5QSS8xODApLHM9Mi8obytpKSxjPTIvKGUrdSk7cmV0dXJuIHRbMF09cyx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1jLHRbNl09MCx0WzddPTAsdFs4XT0tKG8taSkqcyouNSx0WzldPShlLXUpKmMqLjUsdFsxMF09YS8oci1hKSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09YSpyLyhyLWEpLHRbMTVdPTAsdH0sbi5vcnRobz1mdW5jdGlvbih0LG4scixhLGUsdSxvKXt2YXIgaT0xLyhuLXIpLHM9MS8oYS1lKSxjPTEvKHUtbyk7cmV0dXJuIHRbMF09LTIqaSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0tMipzLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0yKmMsdFsxMV09MCx0WzEyXT0obityKSppLHRbMTNdPShlK2EpKnMsdFsxNF09KG8rdSkqYyx0WzE1XT0xLHR9LG4ubG9va0F0PWZ1bmN0aW9uKHQsbixyLHUpe3ZhciBvPXZvaWQgMCxpPXZvaWQgMCxzPXZvaWQgMCxjPXZvaWQgMCxmPXZvaWQgMCxNPXZvaWQgMCxoPXZvaWQgMCxsPXZvaWQgMCx2PXZvaWQgMCxkPXZvaWQgMCxiPW5bMF0sbT1uWzFdLHA9blsyXSxQPXVbMF0sQT11WzFdLEU9dVsyXSxPPXJbMF0sUj1yWzFdLHk9clsyXTtpZihNYXRoLmFicyhiLU8pPGEuRVBTSUxPTiYmTWF0aC5hYnMobS1SKTxhLkVQU0lMT04mJk1hdGguYWJzKHAteSk8YS5FUFNJTE9OKXJldHVybiBlKHQpO2g9Yi1PLGw9bS1SLHY9cC15LGQ9MS9NYXRoLnNxcnQoaCpoK2wqbCt2KnYpLG89QSoodio9ZCktRSoobCo9ZCksaT1FKihoKj1kKS1QKnYscz1QKmwtQSpoLChkPU1hdGguc3FydChvKm8raSppK3MqcykpPyhvKj1kPTEvZCxpKj1kLHMqPWQpOihvPTAsaT0wLHM9MCk7Yz1sKnMtdippLGY9dipvLWgqcyxNPWgqaS1sKm8sKGQ9TWF0aC5zcXJ0KGMqYytmKmYrTSpNKSk/KGMqPWQ9MS9kLGYqPWQsTSo9ZCk6KGM9MCxmPTAsTT0wKTtyZXR1cm4gdFswXT1vLHRbMV09Yyx0WzJdPWgsdFszXT0wLHRbNF09aSx0WzVdPWYsdFs2XT1sLHRbN109MCx0WzhdPXMsdFs5XT1NLHRbMTBdPXYsdFsxMV09MCx0WzEyXT0tKG8qYitpKm0rcypwKSx0WzEzXT0tKGMqYitmKm0rTSpwKSx0WzE0XT0tKGgqYitsKm0rdipwKSx0WzE1XT0xLHR9LG4udGFyZ2V0VG89ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9blswXSx1PW5bMV0sbz1uWzJdLGk9YVswXSxzPWFbMV0sYz1hWzJdLGY9ZS1yWzBdLE09dS1yWzFdLGg9by1yWzJdLGw9ZipmK00qTStoKmg7bD4wJiYobD0xL01hdGguc3FydChsKSxmKj1sLE0qPWwsaCo9bCk7dmFyIHY9cypoLWMqTSxkPWMqZi1pKmgsYj1pKk0tcypmOyhsPXYqditkKmQrYipiKT4wJiYobD0xL01hdGguc3FydChsKSx2Kj1sLGQqPWwsYio9bCk7cmV0dXJuIHRbMF09dix0WzFdPWQsdFsyXT1iLHRbM109MCx0WzRdPU0qYi1oKmQsdFs1XT1oKnYtZipiLHRbNl09ZipkLU0qdix0WzddPTAsdFs4XT1mLHRbOV09TSx0WzEwXT1oLHRbMTFdPTAsdFsxMl09ZSx0WzEzXT11LHRbMTRdPW8sdFsxNV09MSx0fSxuLnN0cj1mdW5jdGlvbih0KXtyZXR1cm5cIm1hdDQoXCIrdFswXStcIiwgXCIrdFsxXStcIiwgXCIrdFsyXStcIiwgXCIrdFszXStcIiwgXCIrdFs0XStcIiwgXCIrdFs1XStcIiwgXCIrdFs2XStcIiwgXCIrdFs3XStcIiwgXCIrdFs4XStcIiwgXCIrdFs5XStcIiwgXCIrdFsxMF0rXCIsIFwiK3RbMTFdK1wiLCBcIit0WzEyXStcIiwgXCIrdFsxM10rXCIsIFwiK3RbMTRdK1wiLCBcIit0WzE1XStcIilcIn0sbi5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrTWF0aC5wb3codFs2XSwyKStNYXRoLnBvdyh0WzddLDIpK01hdGgucG93KHRbOF0sMikrTWF0aC5wb3codFs5XSwyKStNYXRoLnBvdyh0WzEwXSwyKStNYXRoLnBvdyh0WzExXSwyKStNYXRoLnBvdyh0WzEyXSwyKStNYXRoLnBvdyh0WzEzXSwyKStNYXRoLnBvdyh0WzE0XSwyKStNYXRoLnBvdyh0WzE1XSwyKSl9LG4uYWRkPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0sdFsxXT1uWzFdK3JbMV0sdFsyXT1uWzJdK3JbMl0sdFszXT1uWzNdK3JbM10sdFs0XT1uWzRdK3JbNF0sdFs1XT1uWzVdK3JbNV0sdFs2XT1uWzZdK3JbNl0sdFs3XT1uWzddK3JbN10sdFs4XT1uWzhdK3JbOF0sdFs5XT1uWzldK3JbOV0sdFsxMF09blsxMF0rclsxMF0sdFsxMV09blsxMV0rclsxMV0sdFsxMl09blsxMl0rclsxMl0sdFsxM109blsxM10rclsxM10sdFsxNF09blsxNF0rclsxNF0sdFsxNV09blsxNV0rclsxNV0sdH0sbi5zdWJ0cmFjdD1pLG4ubXVsdGlwbHlTY2FsYXI9ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPW5bMF0qcix0WzFdPW5bMV0qcix0WzJdPW5bMl0qcix0WzNdPW5bM10qcix0WzRdPW5bNF0qcix0WzVdPW5bNV0qcix0WzZdPW5bNl0qcix0WzddPW5bN10qcix0WzhdPW5bOF0qcix0WzldPW5bOV0qcix0WzEwXT1uWzEwXSpyLHRbMTFdPW5bMTFdKnIsdFsxMl09blsxMl0qcix0WzEzXT1uWzEzXSpyLHRbMTRdPW5bMTRdKnIsdFsxNV09blsxNV0qcix0fSxuLm11bHRpcGx5U2NhbGFyQW5kQWRkPWZ1bmN0aW9uKHQsbixyLGEpe3JldHVybiB0WzBdPW5bMF0rclswXSphLHRbMV09blsxXStyWzFdKmEsdFsyXT1uWzJdK3JbMl0qYSx0WzNdPW5bM10rclszXSphLHRbNF09bls0XStyWzRdKmEsdFs1XT1uWzVdK3JbNV0qYSx0WzZdPW5bNl0rcls2XSphLHRbN109bls3XStyWzddKmEsdFs4XT1uWzhdK3JbOF0qYSx0WzldPW5bOV0rcls5XSphLHRbMTBdPW5bMTBdK3JbMTBdKmEsdFsxMV09blsxMV0rclsxMV0qYSx0WzEyXT1uWzEyXStyWzEyXSphLHRbMTNdPW5bMTNdK3JbMTNdKmEsdFsxNF09blsxNF0rclsxNF0qYSx0WzE1XT1uWzE1XStyWzE1XSphLHR9LG4uZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT09PW5bMF0mJnRbMV09PT1uWzFdJiZ0WzJdPT09blsyXSYmdFszXT09PW5bM10mJnRbNF09PT1uWzRdJiZ0WzVdPT09bls1XSYmdFs2XT09PW5bNl0mJnRbN109PT1uWzddJiZ0WzhdPT09bls4XSYmdFs5XT09PW5bOV0mJnRbMTBdPT09blsxMF0mJnRbMTFdPT09blsxMV0mJnRbMTJdPT09blsxMl0mJnRbMTNdPT09blsxM10mJnRbMTRdPT09blsxNF0mJnRbMTVdPT09blsxNV19LG4uZXF1YWxzPWZ1bmN0aW9uKHQsbil7dmFyIHI9dFswXSxlPXRbMV0sdT10WzJdLG89dFszXSxpPXRbNF0scz10WzVdLGM9dFs2XSxmPXRbN10sTT10WzhdLGg9dFs5XSxsPXRbMTBdLHY9dFsxMV0sZD10WzEyXSxiPXRbMTNdLG09dFsxNF0scD10WzE1XSxQPW5bMF0sQT1uWzFdLEU9blsyXSxPPW5bM10sUj1uWzRdLHk9bls1XSxxPW5bNl0seD1uWzddLF89bls4XSxZPW5bOV0sTD1uWzEwXSxTPW5bMTFdLHc9blsxMl0sST1uWzEzXSxOPW5bMTRdLGc9blsxNV07cmV0dXJuIE1hdGguYWJzKHItUCk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKFApKSYmTWF0aC5hYnMoZS1BKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZSksTWF0aC5hYnMoQSkpJiZNYXRoLmFicyh1LUUpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh1KSxNYXRoLmFicyhFKSkmJk1hdGguYWJzKG8tTyk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKE8pKSYmTWF0aC5hYnMoaS1SKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMoUikpJiZNYXRoLmFicyhzLXkpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhzKSxNYXRoLmFicyh5KSkmJk1hdGguYWJzKGMtcSk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGMpLE1hdGguYWJzKHEpKSYmTWF0aC5hYnMoZi14KTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoeCkpJiZNYXRoLmFicyhNLV8pPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhNKSxNYXRoLmFicyhfKSkmJk1hdGguYWJzKGgtWSk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKFkpKSYmTWF0aC5hYnMobC1MKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobCksTWF0aC5hYnMoTCkpJiZNYXRoLmFicyh2LVMpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh2KSxNYXRoLmFicyhTKSkmJk1hdGguYWJzKGQtdyk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGQpLE1hdGguYWJzKHcpKSYmTWF0aC5hYnMoYi1JKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoYiksTWF0aC5hYnMoSSkpJiZNYXRoLmFicyhtLU4pPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhtKSxNYXRoLmFicyhOKSkmJk1hdGguYWJzKHAtZyk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHApLE1hdGguYWJzKGcpKX07dmFyIGE9ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBuPXt9O2lmKG51bGwhPXQpZm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJihuW3JdPXRbcl0pO3JldHVybiBuLmRlZmF1bHQ9dCxufShyKDApKTtmdW5jdGlvbiBlKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH1mdW5jdGlvbiB1KHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9bls0XSxzPW5bNV0sYz1uWzZdLGY9bls3XSxNPW5bOF0saD1uWzldLGw9blsxMF0sdj1uWzExXSxkPW5bMTJdLGI9blsxM10sbT1uWzE0XSxwPW5bMTVdLFA9clswXSxBPXJbMV0sRT1yWzJdLE89clszXTtyZXR1cm4gdFswXT1QKmErQSppK0UqTStPKmQsdFsxXT1QKmUrQSpzK0UqaCtPKmIsdFsyXT1QKnUrQSpjK0UqbCtPKm0sdFszXT1QKm8rQSpmK0UqditPKnAsUD1yWzRdLEE9cls1XSxFPXJbNl0sTz1yWzddLHRbNF09UCphK0EqaStFKk0rTypkLHRbNV09UCplK0EqcytFKmgrTypiLHRbNl09UCp1K0EqYytFKmwrTyptLHRbN109UCpvK0EqZitFKnYrTypwLFA9cls4XSxBPXJbOV0sRT1yWzEwXSxPPXJbMTFdLHRbOF09UCphK0EqaStFKk0rTypkLHRbOV09UCplK0EqcytFKmgrTypiLHRbMTBdPVAqdStBKmMrRSpsK08qbSx0WzExXT1QKm8rQSpmK0UqditPKnAsUD1yWzEyXSxBPXJbMTNdLEU9clsxNF0sTz1yWzE1XSx0WzEyXT1QKmErQSppK0UqTStPKmQsdFsxM109UCplK0EqcytFKmgrTypiLHRbMTRdPVAqdStBKmMrRSpsK08qbSx0WzE1XT1QKm8rQSpmK0UqditPKnAsdH1mdW5jdGlvbiBvKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9YSthLHM9ZStlLGM9dSt1LGY9YSppLE09YSpzLGg9YSpjLGw9ZSpzLHY9ZSpjLGQ9dSpjLGI9byppLG09bypzLHA9bypjO3JldHVybiB0WzBdPTEtKGwrZCksdFsxXT1NK3AsdFsyXT1oLW0sdFszXT0wLHRbNF09TS1wLHRbNV09MS0oZitkKSx0WzZdPXYrYix0WzddPTAsdFs4XT1oK20sdFs5XT12LWIsdFsxMF09MS0oZitsKSx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH1mdW5jdGlvbiBpKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdLXJbMF0sdFsxXT1uWzFdLXJbMV0sdFsyXT1uWzJdLXJbMl0sdFszXT1uWzNdLXJbM10sdFs0XT1uWzRdLXJbNF0sdFs1XT1uWzVdLXJbNV0sdFs2XT1uWzZdLXJbNl0sdFs3XT1uWzddLXJbN10sdFs4XT1uWzhdLXJbOF0sdFs5XT1uWzldLXJbOV0sdFsxMF09blsxMF0tclsxMF0sdFsxMV09blsxMV0tclsxMV0sdFsxMl09blsxMl0tclsxMl0sdFsxM109blsxM10tclsxM10sdFsxNF09blsxNF0tclsxNF0sdFsxNV09blsxNV0tclsxNV0sdH1uLm11bD11LG4uc3ViPWl9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnN1Yj1uLm11bD12b2lkIDAsbi5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYS5BUlJBWV9UWVBFKDkpO2EuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYodFsxXT0wLHRbMl09MCx0WzNdPTAsdFs1XT0wLHRbNl09MCx0WzddPTApO3JldHVybiB0WzBdPTEsdFs0XT0xLHRbOF09MSx0fSxuLmZyb21NYXQ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109bls0XSx0WzRdPW5bNV0sdFs1XT1uWzZdLHRbNl09bls4XSx0WzddPW5bOV0sdFs4XT1uWzEwXSx0fSxuLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBhLkFSUkFZX1RZUEUoOSk7cmV0dXJuIG5bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNF0sbls1XT10WzVdLG5bNl09dFs2XSxuWzddPXRbN10sbls4XT10WzhdLG59LG4uY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdFs0XT1uWzRdLHRbNV09bls1XSx0WzZdPW5bNl0sdFs3XT1uWzddLHRbOF09bls4XSx0fSxuLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxuLHIsZSx1LG8saSxzLGMpe3ZhciBmPW5ldyBhLkFSUkFZX1RZUEUoOSk7cmV0dXJuIGZbMF09dCxmWzFdPW4sZlsyXT1yLGZbM109ZSxmWzRdPXUsZls1XT1vLGZbNl09aSxmWzddPXMsZls4XT1jLGZ9LG4uc2V0PWZ1bmN0aW9uKHQsbixyLGEsZSx1LG8saSxzLGMpe3JldHVybiB0WzBdPW4sdFsxXT1yLHRbMl09YSx0WzNdPWUsdFs0XT11LHRbNV09byx0WzZdPWksdFs3XT1zLHRbOF09Yyx0fSxuLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fSxuLnRyYW5zcG9zZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXt2YXIgcj1uWzFdLGE9blsyXSxlPW5bNV07dFsxXT1uWzNdLHRbMl09bls2XSx0WzNdPXIsdFs1XT1uWzddLHRbNl09YSx0WzddPWV9ZWxzZSB0WzBdPW5bMF0sdFsxXT1uWzNdLHRbMl09bls2XSx0WzNdPW5bMV0sdFs0XT1uWzRdLHRbNV09bls3XSx0WzZdPW5bMl0sdFs3XT1uWzVdLHRbOF09bls4XTtyZXR1cm4gdH0sbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPW5bMl0sdT1uWzNdLG89bls0XSxpPW5bNV0scz1uWzZdLGM9bls3XSxmPW5bOF0sTT1mKm8taSpjLGg9LWYqdStpKnMsbD1jKnUtbypzLHY9cipNK2EqaCtlKmw7aWYoIXYpcmV0dXJuIG51bGw7cmV0dXJuIHY9MS92LHRbMF09TSp2LHRbMV09KC1mKmErZSpjKSp2LHRbMl09KGkqYS1lKm8pKnYsdFszXT1oKnYsdFs0XT0oZipyLWUqcykqdix0WzVdPSgtaSpyK2UqdSkqdix0WzZdPWwqdix0WzddPSgtYypyK2Eqcykqdix0WzhdPShvKnItYSp1KSp2LHR9LG4uYWRqb2ludD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLGU9blsyXSx1PW5bM10sbz1uWzRdLGk9bls1XSxzPW5bNl0sYz1uWzddLGY9bls4XTtyZXR1cm4gdFswXT1vKmYtaSpjLHRbMV09ZSpjLWEqZix0WzJdPWEqaS1lKm8sdFszXT1pKnMtdSpmLHRbNF09cipmLWUqcyx0WzVdPWUqdS1yKmksdFs2XT11KmMtbypzLHRbN109YSpzLXIqYyx0WzhdPXIqby1hKnUsdH0sbi5kZXRlcm1pbmFudD1mdW5jdGlvbih0KXt2YXIgbj10WzBdLHI9dFsxXSxhPXRbMl0sZT10WzNdLHU9dFs0XSxvPXRbNV0saT10WzZdLHM9dFs3XSxjPXRbOF07cmV0dXJuIG4qKGMqdS1vKnMpK3IqKC1jKmUrbyppKSthKihzKmUtdSppKX0sbi5tdWx0aXBseT1lLG4udHJhbnNsYXRlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9bls0XSxzPW5bNV0sYz1uWzZdLGY9bls3XSxNPW5bOF0saD1yWzBdLGw9clsxXTtyZXR1cm4gdFswXT1hLHRbMV09ZSx0WzJdPXUsdFszXT1vLHRbNF09aSx0WzVdPXMsdFs2XT1oKmErbCpvK2MsdFs3XT1oKmUrbCppK2YsdFs4XT1oKnUrbCpzK00sdH0sbi5yb3RhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT1uWzRdLHM9bls1XSxjPW5bNl0sZj1uWzddLE09bls4XSxoPU1hdGguc2luKHIpLGw9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09bCphK2gqbyx0WzFdPWwqZStoKmksdFsyXT1sKnUraCpzLHRbM109bCpvLWgqYSx0WzRdPWwqaS1oKmUsdFs1XT1sKnMtaCp1LHRbNl09Yyx0WzddPWYsdFs4XT1NLHR9LG4uc2NhbGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPXJbMF0sZT1yWzFdO3JldHVybiB0WzBdPWEqblswXSx0WzFdPWEqblsxXSx0WzJdPWEqblsyXSx0WzNdPWUqblszXSx0WzRdPWUqbls0XSx0WzVdPWUqbls1XSx0WzZdPW5bNl0sdFs3XT1uWzddLHRbOF09bls4XSx0fSxuLmZyb21UcmFuc2xhdGlvbj1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPW5bMF0sdFs3XT1uWzFdLHRbOF09MSx0fSxuLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LG4pe3ZhciByPU1hdGguc2luKG4pLGE9TWF0aC5jb3Mobik7cmV0dXJuIHRbMF09YSx0WzFdPXIsdFsyXT0wLHRbM109LXIsdFs0XT1hLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fSxuLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPW5bMV0sdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG4uZnJvbU1hdDJkPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT0wLHRbM109blsyXSx0WzRdPW5bM10sdFs1XT0wLHRbNl09bls0XSx0WzddPW5bNV0sdFs4XT0xLHR9LG4uZnJvbVF1YXQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPW5bMl0sdT1uWzNdLG89cityLGk9YSthLHM9ZStlLGM9cipvLGY9YSpvLE09YSppLGg9ZSpvLGw9ZSppLHY9ZSpzLGQ9dSpvLGI9dSppLG09dSpzO3JldHVybiB0WzBdPTEtTS12LHRbM109Zi1tLHRbNl09aCtiLHRbMV09ZittLHRbNF09MS1jLXYsdFs3XT1sLWQsdFsyXT1oLWIsdFs1XT1sK2QsdFs4XT0xLWMtTSx0fSxuLm5vcm1hbEZyb21NYXQ0PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sZT1uWzJdLHU9blszXSxvPW5bNF0saT1uWzVdLHM9bls2XSxjPW5bN10sZj1uWzhdLE09bls5XSxoPW5bMTBdLGw9blsxMV0sdj1uWzEyXSxkPW5bMTNdLGI9blsxNF0sbT1uWzE1XSxwPXIqaS1hKm8sUD1yKnMtZSpvLEE9cipjLXUqbyxFPWEqcy1lKmksTz1hKmMtdSppLFI9ZSpjLXUqcyx5PWYqZC1NKnYscT1mKmItaCp2LHg9ZiptLWwqdixfPU0qYi1oKmQsWT1NKm0tbCpkLEw9aCptLWwqYixTPXAqTC1QKlkrQSpfK0UqeC1PKnErUip5O2lmKCFTKXJldHVybiBudWxsO3JldHVybiBTPTEvUyx0WzBdPShpKkwtcypZK2MqXykqUyx0WzFdPShzKngtbypMLWMqcSkqUyx0WzJdPShvKlktaSp4K2MqeSkqUyx0WzNdPShlKlktYSpMLXUqXykqUyx0WzRdPShyKkwtZSp4K3UqcSkqUyx0WzVdPShhKngtcipZLXUqeSkqUyx0WzZdPShkKlItYipPK20qRSkqUyx0WzddPShiKkEtdipSLW0qUCkqUyx0WzhdPSh2Kk8tZCpBK20qcCkqUyx0fSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPTIvbix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPS0yL3IsdFs1XT0wLHRbNl09LTEsdFs3XT0xLHRbOF09MSx0fSxuLnN0cj1mdW5jdGlvbih0KXtyZXR1cm5cIm1hdDMoXCIrdFswXStcIiwgXCIrdFsxXStcIiwgXCIrdFsyXStcIiwgXCIrdFszXStcIiwgXCIrdFs0XStcIiwgXCIrdFs1XStcIiwgXCIrdFs2XStcIiwgXCIrdFs3XStcIiwgXCIrdFs4XStcIilcIn0sbi5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrTWF0aC5wb3codFs2XSwyKStNYXRoLnBvdyh0WzddLDIpK01hdGgucG93KHRbOF0sMikpfSxuLmFkZD1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09blswXStyWzBdLHRbMV09blsxXStyWzFdLHRbMl09blsyXStyWzJdLHRbM109blszXStyWzNdLHRbNF09bls0XStyWzRdLHRbNV09bls1XStyWzVdLHRbNl09bls2XStyWzZdLHRbN109bls3XStyWzddLHRbOF09bls4XStyWzhdLHR9LG4uc3VidHJhY3Q9dSxuLm11bHRpcGx5U2NhbGFyPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdKnIsdFsxXT1uWzFdKnIsdFsyXT1uWzJdKnIsdFszXT1uWzNdKnIsdFs0XT1uWzRdKnIsdFs1XT1uWzVdKnIsdFs2XT1uWzZdKnIsdFs3XT1uWzddKnIsdFs4XT1uWzhdKnIsdH0sbi5tdWx0aXBseVNjYWxhckFuZEFkZD1mdW5jdGlvbih0LG4scixhKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0qYSx0WzFdPW5bMV0rclsxXSphLHRbMl09blsyXStyWzJdKmEsdFszXT1uWzNdK3JbM10qYSx0WzRdPW5bNF0rcls0XSphLHRbNV09bls1XStyWzVdKmEsdFs2XT1uWzZdK3JbNl0qYSx0WzddPW5bN10rcls3XSphLHRbOF09bls4XStyWzhdKmEsdH0sbi5leGFjdEVxdWFscz1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPT09blswXSYmdFsxXT09PW5bMV0mJnRbMl09PT1uWzJdJiZ0WzNdPT09blszXSYmdFs0XT09PW5bNF0mJnRbNV09PT1uWzVdJiZ0WzZdPT09bls2XSYmdFs3XT09PW5bN10mJnRbOF09PT1uWzhdfSxuLmVxdWFscz1mdW5jdGlvbih0LG4pe3ZhciByPXRbMF0sZT10WzFdLHU9dFsyXSxvPXRbM10saT10WzRdLHM9dFs1XSxjPXRbNl0sZj10WzddLE09dFs4XSxoPW5bMF0sbD1uWzFdLHY9blsyXSxkPW5bM10sYj1uWzRdLG09bls1XSxwPW5bNl0sUD1uWzddLEE9bls4XTtyZXR1cm4gTWF0aC5hYnMoci1oKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoaCkpJiZNYXRoLmFicyhlLWwpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhlKSxNYXRoLmFicyhsKSkmJk1hdGguYWJzKHUtdik8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHUpLE1hdGguYWJzKHYpKSYmTWF0aC5hYnMoby1kKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoZCkpJiZNYXRoLmFicyhpLWIpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhiKSkmJk1hdGguYWJzKHMtbSk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHMpLE1hdGguYWJzKG0pKSYmTWF0aC5hYnMoYy1wKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoYyksTWF0aC5hYnMocCkpJiZNYXRoLmFicyhmLVApPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhmKSxNYXRoLmFicyhQKSkmJk1hdGguYWJzKE0tQSk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKE0pLE1hdGguYWJzKEEpKX07dmFyIGE9ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBuPXt9O2lmKG51bGwhPXQpZm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJihuW3JdPXRbcl0pO3JldHVybiBuLmRlZmF1bHQ9dCxufShyKDApKTtmdW5jdGlvbiBlKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9bls0XSxzPW5bNV0sYz1uWzZdLGY9bls3XSxNPW5bOF0saD1yWzBdLGw9clsxXSx2PXJbMl0sZD1yWzNdLGI9cls0XSxtPXJbNV0scD1yWzZdLFA9cls3XSxBPXJbOF07cmV0dXJuIHRbMF09aCphK2wqbyt2KmMsdFsxXT1oKmUrbCppK3YqZix0WzJdPWgqdStsKnMrdipNLHRbM109ZCphK2IqbyttKmMsdFs0XT1kKmUrYippK20qZix0WzVdPWQqdStiKnMrbSpNLHRbNl09cCphK1AqbytBKmMsdFs3XT1wKmUrUCppK0EqZix0WzhdPXAqdStQKnMrQSpNLHR9ZnVuY3Rpb24gdSh0LG4scil7cmV0dXJuIHRbMF09blswXS1yWzBdLHRbMV09blsxXS1yWzFdLHRbMl09blsyXS1yWzJdLHRbM109blszXS1yWzNdLHRbNF09bls0XS1yWzRdLHRbNV09bls1XS1yWzVdLHRbNl09bls2XS1yWzZdLHRbN109bls3XS1yWzddLHRbOF09bls4XS1yWzhdLHR9bi5tdWw9ZSxuLnN1Yj11fSxmdW5jdGlvbih0LG4scil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksbi5mb3JFYWNoPW4uc3FyTGVuPW4uc3FyRGlzdD1uLmRpc3Q9bi5kaXY9bi5tdWw9bi5zdWI9bi5sZW49dm9pZCAwLG4uY3JlYXRlPWUsbi5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgYS5BUlJBWV9UWVBFKDIpO3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG59LG4uZnJvbVZhbHVlcz1mdW5jdGlvbih0LG4pe3ZhciByPW5ldyBhLkFSUkFZX1RZUEUoMik7cmV0dXJuIHJbMF09dCxyWzFdPW4scn0sbi5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdH0sbi5zZXQ9ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPW4sdFsxXT1yLHR9LG4uYWRkPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0sdFsxXT1uWzFdK3JbMV0sdH0sbi5zdWJ0cmFjdD11LG4ubXVsdGlwbHk9byxuLmRpdmlkZT1pLG4uY2VpbD1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPU1hdGguY2VpbChuWzBdKSx0WzFdPU1hdGguY2VpbChuWzFdKSx0fSxuLmZsb29yPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09TWF0aC5mbG9vcihuWzBdKSx0WzFdPU1hdGguZmxvb3IoblsxXSksdH0sbi5taW49ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPU1hdGgubWluKG5bMF0sclswXSksdFsxXT1NYXRoLm1pbihuWzFdLHJbMV0pLHR9LG4ubWF4PWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1NYXRoLm1heChuWzBdLHJbMF0pLHRbMV09TWF0aC5tYXgoblsxXSxyWzFdKSx0fSxuLnJvdW5kPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09TWF0aC5yb3VuZChuWzBdKSx0WzFdPU1hdGgucm91bmQoblsxXSksdH0sbi5zY2FsZT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09blswXSpyLHRbMV09blsxXSpyLHR9LG4uc2NhbGVBbmRBZGQ9ZnVuY3Rpb24odCxuLHIsYSl7cmV0dXJuIHRbMF09blswXStyWzBdKmEsdFsxXT1uWzFdK3JbMV0qYSx0fSxuLmRpc3RhbmNlPXMsbi5zcXVhcmVkRGlzdGFuY2U9YyxuLmxlbmd0aD1mLG4uc3F1YXJlZExlbmd0aD1NLG4ubmVnYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09LW5bMF0sdFsxXT0tblsxXSx0fSxuLmludmVyc2U9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT0xL25bMF0sdFsxXT0xL25bMV0sdH0sbi5ub3JtYWxpemU9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPXIqcithKmE7ZT4wJiYoZT0xL01hdGguc3FydChlKSx0WzBdPW5bMF0qZSx0WzFdPW5bMV0qZSk7cmV0dXJuIHR9LG4uZG90PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV19LG4uY3Jvc3M9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0qclsxXS1uWzFdKnJbMF07cmV0dXJuIHRbMF09dFsxXT0wLHRbMl09YSx0fSxuLmxlcnA9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9blswXSx1PW5bMV07cmV0dXJuIHRbMF09ZSthKihyWzBdLWUpLHRbMV09dSthKihyWzFdLXUpLHR9LG4ucmFuZG9tPWZ1bmN0aW9uKHQsbil7bj1ufHwxO3ZhciByPTIqYS5SQU5ET00oKSpNYXRoLlBJO3JldHVybiB0WzBdPU1hdGguY29zKHIpKm4sdFsxXT1NYXRoLnNpbihyKSpuLHR9LG4udHJhbnNmb3JtTWF0Mj1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV07cmV0dXJuIHRbMF09clswXSphK3JbMl0qZSx0WzFdPXJbMV0qYStyWzNdKmUsdH0sbi50cmFuc2Zvcm1NYXQyZD1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV07cmV0dXJuIHRbMF09clswXSphK3JbMl0qZStyWzRdLHRbMV09clsxXSphK3JbM10qZStyWzVdLHR9LG4udHJhbnNmb3JtTWF0Mz1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV07cmV0dXJuIHRbMF09clswXSphK3JbM10qZStyWzZdLHRbMV09clsxXSphK3JbNF0qZStyWzddLHR9LG4udHJhbnNmb3JtTWF0ND1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV07cmV0dXJuIHRbMF09clswXSphK3JbNF0qZStyWzEyXSx0WzFdPXJbMV0qYStyWzVdKmUrclsxM10sdH0sbi5yb3RhdGU9ZnVuY3Rpb24odCxuLHIsYSl7dmFyIGU9blswXS1yWzBdLHU9blsxXS1yWzFdLG89TWF0aC5zaW4oYSksaT1NYXRoLmNvcyhhKTtyZXR1cm4gdFswXT1lKmktdSpvK3JbMF0sdFsxXT1lKm8rdSppK3JbMV0sdH0sbi5hbmdsZT1mdW5jdGlvbih0LG4pe3ZhciByPXRbMF0sYT10WzFdLGU9blswXSx1PW5bMV0sbz1yKnIrYSphO28+MCYmKG89MS9NYXRoLnNxcnQobykpO3ZhciBpPWUqZSt1KnU7aT4wJiYoaT0xL01hdGguc3FydChpKSk7dmFyIHM9KHIqZSthKnUpKm8qaTtyZXR1cm4gcz4xPzA6czwtMT9NYXRoLlBJOk1hdGguYWNvcyhzKX0sbi5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJ2ZWMyKFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIpXCJ9LG4uZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT09PW5bMF0mJnRbMV09PT1uWzFdfSxuLmVxdWFscz1mdW5jdGlvbih0LG4pe3ZhciByPXRbMF0sZT10WzFdLHU9blswXSxvPW5bMV07cmV0dXJuIE1hdGguYWJzKHItdSk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKHUpKSYmTWF0aC5hYnMoZS1vKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZSksTWF0aC5hYnMobykpfTt2YXIgYT1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIG49e307aWYobnVsbCE9dClmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG4uZGVmYXVsdD10LG59KHIoMCkpO2Z1bmN0aW9uIGUoKXt2YXIgdD1uZXcgYS5BUlJBWV9UWVBFKDIpO3JldHVybiBhLkFSUkFZX1RZUEUhPUZsb2F0MzJBcnJheSYmKHRbMF09MCx0WzFdPTApLHR9ZnVuY3Rpb24gdSh0LG4scil7cmV0dXJuIHRbMF09blswXS1yWzBdLHRbMV09blsxXS1yWzFdLHR9ZnVuY3Rpb24gbyh0LG4scil7cmV0dXJuIHRbMF09blswXSpyWzBdLHRbMV09blsxXSpyWzFdLHR9ZnVuY3Rpb24gaSh0LG4scil7cmV0dXJuIHRbMF09blswXS9yWzBdLHRbMV09blsxXS9yWzFdLHR9ZnVuY3Rpb24gcyh0LG4pe3ZhciByPW5bMF0tdFswXSxhPW5bMV0tdFsxXTtyZXR1cm4gTWF0aC5zcXJ0KHIqcithKmEpfWZ1bmN0aW9uIGModCxuKXt2YXIgcj1uWzBdLXRbMF0sYT1uWzFdLXRbMV07cmV0dXJuIHIqcithKmF9ZnVuY3Rpb24gZih0KXt2YXIgbj10WzBdLHI9dFsxXTtyZXR1cm4gTWF0aC5zcXJ0KG4qbityKnIpfWZ1bmN0aW9uIE0odCl7dmFyIG49dFswXSxyPXRbMV07cmV0dXJuIG4qbityKnJ9bi5sZW49ZixuLnN1Yj11LG4ubXVsPW8sbi5kaXY9aSxuLmRpc3Q9cyxuLnNxckRpc3Q9YyxuLnNxckxlbj1NLG4uZm9yRWFjaD1mdW5jdGlvbigpe3ZhciB0PWUoKTtyZXR1cm4gZnVuY3Rpb24obixyLGEsZSx1LG8pe3ZhciBpPXZvaWQgMCxzPXZvaWQgMDtmb3Iocnx8KHI9MiksYXx8KGE9MCkscz1lP01hdGgubWluKGUqcithLG4ubGVuZ3RoKTpuLmxlbmd0aCxpPWE7aTxzO2krPXIpdFswXT1uW2ldLHRbMV09bltpKzFdLHUodCx0LG8pLG5baV09dFswXSxuW2krMV09dFsxXTtyZXR1cm4gbn19KCl9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnNxckxlbj1uLnNxdWFyZWRMZW5ndGg9bi5sZW49bi5sZW5ndGg9bi5kb3Q9bi5tdWw9bi5zZXRSZWFsPW4uZ2V0UmVhbD12b2lkIDAsbi5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYS5BUlJBWV9UWVBFKDgpO2EuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYodFswXT0wLHRbMV09MCx0WzJdPTAsdFs0XT0wLHRbNV09MCx0WzZdPTAsdFs3XT0wKTtyZXR1cm4gdFszXT0xLHR9LG4uY2xvbmU9ZnVuY3Rpb24odCl7dmFyIG49bmV3IGEuQVJSQVlfVFlQRSg4KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbls2XT10WzZdLG5bN109dFs3XSxufSxuLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxuLHIsZSx1LG8saSxzKXt2YXIgYz1uZXcgYS5BUlJBWV9UWVBFKDgpO3JldHVybiBjWzBdPXQsY1sxXT1uLGNbMl09cixjWzNdPWUsY1s0XT11LGNbNV09byxjWzZdPWksY1s3XT1zLGN9LG4uZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25WYWx1ZXM9ZnVuY3Rpb24odCxuLHIsZSx1LG8saSl7dmFyIHM9bmV3IGEuQVJSQVlfVFlQRSg4KTtzWzBdPXQsc1sxXT1uLHNbMl09cixzWzNdPWU7dmFyIGM9LjUqdSxmPS41Km8sTT0uNSppO3JldHVybiBzWzRdPWMqZStmKnItTSpuLHNbNV09ZiplK00qdC1jKnIsc1s2XT1NKmUrYypuLWYqdCxzWzddPS1jKnQtZipuLU0qcixzfSxuLmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uPWksbi5mcm9tVHJhbnNsYXRpb249ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09LjUqblswXSx0WzVdPS41Km5bMV0sdFs2XT0uNSpuWzJdLHRbN109MCx0fSxuLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdFs0XT0wLHRbNV09MCx0WzZdPTAsdFs3XT0wLHR9LG4uZnJvbU1hdDQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1lLmNyZWF0ZSgpO3UuZ2V0Um90YXRpb24ocixuKTt2YXIgbz1uZXcgYS5BUlJBWV9UWVBFKDMpO3JldHVybiB1LmdldFRyYW5zbGF0aW9uKG8sbiksaSh0LHIsbyksdH0sbi5jb3B5PXMsbi5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdFs2XT0wLHRbN109MCx0fSxuLnNldD1mdW5jdGlvbih0LG4scixhLGUsdSxvLGkscyl7cmV0dXJuIHRbMF09bix0WzFdPXIsdFsyXT1hLHRbM109ZSx0WzRdPXUsdFs1XT1vLHRbNl09aSx0WzddPXMsdH0sbi5nZXREdWFsPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09bls0XSx0WzFdPW5bNV0sdFsyXT1uWzZdLHRbM109bls3XSx0fSxuLnNldER1YWw9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFs0XT1uWzBdLHRbNV09blsxXSx0WzZdPW5bMl0sdFs3XT1uWzNdLHR9LG4uZ2V0VHJhbnNsYXRpb249ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzRdLGE9bls1XSxlPW5bNl0sdT1uWzddLG89LW5bMF0saT0tblsxXSxzPS1uWzJdLGM9blszXTtyZXR1cm4gdFswXT0yKihyKmMrdSpvK2Eqcy1lKmkpLHRbMV09MiooYSpjK3UqaStlKm8tcipzKSx0WzJdPTIqKGUqYyt1KnMrcippLWEqbyksdH0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT0uNSpyWzBdLHM9LjUqclsxXSxjPS41KnJbMl0sZj1uWzRdLE09bls1XSxoPW5bNl0sbD1uWzddO3JldHVybiB0WzBdPWEsdFsxXT1lLHRbMl09dSx0WzNdPW8sdFs0XT1vKmkrZSpjLXUqcytmLHRbNV09bypzK3UqaS1hKmMrTSx0WzZdPW8qYythKnMtZSppK2gsdFs3XT0tYSppLWUqcy11KmMrbCx0fSxuLnJvdGF0ZVg9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPS1uWzBdLHU9LW5bMV0sbz0tblsyXSxpPW5bM10scz1uWzRdLGM9bls1XSxmPW5bNl0sTT1uWzddLGg9cyppK00qYStjKm8tZip1LGw9YyppK00qdStmKmEtcypvLHY9ZippK00qbytzKnUtYyphLGQ9TSppLXMqYS1jKnUtZipvO3JldHVybiBlLnJvdGF0ZVgodCxuLHIpLGE9dFswXSx1PXRbMV0sbz10WzJdLGk9dFszXSx0WzRdPWgqaStkKmErbCpvLXYqdSx0WzVdPWwqaStkKnUrdiphLWgqbyx0WzZdPXYqaStkKm8raCp1LWwqYSx0WzddPWQqaS1oKmEtbCp1LXYqbyx0fSxuLnJvdGF0ZVk9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPS1uWzBdLHU9LW5bMV0sbz0tblsyXSxpPW5bM10scz1uWzRdLGM9bls1XSxmPW5bNl0sTT1uWzddLGg9cyppK00qYStjKm8tZip1LGw9YyppK00qdStmKmEtcypvLHY9ZippK00qbytzKnUtYyphLGQ9TSppLXMqYS1jKnUtZipvO3JldHVybiBlLnJvdGF0ZVkodCxuLHIpLGE9dFswXSx1PXRbMV0sbz10WzJdLGk9dFszXSx0WzRdPWgqaStkKmErbCpvLXYqdSx0WzVdPWwqaStkKnUrdiphLWgqbyx0WzZdPXYqaStkKm8raCp1LWwqYSx0WzddPWQqaS1oKmEtbCp1LXYqbyx0fSxuLnJvdGF0ZVo9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPS1uWzBdLHU9LW5bMV0sbz0tblsyXSxpPW5bM10scz1uWzRdLGM9bls1XSxmPW5bNl0sTT1uWzddLGg9cyppK00qYStjKm8tZip1LGw9YyppK00qdStmKmEtcypvLHY9ZippK00qbytzKnUtYyphLGQ9TSppLXMqYS1jKnUtZipvO3JldHVybiBlLnJvdGF0ZVoodCxuLHIpLGE9dFswXSx1PXRbMV0sbz10WzJdLGk9dFszXSx0WzRdPWgqaStkKmErbCpvLXYqdSx0WzVdPWwqaStkKnUrdiphLWgqbyx0WzZdPXYqaStkKm8raCp1LWwqYSx0WzddPWQqaS1oKmEtbCp1LXYqbyx0fSxuLnJvdGF0ZUJ5UXVhdEFwcGVuZD1mdW5jdGlvbih0LG4scil7dmFyIGE9clswXSxlPXJbMV0sdT1yWzJdLG89clszXSxpPW5bMF0scz1uWzFdLGM9blsyXSxmPW5bM107cmV0dXJuIHRbMF09aSpvK2YqYStzKnUtYyplLHRbMV09cypvK2YqZStjKmEtaSp1LHRbMl09YypvK2YqdStpKmUtcyphLHRbM109ZipvLWkqYS1zKmUtYyp1LGk9bls0XSxzPW5bNV0sYz1uWzZdLGY9bls3XSx0WzRdPWkqbytmKmErcyp1LWMqZSx0WzVdPXMqbytmKmUrYyphLWkqdSx0WzZdPWMqbytmKnUraSplLXMqYSx0WzddPWYqby1pKmEtcyplLWMqdSx0fSxuLnJvdGF0ZUJ5UXVhdFByZXBlbmQ9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT1yWzBdLHM9clsxXSxjPXJbMl0sZj1yWzNdO3JldHVybiB0WzBdPWEqZitvKmkrZSpjLXUqcyx0WzFdPWUqZitvKnMrdSppLWEqYyx0WzJdPXUqZitvKmMrYSpzLWUqaSx0WzNdPW8qZi1hKmktZSpzLXUqYyxpPXJbNF0scz1yWzVdLGM9cls2XSxmPXJbN10sdFs0XT1hKmYrbyppK2UqYy11KnMsdFs1XT1lKmYrbypzK3UqaS1hKmMsdFs2XT11KmYrbypjK2Eqcy1lKmksdFs3XT1vKmYtYSppLWUqcy11KmMsdH0sbi5yb3RhdGVBcm91bmRBeGlzPWZ1bmN0aW9uKHQsbixyLGUpe2lmKE1hdGguYWJzKGUpPGEuRVBTSUxPTilyZXR1cm4gcyh0LG4pO3ZhciB1PU1hdGguc3FydChyWzBdKnJbMF0rclsxXSpyWzFdK3JbMl0qclsyXSk7ZSo9LjU7dmFyIG89TWF0aC5zaW4oZSksaT1vKnJbMF0vdSxjPW8qclsxXS91LGY9bypyWzJdL3UsTT1NYXRoLmNvcyhlKSxoPW5bMF0sbD1uWzFdLHY9blsyXSxkPW5bM107dFswXT1oKk0rZCppK2wqZi12KmMsdFsxXT1sKk0rZCpjK3YqaS1oKmYsdFsyXT12Kk0rZCpmK2gqYy1sKmksdFszXT1kKk0taCppLWwqYy12KmY7dmFyIGI9bls0XSxtPW5bNV0scD1uWzZdLFA9bls3XTtyZXR1cm4gdFs0XT1iKk0rUCppK20qZi1wKmMsdFs1XT1tKk0rUCpjK3AqaS1iKmYsdFs2XT1wKk0rUCpmK2IqYy1tKmksdFs3XT1QKk0tYippLW0qYy1wKmYsdH0sbi5hZGQ9ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPW5bMF0rclswXSx0WzFdPW5bMV0rclsxXSx0WzJdPW5bMl0rclsyXSx0WzNdPW5bM10rclszXSx0WzRdPW5bNF0rcls0XSx0WzVdPW5bNV0rcls1XSx0WzZdPW5bNl0rcls2XSx0WzddPW5bN10rcls3XSx0fSxuLm11bHRpcGx5PWMsbi5zY2FsZT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRbMF09blswXSpyLHRbMV09blsxXSpyLHRbMl09blsyXSpyLHRbM109blszXSpyLHRbNF09bls0XSpyLHRbNV09bls1XSpyLHRbNl09bls2XSpyLHRbN109bls3XSpyLHR9LG4ubGVycD1mdW5jdGlvbih0LG4scixhKXt2YXIgZT0xLWE7ZihuLHIpPDAmJihhPS1hKTtyZXR1cm4gdFswXT1uWzBdKmUrclswXSphLHRbMV09blsxXSplK3JbMV0qYSx0WzJdPW5bMl0qZStyWzJdKmEsdFszXT1uWzNdKmUrclszXSphLHRbNF09bls0XSplK3JbNF0qYSx0WzVdPW5bNV0qZStyWzVdKmEsdFs2XT1uWzZdKmUrcls2XSphLHRbN109bls3XSplK3JbN10qYSx0fSxuLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPWgobik7cmV0dXJuIHRbMF09LW5bMF0vcix0WzFdPS1uWzFdL3IsdFsyXT0tblsyXS9yLHRbM109blszXS9yLHRbNF09LW5bNF0vcix0WzVdPS1uWzVdL3IsdFs2XT0tbls2XS9yLHRbN109bls3XS9yLHR9LG4uY29uanVnYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09LW5bMF0sdFsxXT0tblsxXSx0WzJdPS1uWzJdLHRbM109blszXSx0WzRdPS1uWzRdLHRbNV09LW5bNV0sdFs2XT0tbls2XSx0WzddPW5bN10sdH0sbi5ub3JtYWxpemU9ZnVuY3Rpb24odCxuKXt2YXIgcj1oKG4pO2lmKHI+MCl7cj1NYXRoLnNxcnQocik7dmFyIGE9blswXS9yLGU9blsxXS9yLHU9blsyXS9yLG89blszXS9yLGk9bls0XSxzPW5bNV0sYz1uWzZdLGY9bls3XSxNPWEqaStlKnMrdSpjK28qZjt0WzBdPWEsdFsxXT1lLHRbMl09dSx0WzNdPW8sdFs0XT0oaS1hKk0pL3IsdFs1XT0ocy1lKk0pL3IsdFs2XT0oYy11Kk0pL3IsdFs3XT0oZi1vKk0pL3J9cmV0dXJuIHR9LG4uc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwicXVhdDIoXCIrdFswXStcIiwgXCIrdFsxXStcIiwgXCIrdFsyXStcIiwgXCIrdFszXStcIiwgXCIrdFs0XStcIiwgXCIrdFs1XStcIiwgXCIrdFs2XStcIiwgXCIrdFs3XStcIilcIn0sbi5leGFjdEVxdWFscz1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPT09blswXSYmdFsxXT09PW5bMV0mJnRbMl09PT1uWzJdJiZ0WzNdPT09blszXSYmdFs0XT09PW5bNF0mJnRbNV09PT1uWzVdJiZ0WzZdPT09bls2XSYmdFs3XT09PW5bN119LG4uZXF1YWxzPWZ1bmN0aW9uKHQsbil7dmFyIHI9dFswXSxlPXRbMV0sdT10WzJdLG89dFszXSxpPXRbNF0scz10WzVdLGM9dFs2XSxmPXRbN10sTT1uWzBdLGg9blsxXSxsPW5bMl0sdj1uWzNdLGQ9bls0XSxiPW5bNV0sbT1uWzZdLHA9bls3XTtyZXR1cm4gTWF0aC5hYnMoci1NKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoTSkpJiZNYXRoLmFicyhlLWgpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhlKSxNYXRoLmFicyhoKSkmJk1hdGguYWJzKHUtbCk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHUpLE1hdGguYWJzKGwpKSYmTWF0aC5hYnMoby12KTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnModikpJiZNYXRoLmFicyhpLWQpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhkKSkmJk1hdGguYWJzKHMtYik8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHMpLE1hdGguYWJzKGIpKSYmTWF0aC5hYnMoYy1tKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoYyksTWF0aC5hYnMobSkpJiZNYXRoLmFicyhmLXApPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhmKSxNYXRoLmFicyhwKSl9O3ZhciBhPW8ocigwKSksZT1vKHIoMykpLHU9byhyKDQpKTtmdW5jdGlvbiBvKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbj17fTtpZihudWxsIT10KWZvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiYobltyXT10W3JdKTtyZXR1cm4gbi5kZWZhdWx0PXQsbn1mdW5jdGlvbiBpKHQsbixyKXt2YXIgYT0uNSpyWzBdLGU9LjUqclsxXSx1PS41KnJbMl0sbz1uWzBdLGk9blsxXSxzPW5bMl0sYz1uWzNdO3JldHVybiB0WzBdPW8sdFsxXT1pLHRbMl09cyx0WzNdPWMsdFs0XT1hKmMrZSpzLXUqaSx0WzVdPWUqYyt1Km8tYSpzLHRbNl09dSpjK2EqaS1lKm8sdFs3XT0tYSpvLWUqaS11KnMsdH1mdW5jdGlvbiBzKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdH1uLmdldFJlYWw9ZS5jb3B5O24uc2V0UmVhbD1lLmNvcHk7ZnVuY3Rpb24gYyh0LG4scil7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89blszXSxpPXJbNF0scz1yWzVdLGM9cls2XSxmPXJbN10sTT1uWzRdLGg9bls1XSxsPW5bNl0sdj1uWzddLGQ9clswXSxiPXJbMV0sbT1yWzJdLHA9clszXTtyZXR1cm4gdFswXT1hKnArbypkK2UqbS11KmIsdFsxXT1lKnArbypiK3UqZC1hKm0sdFsyXT11KnArbyptK2EqYi1lKmQsdFszXT1vKnAtYSpkLWUqYi11Km0sdFs0XT1hKmYrbyppK2UqYy11KnMrTSpwK3YqZCtoKm0tbCpiLHRbNV09ZSpmK28qcyt1KmktYSpjK2gqcCt2KmIrbCpkLU0qbSx0WzZdPXUqZitvKmMrYSpzLWUqaStsKnArdiptK00qYi1oKmQsdFs3XT1vKmYtYSppLWUqcy11KmMrdipwLU0qZC1oKmItbCptLHR9bi5tdWw9Yzt2YXIgZj1uLmRvdD1lLmRvdDt2YXIgTT1uLmxlbmd0aD1lLmxlbmd0aCxoPShuLmxlbj1NLG4uc3F1YXJlZExlbmd0aD1lLnNxdWFyZWRMZW5ndGgpO24uc3FyTGVuPWh9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnN1Yj1uLm11bD12b2lkIDAsbi5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYS5BUlJBWV9UWVBFKDYpO2EuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYodFsxXT0wLHRbMl09MCx0WzRdPTAsdFs1XT0wKTtyZXR1cm4gdFswXT0xLHRbM109MSx0fSxuLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBhLkFSUkFZX1RZUEUoNik7cmV0dXJuIG5bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNF0sbls1XT10WzVdLG59LG4uY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdFs0XT1uWzRdLHRbNV09bls1XSx0fSxuLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT0wLHRbNV09MCx0fSxuLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxuLHIsZSx1LG8pe3ZhciBpPW5ldyBhLkFSUkFZX1RZUEUoNik7cmV0dXJuIGlbMF09dCxpWzFdPW4saVsyXT1yLGlbM109ZSxpWzRdPXUsaVs1XT1vLGl9LG4uc2V0PWZ1bmN0aW9uKHQsbixyLGEsZSx1LG8pe3JldHVybiB0WzBdPW4sdFsxXT1yLHRbMl09YSx0WzNdPWUsdFs0XT11LHRbNV09byx0fSxuLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLGU9blsyXSx1PW5bM10sbz1uWzRdLGk9bls1XSxzPXIqdS1hKmU7aWYoIXMpcmV0dXJuIG51bGw7cmV0dXJuIHM9MS9zLHRbMF09dSpzLHRbMV09LWEqcyx0WzJdPS1lKnMsdFszXT1yKnMsdFs0XT0oZSppLXUqbykqcyx0WzVdPShhKm8tcippKSpzLHR9LG4uZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzFdKnRbMl19LG4ubXVsdGlwbHk9ZSxuLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89blszXSxpPW5bNF0scz1uWzVdLGM9TWF0aC5zaW4ociksZj1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1hKmYrdSpjLHRbMV09ZSpmK28qYyx0WzJdPWEqLWMrdSpmLHRbM109ZSotYytvKmYsdFs0XT1pLHRbNV09cyx0fSxuLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9bls0XSxzPW5bNV0sYz1yWzBdLGY9clsxXTtyZXR1cm4gdFswXT1hKmMsdFsxXT1lKmMsdFsyXT11KmYsdFszXT1vKmYsdFs0XT1pLHRbNV09cyx0fSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxlPW5bMV0sdT1uWzJdLG89blszXSxpPW5bNF0scz1uWzVdLGM9clswXSxmPXJbMV07cmV0dXJuIHRbMF09YSx0WzFdPWUsdFsyXT11LHRbM109byx0WzRdPWEqYyt1KmYraSx0WzVdPWUqYytvKmYrcyx0fSxuLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LG4pe3ZhciByPU1hdGguc2luKG4pLGE9TWF0aC5jb3Mobik7cmV0dXJuIHRbMF09YSx0WzFdPXIsdFsyXT0tcix0WzNdPWEsdFs0XT0wLHRbNV09MCx0fSxuLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPTAsdFsyXT0wLHRbM109blsxXSx0WzRdPTAsdFs1XT0wLHR9LG4uZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0WzRdPW5bMF0sdFs1XT1uWzFdLHR9LG4uc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MmQoXCIrdFswXStcIiwgXCIrdFsxXStcIiwgXCIrdFsyXStcIiwgXCIrdFszXStcIiwgXCIrdFs0XStcIiwgXCIrdFs1XStcIilcIn0sbi5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrMSl9LG4uYWRkPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0sdFsxXT1uWzFdK3JbMV0sdFsyXT1uWzJdK3JbMl0sdFszXT1uWzNdK3JbM10sdFs0XT1uWzRdK3JbNF0sdFs1XT1uWzVdK3JbNV0sdH0sbi5zdWJ0cmFjdD11LG4ubXVsdGlwbHlTY2FsYXI9ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPW5bMF0qcix0WzFdPW5bMV0qcix0WzJdPW5bMl0qcix0WzNdPW5bM10qcix0WzRdPW5bNF0qcix0WzVdPW5bNV0qcix0fSxuLm11bHRpcGx5U2NhbGFyQW5kQWRkPWZ1bmN0aW9uKHQsbixyLGEpe3JldHVybiB0WzBdPW5bMF0rclswXSphLHRbMV09blsxXStyWzFdKmEsdFsyXT1uWzJdK3JbMl0qYSx0WzNdPW5bM10rclszXSphLHRbNF09bls0XStyWzRdKmEsdFs1XT1uWzVdK3JbNV0qYSx0fSxuLmV4YWN0RXF1YWxzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09PT1uWzBdJiZ0WzFdPT09blsxXSYmdFsyXT09PW5bMl0mJnRbM109PT1uWzNdJiZ0WzRdPT09bls0XSYmdFs1XT09PW5bNV19LG4uZXF1YWxzPWZ1bmN0aW9uKHQsbil7dmFyIHI9dFswXSxlPXRbMV0sdT10WzJdLG89dFszXSxpPXRbNF0scz10WzVdLGM9blswXSxmPW5bMV0sTT1uWzJdLGg9blszXSxsPW5bNF0sdj1uWzVdO3JldHVybiBNYXRoLmFicyhyLWMpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhyKSxNYXRoLmFicyhjKSkmJk1hdGguYWJzKGUtZik8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGUpLE1hdGguYWJzKGYpKSYmTWF0aC5hYnModS1NKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMoTSkpJiZNYXRoLmFicyhvLWgpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhvKSxNYXRoLmFicyhoKSkmJk1hdGguYWJzKGktbCk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGkpLE1hdGguYWJzKGwpKSYmTWF0aC5hYnMocy12KTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMocyksTWF0aC5hYnModikpfTt2YXIgYT1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIG49e307aWYobnVsbCE9dClmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG4uZGVmYXVsdD10LG59KHIoMCkpO2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT1uWzRdLHM9bls1XSxjPXJbMF0sZj1yWzFdLE09clsyXSxoPXJbM10sbD1yWzRdLHY9cls1XTtyZXR1cm4gdFswXT1hKmMrdSpmLHRbMV09ZSpjK28qZix0WzJdPWEqTSt1KmgsdFszXT1lKk0rbypoLHRbNF09YSpsK3UqditpLHRbNV09ZSpsK28qditzLHR9ZnVuY3Rpb24gdSh0LG4scil7cmV0dXJuIHRbMF09blswXS1yWzBdLHRbMV09blsxXS1yWzFdLHRbMl09blsyXS1yWzJdLHRbM109blszXS1yWzNdLHRbNF09bls0XS1yWzRdLHRbNV09bls1XS1yWzVdLHR9bi5tdWw9ZSxuLnN1Yj11fSxmdW5jdGlvbih0LG4scil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksbi5zdWI9bi5tdWw9dm9pZCAwLG4uY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGEuQVJSQVlfVFlQRSg0KTthLkFSUkFZX1RZUEUhPUZsb2F0MzJBcnJheSYmKHRbMV09MCx0WzJdPTApO3JldHVybiB0WzBdPTEsdFszXT0xLHR9LG4uY2xvbmU9ZnVuY3Rpb24odCl7dmFyIG49bmV3IGEuQVJSQVlfVFlQRSg0KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG59LG4uY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdH0sbi5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHR9LG4uZnJvbVZhbHVlcz1mdW5jdGlvbih0LG4scixlKXt2YXIgdT1uZXcgYS5BUlJBWV9UWVBFKDQpO3JldHVybiB1WzBdPXQsdVsxXT1uLHVbMl09cix1WzNdPWUsdX0sbi5zZXQ9ZnVuY3Rpb24odCxuLHIsYSxlKXtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPWEsdFszXT1lLHR9LG4udHJhbnNwb3NlPWZ1bmN0aW9uKHQsbil7aWYodD09PW4pe3ZhciByPW5bMV07dFsxXT1uWzJdLHRbMl09cn1lbHNlIHRbMF09blswXSx0WzFdPW5bMl0sdFsyXT1uWzFdLHRbM109blszXTtyZXR1cm4gdH0sbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxlPW5bMl0sdT1uWzNdLG89cip1LWUqYTtpZighbylyZXR1cm4gbnVsbDtyZXR1cm4gbz0xL28sdFswXT11Km8sdFsxXT0tYSpvLHRbMl09LWUqbyx0WzNdPXIqbyx0fSxuLmFkam9pbnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdO3JldHVybiB0WzBdPW5bM10sdFsxXT0tblsxXSx0WzJdPS1uWzJdLHRbM109cix0fSxuLmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdKnRbM10tdFsyXSp0WzFdfSxuLm11bHRpcGx5PWUsbi5yb3RhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT1NYXRoLnNpbihyKSxzPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWEqcyt1KmksdFsxXT1lKnMrbyppLHRbMl09YSotaSt1KnMsdFszXT1lKi1pK28qcyx0fSxuLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLGU9blsxXSx1PW5bMl0sbz1uWzNdLGk9clswXSxzPXJbMV07cmV0dXJuIHRbMF09YSppLHRbMV09ZSppLHRbMl09dSpzLHRbM109bypzLHR9LG4uZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPS1yLHRbM109YSx0fSxuLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPTAsdFsyXT0wLHRbM109blsxXSx0fSxuLnN0cj1mdW5jdGlvbih0KXtyZXR1cm5cIm1hdDIoXCIrdFswXStcIiwgXCIrdFsxXStcIiwgXCIrdFsyXStcIiwgXCIrdFszXStcIilcIn0sbi5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKSl9LG4uTERVPWZ1bmN0aW9uKHQsbixyLGEpe3JldHVybiB0WzJdPWFbMl0vYVswXSxyWzBdPWFbMF0sclsxXT1hWzFdLHJbM109YVszXS10WzJdKnJbMV0sW3QsbixyXX0sbi5hZGQ9ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0WzBdPW5bMF0rclswXSx0WzFdPW5bMV0rclsxXSx0WzJdPW5bMl0rclsyXSx0WzNdPW5bM10rclszXSx0fSxuLnN1YnRyYWN0PXUsbi5leGFjdEVxdWFscz1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPT09blswXSYmdFsxXT09PW5bMV0mJnRbMl09PT1uWzJdJiZ0WzNdPT09blszXX0sbi5lcXVhbHM9ZnVuY3Rpb24odCxuKXt2YXIgcj10WzBdLGU9dFsxXSx1PXRbMl0sbz10WzNdLGk9blswXSxzPW5bMV0sYz1uWzJdLGY9blszXTtyZXR1cm4gTWF0aC5hYnMoci1pKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoaSkpJiZNYXRoLmFicyhlLXMpPD1hLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhlKSxNYXRoLmFicyhzKSkmJk1hdGguYWJzKHUtYyk8PWEuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHUpLE1hdGguYWJzKGMpKSYmTWF0aC5hYnMoby1mKTw9YS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoZikpfSxuLm11bHRpcGx5U2NhbGFyPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFswXT1uWzBdKnIsdFsxXT1uWzFdKnIsdFsyXT1uWzJdKnIsdFszXT1uWzNdKnIsdH0sbi5tdWx0aXBseVNjYWxhckFuZEFkZD1mdW5jdGlvbih0LG4scixhKXtyZXR1cm4gdFswXT1uWzBdK3JbMF0qYSx0WzFdPW5bMV0rclsxXSphLHRbMl09blsyXStyWzJdKmEsdFszXT1uWzNdK3JbM10qYSx0fTt2YXIgYT1mdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIG49e307aWYobnVsbCE9dClmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG4uZGVmYXVsdD10LG59KHIoMCkpO2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBhPW5bMF0sZT1uWzFdLHU9blsyXSxvPW5bM10saT1yWzBdLHM9clsxXSxjPXJbMl0sZj1yWzNdO3JldHVybiB0WzBdPWEqaSt1KnMsdFsxXT1lKmkrbypzLHRbMl09YSpjK3UqZix0WzNdPWUqYytvKmYsdH1mdW5jdGlvbiB1KHQsbixyKXtyZXR1cm4gdFswXT1uWzBdLXJbMF0sdFsxXT1uWzFdLXJbMV0sdFsyXT1uWzJdLXJbMl0sdFszXT1uWzNdLXJbM10sdH1uLm11bD1lLG4uc3ViPXV9LGZ1bmN0aW9uKHQsbixyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxuLnZlYzQ9bi52ZWMzPW4udmVjMj1uLnF1YXQyPW4ucXVhdD1uLm1hdDQ9bi5tYXQzPW4ubWF0MmQ9bi5tYXQyPW4uZ2xNYXRyaXg9dm9pZCAwO3ZhciBhPWwocigwKSksZT1sKHIoOSkpLHU9bChyKDgpKSxvPWwocig1KSksaT1sKHIoNCkpLHM9bChyKDMpKSxjPWwocig3KSksZj1sKHIoNikpLE09bChyKDIpKSxoPWwocigxKSk7ZnVuY3Rpb24gbCh0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIG49e307aWYobnVsbCE9dClmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG4uZGVmYXVsdD10LG59bi5nbE1hdHJpeD1hLG4ubWF0Mj1lLG4ubWF0MmQ9dSxuLm1hdDM9byxuLm1hdDQ9aSxuLnF1YXQ9cyxuLnF1YXQyPWMsbi52ZWMyPWYsbi52ZWMzPU0sbi52ZWM0PWh9XSl9KTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9+L2dsLW1hdHJpeC9kaXN0L2dsLW1hdHJpeC5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 2 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.MAXY = exports.MAXX = exports.MINY = exports.MINX = undefined;\nexports.set = set;\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.initEmpty = initEmpty;\nexports.initInfinity = initInfinity;\nexports.initSizeFromOrigin = initSizeFromOrigin;\nexports.initSizeFromLocation = initSizeFromLocation;\nexports.initCenterExtents = initCenterExtents;\nexports.isEmpty = isEmpty;\nexports.isInfinite = isInfinite;\nexports.equals = equals;\nexports.getSize = getSize;\nexports.getExtents = getExtents;\nexports.getCenter = getCenter;\nexports.expand = expand;\nexports.area = area;\nexports.hull = hull;\nexports.intersection = intersection;\nexports.overlaps = overlaps;\nexports.contains = contains;\nexports.containsPt = containsPt;\nexports.encapsulatePt = encapsulatePt;\nexports.translate = translate;\nexports.transformMat2 = transformMat2;\nexports.transformMat2d = transformMat2d;\n\nvar _glMatrix = __webpack_require__(1);\n\nvar MINX = exports.MINX = 0;\nvar MINY = exports.MINY = 1;\nvar MAXX = exports.MAXX = 2;\nvar MAXY = exports.MAXY = 3;\n\nvar Constants = {\n BOX_SIDES: 4\n};\n\n/**\n * Sets the boundaries of an existing 2d axis-aligned bounding box\n * If arguments are not supplied, the aabox is initialized as empty.\n * @param {AABox2d} out AAbox2d to set\n * @param {Number} [minx = Infinity] Minimum x-axis value\n * @param {Number} [miny = Infinity] Minimum y-axis value\n * @param {Number} [maxx = -Infinity] Maximum x-axis value\n * @param {Number} [maxy = -Infinity] Maximum y-axis value\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction set(out, minx, miny, maxx, maxy) {\n out[MINX] = typeof minx === \"number\" ? minx : Infinity;\n out[MINY] = typeof miny === \"number\" ? miny : Infinity;\n out[MAXX] = typeof maxx === \"number\" ? maxx : -Infinity;\n out[MAXY] = typeof maxy === \"number\" ? maxy : -Infinity;\n return out;\n}\n\n/**\n * Creates a new 2d axis-aligned bounding box object\n * with optional boundaries. If boundaries are not supplied,\n * the aabox is initialized as empty.\n * @param {Number} [minx = Infinity] Minimum x-axis value\n * @param {Number} [miny = Infinity] Minimum y-axis value\n * @param {Number} [maxx = -Infinity] Maximum x-axis value\n * @param {Number} [maxy = -Infinity] Maximum y-axis value\n * @return {AABox2d} New AABox2d object\n */\nfunction create(minx, miny, maxx, maxy) {\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(Constants.BOX_SIDES);\n return set(out, minx, miny, maxx, maxy);\n}\n\n/**\n * Creates a new 2d axis-aligned bounding box with boundaries copied\n * from an existing aabox.\n * @param {AABox2d} box existing bounds to copy boundaries from\n * @return {AABox2d} new AABox2d object\n */\nfunction clone(box) {\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(Constants.BOX_SIDES);\n out[MINX] = box[MINX];\n out[MINY] = box[MINY];\n out[MAXX] = box[MAXX];\n out[MAXY] = box[MAXY];\n return out;\n}\n\n/**\n * Copies the boundaries from one existing aabox to another.\n * @param {AABox2d} out bounds to copy to\n * @param {AABox2d} box bounds to copy from\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction copy(out, box) {\n out[MINX] = box[MINX];\n out[MINY] = box[MINY];\n out[MAXX] = box[MAXX];\n out[MAXY] = box[MAXY];\n return out;\n}\n\n/**\n * Re-initializes an existing aabox as empty.\n * An aabox is empty if the minimum value in either of\n * its dimensions exceeds its respective max value.\n * In this case, the minumums will be set to +Infinity\n * and the maximums to -Infinity\n * @param {AABox2d} out existing bounds to re-initialize as empty\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initEmpty(out) {\n out[MINX] = Infinity;\n out[MINY] = Infinity;\n out[MAXX] = -Infinity;\n out[MAXY] = -Infinity;\n return out;\n}\n\n/**\n * Re-initializes an existing aabox to infinity, ultimately encompassing\n * all numeric values.\n * @param {AABox2d} out existing bounds to initialize to infinity\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initInfinity(out) {\n out[MINX] = -Infinity;\n out[MINY] = -Infinity;\n out[MAXX] = Infinity;\n out[MAXY] = Infinity;\n return out;\n}\n\n/**\n * Initializes an existing aabox with its top-left corner set to be the origin ([0, 0]),\n * an extends outwards in each dimension by its respective size.\n * minx: 0\n * miny: 0\n * maxx: sizes[x]\n * maxy: sizes[y]\n * @param {AABox2d} out existing bounds to re-initialize\n * @param {Vec2d} sizes new width/height of the bounds\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initSizeFromOrigin(out, sizes) {\n if (sizes[0] < 0) {\n out[MINX] = -sizes[0];\n out[MAXX] = 0;\n } else {\n out[MINX] = 0;\n out[MAXX] = sizes[0];\n }\n if (sizes[1] < 0) {\n out[MINY] = -sizes[1];\n out[MAXY] = 0;\n } else {\n out[MINY] = 0;\n out[MAXY] = sizes[1];\n }\n return out;\n}\n\n/**\n * Initializes an existing aabox with its top-left corner set to be an existing pt and with\n * bounds extending outwards in each dimension by its respective size.\n * minx: pt[x]\n * miny: pt[y]\n * maxx: pt[x] + sizes[x]\n * maxy: pt[y] + sizes[y]\n * @param {AABox2d} out existing bounds to re-initialize\n * @param {Point2d} pt new position of the top-left corner of the bounds\n * @param {Vec2d} sizes new width/height of the bounds\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initSizeFromLocation(out, pt, sizes) {\n for (var i = 0; i < 2; i += 1) {\n if (sizes[i] < 0) {\n out[i] = pt[i] - sizes[i];\n out[i + 2] = pt[i];\n } else {\n out[i] = pt[i];\n out[i + 2] = pt[i] + sizes[i];\n }\n }\n return out;\n}\n\n/**\n * Initializes an existing aabox with its center set to a specific pt and with bounds\n * extending outward in each dimension so that the aabox's width and height are a\n * specific size\n * @param {AABox2d} out existing bounds to re-initialize\n * @param {Point2d} center new center of the bounds\n * @param {Vec2d} sizes new width/height of the bounds\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initCenterExtents(out, center, sizes) {\n for (var i = 0; i < 2; i += 1) {\n if (sizes[i] < 0) {\n out[i] = center[i] + sizes[i];\n out[i + 2] = center[i] - sizes[i];\n } else {\n out[i] = center[i] - sizes[i];\n out[i + 2] = center[i] + sizes[i];\n }\n }\n return out;\n}\n\n/**\n * Returns true if the aabox is empty\n * @param {AABox2d} box\n * @return {Boolean} true if box is empty, false otherwise\n */\nfunction isEmpty(box) {\n return box[MINX] > box[MAXX] || box[MINY] > box[MAXY];\n}\n\n/**\n * Returns true if an aabox is infinite in either dimension\n * @param {AABox2d} box Existing aabox to check\n * @return {Boolean} True if box extends to +/- inifinity in either dimension, false otherwise\n */\nfunction isInfinite(box) {\n return !isFinite(box[MINX]) || !isFinite(box[MINY]) || !isFinite(box[MAXX]) || !isFinite(box[MAXY]);\n}\n\n/**\n * Returns true if one aabox approximately equals another\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {Boolean} true if a ~= b\n */\nfunction equals(a, b) {\n var a0 = a[0];\n var a1 = a[1];\n var a2 = a[2];\n var a3 = a[3];\n var b0 = b[0];\n var b1 = b[1];\n var b2 = b[2];\n var b3 = b[3];\n return Math.abs(a0 - b0) <= _glMatrix.glMatrix.EPSILON && Math.abs(a1 - b1) <= _glMatrix.glMatrix.EPSILON && Math.abs(a2 - b2) <= _glMatrix.glMatrix.EPSILON && Math.abs(a3 - b3) <= _glMatrix.glMatrix.EPSILON;\n}\n\n/**\n * Returns the width/height of an existing aabox\n * @param {Vec2d} out 2d vector to store the width/height of an existing aabox\n * @param {AABox2d} box bounds to extract the width/height from\n * @return {Vec2d} vector referenced by the out arg\n */\nfunction getSize(out, box) {\n return _glMatrix.vec2.set(out, box[MAXX] - box[MINX], box[MAXY] - box[MINY]);\n}\n\n/**\n * Returns the extents of an existing aabox.\n * Extents is the size of a bounds in each dimension starting at the center\n * of the bounds. (i.e. extents = [width / 2, height / 2])\n * @param {Vec2d} out 2d vector to store the extents of an existing aabox\n * @param {AABox2d} box bounds to extract the extents from\n * @return {Vec2d} vector referenced by the out arg\n */\nfunction getExtents(out, box) {\n getSize(out, box);\n return _glMatrix.vec2.scale(out, out, 0.5); // eslint-disable-line no-magic-numbers\n}\n\n/**\n * Returns the center of an existing aabox\n * @param {Point2d} out point to store the center of an existing bounds\n * @param {AABox2d} box bounds to extract the center from\n * @return {Point2d} point referenced by the out arg\n */\nfunction getCenter(out, box) {\n getExtents(out, box);\n out[MINX] += box[MINX];\n out[MINY] += box[MINY];\n return out;\n}\n\n/**\n * Expands an existing aabox by a specified size in each dimension.\n * @param {AABox2d} out bounds to store the resulting operation in\n * @param {AABox2d} box starting bounds to expand\n * @param {Vec2d} expandSize size to expand in each dimension\n * @return {AABox2d} bounds referenced by the out arg\n */\nfunction expand(out, box, expandSize) {\n out[MINX] = box[MINX] - expandSize[0];\n out[MAXX] = box[MAXX] + expandSize[0];\n out[MINY] = box[MINY] - expandSize[1];\n out[MAXY] = box[MAXY] + expandSize[1];\n}\n\n/**\n * Computes the area of an existing aabox\n * @param {AABox2d} box\n * @return {Number} area of the bounds\n */\nfunction area(box) {\n return (box[MAXX] - box[MINX]) * (box[MAXY] - box[MINY]);\n}\n\n/**\n * Calculates the hull of two aaboxes. The hull is the smallest bounds that contains\n * both of the aaboxes\n * @param {AABox2d} out bounds to store the resulting operation in\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction hull(out, a, b) {\n return create(Math.min(a[MINX], b[MINX]), Math.min(a[MINY], b[MINY]), Math.max(a[MAXX], b[MAXX]), Math.max(a[MAXY], b[MAXY]));\n}\n\n/**\n * Calculates the intersection of two existing bounds.\n * @param {AABox2d} out bounds to store the resulting operation in\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction intersection(out, a, b) {\n var boxToUse = out;\n if (out === a) {\n boxToUse = create();\n }\n\n var minindex = MINX;\n var maxindex = MAXX;\n for (; minindex <= MINY; minindex += 1, maxindex += 1) {\n if (a[maxindex] < b[minindex] || a[minindex] > b[maxindex]) {\n break;\n }\n\n boxToUse[minindex] = Math.max(a[minindex], b[minindex]);\n boxToUse[maxindex] = Math.min(a[maxindex], b[maxindex]);\n }\n\n if (minindex !== MINY + 1) {\n initEmpty(boxToUse);\n }\n\n if (out === a) {\n copy(out, boxToUse);\n }\n\n return out;\n}\n\n/**\n * Returns true if one bounds overlaps another in any way (non-inclusive).\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {Boolean} Returns true if a overlaps b, false otherwise\n */\nfunction overlaps(a, b) {\n return !(a[MAXX] <= b[MINX] || a[MINX] >= b[MAXX] || a[MAXY] <= b[MINY] || a[MINY] >= b[MAXY]);\n}\n\n/**\n * Returns true if one bounds full contains another (inclusive).\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {Boolean} true if a fully contains b.\n */\nfunction contains(a, b) {\n return !(b[MINX] < a[MINX] || b[MAXX] > a[MAXX] || b[MINY] < a[MINY] || b[MAXY] > a[MAXY]);\n}\n\n/**\n * Returns true if an existing bounds contains a specific point (inclusive)\n * @param {AABox2d} box\n * @param {Point2d} pt\n * @return {Boolean} Returns true if pt is inside of box, false otherwise\n */\nfunction containsPt(box, pt) {\n return pt[MINX] >= box[MINX] && pt[MINX] <= box[MAXX] && pt[MINY] >= box[MINY] && pt[MINY] <= box[MAXY];\n}\n\n/**\n * Extends an existing bounds so that it would contain a specific point\n * @param {AABox2d} out Bounds containing the operation result\n * @param {AABox2d} box Starting bounds to possibly extend\n * @param {Point2d} pt Point to encapsulate in box\n * @return {AAbox2d} bounds referenced by out arg\n */\nfunction encapsulatePt(out, box, pt) {\n if (out !== box) {\n copy(out, box);\n }\n if (isEmpty(box)) {\n out[MINX] = pt[MINX];\n out[MAXX] = pt[MINX];\n out[MINY] = pt[MINY];\n out[MAXY] = pt[MINY];\n } else {\n if (pt[MINX] < out[MINX]) {\n out[MINX] = pt[MINX];\n } else if (pt[MINX] > out[MAXX]) {\n out[MAXX] = pt[MINX];\n }\n\n if (pt[MINY] < out[MINY]) {\n out[MINY] = pt[MINY];\n } else if (pt[MINY] > out[MAXY]) {\n out[MAXY] = pt[MINY];\n }\n }\n return out;\n}\n\n/**\n * Translates an existing bounds by a specified offset it each dimension\n * @param {AABox2d} out bounds resulting from the operation\n * @param {AABox2d} box starting bounds\n * @param {Vec2d} pos translation in each dimension\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction translate(out, box, pos) {\n out[MINX] = box[MINX] + pos[0];\n out[MINY] = box[MINY] + pos[1];\n out[MAXX] = box[MAXX] + pos[0];\n out[MAXY] = box[MAXY] + pos[1];\n}\n\nfunction transform(out, box, mat, xformFunc) {\n var boxToUse = out;\n if (out === box) {\n boxToUse = create();\n }\n initEmpty(boxToUse);\n\n var pt1 = _glMatrix.vec2.set(_glMatrix.vec2.create(), box[MINX], box[MINY]);\n var pt2 = _glMatrix.vec2.create();\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n pt1[MINX] = box[MAXX];\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n pt1[MINY] = box[MAXY];\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n pt1[MINX] = box[MINX];\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n if (out === box) {\n copy(out, boxToUse);\n }\n return out;\n}\n\n/**\n * Transforms an existing bounds by a 2x2 matrix\n * @param {AABox2d} out bounds to contain the operation result\n * @param {AABox2d} box bounds to transform\n * @param {Mat2} mat 2x2 matrix transformation\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction transformMat2(out, box, mat) {\n return transform(out, box, mat, _glMatrix.vec2.transformMat2);\n}\n\n/**\n * Transforms an existing bounds by a 2x3 matrix.\n * A 2x3 matrix is a 2x2 matrix with a translation component.\n * @param {AABox2d} out bounds to hold the operation result\n * @param {AABox2d} box bounds to transform\n * @param {Mat2d} mat 2x3 matrix\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction transformMat2d(out, box, mat) {\n return transform(out, box, mat, _glMatrix.vec2.transformMat2d);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL2FhYm94MmQuanM/MDZlMCJdLCJuYW1lcyI6WyJzZXQiLCJjcmVhdGUiLCJjbG9uZSIsImNvcHkiLCJpbml0RW1wdHkiLCJpbml0SW5maW5pdHkiLCJpbml0U2l6ZUZyb21PcmlnaW4iLCJpbml0U2l6ZUZyb21Mb2NhdGlvbiIsImluaXRDZW50ZXJFeHRlbnRzIiwiaXNFbXB0eSIsImlzSW5maW5pdGUiLCJlcXVhbHMiLCJnZXRTaXplIiwiZ2V0RXh0ZW50cyIsImdldENlbnRlciIsImV4cGFuZCIsImFyZWEiLCJodWxsIiwiaW50ZXJzZWN0aW9uIiwib3ZlcmxhcHMiLCJjb250YWlucyIsImNvbnRhaW5zUHQiLCJlbmNhcHN1bGF0ZVB0IiwidHJhbnNsYXRlIiwidHJhbnNmb3JtTWF0MiIsInRyYW5zZm9ybU1hdDJkIiwiTUlOWCIsIk1JTlkiLCJNQVhYIiwiTUFYWSIsIkNvbnN0YW50cyIsIkJPWF9TSURFUyIsIm91dCIsIm1pbngiLCJtaW55IiwibWF4eCIsIm1heHkiLCJJbmZpbml0eSIsIkFSUkFZX1RZUEUiLCJib3giLCJzaXplcyIsInB0IiwiaSIsImNlbnRlciIsImlzRmluaXRlIiwiYSIsImIiLCJhMCIsImExIiwiYTIiLCJhMyIsImIwIiwiYjEiLCJiMiIsImIzIiwiTWF0aCIsImFicyIsIkVQU0lMT04iLCJzY2FsZSIsImV4cGFuZFNpemUiLCJtaW4iLCJtYXgiLCJib3hUb1VzZSIsIm1pbmluZGV4IiwibWF4aW5kZXgiLCJwb3MiLCJ0cmFuc2Zvcm0iLCJtYXQiLCJ4Zm9ybUZ1bmMiLCJwdDEiLCJwdDIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7UUF1QmdCQSxHLEdBQUFBLEc7UUFrQkFDLE0sR0FBQUEsTTtRQVdBQyxLLEdBQUFBLEs7UUFlQUMsSSxHQUFBQSxJO1FBaUJBQyxTLEdBQUFBLFM7UUFjQUMsWSxHQUFBQSxZO1FBbUJBQyxrQixHQUFBQSxrQjtRQThCQUMsb0IsR0FBQUEsb0I7UUFzQkFDLGlC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QUFaLEVBQWlCO0FBQ2ZwQyxTQUFLNkIsR0FBTCxFQUFVOEIsUUFBVjtBQUNEO0FBQ0QsU0FBTzlCLEdBQVA7QUFDRDs7QUFFRDs7Ozs7OztBQU9PLFNBQVNSLGFBQVQsQ0FBdUJRLEdBQXZCLEVBQTRCTyxHQUE1QixFQUFpQzRCLEdBQWpDLEVBQXNDO0FBQzNDLFNBQU9ELFVBQVVsQyxHQUFWLEVBQWVPLEdBQWYsRUFBb0I0QixHQUFwQixFQUF5QixlQUFNM0MsYUFBL0IsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFPLFNBQVNDLGNBQVQsQ0FBd0JPLEdBQXhCLEVBQTZCTyxHQUE3QixFQUFrQzRCLEdBQWxDLEVBQXVDO0FBQzVDLFNBQU9ELFVBQVVsQyxHQUFWLEVBQWVPLEdBQWYsRUFBb0I0QixHQUFwQixFQUF5QixlQUFNMUMsY0FBL0IsQ0FBUDtBQUNEIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQge2dsTWF0cml4LCB2ZWMyIGFzIFZlYzJkfSBmcm9tIFwiZ2wtbWF0cml4XCJcblxuZXhwb3J0IGNvbnN0IE1JTlggPSAwXG5leHBvcnQgY29uc3QgTUlOWSA9IDFcbmV4cG9ydCBjb25zdCBNQVhYID0gMlxuZXhwb3J0IGNvbnN0IE1BWFkgPSAzXG5cbmNvbnN0IENvbnN0YW50cyA9IHtcbiAgQk9YX1NJREVTOiA0XG59XG5cbi8qKlxuICogU2V0cyB0aGUgYm91bmRhcmllcyBvZiBhbiBleGlzdGluZyAyZCBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94XG4gKiBJZiBhcmd1bWVudHMgYXJlIG5vdCBzdXBwbGllZCwgdGhlIGFhYm94IGlzIGluaXRpYWxpemVkIGFzIGVtcHR5LlxuICogQHBhcmFtIHtBQUJveDJkfSBvdXQgIEFBYm94MmQgdG8gc2V0XG4gKiBAcGFyYW0ge051bWJlcn0gW21pbnggPSBJbmZpbml0eV0gTWluaW11bSB4LWF4aXMgdmFsdWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWlueSA9IEluZmluaXR5XSBNaW5pbXVtIHktYXhpcyB2YWx1ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFttYXh4ID0gLUluZmluaXR5XSBNYXhpbXVtIHgtYXhpcyB2YWx1ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFttYXh5ID0gLUluZmluaXR5XSBNYXhpbXVtIHktYXhpcyB2YWx1ZVxuICogQHJldHVybiB7QUFCb3gyZH0gICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbWlueCwgbWlueSwgbWF4eCwgbWF4eSkge1xuICBvdXRbTUlOWF0gPSB0eXBlb2YgbWlueCA9PT0gXCJudW1iZXJcIiA/IG1pbnggOiBJbmZpbml0eVxuICBvdXRbTUlOWV0gPSB0eXBlb2YgbWlueSA9PT0gXCJudW1iZXJcIiA/IG1pbnkgOiBJbmZpbml0eVxuICBvdXRbTUFYWF0gPSB0eXBlb2YgbWF4eCA9PT0gXCJudW1iZXJcIiA/IG1heHggOiAtSW5maW5pdHlcbiAgb3V0W01BWFldID0gdHlwZW9mIG1heHkgPT09IFwibnVtYmVyXCIgPyBtYXh5IDogLUluZmluaXR5XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IDJkIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2JqZWN0XG4gKiB3aXRoIG9wdGlvbmFsIGJvdW5kYXJpZXMuIElmIGJvdW5kYXJpZXMgYXJlIG5vdCBzdXBwbGllZCxcbiAqIHRoZSBhYWJveCBpcyBpbml0aWFsaXplZCBhcyBlbXB0eS5cbiAqIEBwYXJhbSAge051bWJlcn0gW21pbnggPSBJbmZpbml0eV0gTWluaW11bSB4LWF4aXMgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gW21pbnkgPSBJbmZpbml0eV0gTWluaW11bSB5LWF4aXMgdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gW21heHggPSAtSW5maW5pdHldIE1heGltdW0geC1heGlzIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFttYXh5ID0gLUluZmluaXR5XSBNYXhpbXVtIHktYXhpcyB2YWx1ZVxuICogQHJldHVybiB7QUFCb3gyZH0gICAgICBOZXcgQUFCb3gyZCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShtaW54LCBtaW55LCBtYXh4LCBtYXh5KSB7XG4gIGNvbnN0IG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKENvbnN0YW50cy5CT1hfU0lERVMpXG4gIHJldHVybiBzZXQob3V0LCBtaW54LCBtaW55LCBtYXh4LCBtYXh5KVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgMmQgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCB3aXRoIGJvdW5kYXJpZXMgY29waWVkXG4gKiBmcm9tIGFuIGV4aXN0aW5nIGFhYm94LlxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IGV4aXN0aW5nIGJvdW5kcyB0byBjb3B5IGJvdW5kYXJpZXMgZnJvbVxuICogQHJldHVybiB7QUFCb3gyZH0gICAgIG5ldyBBQUJveDJkIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYm94KSB7XG4gIGNvbnN0IG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKENvbnN0YW50cy5CT1hfU0lERVMpXG4gIG91dFtNSU5YXSA9IGJveFtNSU5YXVxuICBvdXRbTUlOWV0gPSBib3hbTUlOWV1cbiAgb3V0W01BWFhdID0gYm94W01BWFhdXG4gIG91dFtNQVhZXSA9IGJveFtNQVhZXVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBib3VuZGFyaWVzIGZyb20gb25lIGV4aXN0aW5nIGFhYm94IHRvIGFub3RoZXIuXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgYm91bmRzIHRvIGNvcHkgdG9cbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCBib3VuZHMgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGJveCkge1xuICBvdXRbTUlOWF0gPSBib3hbTUlOWF1cbiAgb3V0W01JTlldID0gYm94W01JTlldXG4gIG91dFtNQVhYXSA9IGJveFtNQVhYXVxuICBvdXRbTUFYWV0gPSBib3hbTUFYWV1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFJlLWluaXRpYWxpemVzIGFuIGV4aXN0aW5nIGFhYm94IGFzIGVtcHR5LlxuICogQW4gYWFib3ggaXMgZW1wdHkgaWYgdGhlIG1pbmltdW0gdmFsdWUgaW4gZWl0aGVyIG9mXG4gKiBpdHMgZGltZW5zaW9ucyBleGNlZWRzIGl0cyByZXNwZWN0aXZlIG1heCB2YWx1ZS5cbiAqIEluIHRoaXMgY2FzZSwgdGhlIG1pbnVtdW1zIHdpbGwgYmUgc2V0IHRvICtJbmZpbml0eVxuICogYW5kIHRoZSBtYXhpbXVtcyB0byAtSW5maW5pdHlcbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCBleGlzdGluZyBib3VuZHMgdG8gcmUtaW5pdGlhbGl6ZSBhcyBlbXB0eVxuICogQHJldHVybiB7QUFCb3gyZH0gICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRFbXB0eShvdXQpIHtcbiAgb3V0W01JTlhdID0gSW5maW5pdHlcbiAgb3V0W01JTlldID0gSW5maW5pdHlcbiAgb3V0W01BWFhdID0gLUluZmluaXR5XG4gIG91dFtNQVhZXSA9IC1JbmZpbml0eVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogUmUtaW5pdGlhbGl6ZXMgYW4gZXhpc3RpbmcgYWFib3ggdG8gaW5maW5pdHksIHVsdGltYXRlbHkgZW5jb21wYXNzaW5nXG4gKiBhbGwgbnVtZXJpYyB2YWx1ZXMuXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgZXhpc3RpbmcgYm91bmRzIHRvIGluaXRpYWxpemUgdG8gaW5maW5pdHlcbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW5maW5pdHkob3V0KSB7XG4gIG91dFtNSU5YXSA9IC1JbmZpbml0eVxuICBvdXRbTUlOWV0gPSAtSW5maW5pdHlcbiAgb3V0W01BWFhdID0gSW5maW5pdHlcbiAgb3V0W01BWFldID0gSW5maW5pdHlcbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIGV4aXN0aW5nIGFhYm94IHdpdGggaXRzIHRvcC1sZWZ0IGNvcm5lciBzZXQgdG8gYmUgdGhlIG9yaWdpbiAoWzAsIDBdKSxcbiAqIGFuIGV4dGVuZHMgb3V0d2FyZHMgaW4gZWFjaCBkaW1lbnNpb24gYnkgaXRzIHJlc3BlY3RpdmUgc2l6ZS5cbiAqICAgbWlueDogMFxuICogICBtaW55OiAwXG4gKiAgIG1heHg6IHNpemVzW3hdXG4gKiAgIG1heHk6IHNpemVzW3ldXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgICBleGlzdGluZyBib3VuZHMgdG8gcmUtaW5pdGlhbGl6ZVxuICogQHBhcmFtICB7VmVjMmR9IHNpemVzICAgbmV3IHdpZHRoL2hlaWdodCBvZiB0aGUgYm91bmRzXG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2l6ZUZyb21PcmlnaW4ob3V0LCBzaXplcykge1xuICBpZiAoc2l6ZXNbMF0gPCAwKSB7XG4gICAgb3V0W01JTlhdID0gLXNpemVzWzBdXG4gICAgb3V0W01BWFhdID0gMFxuICB9IGVsc2Uge1xuICAgIG91dFtNSU5YXSA9IDBcbiAgICBvdXRbTUFYWF0gPSBzaXplc1swXVxuICB9XG4gIGlmIChzaXplc1sxXSA8IDApIHtcbiAgICBvdXRbTUlOWV0gPSAtc2l6ZXNbMV1cbiAgICBvdXRbTUFYWV0gPSAwXG4gIH0gZWxzZSB7XG4gICAgb3V0W01JTlldID0gMFxuICAgIG91dFtNQVhZXSA9IHNpemVzWzFdXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIGV4aXN0aW5nIGFhYm94IHdpdGggaXRzIHRvcC1sZWZ0IGNvcm5lciBzZXQgdG8gYmUgYW4gZXhpc3RpbmcgcHQgYW5kIHdpdGhcbiAqIGJvdW5kcyBleHRlbmRpbmcgb3V0d2FyZHMgaW4gZWFjaCBkaW1lbnNpb24gYnkgaXRzIHJlc3BlY3RpdmUgc2l6ZS5cbiAqICAgbWlueDogcHRbeF1cbiAqICAgbWlueTogcHRbeV1cbiAqICAgbWF4eDogcHRbeF0gKyBzaXplc1t4XVxuICogICBtYXh5OiBwdFt5XSArIHNpemVzW3ldXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgICBleGlzdGluZyBib3VuZHMgdG8gcmUtaW5pdGlhbGl6ZVxuICogQHBhcmFtICB7UG9pbnQyZH0gcHQgICAgbmV3IHBvc2l0aW9uIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kc1xuICogQHBhcmFtICB7VmVjMmR9IHNpemVzICAgbmV3IHdpZHRoL2hlaWdodCBvZiB0aGUgYm91bmRzXG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2l6ZUZyb21Mb2NhdGlvbihvdXQsIHB0LCBzaXplcykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkgKz0gMSkge1xuICAgIGlmIChzaXplc1tpXSA8IDApIHtcbiAgICAgIG91dFtpXSA9IHB0W2ldIC0gc2l6ZXNbaV1cbiAgICAgIG91dFtpICsgMl0gPSBwdFtpXVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRbaV0gPSBwdFtpXVxuICAgICAgb3V0W2kgKyAyXSA9IHB0W2ldICsgc2l6ZXNbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIGV4aXN0aW5nIGFhYm94IHdpdGggaXRzIGNlbnRlciBzZXQgdG8gYSBzcGVjaWZpYyBwdCBhbmQgd2l0aCBib3VuZHNcbiAqIGV4dGVuZGluZyBvdXR3YXJkIGluIGVhY2ggZGltZW5zaW9uIHNvIHRoYXQgdGhlIGFhYm94J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYVxuICogc3BlY2lmaWMgc2l6ZVxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0ICAgIGV4aXN0aW5nIGJvdW5kcyB0byByZS1pbml0aWFsaXplXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBjZW50ZXIgbmV3IGNlbnRlciBvZiB0aGUgYm91bmRzXG4gKiBAcGFyYW0gIHtWZWMyZH0gc2l6ZXMgIG5ldyB3aWR0aC9oZWlnaHQgb2YgdGhlIGJvdW5kc1xuICogQHJldHVybiB7QUFCb3gyZH0gICAgICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRDZW50ZXJFeHRlbnRzKG91dCwgY2VudGVyLCBzaXplcykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkgKz0gMSkge1xuICAgIGlmIChzaXplc1tpXSA8IDApIHtcbiAgICAgIG91dFtpXSA9IGNlbnRlcltpXSArIHNpemVzW2ldXG4gICAgICBvdXRbaSArIDJdID0gY2VudGVyW2ldIC0gc2l6ZXNbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2ldID0gY2VudGVyW2ldIC0gc2l6ZXNbaV1cbiAgICAgIG91dFtpICsgMl0gPSBjZW50ZXJbaV0gKyBzaXplc1tpXVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBhYWJveCBpcyBlbXB0eVxuICogQHBhcmFtICB7QUFCb3gyZH0gIGJveFxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgIHRydWUgaWYgYm94IGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoYm94KSB7XG4gIHJldHVybiAoYm94W01JTlhdID4gYm94W01BWFhdIHx8IGJveFtNSU5ZXSA+IGJveFtNQVhZXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gYWFib3ggaXMgaW5maW5pdGUgaW4gZWl0aGVyIGRpbWVuc2lvblxuICogQHBhcmFtICB7QUFCb3gyZH0gIGJveCBFeGlzdGluZyBhYWJveCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gICAgIFRydWUgaWYgYm94IGV4dGVuZHMgdG8gKy8tIGluaWZpbml0eSBpbiBlaXRoZXIgZGltZW5zaW9uLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5maW5pdGUoYm94KSB7XG4gIHJldHVybiAhaXNGaW5pdGUoYm94W01JTlhdKSB8fCAhaXNGaW5pdGUoYm94W01JTlldKSB8fCAhaXNGaW5pdGUoYm94W01BWFhdKSB8fCAhaXNGaW5pdGUoYm94W01BWFldKVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvbmUgYWFib3ggYXBwcm94aW1hdGVseSBlcXVhbHMgYW5vdGhlclxuICogQHBhcmFtICB7QUFCb3gyZH0gYVxuICogQHBhcmFtICB7QUFCb3gyZH0gYlxuICogQHJldHVybiB7Qm9vbGVhbn0gICB0cnVlIGlmIGEgfj0gYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgY29uc3QgYTAgPSBhWzBdXG4gIGNvbnN0IGExID0gYVsxXVxuICBjb25zdCBhMiA9IGFbMl1cbiAgY29uc3QgYTMgPSBhWzNdXG4gIGNvbnN0IGIwID0gYlswXVxuICBjb25zdCBiMSA9IGJbMV1cbiAgY29uc3QgYjIgPSBiWzJdXG4gIGNvbnN0IGIzID0gYlszXVxuICByZXR1cm4gKE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04pXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgd2lkdGgvaGVpZ2h0IG9mIGFuIGV4aXN0aW5nIGFhYm94XG4gKiBAcGFyYW0gIHtWZWMyZH0gb3V0IDJkIHZlY3RvciB0byBzdG9yZSB0aGUgd2lkdGgvaGVpZ2h0IG9mIGFuIGV4aXN0aW5nIGFhYm94XG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggYm91bmRzIHRvIGV4dHJhY3QgdGhlIHdpZHRoL2hlaWdodCBmcm9tXG4gKiBAcmV0dXJuIHtWZWMyZH0gICAgIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaXplKG91dCwgYm94KSB7XG4gIHJldHVybiBWZWMyZC5zZXQob3V0LCBib3hbTUFYWF0gLSBib3hbTUlOWF0sIGJveFtNQVhZXSAtIGJveFtNSU5ZXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHRlbnRzIG9mIGFuIGV4aXN0aW5nIGFhYm94LlxuICogRXh0ZW50cyBpcyB0aGUgc2l6ZSBvZiBhIGJvdW5kcyBpbiBlYWNoIGRpbWVuc2lvbiBzdGFydGluZyBhdCB0aGUgY2VudGVyXG4gKiBvZiB0aGUgYm91bmRzLiAoaS5lLiBleHRlbnRzID0gW3dpZHRoIC8gMiwgaGVpZ2h0IC8gMl0pXG4gKiBAcGFyYW0gIHtWZWMyZH0gb3V0IDJkIHZlY3RvciB0byBzdG9yZSB0aGUgZXh0ZW50cyBvZiBhbiBleGlzdGluZyBhYWJveFxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IGJvdW5kcyB0byBleHRyYWN0IHRoZSBleHRlbnRzIGZyb21cbiAqIEByZXR1cm4ge1ZlYzJkfSAgICAgdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVudHMob3V0LCBib3gpIHtcbiAgZ2V0U2l6ZShvdXQsIGJveClcbiAgcmV0dXJuIFZlYzJkLnNjYWxlKG91dCwgb3V0LCAwLjUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNlbnRlciBvZiBhbiBleGlzdGluZyBhYWJveFxuICogQHBhcmFtICB7UG9pbnQyZH0gb3V0IHBvaW50IHRvIHN0b3JlIHRoZSBjZW50ZXIgb2YgYW4gZXhpc3RpbmcgYm91bmRzXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggYm91bmRzIHRvIGV4dHJhY3QgdGhlIGNlbnRlciBmcm9tXG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgICAgcG9pbnQgcmVmZXJlbmNlZCBieSB0aGUgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2VudGVyKG91dCwgYm94KSB7XG4gIGdldEV4dGVudHMob3V0LCBib3gpXG4gIG91dFtNSU5YXSArPSBib3hbTUlOWF1cbiAgb3V0W01JTlldICs9IGJveFtNSU5ZXVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogRXhwYW5kcyBhbiBleGlzdGluZyBhYWJveCBieSBhIHNwZWNpZmllZCBzaXplIGluIGVhY2ggZGltZW5zaW9uLlxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0ICAgICAgICBib3VuZHMgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBvcGVyYXRpb24gaW5cbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCAgICAgICAgc3RhcnRpbmcgYm91bmRzIHRvIGV4cGFuZFxuICogQHBhcmFtICB7VmVjMmR9IGV4cGFuZFNpemUgICBzaXplIHRvIGV4cGFuZCBpbiBlYWNoIGRpbWVuc2lvblxuICogQHJldHVybiB7QUFCb3gyZH0gICAgICAgICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSB0aGUgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kKG91dCwgYm94LCBleHBhbmRTaXplKSB7XG4gIG91dFtNSU5YXSA9IGJveFtNSU5YXSAtIGV4cGFuZFNpemVbMF1cbiAgb3V0W01BWFhdID0gYm94W01BWFhdICsgZXhwYW5kU2l6ZVswXVxuICBvdXRbTUlOWV0gPSBib3hbTUlOWV0gLSBleHBhbmRTaXplWzFdXG4gIG91dFtNQVhZXSA9IGJveFtNQVhZXSArIGV4cGFuZFNpemVbMV1cbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYXJlYSBvZiBhbiBleGlzdGluZyBhYWJveFxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94XG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBhcmVhIG9mIHRoZSBib3VuZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZWEoYm94KSB7XG4gIHJldHVybiAoYm94W01BWFhdIC0gYm94W01JTlhdKSAqIChib3hbTUFYWV0gLSBib3hbTUlOWV0pXG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaHVsbCBvZiB0d28gYWFib3hlcy4gVGhlIGh1bGwgaXMgdGhlIHNtYWxsZXN0IGJvdW5kcyB0aGF0IGNvbnRhaW5zXG4gKiBib3RoIG9mIHRoZSBhYWJveGVzXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgYm91bmRzIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgb3BlcmF0aW9uIGluXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBhXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBiXG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaHVsbChvdXQsIGEsIGIpIHtcbiAgcmV0dXJuIGNyZWF0ZShNYXRoLm1pbihhW01JTlhdLCBiW01JTlhdKSwgTWF0aC5taW4oYVtNSU5ZXSwgYltNSU5ZXSksIE1hdGgubWF4KGFbTUFYWF0sIGJbTUFYWF0pLCBNYXRoLm1heChhW01BWFldLCBiW01BWFldKSlcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIGV4aXN0aW5nIGJvdW5kcy5cbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCBib3VuZHMgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBvcGVyYXRpb24gaW5cbiAqIEBwYXJhbSAge0FBQm94MmR9IGFcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJcbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3V0LCBhLCBiKSB7XG4gIGxldCBib3hUb1VzZSA9IG91dFxuICBpZiAob3V0ID09PSBhKSB7XG4gICAgYm94VG9Vc2UgPSBjcmVhdGUoKVxuICB9XG5cbiAgbGV0IG1pbmluZGV4ID0gTUlOWFxuICBsZXQgbWF4aW5kZXggPSBNQVhYXG4gIGZvciAoOyBtaW5pbmRleCA8PSBNSU5ZOyBtaW5pbmRleCArPSAxLCBtYXhpbmRleCArPSAxKSB7XG4gICAgaWYgKGFbbWF4aW5kZXhdIDwgYlttaW5pbmRleF0gfHwgYVttaW5pbmRleF0gPiBiW21heGluZGV4XSkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBib3hUb1VzZVttaW5pbmRleF0gPSBNYXRoLm1heChhW21pbmluZGV4XSwgYlttaW5pbmRleF0pXG4gICAgYm94VG9Vc2VbbWF4aW5kZXhdID0gTWF0aC5taW4oYVttYXhpbmRleF0sIGJbbWF4aW5kZXhdKVxuICB9XG5cbiAgaWYgKG1pbmluZGV4ICE9PSBNSU5ZICsgMSkge1xuICAgIGluaXRFbXB0eShib3hUb1VzZSlcbiAgfVxuXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICBjb3B5KG91dCwgYm94VG9Vc2UpXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9uZSBib3VuZHMgb3ZlcmxhcHMgYW5vdGhlciBpbiBhbnkgd2F5IChub24taW5jbHVzaXZlKS5cbiAqIEBwYXJhbSAge0FBQm94MmR9IGFcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgUmV0dXJucyB0cnVlIGlmIGEgb3ZlcmxhcHMgYiwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdmVybGFwcyhhLCBiKSB7XG4gIHJldHVybiAhKGFbTUFYWF0gPD0gYltNSU5YXSB8fCBhW01JTlhdID49IGJbTUFYWF0gfHwgYVtNQVhZXSA8PSBiW01JTlldIHx8IGFbTUlOWV0gPj0gYltNQVhZXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgb25lIGJvdW5kcyBmdWxsIGNvbnRhaW5zIGFub3RoZXIgKGluY2x1c2l2ZSkuXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBhXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgIHRydWUgaWYgYSBmdWxseSBjb250YWlucyBiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnMoYSwgYikge1xuICByZXR1cm4gIShiW01JTlhdIDwgYVtNSU5YXSB8fCBiW01BWFhdID4gYVtNQVhYXSB8fCBiW01JTlldIDwgYVtNSU5ZXSB8fCBiW01BWFldID4gYVtNQVhZXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gZXhpc3RpbmcgYm91bmRzIGNvbnRhaW5zIGEgc3BlY2lmaWMgcG9pbnQgKGluY2x1c2l2ZSlcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveFxuICogQHBhcmFtICB7UG9pbnQyZH0gcHRcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICBSZXR1cm5zIHRydWUgaWYgcHQgaXMgaW5zaWRlIG9mIGJveCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc1B0KGJveCwgcHQpIHtcbiAgcmV0dXJuIChwdFtNSU5YXSA+PSBib3hbTUlOWF0gJiYgcHRbTUlOWF0gPD0gYm94W01BWFhdICYmIHB0W01JTlldID49IGJveFtNSU5ZXSAmJiBwdFtNSU5ZXSA8PSBib3hbTUFYWV0pXG59XG5cbi8qKlxuICogRXh0ZW5kcyBhbiBleGlzdGluZyBib3VuZHMgc28gdGhhdCBpdCB3b3VsZCBjb250YWluIGEgc3BlY2lmaWMgcG9pbnRcbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCBCb3VuZHMgY29udGFpbmluZyB0aGUgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IFN0YXJ0aW5nIGJvdW5kcyB0byBwb3NzaWJseSBleHRlbmRcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0ICBQb2ludCB0byBlbmNhcHN1bGF0ZSBpbiBib3hcbiAqIEByZXR1cm4ge0FBYm94MmR9ICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNhcHN1bGF0ZVB0KG91dCwgYm94LCBwdCkge1xuICBpZiAob3V0ICE9PSBib3gpIHtcbiAgICBjb3B5KG91dCwgYm94KVxuICB9XG4gIGlmIChpc0VtcHR5KGJveCkpIHtcbiAgICBvdXRbTUlOWF0gPSBwdFtNSU5YXVxuICAgIG91dFtNQVhYXSA9IHB0W01JTlhdXG4gICAgb3V0W01JTlldID0gcHRbTUlOWV1cbiAgICBvdXRbTUFYWV0gPSBwdFtNSU5ZXVxuICB9IGVsc2Uge1xuICAgIGlmIChwdFtNSU5YXSA8IG91dFtNSU5YXSkge1xuICAgICAgb3V0W01JTlhdID0gcHRbTUlOWF1cbiAgICB9IGVsc2UgaWYgKHB0W01JTlhdID4gb3V0W01BWFhdKSB7XG4gICAgICBvdXRbTUFYWF0gPSBwdFtNSU5YXVxuICAgIH1cblxuICAgIGlmIChwdFtNSU5ZXSA8IG91dFtNSU5ZXSkge1xuICAgICAgb3V0W01JTlldID0gcHRbTUlOWV1cbiAgICB9IGVsc2UgaWYgKHB0W01JTlldID4gb3V0W01BWFldKSB7XG4gICAgICBvdXRbTUFYWV0gPSBwdFtNSU5ZXVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhbiBleGlzdGluZyBib3VuZHMgYnkgYSBzcGVjaWZpZWQgb2Zmc2V0IGl0IGVhY2ggZGltZW5zaW9uXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgYm91bmRzIHJlc3VsdGluZyBmcm9tIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCBzdGFydGluZyBib3VuZHNcbiAqIEBwYXJhbSAge1ZlYzJkfSBwb3MgICB0cmFuc2xhdGlvbiBpbiBlYWNoIGRpbWVuc2lvblxuICogQHJldHVybiB7QUFCb3gyZH0gICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGJveCwgcG9zKSB7XG4gIG91dFtNSU5YXSA9IGJveFtNSU5YXSArIHBvc1swXVxuICBvdXRbTUlOWV0gPSBib3hbTUlOWV0gKyBwb3NbMV1cbiAgb3V0W01BWFhdID0gYm94W01BWFhdICsgcG9zWzBdXG4gIG91dFtNQVhZXSA9IGJveFtNQVhZXSArIHBvc1sxXVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0ob3V0LCBib3gsIG1hdCwgeGZvcm1GdW5jKSB7XG4gIGxldCBib3hUb1VzZSA9IG91dFxuICBpZiAob3V0ID09PSBib3gpIHtcbiAgICBib3hUb1VzZSA9IGNyZWF0ZSgpXG4gIH1cbiAgaW5pdEVtcHR5KGJveFRvVXNlKVxuXG4gIGNvbnN0IHB0MSA9IFZlYzJkLnNldChWZWMyZC5jcmVhdGUoKSwgYm94W01JTlhdLCBib3hbTUlOWV0pXG4gIGNvbnN0IHB0MiA9IFZlYzJkLmNyZWF0ZSgpXG4gIHhmb3JtRnVuYyhwdDIsIHB0MSwgbWF0KVxuICBlbmNhcHN1bGF0ZVB0KGJveFRvVXNlLCBib3hUb1VzZSwgcHQyKVxuICBwdDFbTUlOWF0gPSBib3hbTUFYWF1cbiAgeGZvcm1GdW5jKHB0MiwgcHQxLCBtYXQpXG4gIGVuY2Fwc3VsYXRlUHQoYm94VG9Vc2UsIGJveFRvVXNlLCBwdDIpXG4gIHB0MVtNSU5ZXSA9IGJveFtNQVhZXVxuICB4Zm9ybUZ1bmMocHQyLCBwdDEsIG1hdClcbiAgZW5jYXBzdWxhdGVQdChib3hUb1VzZSwgYm94VG9Vc2UsIHB0MilcbiAgcHQxW01JTlhdID0gYm94W01JTlhdXG4gIHhmb3JtRnVuYyhwdDIsIHB0MSwgbWF0KVxuICBlbmNhcHN1bGF0ZVB0KGJveFRvVXNlLCBib3hUb1VzZSwgcHQyKVxuICBpZiAob3V0ID09PSBib3gpIHtcbiAgICBjb3B5KG91dCwgYm94VG9Vc2UpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgYm91bmRzIGJ5IGEgMngyIG1hdHJpeFxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0IGJvdW5kcyB0byBjb250YWluIHRoZSBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggYm91bmRzIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtICB7TWF0Mn0gbWF0IDJ4MiBtYXRyaXggdHJhbnNmb3JtYXRpb25cbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgYm94LCBtYXQpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybShvdXQsIGJveCwgbWF0LCBWZWMyZC50cmFuc2Zvcm1NYXQyKVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgYm91bmRzIGJ5IGEgMngzIG1hdHJpeC5cbiAqIEEgMngzIG1hdHJpeCBpcyBhIDJ4MiBtYXRyaXggd2l0aCBhIHRyYW5zbGF0aW9uIGNvbXBvbmVudC5cbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCBib3VuZHMgdG8gaG9sZCB0aGUgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IGJvdW5kcyB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSAge01hdDJkfSBtYXQgICAyeDMgbWF0cml4XG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MmQob3V0LCBib3gsIG1hdCkge1xuICByZXR1cm4gdHJhbnNmb3JtKG91dCwgYm94LCBtYXQsIFZlYzJkLnRyYW5zZm9ybU1hdDJkKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29yZS9hYWJveDJkLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.MAXY = exports.MAXX = exports.MINY = exports.MINX = undefined;\nexports.set = set;\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.initEmpty = initEmpty;\nexports.initInfinity = initInfinity;\nexports.initSizeFromOrigin = initSizeFromOrigin;\nexports.initSizeFromLocation = initSizeFromLocation;\nexports.initCenterExtents = initCenterExtents;\nexports.isEmpty = isEmpty;\nexports.isInfinite = isInfinite;\nexports.equals = equals;\nexports.getSize = getSize;\nexports.getExtents = getExtents;\nexports.getCenter = getCenter;\nexports.expand = expand;\nexports.area = area;\nexports.hull = hull;\nexports.intersection = intersection;\nexports.overlaps = overlaps;\nexports.contains = contains;\nexports.containsPt = containsPt;\nexports.encapsulatePt = encapsulatePt;\nexports.translate = translate;\nexports.transformMat2 = transformMat2;\nexports.transformMat2d = transformMat2d;\n\nvar _glMatrix = __webpack_require__(1);\n\nvar MINX = exports.MINX = 0;\nvar MINY = exports.MINY = 1;\nvar MAXX = exports.MAXX = 2;\nvar MAXY = exports.MAXY = 3;\n\nvar Constants = {\n BOX_SIDES: 4\n\n /**\n * Sets the boundaries of an existing 2d axis-aligned bounding box\n * If arguments are not supplied, the aabox is initialized as empty.\n * @param {AABox2d} out AAbox2d to set\n * @param {Number} [minx = Infinity] Minimum x-axis value\n * @param {Number} [miny = Infinity] Minimum y-axis value\n * @param {Number} [maxx = -Infinity] Maximum x-axis value\n * @param {Number} [maxy = -Infinity] Maximum y-axis value\n * @return {AABox2d} bounds referenced by out arg\n */\n};function set(out, minx, miny, maxx, maxy) {\n out[MINX] = typeof minx === \"number\" ? minx : Infinity;\n out[MINY] = typeof miny === \"number\" ? miny : Infinity;\n out[MAXX] = typeof maxx === \"number\" ? maxx : -Infinity;\n out[MAXY] = typeof maxy === \"number\" ? maxy : -Infinity;\n return out;\n}\n\n/**\n * Creates a new 2d axis-aligned bounding box object\n * with optional boundaries. If boundaries are not supplied,\n * the aabox is initialized as empty.\n * @param {Number} [minx = Infinity] Minimum x-axis value\n * @param {Number} [miny = Infinity] Minimum y-axis value\n * @param {Number} [maxx = -Infinity] Maximum x-axis value\n * @param {Number} [maxy = -Infinity] Maximum y-axis value\n * @return {AABox2d} New AABox2d object\n */\nfunction create(minx, miny, maxx, maxy) {\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(Constants.BOX_SIDES);\n return set(out, minx, miny, maxx, maxy);\n}\n\n/**\n * Creates a new 2d axis-aligned bounding box with boundaries copied\n * from an existing aabox.\n * @param {AABox2d} box existing bounds to copy boundaries from\n * @return {AABox2d} new AABox2d object\n */\nfunction clone(box) {\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(Constants.BOX_SIDES);\n out[MINX] = box[MINX];\n out[MINY] = box[MINY];\n out[MAXX] = box[MAXX];\n out[MAXY] = box[MAXY];\n return out;\n}\n\n/**\n * Copies the boundaries from one existing aabox to another.\n * @param {AABox2d} out bounds to copy to\n * @param {AABox2d} box bounds to copy from\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction copy(out, box) {\n out[MINX] = box[MINX];\n out[MINY] = box[MINY];\n out[MAXX] = box[MAXX];\n out[MAXY] = box[MAXY];\n return out;\n}\n\n/**\n * Re-initializes an existing aabox as empty.\n * An aabox is empty if the minimum value in either of\n * its dimensions exceeds its respective max value.\n * In this case, the minumums will be set to +Infinity\n * and the maximums to -Infinity\n * @param {AABox2d} out existing bounds to re-initialize as empty\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initEmpty(out) {\n out[MINX] = Infinity;\n out[MINY] = Infinity;\n out[MAXX] = -Infinity;\n out[MAXY] = -Infinity;\n return out;\n}\n\n/**\n * Re-initializes an existing aabox to infinity, ultimately encompassing\n * all numeric values.\n * @param {AABox2d} out existing bounds to initialize to infinity\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initInfinity(out) {\n out[MINX] = -Infinity;\n out[MINY] = -Infinity;\n out[MAXX] = Infinity;\n out[MAXY] = Infinity;\n return out;\n}\n\n/**\n * Initializes an existing aabox with its top-left corner set to be the origin ([0, 0]),\n * an extends outwards in each dimension by its respective size.\n * minx: 0\n * miny: 0\n * maxx: sizes[x]\n * maxy: sizes[y]\n * @param {AABox2d} out existing bounds to re-initialize\n * @param {Vec2d} sizes new width/height of the bounds\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initSizeFromOrigin(out, sizes) {\n if (sizes[0] < 0) {\n out[MINX] = -sizes[0];\n out[MAXX] = 0;\n } else {\n out[MINX] = 0;\n out[MAXX] = sizes[0];\n }\n if (sizes[1] < 0) {\n out[MINY] = -sizes[1];\n out[MAXY] = 0;\n } else {\n out[MINY] = 0;\n out[MAXY] = sizes[1];\n }\n return out;\n}\n\n/**\n * Initializes an existing aabox with its top-left corner set to be an existing pt and with\n * bounds extending outwards in each dimension by its respective size.\n * minx: pt[x]\n * miny: pt[y]\n * maxx: pt[x] + sizes[x]\n * maxy: pt[y] + sizes[y]\n * @param {AABox2d} out existing bounds to re-initialize\n * @param {Point2d} pt new position of the top-left corner of the bounds\n * @param {Vec2d} sizes new width/height of the bounds\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initSizeFromLocation(out, pt, sizes) {\n for (var i = 0; i < 2; i += 1) {\n if (sizes[i] < 0) {\n out[i] = pt[i] - sizes[i];\n out[i + 2] = pt[i];\n } else {\n out[i] = pt[i];\n out[i + 2] = pt[i] + sizes[i];\n }\n }\n return out;\n}\n\n/**\n * Initializes an existing aabox with its center set to a specific pt and with bounds\n * extending outward in each dimension so that the aabox's width and height are a\n * specific size\n * @param {AABox2d} out existing bounds to re-initialize\n * @param {Point2d} center new center of the bounds\n * @param {Vec2d} sizes new width/height of the bounds\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction initCenterExtents(out, center, sizes) {\n for (var i = 0; i < 2; i += 1) {\n if (sizes[i] < 0) {\n out[i] = center[i] + sizes[i];\n out[i + 2] = center[i] - sizes[i];\n } else {\n out[i] = center[i] - sizes[i];\n out[i + 2] = center[i] + sizes[i];\n }\n }\n return out;\n}\n\n/**\n * Returns true if the aabox is empty\n * @param {AABox2d} box\n * @return {Boolean} true if box is empty, false otherwise\n */\nfunction isEmpty(box) {\n return box[MINX] > box[MAXX] || box[MINY] > box[MAXY];\n}\n\n/**\n * Returns true if an aabox is infinite in either dimension\n * @param {AABox2d} box Existing aabox to check\n * @return {Boolean} True if box extends to +/- inifinity in either dimension, false otherwise\n */\nfunction isInfinite(box) {\n return !isFinite(box[MINX]) || !isFinite(box[MINY]) || !isFinite(box[MAXX]) || !isFinite(box[MAXY]);\n}\n\n/**\n * Returns true if one aabox approximately equals another\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {Boolean} true if a ~= b\n */\nfunction equals(a, b) {\n var a0 = a[0];\n var a1 = a[1];\n var a2 = a[2];\n var a3 = a[3];\n var b0 = b[0];\n var b1 = b[1];\n var b2 = b[2];\n var b3 = b[3];\n return Math.abs(a0 - b0) <= _glMatrix.glMatrix.EPSILON && Math.abs(a1 - b1) <= _glMatrix.glMatrix.EPSILON && Math.abs(a2 - b2) <= _glMatrix.glMatrix.EPSILON && Math.abs(a3 - b3) <= _glMatrix.glMatrix.EPSILON;\n}\n\n/**\n * Returns the width/height of an existing aabox\n * @param {Vec2d} out 2d vector to store the width/height of an existing aabox\n * @param {AABox2d} box bounds to extract the width/height from\n * @return {Vec2d} vector referenced by the out arg\n */\nfunction getSize(out, box) {\n return _glMatrix.vec2.set(out, box[MAXX] - box[MINX], box[MAXY] - box[MINY]);\n}\n\n/**\n * Returns the extents of an existing aabox.\n * Extents is the size of a bounds in each dimension starting at the center\n * of the bounds. (i.e. extents = [width / 2, height / 2])\n * @param {Vec2d} out 2d vector to store the extents of an existing aabox\n * @param {AABox2d} box bounds to extract the extents from\n * @return {Vec2d} vector referenced by the out arg\n */\nfunction getExtents(out, box) {\n getSize(out, box);\n return _glMatrix.vec2.scale(out, out, 0.5); // eslint-disable-line no-magic-numbers\n}\n\n/**\n * Returns the center of an existing aabox\n * @param {Point2d} out point to store the center of an existing bounds\n * @param {AABox2d} box bounds to extract the center from\n * @return {Point2d} point referenced by the out arg\n */\nfunction getCenter(out, box) {\n getExtents(out, box);\n out[MINX] += box[MINX];\n out[MINY] += box[MINY];\n return out;\n}\n\n/**\n * Expands an existing aabox by a specified size in each dimension.\n * @param {AABox2d} out bounds to store the resulting operation in\n * @param {AABox2d} box starting bounds to expand\n * @param {Vec2d} expandSize size to expand in each dimension\n * @return {AABox2d} bounds referenced by the out arg\n */\nfunction expand(out, box, expandSize) {\n out[MINX] = box[MINX] - expandSize[0];\n out[MAXX] = box[MAXX] + expandSize[0];\n out[MINY] = box[MINY] - expandSize[1];\n out[MAXY] = box[MAXY] + expandSize[1];\n}\n\n/**\n * Computes the area of an existing aabox\n * @param {AABox2d} box\n * @return {Number} area of the bounds\n */\nfunction area(box) {\n return (box[MAXX] - box[MINX]) * (box[MAXY] - box[MINY]);\n}\n\n/**\n * Calculates the hull of two aaboxes. The hull is the smallest bounds that contains\n * both of the aaboxes\n * @param {AABox2d} out bounds to store the resulting operation in\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction hull(out, a, b) {\n return create(Math.min(a[MINX], b[MINX]), Math.min(a[MINY], b[MINY]), Math.max(a[MAXX], b[MAXX]), Math.max(a[MAXY], b[MAXY]));\n}\n\n/**\n * Calculates the intersection of two existing bounds.\n * @param {AABox2d} out bounds to store the resulting operation in\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction intersection(out, a, b) {\n var boxToUse = out;\n if (out === a) {\n boxToUse = create();\n }\n\n var minindex = MINX;\n var maxindex = MAXX;\n for (; minindex <= MINY; minindex += 1, maxindex += 1) {\n if (a[maxindex] < b[minindex] || a[minindex] > b[maxindex]) {\n break;\n }\n\n boxToUse[minindex] = Math.max(a[minindex], b[minindex]);\n boxToUse[maxindex] = Math.min(a[maxindex], b[maxindex]);\n }\n\n if (minindex !== MINY + 1) {\n initEmpty(boxToUse);\n }\n\n if (out === a) {\n copy(out, boxToUse);\n }\n\n return out;\n}\n\n/**\n * Returns true if one bounds overlaps another in any way (non-inclusive).\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {Boolean} Returns true if a overlaps b, false otherwise\n */\nfunction overlaps(a, b) {\n return !(a[MAXX] <= b[MINX] || a[MINX] >= b[MAXX] || a[MAXY] <= b[MINY] || a[MINY] >= b[MAXY]);\n}\n\n/**\n * Returns true if one bounds full contains another (inclusive).\n * @param {AABox2d} a\n * @param {AABox2d} b\n * @return {Boolean} true if a fully contains b.\n */\nfunction contains(a, b) {\n return !(b[MINX] < a[MINX] || b[MAXX] > a[MAXX] || b[MINY] < a[MINY] || b[MAXY] > a[MAXY]);\n}\n\n/**\n * Returns true if an existing bounds contains a specific point (inclusive)\n * @param {AABox2d} box\n * @param {Point2d} pt\n * @return {Boolean} Returns true if pt is inside of box, false otherwise\n */\nfunction containsPt(box, pt) {\n return pt[MINX] >= box[MINX] && pt[MINX] <= box[MAXX] && pt[MINY] >= box[MINY] && pt[MINY] <= box[MAXY];\n}\n\n/**\n * Extends an existing bounds so that it would contain a specific point\n * @param {AABox2d} out Bounds containing the operation result\n * @param {AABox2d} box Starting bounds to possibly extend\n * @param {Point2d} pt Point to encapsulate in box\n * @return {AAbox2d} bounds referenced by out arg\n */\nfunction encapsulatePt(out, box, pt) {\n if (out !== box) {\n copy(out, box);\n }\n if (isEmpty(box)) {\n out[MINX] = pt[MINX];\n out[MAXX] = pt[MINX];\n out[MINY] = pt[MINY];\n out[MAXY] = pt[MINY];\n } else {\n if (pt[MINX] < out[MINX]) {\n out[MINX] = pt[MINX];\n } else if (pt[MINX] > out[MAXX]) {\n out[MAXX] = pt[MINX];\n }\n\n if (pt[MINY] < out[MINY]) {\n out[MINY] = pt[MINY];\n } else if (pt[MINY] > out[MAXY]) {\n out[MAXY] = pt[MINY];\n }\n }\n return out;\n}\n\n/**\n * Translates an existing bounds by a specified offset it each dimension\n * @param {AABox2d} out bounds resulting from the operation\n * @param {AABox2d} box starting bounds\n * @param {Vec2d} pos translation in each dimension\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction translate(out, box, pos) {\n out[MINX] = box[MINX] + pos[0];\n out[MINY] = box[MINY] + pos[1];\n out[MAXX] = box[MAXX] + pos[0];\n out[MAXY] = box[MAXY] + pos[1];\n}\n\nfunction transform(out, box, mat, xformFunc) {\n var boxToUse = out;\n if (out === box) {\n boxToUse = create();\n }\n initEmpty(boxToUse);\n\n var pt1 = _glMatrix.vec2.set(_glMatrix.vec2.create(), box[MINX], box[MINY]);\n var pt2 = _glMatrix.vec2.create();\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n pt1[MINX] = box[MAXX];\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n pt1[MINY] = box[MAXY];\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n pt1[MINX] = box[MINX];\n xformFunc(pt2, pt1, mat);\n encapsulatePt(boxToUse, boxToUse, pt2);\n if (out === box) {\n copy(out, boxToUse);\n }\n return out;\n}\n\n/**\n * Transforms an existing bounds by a 2x2 matrix\n * @param {AABox2d} out bounds to contain the operation result\n * @param {AABox2d} box bounds to transform\n * @param {Mat2} mat 2x2 matrix transformation\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction transformMat2(out, box, mat) {\n return transform(out, box, mat, _glMatrix.vec2.transformMat2);\n}\n\n/**\n * Transforms an existing bounds by a 2x3 matrix.\n * A 2x3 matrix is a 2x2 matrix with a translation component.\n * @param {AABox2d} out bounds to hold the operation result\n * @param {AABox2d} box bounds to transform\n * @param {Mat2d} mat 2x3 matrix\n * @return {AABox2d} bounds referenced by out arg\n */\nfunction transformMat2d(out, box, mat) {\n return transform(out, box, mat, _glMatrix.vec2.transformMat2d);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL2FhYm94MmQuanM/MDZlMCJdLCJuYW1lcyI6WyJzZXQiLCJjcmVhdGUiLCJjbG9uZSIsImNvcHkiLCJpbml0RW1wdHkiLCJpbml0SW5maW5pdHkiLCJpbml0U2l6ZUZyb21PcmlnaW4iLCJpbml0U2l6ZUZyb21Mb2NhdGlvbiIsImluaXRDZW50ZXJFeHRlbnRzIiwiaXNFbXB0eSIsImlzSW5maW5pdGUiLCJlcXVhbHMiLCJnZXRTaXplIiwiZ2V0RXh0ZW50cyIsImdldENlbnRlciIsImV4cGFuZCIsImFyZWEiLCJodWxsIiwiaW50ZXJzZWN0aW9uIiwib3ZlcmxhcHMiLCJjb250YWlucyIsImNvbnRhaW5zUHQiLCJlbmNhcHN1bGF0ZVB0IiwidHJhbnNsYXRlIiwidHJhbnNmb3JtTWF0MiIsInRyYW5zZm9ybU1hdDJkIiwiTUlOWCIsIk1JTlkiLCJNQVhYIiwiTUFYWSIsIkNvbnN0YW50cyIsIkJPWF9TSURFUyIsIm91dCIsIm1pbngiLCJtaW55IiwibWF4eCIsIm1heHkiLCJJbmZpbml0eSIsImdsTWF0cml4IiwiQVJSQVlfVFlQRSIsImJveCIsInNpemVzIiwicHQiLCJpIiwiY2VudGVyIiwiaXNGaW5pdGUiLCJhIiwiYiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJNYXRoIiwiYWJzIiwiRVBTSUxPTiIsIlZlYzJkIiwic2NhbGUiLCJleHBhbmRTaXplIiwibWluIiwibWF4IiwiYm94VG9Vc2UiLCJtaW5pbmRleCIsIm1heGluZGV4IiwicG9zIiwidHJhbnNmb3JtIiwibWF0IiwieGZvcm1GdW5jIiwicHQxIiwicHQyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O1FBdUJnQkEsRyxHQUFBQSxHO1FBa0JBQyxNLEdBQUFBLE07UUFXQUMsSyxHQUFBQSxLO1FBZUFDLEksR0FBQUEsSTtRQWlCQUMsUyxHQUFBQSxTO1FBY0FDLFksR0FBQUEsWTtRQW1CQUMsa0IsR0FBQUEsa0I7UUE4QkFDLG9C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QUFjMEMsUUFBZCxFQUF3QkEsUUFBeEIsRUFBa0NRLEdBQWxDO0FBQ0EsTUFBSXhDLFFBQVFRLEdBQVosRUFBaUI7QUFDZnJDLFNBQUs2QixHQUFMLEVBQVVnQyxRQUFWO0FBQ0Q7QUFDRCxTQUFPaEMsR0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT08sU0FBU1IsYUFBVCxDQUF1QlEsR0FBdkIsRUFBNEJRLEdBQTVCLEVBQWlDNkIsR0FBakMsRUFBc0M7QUFDM0MsU0FBT0QsVUFBVXBDLEdBQVYsRUFBZVEsR0FBZixFQUFvQjZCLEdBQXBCLEVBQXlCVixlQUFNbkMsYUFBL0IsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFPLFNBQVNDLGNBQVQsQ0FBd0JPLEdBQXhCLEVBQTZCUSxHQUE3QixFQUFrQzZCLEdBQWxDLEVBQXVDO0FBQzVDLFNBQU9ELFVBQVVwQyxHQUFWLEVBQWVRLEdBQWYsRUFBb0I2QixHQUFwQixFQUF5QlYsZUFBTWxDLGNBQS9CLENBQVA7QUFDRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0IHtnbE1hdHJpeCwgdmVjMiBhcyBWZWMyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5cbmV4cG9ydCBjb25zdCBNSU5YID0gMFxuZXhwb3J0IGNvbnN0IE1JTlkgPSAxXG5leHBvcnQgY29uc3QgTUFYWCA9IDJcbmV4cG9ydCBjb25zdCBNQVhZID0gM1xuXG5jb25zdCBDb25zdGFudHMgPSB7XG4gIEJPWF9TSURFUzogNFxufVxuXG4vKipcbiAqIFNldHMgdGhlIGJvdW5kYXJpZXMgb2YgYW4gZXhpc3RpbmcgMmQgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxuICogSWYgYXJndW1lbnRzIGFyZSBub3Qgc3VwcGxpZWQsIHRoZSBhYWJveCBpcyBpbml0aWFsaXplZCBhcyBlbXB0eS5cbiAqIEBwYXJhbSB7QUFCb3gyZH0gb3V0ICBBQWJveDJkIHRvIHNldFxuICogQHBhcmFtIHtOdW1iZXJ9IFttaW54ID0gSW5maW5pdHldIE1pbmltdW0geC1heGlzIHZhbHVlXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbnkgPSBJbmZpbml0eV0gTWluaW11bSB5LWF4aXMgdmFsdWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4eCA9IC1JbmZpbml0eV0gTWF4aW11bSB4LWF4aXMgdmFsdWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4eSA9IC1JbmZpbml0eV0gTWF4aW11bSB5LWF4aXMgdmFsdWVcbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG1pbngsIG1pbnksIG1heHgsIG1heHkpIHtcbiAgb3V0W01JTlhdID0gdHlwZW9mIG1pbnggPT09IFwibnVtYmVyXCIgPyBtaW54IDogSW5maW5pdHlcbiAgb3V0W01JTlldID0gdHlwZW9mIG1pbnkgPT09IFwibnVtYmVyXCIgPyBtaW55IDogSW5maW5pdHlcbiAgb3V0W01BWFhdID0gdHlwZW9mIG1heHggPT09IFwibnVtYmVyXCIgPyBtYXh4IDogLUluZmluaXR5XG4gIG91dFtNQVhZXSA9IHR5cGVvZiBtYXh5ID09PSBcIm51bWJlclwiID8gbWF4eSA6IC1JbmZpbml0eVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyAyZCBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9iamVjdFxuICogd2l0aCBvcHRpb25hbCBib3VuZGFyaWVzLiBJZiBib3VuZGFyaWVzIGFyZSBub3Qgc3VwcGxpZWQsXG4gKiB0aGUgYWFib3ggaXMgaW5pdGlhbGl6ZWQgYXMgZW1wdHkuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFttaW54ID0gSW5maW5pdHldIE1pbmltdW0geC1heGlzIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFttaW55ID0gSW5maW5pdHldIE1pbmltdW0geS1heGlzIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFttYXh4ID0gLUluZmluaXR5XSBNYXhpbXVtIHgtYXhpcyB2YWx1ZVxuICogQHBhcmFtICB7TnVtYmVyfSBbbWF4eSA9IC1JbmZpbml0eV0gTWF4aW11bSB5LWF4aXMgdmFsdWVcbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICAgTmV3IEFBQm94MmQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUobWlueCwgbWlueSwgbWF4eCwgbWF4eSkge1xuICBjb25zdCBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRShDb25zdGFudHMuQk9YX1NJREVTKVxuICByZXR1cm4gc2V0KG91dCwgbWlueCwgbWlueSwgbWF4eCwgbWF4eSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IDJkIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggd2l0aCBib3VuZGFyaWVzIGNvcGllZFxuICogZnJvbSBhbiBleGlzdGluZyBhYWJveC5cbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCBleGlzdGluZyBib3VuZHMgdG8gY29weSBib3VuZGFyaWVzIGZyb21cbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICBuZXcgQUFCb3gyZCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGJveCkge1xuICBjb25zdCBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRShDb25zdGFudHMuQk9YX1NJREVTKVxuICBvdXRbTUlOWF0gPSBib3hbTUlOWF1cbiAgb3V0W01JTlldID0gYm94W01JTlldXG4gIG91dFtNQVhYXSA9IGJveFtNQVhYXVxuICBvdXRbTUFYWV0gPSBib3hbTUFYWV1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIENvcGllcyB0aGUgYm91bmRhcmllcyBmcm9tIG9uZSBleGlzdGluZyBhYWJveCB0byBhbm90aGVyLlxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0IGJvdW5kcyB0byBjb3B5IHRvXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggYm91bmRzIHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7QUFCb3gyZH0gICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBib3gpIHtcbiAgb3V0W01JTlhdID0gYm94W01JTlhdXG4gIG91dFtNSU5ZXSA9IGJveFtNSU5ZXVxuICBvdXRbTUFYWF0gPSBib3hbTUFYWF1cbiAgb3V0W01BWFldID0gYm94W01BWFldXG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBSZS1pbml0aWFsaXplcyBhbiBleGlzdGluZyBhYWJveCBhcyBlbXB0eS5cbiAqIEFuIGFhYm94IGlzIGVtcHR5IGlmIHRoZSBtaW5pbXVtIHZhbHVlIGluIGVpdGhlciBvZlxuICogaXRzIGRpbWVuc2lvbnMgZXhjZWVkcyBpdHMgcmVzcGVjdGl2ZSBtYXggdmFsdWUuXG4gKiBJbiB0aGlzIGNhc2UsIHRoZSBtaW51bXVtcyB3aWxsIGJlIHNldCB0byArSW5maW5pdHlcbiAqIGFuZCB0aGUgbWF4aW11bXMgdG8gLUluZmluaXR5XG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgZXhpc3RpbmcgYm91bmRzIHRvIHJlLWluaXRpYWxpemUgYXMgZW1wdHlcbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RW1wdHkob3V0KSB7XG4gIG91dFtNSU5YXSA9IEluZmluaXR5XG4gIG91dFtNSU5ZXSA9IEluZmluaXR5XG4gIG91dFtNQVhYXSA9IC1JbmZpbml0eVxuICBvdXRbTUFYWV0gPSAtSW5maW5pdHlcbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFJlLWluaXRpYWxpemVzIGFuIGV4aXN0aW5nIGFhYm94IHRvIGluZmluaXR5LCB1bHRpbWF0ZWx5IGVuY29tcGFzc2luZ1xuICogYWxsIG51bWVyaWMgdmFsdWVzLlxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0IGV4aXN0aW5nIGJvdW5kcyB0byBpbml0aWFsaXplIHRvIGluZmluaXR5XG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEluZmluaXR5KG91dCkge1xuICBvdXRbTUlOWF0gPSAtSW5maW5pdHlcbiAgb3V0W01JTlldID0gLUluZmluaXR5XG4gIG91dFtNQVhYXSA9IEluZmluaXR5XG4gIG91dFtNQVhZXSA9IEluZmluaXR5XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBleGlzdGluZyBhYWJveCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgc2V0IHRvIGJlIHRoZSBvcmlnaW4gKFswLCAwXSksXG4gKiBhbiBleHRlbmRzIG91dHdhcmRzIGluIGVhY2ggZGltZW5zaW9uIGJ5IGl0cyByZXNwZWN0aXZlIHNpemUuXG4gKiAgIG1pbng6IDBcbiAqICAgbWlueTogMFxuICogICBtYXh4OiBzaXplc1t4XVxuICogICBtYXh5OiBzaXplc1t5XVxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0ICAgZXhpc3RpbmcgYm91bmRzIHRvIHJlLWluaXRpYWxpemVcbiAqIEBwYXJhbSAge1ZlYzJkfSBzaXplcyAgIG5ldyB3aWR0aC9oZWlnaHQgb2YgdGhlIGJvdW5kc1xuICogQHJldHVybiB7QUFCb3gyZH0gICAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNpemVGcm9tT3JpZ2luKG91dCwgc2l6ZXMpIHtcbiAgaWYgKHNpemVzWzBdIDwgMCkge1xuICAgIG91dFtNSU5YXSA9IC1zaXplc1swXVxuICAgIG91dFtNQVhYXSA9IDBcbiAgfSBlbHNlIHtcbiAgICBvdXRbTUlOWF0gPSAwXG4gICAgb3V0W01BWFhdID0gc2l6ZXNbMF1cbiAgfVxuICBpZiAoc2l6ZXNbMV0gPCAwKSB7XG4gICAgb3V0W01JTlldID0gLXNpemVzWzFdXG4gICAgb3V0W01BWFldID0gMFxuICB9IGVsc2Uge1xuICAgIG91dFtNSU5ZXSA9IDBcbiAgICBvdXRbTUFYWV0gPSBzaXplc1sxXVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBleGlzdGluZyBhYWJveCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgc2V0IHRvIGJlIGFuIGV4aXN0aW5nIHB0IGFuZCB3aXRoXG4gKiBib3VuZHMgZXh0ZW5kaW5nIG91dHdhcmRzIGluIGVhY2ggZGltZW5zaW9uIGJ5IGl0cyByZXNwZWN0aXZlIHNpemUuXG4gKiAgIG1pbng6IHB0W3hdXG4gKiAgIG1pbnk6IHB0W3ldXG4gKiAgIG1heHg6IHB0W3hdICsgc2l6ZXNbeF1cbiAqICAgbWF4eTogcHRbeV0gKyBzaXplc1t5XVxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0ICAgZXhpc3RpbmcgYm91bmRzIHRvIHJlLWluaXRpYWxpemVcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0ICAgIG5ldyBwb3NpdGlvbiBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBib3VuZHNcbiAqIEBwYXJhbSAge1ZlYzJkfSBzaXplcyAgIG5ldyB3aWR0aC9oZWlnaHQgb2YgdGhlIGJvdW5kc1xuICogQHJldHVybiB7QUFCb3gyZH0gICAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNpemVGcm9tTG9jYXRpb24ob3V0LCBwdCwgc2l6ZXMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpICs9IDEpIHtcbiAgICBpZiAoc2l6ZXNbaV0gPCAwKSB7XG4gICAgICBvdXRbaV0gPSBwdFtpXSAtIHNpemVzW2ldXG4gICAgICBvdXRbaSArIDJdID0gcHRbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2ldID0gcHRbaV1cbiAgICAgIG91dFtpICsgMl0gPSBwdFtpXSArIHNpemVzW2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBleGlzdGluZyBhYWJveCB3aXRoIGl0cyBjZW50ZXIgc2V0IHRvIGEgc3BlY2lmaWMgcHQgYW5kIHdpdGggYm91bmRzXG4gKiBleHRlbmRpbmcgb3V0d2FyZCBpbiBlYWNoIGRpbWVuc2lvbiBzbyB0aGF0IHRoZSBhYWJveCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFcbiAqIHNwZWNpZmljIHNpemVcbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCAgICBleGlzdGluZyBib3VuZHMgdG8gcmUtaW5pdGlhbGl6ZVxuICogQHBhcmFtICB7UG9pbnQyZH0gY2VudGVyIG5ldyBjZW50ZXIgb2YgdGhlIGJvdW5kc1xuICogQHBhcmFtICB7VmVjMmR9IHNpemVzICBuZXcgd2lkdGgvaGVpZ2h0IG9mIHRoZSBib3VuZHNcbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q2VudGVyRXh0ZW50cyhvdXQsIGNlbnRlciwgc2l6ZXMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpICs9IDEpIHtcbiAgICBpZiAoc2l6ZXNbaV0gPCAwKSB7XG4gICAgICBvdXRbaV0gPSBjZW50ZXJbaV0gKyBzaXplc1tpXVxuICAgICAgb3V0W2kgKyAyXSA9IGNlbnRlcltpXSAtIHNpemVzW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFtpXSA9IGNlbnRlcltpXSAtIHNpemVzW2ldXG4gICAgICBvdXRbaSArIDJdID0gY2VudGVyW2ldICsgc2l6ZXNbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWFib3ggaXMgZW1wdHlcbiAqIEBwYXJhbSAge0FBQm94MmR9ICBib3hcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICB0cnVlIGlmIGJveCBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KGJveCkge1xuICByZXR1cm4gKGJveFtNSU5YXSA+IGJveFtNQVhYXSB8fCBib3hbTUlOWV0gPiBib3hbTUFYWV0pXG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIGFhYm94IGlzIGluZmluaXRlIGluIGVpdGhlciBkaW1lbnNpb25cbiAqIEBwYXJhbSAge0FBQm94MmR9ICBib3ggRXhpc3RpbmcgYWFib3ggdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICBUcnVlIGlmIGJveCBleHRlbmRzIHRvICsvLSBpbmlmaW5pdHkgaW4gZWl0aGVyIGRpbWVuc2lvbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luZmluaXRlKGJveCkge1xuICByZXR1cm4gIWlzRmluaXRlKGJveFtNSU5YXSkgfHwgIWlzRmluaXRlKGJveFtNSU5ZXSkgfHwgIWlzRmluaXRlKGJveFtNQVhYXSkgfHwgIWlzRmluaXRlKGJveFtNQVhZXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgb25lIGFhYm94IGFwcHJveGltYXRlbHkgZXF1YWxzIGFub3RoZXJcbiAqIEBwYXJhbSAge0FBQm94MmR9IGFcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgdHJ1ZSBpZiBhIH49IGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIGNvbnN0IGEwID0gYVswXVxuICBjb25zdCBhMSA9IGFbMV1cbiAgY29uc3QgYTIgPSBhWzJdXG4gIGNvbnN0IGEzID0gYVszXVxuICBjb25zdCBiMCA9IGJbMF1cbiAgY29uc3QgYjEgPSBiWzFdXG4gIGNvbnN0IGIyID0gYlsyXVxuICBjb25zdCBiMyA9IGJbM11cbiAgcmV0dXJuIChNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHdpZHRoL2hlaWdodCBvZiBhbiBleGlzdGluZyBhYWJveFxuICogQHBhcmFtICB7VmVjMmR9IG91dCAyZCB2ZWN0b3IgdG8gc3RvcmUgdGhlIHdpZHRoL2hlaWdodCBvZiBhbiBleGlzdGluZyBhYWJveFxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IGJvdW5kcyB0byBleHRyYWN0IHRoZSB3aWR0aC9oZWlnaHQgZnJvbVxuICogQHJldHVybiB7VmVjMmR9ICAgICB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6ZShvdXQsIGJveCkge1xuICByZXR1cm4gVmVjMmQuc2V0KG91dCwgYm94W01BWFhdIC0gYm94W01JTlhdLCBib3hbTUFYWV0gLSBib3hbTUlOWV0pXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXh0ZW50cyBvZiBhbiBleGlzdGluZyBhYWJveC5cbiAqIEV4dGVudHMgaXMgdGhlIHNpemUgb2YgYSBib3VuZHMgaW4gZWFjaCBkaW1lbnNpb24gc3RhcnRpbmcgYXQgdGhlIGNlbnRlclxuICogb2YgdGhlIGJvdW5kcy4gKGkuZS4gZXh0ZW50cyA9IFt3aWR0aCAvIDIsIGhlaWdodCAvIDJdKVxuICogQHBhcmFtICB7VmVjMmR9IG91dCAyZCB2ZWN0b3IgdG8gc3RvcmUgdGhlIGV4dGVudHMgb2YgYW4gZXhpc3RpbmcgYWFib3hcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCBib3VuZHMgdG8gZXh0cmFjdCB0aGUgZXh0ZW50cyBmcm9tXG4gKiBAcmV0dXJuIHtWZWMyZH0gICAgIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnRzKG91dCwgYm94KSB7XG4gIGdldFNpemUob3V0LCBib3gpXG4gIHJldHVybiBWZWMyZC5zY2FsZShvdXQsIG91dCwgMC41KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjZW50ZXIgb2YgYW4gZXhpc3RpbmcgYWFib3hcbiAqIEBwYXJhbSAge1BvaW50MmR9IG91dCBwb2ludCB0byBzdG9yZSB0aGUgY2VudGVyIG9mIGFuIGV4aXN0aW5nIGJvdW5kc1xuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IGJvdW5kcyB0byBleHRyYWN0IHRoZSBjZW50ZXIgZnJvbVxuICogQHJldHVybiB7UG9pbnQyZH0gICAgIHBvaW50IHJlZmVyZW5jZWQgYnkgdGhlIG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENlbnRlcihvdXQsIGJveCkge1xuICBnZXRFeHRlbnRzKG91dCwgYm94KVxuICBvdXRbTUlOWF0gKz0gYm94W01JTlhdXG4gIG91dFtNSU5ZXSArPSBib3hbTUlOWV1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEV4cGFuZHMgYW4gZXhpc3RpbmcgYWFib3ggYnkgYSBzcGVjaWZpZWQgc2l6ZSBpbiBlYWNoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCAgICAgICAgYm91bmRzIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgb3BlcmF0aW9uIGluXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggICAgICAgIHN0YXJ0aW5nIGJvdW5kcyB0byBleHBhbmRcbiAqIEBwYXJhbSAge1ZlYzJkfSBleHBhbmRTaXplICAgc2l6ZSB0byBleHBhbmQgaW4gZWFjaCBkaW1lbnNpb25cbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICAgICAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgdGhlIG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZChvdXQsIGJveCwgZXhwYW5kU2l6ZSkge1xuICBvdXRbTUlOWF0gPSBib3hbTUlOWF0gLSBleHBhbmRTaXplWzBdXG4gIG91dFtNQVhYXSA9IGJveFtNQVhYXSArIGV4cGFuZFNpemVbMF1cbiAgb3V0W01JTlldID0gYm94W01JTlldIC0gZXhwYW5kU2l6ZVsxXVxuICBvdXRbTUFYWV0gPSBib3hbTUFYWV0gKyBleHBhbmRTaXplWzFdXG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGFyZWEgb2YgYW4gZXhpc3RpbmcgYWFib3hcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgYXJlYSBvZiB0aGUgYm91bmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVhKGJveCkge1xuICByZXR1cm4gKGJveFtNQVhYXSAtIGJveFtNSU5YXSkgKiAoYm94W01BWFldIC0gYm94W01JTlldKVxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGh1bGwgb2YgdHdvIGFhYm94ZXMuIFRoZSBodWxsIGlzIHRoZSBzbWFsbGVzdCBib3VuZHMgdGhhdCBjb250YWluc1xuICogYm90aCBvZiB0aGUgYWFib3hlc1xuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0IGJvdW5kcyB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIG9wZXJhdGlvbiBpblxuICogQHBhcmFtICB7QUFCb3gyZH0gYVxuICogQHBhcmFtICB7QUFCb3gyZH0gYlxuICogQHJldHVybiB7QUFCb3gyZH0gICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh1bGwob3V0LCBhLCBiKSB7XG4gIHJldHVybiBjcmVhdGUoTWF0aC5taW4oYVtNSU5YXSwgYltNSU5YXSksIE1hdGgubWluKGFbTUlOWV0sIGJbTUlOWV0pLCBNYXRoLm1heChhW01BWFhdLCBiW01BWFhdKSwgTWF0aC5tYXgoYVtNQVhZXSwgYltNQVhZXSkpXG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBleGlzdGluZyBib3VuZHMuXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgYm91bmRzIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgb3BlcmF0aW9uIGluXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBhXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBiXG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKG91dCwgYSwgYikge1xuICBsZXQgYm94VG9Vc2UgPSBvdXRcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIGJveFRvVXNlID0gY3JlYXRlKClcbiAgfVxuXG4gIGxldCBtaW5pbmRleCA9IE1JTlhcbiAgbGV0IG1heGluZGV4ID0gTUFYWFxuICBmb3IgKDsgbWluaW5kZXggPD0gTUlOWTsgbWluaW5kZXggKz0gMSwgbWF4aW5kZXggKz0gMSkge1xuICAgIGlmIChhW21heGluZGV4XSA8IGJbbWluaW5kZXhdIHx8IGFbbWluaW5kZXhdID4gYlttYXhpbmRleF0pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgYm94VG9Vc2VbbWluaW5kZXhdID0gTWF0aC5tYXgoYVttaW5pbmRleF0sIGJbbWluaW5kZXhdKVxuICAgIGJveFRvVXNlW21heGluZGV4XSA9IE1hdGgubWluKGFbbWF4aW5kZXhdLCBiW21heGluZGV4XSlcbiAgfVxuXG4gIGlmIChtaW5pbmRleCAhPT0gTUlOWSArIDEpIHtcbiAgICBpbml0RW1wdHkoYm94VG9Vc2UpXG4gIH1cblxuICBpZiAob3V0ID09PSBhKSB7XG4gICAgY29weShvdXQsIGJveFRvVXNlKVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvbmUgYm91bmRzIG92ZXJsYXBzIGFub3RoZXIgaW4gYW55IHdheSAobm9uLWluY2x1c2l2ZSkuXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBhXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgIFJldHVybnMgdHJ1ZSBpZiBhIG92ZXJsYXBzIGIsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcmxhcHMoYSwgYikge1xuICByZXR1cm4gIShhW01BWFhdIDw9IGJbTUlOWF0gfHwgYVtNSU5YXSA+PSBiW01BWFhdIHx8IGFbTUFYWV0gPD0gYltNSU5ZXSB8fCBhW01JTlldID49IGJbTUFYWV0pXG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9uZSBib3VuZHMgZnVsbCBjb250YWlucyBhbm90aGVyIChpbmNsdXNpdmUpLlxuICogQHBhcmFtICB7QUFCb3gyZH0gYVxuICogQHBhcmFtICB7QUFCb3gyZH0gYlxuICogQHJldHVybiB7Qm9vbGVhbn0gICB0cnVlIGlmIGEgZnVsbHkgY29udGFpbnMgYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zKGEsIGIpIHtcbiAgcmV0dXJuICEoYltNSU5YXSA8IGFbTUlOWF0gfHwgYltNQVhYXSA+IGFbTUFYWF0gfHwgYltNSU5ZXSA8IGFbTUlOWV0gfHwgYltNQVhZXSA+IGFbTUFYWV0pXG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIGV4aXN0aW5nIGJvdW5kcyBjb250YWlucyBhIHNwZWNpZmljIHBvaW50IChpbmNsdXNpdmUpXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3hcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0XG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgUmV0dXJucyB0cnVlIGlmIHB0IGlzIGluc2lkZSBvZiBib3gsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNQdChib3gsIHB0KSB7XG4gIHJldHVybiAocHRbTUlOWF0gPj0gYm94W01JTlhdICYmIHB0W01JTlhdIDw9IGJveFtNQVhYXSAmJiBwdFtNSU5ZXSA+PSBib3hbTUlOWV0gJiYgcHRbTUlOWV0gPD0gYm94W01BWFldKVxufVxuXG4vKipcbiAqIEV4dGVuZHMgYW4gZXhpc3RpbmcgYm91bmRzIHNvIHRoYXQgaXQgd291bGQgY29udGFpbiBhIHNwZWNpZmljIHBvaW50XG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgQm91bmRzIGNvbnRhaW5pbmcgdGhlIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCBTdGFydGluZyBib3VuZHMgdG8gcG9zc2libHkgZXh0ZW5kXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwdCAgUG9pbnQgdG8gZW5jYXBzdWxhdGUgaW4gYm94XG4gKiBAcmV0dXJuIHtBQWJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jYXBzdWxhdGVQdChvdXQsIGJveCwgcHQpIHtcbiAgaWYgKG91dCAhPT0gYm94KSB7XG4gICAgY29weShvdXQsIGJveClcbiAgfVxuICBpZiAoaXNFbXB0eShib3gpKSB7XG4gICAgb3V0W01JTlhdID0gcHRbTUlOWF1cbiAgICBvdXRbTUFYWF0gPSBwdFtNSU5YXVxuICAgIG91dFtNSU5ZXSA9IHB0W01JTlldXG4gICAgb3V0W01BWFldID0gcHRbTUlOWV1cbiAgfSBlbHNlIHtcbiAgICBpZiAocHRbTUlOWF0gPCBvdXRbTUlOWF0pIHtcbiAgICAgIG91dFtNSU5YXSA9IHB0W01JTlhdXG4gICAgfSBlbHNlIGlmIChwdFtNSU5YXSA+IG91dFtNQVhYXSkge1xuICAgICAgb3V0W01BWFhdID0gcHRbTUlOWF1cbiAgICB9XG5cbiAgICBpZiAocHRbTUlOWV0gPCBvdXRbTUlOWV0pIHtcbiAgICAgIG91dFtNSU5ZXSA9IHB0W01JTlldXG4gICAgfSBlbHNlIGlmIChwdFtNSU5ZXSA+IG91dFtNQVhZXSkge1xuICAgICAgb3V0W01BWFldID0gcHRbTUlOWV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFRyYW5zbGF0ZXMgYW4gZXhpc3RpbmcgYm91bmRzIGJ5IGEgc3BlY2lmaWVkIG9mZnNldCBpdCBlYWNoIGRpbWVuc2lvblxuICogQHBhcmFtICB7QUFCb3gyZH0gb3V0IGJvdW5kcyByZXN1bHRpbmcgZnJvbSB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggc3RhcnRpbmcgYm91bmRzXG4gKiBAcGFyYW0gIHtWZWMyZH0gcG9zICAgdHJhbnNsYXRpb24gaW4gZWFjaCBkaW1lbnNpb25cbiAqIEByZXR1cm4ge0FBQm94MmR9ICAgICBib3VuZHMgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBib3gsIHBvcykge1xuICBvdXRbTUlOWF0gPSBib3hbTUlOWF0gKyBwb3NbMF1cbiAgb3V0W01JTlldID0gYm94W01JTlldICsgcG9zWzFdXG4gIG91dFtNQVhYXSA9IGJveFtNQVhYXSArIHBvc1swXVxuICBvdXRbTUFYWV0gPSBib3hbTUFYWV0gKyBwb3NbMV1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtKG91dCwgYm94LCBtYXQsIHhmb3JtRnVuYykge1xuICBsZXQgYm94VG9Vc2UgPSBvdXRcbiAgaWYgKG91dCA9PT0gYm94KSB7XG4gICAgYm94VG9Vc2UgPSBjcmVhdGUoKVxuICB9XG4gIGluaXRFbXB0eShib3hUb1VzZSlcblxuICBjb25zdCBwdDEgPSBWZWMyZC5zZXQoVmVjMmQuY3JlYXRlKCksIGJveFtNSU5YXSwgYm94W01JTlldKVxuICBjb25zdCBwdDIgPSBWZWMyZC5jcmVhdGUoKVxuICB4Zm9ybUZ1bmMocHQyLCBwdDEsIG1hdClcbiAgZW5jYXBzdWxhdGVQdChib3hUb1VzZSwgYm94VG9Vc2UsIHB0MilcbiAgcHQxW01JTlhdID0gYm94W01BWFhdXG4gIHhmb3JtRnVuYyhwdDIsIHB0MSwgbWF0KVxuICBlbmNhcHN1bGF0ZVB0KGJveFRvVXNlLCBib3hUb1VzZSwgcHQyKVxuICBwdDFbTUlOWV0gPSBib3hbTUFYWV1cbiAgeGZvcm1GdW5jKHB0MiwgcHQxLCBtYXQpXG4gIGVuY2Fwc3VsYXRlUHQoYm94VG9Vc2UsIGJveFRvVXNlLCBwdDIpXG4gIHB0MVtNSU5YXSA9IGJveFtNSU5YXVxuICB4Zm9ybUZ1bmMocHQyLCBwdDEsIG1hdClcbiAgZW5jYXBzdWxhdGVQdChib3hUb1VzZSwgYm94VG9Vc2UsIHB0MilcbiAgaWYgKG91dCA9PT0gYm94KSB7XG4gICAgY29weShvdXQsIGJveFRvVXNlKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGFuIGV4aXN0aW5nIGJvdW5kcyBieSBhIDJ4MiBtYXRyaXhcbiAqIEBwYXJhbSAge0FBQm94MmR9IG91dCBib3VuZHMgdG8gY29udGFpbiB0aGUgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtICB7QUFCb3gyZH0gYm94IGJvdW5kcyB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSAge01hdDJ9IG1hdCAyeDIgbWF0cml4IHRyYW5zZm9ybWF0aW9uXG4gKiBAcmV0dXJuIHtBQUJveDJkfSAgICAgYm91bmRzIHJlZmVyZW5jZWQgYnkgb3V0IGFyZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MihvdXQsIGJveCwgbWF0KSB7XG4gIHJldHVybiB0cmFuc2Zvcm0ob3V0LCBib3gsIG1hdCwgVmVjMmQudHJhbnNmb3JtTWF0Milcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGFuIGV4aXN0aW5nIGJvdW5kcyBieSBhIDJ4MyBtYXRyaXguXG4gKiBBIDJ4MyBtYXRyaXggaXMgYSAyeDIgbWF0cml4IHdpdGggYSB0cmFuc2xhdGlvbiBjb21wb25lbnQuXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBvdXQgYm91bmRzIHRvIGhvbGQgdGhlIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSAge0FBQm94MmR9IGJveCBib3VuZHMgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0gIHtNYXQyZH0gbWF0ICAgMngzIG1hdHJpeFxuICogQHJldHVybiB7QUFCb3gyZH0gICAgIGJvdW5kcyByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYm94LCBtYXQpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybShvdXQsIGJveCwgbWF0LCBWZWMyZC50cmFuc2Zvcm1NYXQyZClcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvcmUvYWFib3gyZC5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 3 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\n/**\n * @class Common utilities\n * @name glMatrix\n */\nvar glMatrix = {};\n\n// Configuration Constants\nglMatrix.EPSILON = 0.000001;\nglMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array;\nglMatrix.RANDOM = Math.random;\nglMatrix.ENABLE_SIMD = false;\n\n// Capability detection\nglMatrix.SIMD_AVAILABLE = (glMatrix.ARRAY_TYPE === Float32Array) && ('SIMD' in this);\nglMatrix.USE_SIMD = glMatrix.ENABLE_SIMD && glMatrix.SIMD_AVAILABLE;\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\nglMatrix.setMatrixArrayType = function(type) {\n glMatrix.ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n\n/**\n* Convert Degree To Radian\n*\n* @param {Number} Angle in Degrees\n*/\nglMatrix.toRadian = function(a){\n return a * degree;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less \n * than or equal to 1.0, and a relative tolerance is used for larger values)\n * \n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nglMatrix.equals = function(a, b) {\n\treturn Math.abs(a - b) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n\nmodule.exports = glMatrix;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9jb21tb24uanM/N2NhYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyBDb21tb24gdXRpbGl0aWVzXG4gKiBAbmFtZSBnbE1hdHJpeFxuICovXG52YXIgZ2xNYXRyaXggPSB7fTtcblxuLy8gQ29uZmlndXJhdGlvbiBDb25zdGFudHNcbmdsTWF0cml4LkVQU0lMT04gPSAwLjAwMDAwMTtcbmdsTWF0cml4LkFSUkFZX1RZUEUgPSAodHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpID8gRmxvYXQzMkFycmF5IDogQXJyYXk7XG5nbE1hdHJpeC5SQU5ET00gPSBNYXRoLnJhbmRvbTtcbmdsTWF0cml4LkVOQUJMRV9TSU1EID0gZmFsc2U7XG5cbi8vIENhcGFiaWxpdHkgZGV0ZWN0aW9uXG5nbE1hdHJpeC5TSU1EX0FWQUlMQUJMRSA9IChnbE1hdHJpeC5BUlJBWV9UWVBFID09PSBGbG9hdDMyQXJyYXkpICYmICgnU0lNRCcgaW4gdGhpcyk7XG5nbE1hdHJpeC5VU0VfU0lNRCA9IGdsTWF0cml4LkVOQUJMRV9TSU1EICYmIGdsTWF0cml4LlNJTURfQVZBSUxBQkxFO1xuXG4vKipcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuICpcbiAqIEBwYXJhbSB7VHlwZX0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxuICovXG5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgZ2xNYXRyaXguQVJSQVlfVFlQRSA9IHR5cGU7XG59XG5cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuXG4vKipcbiogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4qXG4qIEBwYXJhbSB7TnVtYmVyfSBBbmdsZSBpbiBEZWdyZWVzXG4qL1xuZ2xNYXRyaXgudG9SYWRpYW4gPSBmdW5jdGlvbihhKXtcbiAgICAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgdGhlIGFyZ3VtZW50cyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdmFsdWUsIHdpdGhpbiBhbiBhYnNvbHV0ZVxuICogb3IgcmVsYXRpdmUgdG9sZXJhbmNlIG9mIGdsTWF0cml4LkVQU0lMT04gKGFuIGFic29sdXRlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciB2YWx1ZXMgbGVzcyBcbiAqIHRoYW4gb3IgZXF1YWwgdG8gMS4wLCBhbmQgYSByZWxhdGl2ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgbGFyZ2VyIHZhbHVlcylcbiAqIFxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IG51bWJlciB0byB0ZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCBudW1iZXIgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXJzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmdsTWF0cml4LmVxdWFscyA9IGZ1bmN0aW9uKGEsIGIpIHtcblx0cmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnbE1hdHJpeDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvY29tbW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.sqrDist = exports.dist = undefined;\nexports.set = set;\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.initFromValues = initFromValues;\nexports.addVec2 = addVec2;\nexports.sub = sub;\nexports.transformMat2 = transformMat2;\nexports.transformMat2d = transformMat2d;\nexports.str = str;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.lerp = lerp;\nexports.equals = equals;\nexports.exactEquals = exactEquals;\n\nvar _glMatrix = __webpack_require__(1);\n\nvar X = 0;\nvar Y = 1;\n\n/**\n * Sets the coordinates of a 2D point\n * @param {Point2d} out Point to set\n * @param {Number} [x = 0] X coordinate\n * @param {Number} [y = 0] Y coordinate\n * @return {Point2d} Point referenced by out arg\n */\nfunction set(out) {\n var x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var y = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n out[X] = x;\n out[Y] = y;\n return out;\n}\n\n/**\n * Creates a new Point2d object\n * @param {Number} [x = 0] X coordinate\n * @param {Number} [y = 0] Y coordinate\n * @return {Point2d}\n */\nfunction create() {\n var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(2);\n return set(out, x, y);\n}\n\n/**\n * Creates a new Point2d object with coordinates initialized from an existing point.\n * @param {Point2d} p\n * @return {Point2d}\n */\nfunction clone(p) {\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(2);\n out[X] = p[X];\n out[Y] = p[Y];\n return out;\n}\n\n/**\n * Copies the coordinates of one point to another.\n * @param {Point2d} out The point to copy to\n * @param {Point2d} p The point to copy from\n * @return {Point2d} Point referenced by out arg\n */\nfunction copy(out, p) {\n out[X] = p[X];\n out[Y] = p[Y];\n return out;\n}\n\n/**\n * Creates a new point from coordinates\n * @param {Number} x X coordinate\n * @param {Number} y Y coordinate\n * @return {Point2d} New point\n */\nfunction initFromValues(x, y) {\n return create(x, y);\n}\n\n/**\n * Adds a 2d offset to an existing point\n * @param {Point2d} out Point receiving the operation result\n * @param {Point2d} pt Existing point\n * @param {Vec2d} v Vector describing the offset\n * @return {Point2d} Point referenced by out arg\n */\nfunction addVec2(out, pt, v) {\n return _glMatrix.vec2.add(out, pt, v);\n}\n\n/**\n * Calculates the difference between two points\n * @param {Vec2d} out Vector receiving operation result\n * @param {Point2d} pt1\n * @param {Point2d} pt2\n * @return {Vec2d} Vector referenced by out arg\n */\nfunction sub(out, pt1, pt2) {\n return _glMatrix.vec2.sub(out, pt1, pt2);\n}\n\n/**\n * Performs an 2x2 matrix multiplication on a point\n * @param {Point2d} out Point receiving operation result\n * @param {Point2d} p\n * @param {Mat2} m 2x2 matrix\n * @return {Point2d} Point referenced by out arg\n */\nfunction transformMat2(out, p, m) {\n return _glMatrix.vec2.transformMat2(out, p, m);\n}\n\n/**\n * Performs a 2x3 matrix multiplication on a point.\n * A 2x3 matrix is ultimately a 2x2 matrix with a\n * translation component\n * @param {Point2d} out Point receiving operation result\n * @param {Point2d} p\n * @param {Mat2d} m 2x3 matrix\n * @return {Point2d} Point referenced by out arg\n */\nfunction transformMat2d(out, p, m) {\n return _glMatrix.vec2.transformMat2d(out, p, m);\n}\n\n/**\n * Creates a string representation of a point\n * @param {Point2d} p\n * @return {string}\n */\nfunction str(p) {\n return \"point2d(\" + p[0] + \" , \" + p[1] + \")\";\n}\n\n/**\n * Computes the distance between two 2d points\n * @param {Point2d} p1\n * @param {Point2d} p2\n * @return {Number}\n */\nfunction distance(p1, p2) {\n return _glMatrix.vec2.distance(p1, p2);\n}\n\nvar dist = exports.dist = distance;\n\n/**\n * Returns the squared distance between two points.\n * This is a cheaper operation than the true distance\n * calculation.\n * @param {Point2d} p1\n * @param {Point2d} p2\n * @return {Number} distance^2\n */\nfunction squaredDistance(p1, p2) {\n return _glMatrix.vec2.squaredDistance(p1, p2);\n}\n\nvar sqrDist = exports.sqrDist = squaredDistance;\n\n/**\n * Calculates the point linearly interpolated\n * between two points according to the relative operator t\n * [t == 0 = p1 & t == 1 = p2]\n * @param {Point2d} out Point receiving result of operation\n * @param {Point2d} p1 Start point (t = 0)\n * @param {Point2d} p2 End point (t = 1)\n * @param {[type]} t Interpolate parameter [0, 1]\n * @return {Point2d} Point referenced by out arg\n */\nfunction lerp(out, p1, p2, t) {\n return _glMatrix.vec2.lerp(out, p1, p2, t);\n}\n\n/**\n * Returns whether two points are relatively equal\n * @param {Point2d} a\n * @param {Point2d} b\n * @return {Boolean} Returns true if two point are relatively equal, false otherwise\n */\nfunction equals(a, b) {\n return _glMatrix.vec2.equals(a, b);\n}\n\n/**\n * Returns whether two points are exactly equal.\n * @param {Point2d} a\n * @param {Point2d} b\n * @return {Boolean} Returns true if the two points are exactly equal, false otherwise\n */\nfunction exactEquals(a, b) {\n return _glMatrix.vec2.exactEquals(a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL3BvaW50MmQuanM/NzNlMyJdLCJuYW1lcyI6WyJzZXQiLCJjcmVhdGUiLCJjbG9uZSIsImNvcHkiLCJpbml0RnJvbVZhbHVlcyIsImFkZFZlYzIiLCJzdWIiLCJ0cmFuc2Zvcm1NYXQyIiwidHJhbnNmb3JtTWF0MmQiLCJzdHIiLCJkaXN0YW5jZSIsInNxdWFyZWREaXN0YW5jZSIsImxlcnAiLCJlcXVhbHMiLCJleGFjdEVxdWFscyIsIlgiLCJZIiwib3V0IiwieCIsInkiLCJnbE1hdHJpeCIsIkFSUkFZX1RZUEUiLCJwIiwicHQiLCJ2IiwiVmVjMiIsImFkZCIsInB0MSIsInB0MiIsIm0iLCJwMSIsInAyIiwiZGlzdCIsInNxckRpc3QiLCJ0IiwiYSIsImIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7UUFjZ0JBLEcsR0FBQUEsRztRQVlBQyxNLEdBQUFBLE07UUFVQUMsSyxHQUFBQSxLO1FBYUFDLEksR0FBQUEsSTtRQVlBQyxjLEdBQUFBLGM7UUFXQUMsTyxHQUFBQSxPO1FBV0FDLEcsR0FBQUEsRztRQVdBQyxhLEdBQUFBLGE7UUFhQUMsYyxHQUFBQSxjO1FBU0FDLEcsR0FBQUEsRztRQVVBQyxRLEdBQUFBLFE7UUFjQUMsZSxHQUFBQSxlO1FBZ0JBQyxJLEdBQUFBLEk7UUFVQUMsTSxHQUFBQSxNO1FBVUFDLFcsR0FBQUEsVzs7QUE5S2hCOztBQUVBLElBQU1DLElBQUksQ0FBVjtBQUNBLElBQU1DLElBQUksQ0FBVjs7QUFFQTs7Ozs7OztBQU9PLFNBQVNoQixHQUFULENBQWFpQixHQUFiLEVBQWdDO0FBQUEsTUFBZEMsQ0FBYyx1RUFBVixDQUFVO0FBQUEsTUFBUEMsQ0FBTyx1RUFBSCxDQUFHOztBQUNyQ0YsTUFBSUYsQ0FBSixJQUFTRyxDQUFUO0FBQ0FELE1BQUlELENBQUosSUFBU0csQ0FBVDtBQUNBLFNBQU9GLEdBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTU8sU0FBU2hCLE1BQVQsR0FBOEI7QUFBQSxNQUFkaUIs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QW5CLEVBQXNCO0FBQzNCLFNBQU9YLGVBQUtaLE1BQUwsQ0FBWXNCLENBQVosRUFBZUMsQ0FBZixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7OztBQU1PLFNBQVN0QixXQUFULENBQXFCcUIsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCO0FBQ2hDLFNBQU9YLGVBQUtYLFdBQUwsQ0FBaUJxQixDQUFqQixFQUFvQkMsQ0FBcEIsQ0FBUDtBQUNEIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQge2dsTWF0cml4LCB2ZWMyIGFzIFZlYzJ9IGZyb20gXCJnbC1tYXRyaXhcIlxuXG5jb25zdCBYID0gMFxuY29uc3QgWSA9IDFcblxuLyoqXG4gKiBTZXRzIHRoZSBjb29yZGluYXRlcyBvZiBhIDJEIHBvaW50XG4gKiBAcGFyYW0ge1BvaW50MmR9IG91dCBQb2ludCB0byBzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeCA9IDBdICAgWCBjb29yZGluYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3kgPSAwXSAgIFkgY29vcmRpbmF0ZVxuICogQHJldHVybiB7UG9pbnQyZH0gICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4ID0gMCwgeSA9IDApIHtcbiAgb3V0W1hdID0geFxuICBvdXRbWV0gPSB5XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFBvaW50MmQgb2JqZWN0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt4ID0gMF0gWCBjb29yZGluYXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt5ID0gMF0gWSBjb29yZGluYXRlXG4gKiBAcmV0dXJuIHtQb2ludDJkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKHggPSAwLCB5ID0gMCkge1xuICBjb25zdCBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKVxuICByZXR1cm4gc2V0KG91dCwgeCwgeSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFBvaW50MmQgb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgaW5pdGlhbGl6ZWQgZnJvbSBhbiBleGlzdGluZyBwb2ludC5cbiAqIEBwYXJhbSAge1BvaW50MmR9IHBcbiAqIEByZXR1cm4ge1BvaW50MmR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShwKSB7XG4gIGNvbnN0IG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpXG4gIG91dFtYXSA9IHBbWF1cbiAgb3V0W1ldID0gcFtZXVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBjb29yZGluYXRlcyBvZiBvbmUgcG9pbnQgdG8gYW5vdGhlci5cbiAqIEBwYXJhbSAge1BvaW50MmR9IG91dCBUaGUgcG9pbnQgdG8gY29weSB0b1xuICogQHBhcmFtICB7UG9pbnQyZH0gcCAgIFRoZSBwb2ludCB0byBjb3B5IGZyb21cbiAqIEByZXR1cm4ge1BvaW50MmR9ICAgICBQb2ludCByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBwKSB7XG4gIG91dFtYXSA9IHBbWF1cbiAgb3V0W1ldID0gcFtZXVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwb2ludCBmcm9tIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggWCBjb29yZGluYXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgWSBjb29yZGluYXRlXG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgIE5ldyBwb2ludFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEZyb21WYWx1ZXMoeCwgeSkge1xuICByZXR1cm4gY3JlYXRlKHgsIHkpXG59XG5cbi8qKlxuICogQWRkcyBhIDJkIG9mZnNldCB0byBhbiBleGlzdGluZyBwb2ludFxuICogQHBhcmFtIHtQb2ludDJkfSBvdXQgUG9pbnQgcmVjZWl2aW5nIHRoZSBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1BvaW50MmR9IHB0ICBFeGlzdGluZyBwb2ludFxuICogQHBhcmFtIHtWZWMyZH0gdiAgIFZlY3RvciBkZXNjcmliaW5nIHRoZSBvZmZzZXRcbiAqIEByZXR1cm4ge1BvaW50MmR9ICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRWZWMyKG91dCwgcHQsIHYpIHtcbiAgcmV0dXJuIFZlYzIuYWRkKG91dCwgcHQsIHYpXG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSAge1ZlYzJkfSBvdXQgVmVjdG9yIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwdDFcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0MlxuICogQHJldHVybiB7VmVjMmR9ICAgICBWZWN0b3IgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWIob3V0LCBwdDEsIHB0Mikge1xuICByZXR1cm4gVmVjMi5zdWIob3V0LCBwdDEsIHB0Milcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhbiAyeDIgbWF0cml4IG11bHRpcGxpY2F0aW9uIG9uIGEgcG9pbnRcbiAqIEBwYXJhbSAge1BvaW50MmR9IG91dCBQb2ludCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtICB7UG9pbnQyZH0gcFxuICogQHBhcmFtICB7TWF0Mn0gbSAyeDIgbWF0cml4XG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgcCwgbSkge1xuICByZXR1cm4gVmVjMi50cmFuc2Zvcm1NYXQyKG91dCwgcCwgbSlcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIDJ4MyBtYXRyaXggbXVsdGlwbGljYXRpb24gb24gYSBwb2ludC5cbiAqIEEgMngzIG1hdHJpeCBpcyB1bHRpbWF0ZWx5IGEgMngyIG1hdHJpeCB3aXRoIGFcbiAqIHRyYW5zbGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtICB7UG9pbnQyZH0gb3V0IFBvaW50IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwXG4gKiBAcGFyYW0gIHtNYXQyZH0gbSAgIDJ4MyBtYXRyaXhcbiAqIEByZXR1cm4ge1BvaW50MmR9ICAgICBQb2ludCByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgcCwgbSkge1xuICByZXR1cm4gVmVjMi50cmFuc2Zvcm1NYXQyZChvdXQsIHAsIG0pXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHBvaW50XG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIocCkge1xuICByZXR1cm4gYHBvaW50MmQoJHtwWzBdfSAsICR7cFsxXX0pYFxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byAyZCBwb2ludHNcbiAqIEBwYXJhbSAge1BvaW50MmR9IHAxXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwMlxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UocDEsIHAyKSB7XG4gIHJldHVybiBWZWMyLmRpc3RhbmNlKHAxLCBwMilcbn1cblxuZXhwb3J0IGNvbnN0IGRpc3QgPSBkaXN0YW5jZVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxuICogVGhpcyBpcyBhIGNoZWFwZXIgb3BlcmF0aW9uIHRoYW4gdGhlIHRydWUgZGlzdGFuY2VcbiAqIGNhbGN1bGF0aW9uLlxuICogQHBhcmFtICB7UG9pbnQyZH0gcDFcbiAqIEBwYXJhbSAge1BvaW50MmR9IHAyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIGRpc3RhbmNlXjJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShwMSwgcDIpIHtcbiAgcmV0dXJuIFZlYzIuc3F1YXJlZERpc3RhbmNlKHAxLCBwMilcbn1cblxuZXhwb3J0IGNvbnN0IHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2VcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwb2ludCBsaW5lYXJseSBpbnRlcnBvbGF0ZWRcbiAqIGJldHdlZW4gdHdvIHBvaW50cyBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aXZlIG9wZXJhdG9yIHRcbiAqIFt0ID09IDAgPSBwMSAmIHQgPT0gMSA9IHAyXVxuICogQHBhcmFtICB7UG9pbnQyZH0gb3V0IFBvaW50IHJlY2VpdmluZyByZXN1bHQgb2Ygb3BlcmF0aW9uXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwMSAgU3RhcnQgcG9pbnQgKHQgPSAwKVxuICogQHBhcmFtICB7UG9pbnQyZH0gcDIgIEVuZCBwb2ludCAodCA9IDEpXG4gKiBAcGFyYW0gIHtbdHlwZV19IHQgICBJbnRlcnBvbGF0ZSBwYXJhbWV0ZXIgWzAsIDFdXG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiBWZWMyLmxlcnAob3V0LCBwMSwgcDIsIHQpXG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHR3byBwb2ludHMgYXJlIHJlbGF0aXZlbHkgZXF1YWxcbiAqIEBwYXJhbSAge1BvaW50MmR9IGFcbiAqIEBwYXJhbSAge1BvaW50MmR9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgUmV0dXJucyB0cnVlIGlmIHR3byBwb2ludCBhcmUgcmVsYXRpdmVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gVmVjMi5lcXVhbHMoYSwgYilcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdHdvIHBvaW50cyBhcmUgZXhhY3RseSBlcXVhbC5cbiAqIEBwYXJhbSAge1BvaW50MmR9IGFcbiAqIEBwYXJhbSAge1BvaW50MmR9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcG9pbnRzIGFyZSBleGFjdGx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIFZlYzIuZXhhY3RFcXVhbHMoYSwgYilcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvcmUvcG9pbnQyZC5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 4 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.sqrDist = exports.dist = undefined;\nexports.set = set;\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.initFromValues = initFromValues;\nexports.addVec2 = addVec2;\nexports.sub = sub;\nexports.transformMat2 = transformMat2;\nexports.transformMat2d = transformMat2d;\nexports.str = str;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.lerp = lerp;\nexports.equals = equals;\nexports.exactEquals = exactEquals;\n\nvar _glMatrix = __webpack_require__(1);\n\nvar X = 0;\nvar Y = 1;\n\n/**\n * Sets the coordinates of a 2D point\n * @param {Point2d} out Point to set\n * @param {Number} [x = 0] X coordinate\n * @param {Number} [y = 0] Y coordinate\n * @return {Point2d} Point referenced by out arg\n */\nfunction set(out) {\n var x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var y = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n out[X] = x;\n out[Y] = y;\n return out;\n}\n\n/**\n * Creates a new Point2d object\n * @param {Number} [x = 0] X coordinate\n * @param {Number} [y = 0] Y coordinate\n * @return {Point2d}\n */\nfunction create() {\n var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(2);\n return set(out, x, y);\n}\n\n/**\n * Creates a new Point2d object with coordinates initialized from an existing point.\n * @param {Point2d} p\n * @return {Point2d}\n */\nfunction clone(p) {\n var out = new _glMatrix.glMatrix.ARRAY_TYPE(2);\n out[X] = p[X];\n out[Y] = p[Y];\n return out;\n}\n\n/**\n * Copies the coordinates of one point to another.\n * @param {Point2d} out The point to copy to\n * @param {Point2d} p The point to copy from\n * @return {Point2d} Point referenced by out arg\n */\nfunction copy(out, p) {\n out[X] = p[X];\n out[Y] = p[Y];\n return out;\n}\n\n/**\n * Creates a new point from coordinates\n * @param {Number} x X coordinate\n * @param {Number} y Y coordinate\n * @return {Point2d} New point\n */\nfunction initFromValues(x, y) {\n return create(x, y);\n}\n\n/**\n * Adds a 2d offset to an existing point\n * @param {Point2d} out Point receiving the operation result\n * @param {Point2d} pt Existing point\n * @param {Vec2d} v Vector describing the offset\n * @return {Point2d} Point referenced by out arg\n */\nfunction addVec2(out, pt, v) {\n return _glMatrix.vec2.add(out, pt, v);\n}\n\n/**\n * Calculates the difference between two points\n * @param {Vec2d} out Vector receiving operation result\n * @param {Point2d} pt1\n * @param {Point2d} pt2\n * @return {Vec2d} Vector referenced by out arg\n */\nfunction sub(out, pt1, pt2) {\n return _glMatrix.vec2.sub(out, pt1, pt2);\n}\n\n/**\n * Performs an 2x2 matrix multiplication on a point\n * @param {Point2d} out Point receiving operation result\n * @param {Point2d} p\n * @param {Mat2} m 2x2 matrix\n * @return {Point2d} Point referenced by out arg\n */\nfunction transformMat2(out, p, m) {\n return _glMatrix.vec2.transformMat2(out, p, m);\n}\n\n/**\n * Performs a 2x3 matrix multiplication on a point.\n * A 2x3 matrix is ultimately a 2x2 matrix with a\n * translation component\n * @param {Point2d} out Point receiving operation result\n * @param {Point2d} p\n * @param {Mat2d} m 2x3 matrix\n * @return {Point2d} Point referenced by out arg\n */\nfunction transformMat2d(out, p, m) {\n return _glMatrix.vec2.transformMat2d(out, p, m);\n}\n\n/**\n * Creates a string representation of a point\n * @param {Point2d} p\n * @return {string}\n */\nfunction str(p) {\n return \"point2d(\" + p[0] + \" , \" + p[1] + \")\";\n}\n\n/**\n * Computes the distance between two 2d points\n * @param {Point2d} p1\n * @param {Point2d} p2\n * @return {Number}\n */\nfunction distance(p1, p2) {\n return _glMatrix.vec2.distance(p1, p2);\n}\n\nvar dist = exports.dist = distance;\n\n/**\n * Returns the squared distance between two points.\n * This is a cheaper operation than the true distance\n * calculation.\n * @param {Point2d} p1\n * @param {Point2d} p2\n * @return {Number} distance^2\n */\nfunction squaredDistance(p1, p2) {\n return _glMatrix.vec2.squaredDistance(p1, p2);\n}\n\nvar sqrDist = exports.sqrDist = squaredDistance;\n\n/**\n * Calculates the point linearly interpolated\n * between two points according to the relative operator t\n * [t == 0 = p1 & t == 1 = p2]\n * @param {Point2d} out Point receiving result of operation\n * @param {Point2d} p1 Start point (t = 0)\n * @param {Point2d} p2 End point (t = 1)\n * @param {[type]} t Interpolate parameter [0, 1]\n * @return {Point2d} Point referenced by out arg\n */\nfunction lerp(out, p1, p2, t) {\n return _glMatrix.vec2.lerp(out, p1, p2, t);\n}\n\n/**\n * Returns whether two points are relatively equal\n * @param {Point2d} a\n * @param {Point2d} b\n * @return {Boolean} Returns true if two point are relatively equal, false otherwise\n */\nfunction equals(a, b) {\n return _glMatrix.vec2.equals(a, b);\n}\n\n/**\n * Returns whether two points are exactly equal.\n * @param {Point2d} a\n * @param {Point2d} b\n * @return {Boolean} Returns true if the two points are exactly equal, false otherwise\n */\nfunction exactEquals(a, b) {\n return _glMatrix.vec2.exactEquals(a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL3BvaW50MmQuanM/NzNlMyJdLCJuYW1lcyI6WyJzZXQiLCJjcmVhdGUiLCJjbG9uZSIsImNvcHkiLCJpbml0RnJvbVZhbHVlcyIsImFkZFZlYzIiLCJzdWIiLCJ0cmFuc2Zvcm1NYXQyIiwidHJhbnNmb3JtTWF0MmQiLCJzdHIiLCJkaXN0YW5jZSIsInNxdWFyZWREaXN0YW5jZSIsImxlcnAiLCJlcXVhbHMiLCJleGFjdEVxdWFscyIsIlgiLCJZIiwib3V0IiwieCIsInkiLCJBUlJBWV9UWVBFIiwicCIsInB0IiwidiIsImFkZCIsInB0MSIsInB0MiIsIm0iLCJwMSIsInAyIiwiZGlzdCIsInNxckRpc3QiLCJ0IiwiYSIsImIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7UUFjZ0JBLEcsR0FBQUEsRztRQVlBQyxNLEdBQUFBLE07UUFVQUMsSyxHQUFBQSxLO1FBYUFDLEksR0FBQUEsSTtRQVlBQyxjLEdBQUFBLGM7UUFXQUMsTyxHQUFBQSxPO1FBV0FDLEcsR0FBQUEsRztRQVdBQyxhLEdBQUFBLGE7UUFhQUMsYyxHQUFBQSxjO1FBU0FDLEcsR0FBQUEsRztRQVVBQyxRLEdBQUFBLFE7UUFjQUMsZSxHQUFBQSxlO1FBZ0JBQyxJLEdBQUFBLEk7UUFVQUMsTSxHQUFBQSxNO1FBVUFDLFcsR0FBQUEsVzs7QUE5S2hCOztBQUVBLElBQU1DLElBQUksQ0FBVjtBQUNBLElBQU1DLElBQUksQ0FBVjs7QUFFQTs7Ozs7OztBQU9PLFNBQVNoQixHQUFULENBQWFpQixHQUFiLEVBQWdDO0FBQUEsTUFBZEMsQ0FBYyx1RUFBVixDQUFVO0FBQUEsTUFBUEMsQ0FBTyx1RUFBSCxDQUFHOztBQUNyQ0YsTUFBSUYsQ0FBSixJQUFTRyxDQUFUO0FBQ0FELE1BQUlELENBQUosSUFBU0csQ0FBVDtBQUNBLFNBQU9GLEdBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTU8sU0FBU2hCLE1BQVQsR0FBOEI7QUFBQSxNQUFkaUIsQ0FBYyx1RUFBVixDQUFVO0FBQUEsTUFBUEMsQ0FBTyx1RUFBSCxDQUFHOztBQUNuQyxNQUFNRixNQUFNLElBQUksbUJBQVNHLFVBQWIsQ0FBd0IsQ0FBeEIsQ0FBWjtBQUNBLFNBQU9wQixJQUFJaUIsR0FBSixFQUFTQyxDQUFULEVBQVlDLENBQVosQ0FBUDtBQUNEOztBQUVEOzs7OztBQUtPLFNBQVNqQixLQUFULENBQWVtQixDQUFmLEVBQWtCO0FBQ3ZCLE1BQU1KLE1BQU0sSUFBSSxtQkFBU0csVUFBYixDQUF3QixDQUF4QixDQUFaO0FBQ0FILE1BQUlGLENBQUosSUFBU00sRUFBRU4sQ0FBRixDQUFUO0FBQ0FFLE1BQUlELENBQUosSUFBU0ssRUFBRUwsQ0FBRixDQUFUO0FBQ0EsU0FBT0MsR0FBUDtBQUNEOztBQUVEOzs7Ozs7QUFNTyxTQUFTZCxJQUFULENBQWNjLEdBQWQsRUFBbUJJLENBQW5CLEVBQXNCO0FBQzNCSixNQUFJRixDQUFKLElBQVNNLEVBQUVOLENBQUYsQ0FBVDtBQUNBRSxNQUFJRCxDQUFKLElBQVNLLEVBQUVMLENBQUYsQ0FBVDtBQUNBLFNBQU9DLEdBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTU8sU0FBU2IsY0FBVCxDQUF3QmMsQ0FBeEIsRUFBMkJDLENBQTNCLEVBQThCO0FBQ25DLFNBQU9sQixPQUFPaUIsQ0FBUCxFQUFVQyxDQUFWLENBQVA7QUFDRDs7QUFFRDs7Ozs7OztBQU9PLFNBQVNkLE9BQVQsQ0FBaUJZLEdBQWpCLEVBQXNCSyxFQUF0QixFQUEwQkMsQ0FBMUIsRUFBNkI7QUFDbEMsU0FBTyxlQUFLQyxHQUFMLENBQVNQLEdBQVQsRUFBY0ssRUFBZCxFQUFrQkMsQ0FBbEIsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT08sU0FBU2pCLEdBQVQsQ0FBYVcsR0FBYixFQUFrQlEsR0FBbEIsRUFBdUJDLEdBQXZCLEVBQTRCO0FBQ2pDLFNBQU8sZUFBS3BCLEdBQUwsQ0FBU1csR0FBVCxFQUFjUSxHQUFkLEVBQW1CQyxHQUFuQixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPTyxTQUFTbkIsYUFBVCxDQUF1QlUsR0FBdkIsRUFBNEJJLENBQTVCLEVBQStCTSxDQUEvQixFQUFrQztBQUN2QyxTQUFPLGVBQUtwQixhQUFMLENBQW1CVSxHQUFuQixFQUF3QkksQ0FBeEIsRUFBMkJNLENBQTNCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O0FBU08sU0FBU25CLGNBQVQsQ0FBd0JTLEdBQXhCLEVBQTZCSSxDQUE3QixFQUFnQ00sQ0FBaEMsRUFBbUM7QUFDeEMsU0FBTyxlQUFLbkIsY0FBTCxDQUFvQlMsR0FBcEIsRUFBeUJJLENBQXpCLEVBQTRCTSxDQUE1QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7O0FBS08sU0FBU2xCLEdBQVQsQ0FBYVksQ0FBYixFQUFnQjtBQUNyQixzQkFBa0JBLEVBQUUsQ0FBRixDQUFsQixXQUE0QkEsRUFBRSxDQUFGLENBQTVCO0FBQ0Q7O0FBRUQ7Ozs7OztBQU1PLFNBQVNYLFFBQVQsQ0FBa0JrQixFQUFsQixFQUFzQkMsRUFBdEIsRUFBMEI7QUFDL0IsU0FBTyxlQUFLbkIsUUFBTCxDQUFja0IsRUFBZCxFQUFrQkMsRUFBbEIsQ0FBUDtBQUNEOztBQUVNLElBQU1DLHNCQUFPcEIsUUFBYjs7QUFFUDs7Ozs7Ozs7QUFRTyxTQUFTQyxlQUFULENBQXlCaUIsRUFBekIsRUFBNkJDLEVBQTdCLEVBQWlDO0FBQ3RDLFNBQU8sZUFBS2xCLGVBQUwsQ0FBcUJpQixFQUFyQixFQUF5QkMsRUFBekIsQ0FBUDtBQUNEOztBQUVNLElBQU1FLDRCQUFVcEIsZUFBaEI7O0FBRVA7Ozs7Ozs7Ozs7QUFVTyxTQUFTQyxJQUFULENBQWNLLEdBQWQsRUFBbUJXLEVBQW5CLEVBQXVCQyxFQUF2QixFQUEyQkcsQ0FBM0IsRUFBOEI7QUFDbkMsU0FBTyxlQUFLcEIsSUFBTCxDQUFVSyxHQUFWLEVBQWVXLEVBQWYsRUFBbUJDLEVBQW5CLEVBQXVCRyxDQUF2QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7OztBQU1PLFNBQVNuQixNQUFULENBQWdCb0IsQ0FBaEIsRUFBbUJDLENBQW5CLEVBQXNCO0FBQzNCLFNBQU8sZUFBS3JCLE1BQUwsQ0FBWW9CLENBQVosRUFBZUMsQ0FBZixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7OztBQU1PLFNBQVNwQixXQUFULENBQXFCbUIsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCO0FBQ2hDLFNBQU8sZUFBS3BCLFdBQUwsQ0FBaUJtQixDQUFqQixFQUFvQkMsQ0FBcEIsQ0FBUDtBQUNEIiwiZmlsZSI6IjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQge2dsTWF0cml4LCB2ZWMyIGFzIFZlYzJ9IGZyb20gXCJnbC1tYXRyaXhcIlxuXG5jb25zdCBYID0gMFxuY29uc3QgWSA9IDFcblxuLyoqXG4gKiBTZXRzIHRoZSBjb29yZGluYXRlcyBvZiBhIDJEIHBvaW50XG4gKiBAcGFyYW0ge1BvaW50MmR9IG91dCBQb2ludCB0byBzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbeCA9IDBdICAgWCBjb29yZGluYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3kgPSAwXSAgIFkgY29vcmRpbmF0ZVxuICogQHJldHVybiB7UG9pbnQyZH0gICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4ID0gMCwgeSA9IDApIHtcbiAgb3V0W1hdID0geFxuICBvdXRbWV0gPSB5XG4gIHJldHVybiBvdXRcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFBvaW50MmQgb2JqZWN0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt4ID0gMF0gWCBjb29yZGluYXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFt5ID0gMF0gWSBjb29yZGluYXRlXG4gKiBAcmV0dXJuIHtQb2ludDJkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKHggPSAwLCB5ID0gMCkge1xuICBjb25zdCBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKVxuICByZXR1cm4gc2V0KG91dCwgeCwgeSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFBvaW50MmQgb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgaW5pdGlhbGl6ZWQgZnJvbSBhbiBleGlzdGluZyBwb2ludC5cbiAqIEBwYXJhbSAge1BvaW50MmR9IHBcbiAqIEByZXR1cm4ge1BvaW50MmR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShwKSB7XG4gIGNvbnN0IG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpXG4gIG91dFtYXSA9IHBbWF1cbiAgb3V0W1ldID0gcFtZXVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBjb29yZGluYXRlcyBvZiBvbmUgcG9pbnQgdG8gYW5vdGhlci5cbiAqIEBwYXJhbSAge1BvaW50MmR9IG91dCBUaGUgcG9pbnQgdG8gY29weSB0b1xuICogQHBhcmFtICB7UG9pbnQyZH0gcCAgIFRoZSBwb2ludCB0byBjb3B5IGZyb21cbiAqIEByZXR1cm4ge1BvaW50MmR9ICAgICBQb2ludCByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBwKSB7XG4gIG91dFtYXSA9IHBbWF1cbiAgb3V0W1ldID0gcFtZXVxuICByZXR1cm4gb3V0XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwb2ludCBmcm9tIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggWCBjb29yZGluYXRlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgWSBjb29yZGluYXRlXG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgIE5ldyBwb2ludFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEZyb21WYWx1ZXMoeCwgeSkge1xuICByZXR1cm4gY3JlYXRlKHgsIHkpXG59XG5cbi8qKlxuICogQWRkcyBhIDJkIG9mZnNldCB0byBhbiBleGlzdGluZyBwb2ludFxuICogQHBhcmFtIHtQb2ludDJkfSBvdXQgUG9pbnQgcmVjZWl2aW5nIHRoZSBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1BvaW50MmR9IHB0ICBFeGlzdGluZyBwb2ludFxuICogQHBhcmFtIHtWZWMyZH0gdiAgIFZlY3RvciBkZXNjcmliaW5nIHRoZSBvZmZzZXRcbiAqIEByZXR1cm4ge1BvaW50MmR9ICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRWZWMyKG91dCwgcHQsIHYpIHtcbiAgcmV0dXJuIFZlYzIuYWRkKG91dCwgcHQsIHYpXG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSAge1ZlYzJkfSBvdXQgVmVjdG9yIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwdDFcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0MlxuICogQHJldHVybiB7VmVjMmR9ICAgICBWZWN0b3IgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWIob3V0LCBwdDEsIHB0Mikge1xuICByZXR1cm4gVmVjMi5zdWIob3V0LCBwdDEsIHB0Milcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhbiAyeDIgbWF0cml4IG11bHRpcGxpY2F0aW9uIG9uIGEgcG9pbnRcbiAqIEBwYXJhbSAge1BvaW50MmR9IG91dCBQb2ludCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtICB7UG9pbnQyZH0gcFxuICogQHBhcmFtICB7TWF0Mn0gbSAyeDIgbWF0cml4XG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgcCwgbSkge1xuICByZXR1cm4gVmVjMi50cmFuc2Zvcm1NYXQyKG91dCwgcCwgbSlcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIDJ4MyBtYXRyaXggbXVsdGlwbGljYXRpb24gb24gYSBwb2ludC5cbiAqIEEgMngzIG1hdHJpeCBpcyB1bHRpbWF0ZWx5IGEgMngyIG1hdHJpeCB3aXRoIGFcbiAqIHRyYW5zbGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtICB7UG9pbnQyZH0gb3V0IFBvaW50IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwXG4gKiBAcGFyYW0gIHtNYXQyZH0gbSAgIDJ4MyBtYXRyaXhcbiAqIEByZXR1cm4ge1BvaW50MmR9ICAgICBQb2ludCByZWZlcmVuY2VkIGJ5IG91dCBhcmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgcCwgbSkge1xuICByZXR1cm4gVmVjMi50cmFuc2Zvcm1NYXQyZChvdXQsIHAsIG0pXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHBvaW50XG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIocCkge1xuICByZXR1cm4gYHBvaW50MmQoJHtwWzBdfSAsICR7cFsxXX0pYFxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byAyZCBwb2ludHNcbiAqIEBwYXJhbSAge1BvaW50MmR9IHAxXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwMlxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UocDEsIHAyKSB7XG4gIHJldHVybiBWZWMyLmRpc3RhbmNlKHAxLCBwMilcbn1cblxuZXhwb3J0IGNvbnN0IGRpc3QgPSBkaXN0YW5jZVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxuICogVGhpcyBpcyBhIGNoZWFwZXIgb3BlcmF0aW9uIHRoYW4gdGhlIHRydWUgZGlzdGFuY2VcbiAqIGNhbGN1bGF0aW9uLlxuICogQHBhcmFtICB7UG9pbnQyZH0gcDFcbiAqIEBwYXJhbSAge1BvaW50MmR9IHAyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIGRpc3RhbmNlXjJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShwMSwgcDIpIHtcbiAgcmV0dXJuIFZlYzIuc3F1YXJlZERpc3RhbmNlKHAxLCBwMilcbn1cblxuZXhwb3J0IGNvbnN0IHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2VcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwb2ludCBsaW5lYXJseSBpbnRlcnBvbGF0ZWRcbiAqIGJldHdlZW4gdHdvIHBvaW50cyBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aXZlIG9wZXJhdG9yIHRcbiAqIFt0ID09IDAgPSBwMSAmIHQgPT0gMSA9IHAyXVxuICogQHBhcmFtICB7UG9pbnQyZH0gb3V0IFBvaW50IHJlY2VpdmluZyByZXN1bHQgb2Ygb3BlcmF0aW9uXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwMSAgU3RhcnQgcG9pbnQgKHQgPSAwKVxuICogQHBhcmFtICB7UG9pbnQyZH0gcDIgIEVuZCBwb2ludCAodCA9IDEpXG4gKiBAcGFyYW0gIHtbdHlwZV19IHQgICBJbnRlcnBvbGF0ZSBwYXJhbWV0ZXIgWzAsIDFdXG4gKiBAcmV0dXJuIHtQb2ludDJkfSAgICAgUG9pbnQgcmVmZXJlbmNlZCBieSBvdXQgYXJnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgcDEsIHAyLCB0KSB7XG4gIHJldHVybiBWZWMyLmxlcnAob3V0LCBwMSwgcDIsIHQpXG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHR3byBwb2ludHMgYXJlIHJlbGF0aXZlbHkgZXF1YWxcbiAqIEBwYXJhbSAge1BvaW50MmR9IGFcbiAqIEBwYXJhbSAge1BvaW50MmR9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgUmV0dXJucyB0cnVlIGlmIHR3byBwb2ludCBhcmUgcmVsYXRpdmVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gVmVjMi5lcXVhbHMoYSwgYilcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdHdvIHBvaW50cyBhcmUgZXhhY3RseSBlcXVhbC5cbiAqIEBwYXJhbSAge1BvaW50MmR9IGFcbiAqIEBwYXJhbSAge1BvaW50MmR9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcG9pbnRzIGFyZSBleGFjdGx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIFZlYzIuZXhhY3RFcXVhbHMoYSwgYilcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvcmUvcG9pbnQyZC5qcyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _glMatrix = __webpack_require__(1);\n\n/**\n * Singular value decomposition\n * See: http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation\n */\n\n/**\n * Calculates the singular value decomposition to extract the\n * scale, rotation, and translation from a 2x3 matrix.\n * Any matrix built by affine transformations can be decomposed\n * into a rotation*scale*rotation*translation\n * See: http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation\n * @param {Vec2d} outTranslate Vector to hold the translation components\n * @param {Vec2d} outScale Vector to hold the x,y scale components\n * @param {Vec2d} outRotate Vector to hold the rotation components\n * @param {Mat2d} mat Matrix to decompose\n */\n_glMatrix.mat2d.svd = function (outTranslate, outScale, outRotate, mat) {\n if (outTranslate) {\n outTranslate[0] = mat[4];\n outTranslate[1] = mat[5];\n }\n if (outScale || outRotate) {\n var E = (mat[0] + mat[3]) / 2.0;\n var F = (mat[0] - mat[3]) / 2.0;\n var G = (mat[1] + mat[2]) / 2.0;\n var H = (mat[1] - mat[2]) / 2.0;\n if (outScale) {\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n outScale[0] = Q + R;\n outScale[1] = Q - R;\n }\n if (outRotate) {\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n outRotate[0] = (a2 - a1) / 2.0;\n outRotate[1] = (a2 + a1) / 2.0;\n }\n }\n};\n\nexports.default = _glMatrix.mat2d;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL21hdDJkLmpzPzY0YTUiXSwibmFtZXMiOlsiTWF0MmQiLCJzdmQiLCJvdXRUcmFuc2xhdGUiLCJvdXRTY2FsZSIsIm91dFJvdGF0ZSIsIm1hdCIsIkUiLCJGIiwiRyIsIkgiLCJRIiwiTWF0aCIsInNxcnQiLCJSIiwiYTEiLCJhdGFuMiIsImEyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0FBRUE7O0FBRUE7Ozs7O0FBS0M7Ozs7Ozs7Ozs7O0FBV0RBLGdCQUFNQyxHQUFOLEdBQVksVUFBQ0MsWUFBRCxFQUFlQyxRQUFmLEVBQXlCQyxTQUF6QixFQUFvQ0MsR0FBcEMsRUFBNEM7QUFDdEQsTUFBSUgsWUFBSixFQUFrQjtBQUNoQkEsaUJBQWEsQ0FBYixJQUFrQkcsSUFBSSxDQUFKLENBQWxCO0FBQ0FILGlCQUFhLENBQWIsSUFBa0JHLElBQUksQ0FBSixDQUFsQjtBQUNEO0FBQ0QsTUFBSUYsWUFBWUMsU0FBaEIsRUFBMkI7QUFDekIsUUFBTUUsSUFBSSxDQUFDRCxJQUFJLENBQUosSUFBU0EsSUFBSSxDQUFKLENBQVYsSUFBb0IsR0FBOUI7QUFDQSxRQUFNRSxJQUFJLENBQUNGLElBQUksQ0FBSixJQUFTQSxJQUFJLENBQUosQ0FBVixJQUFvQixHQUE5QjtBQUNBLFFBQU1HLElBQUksQ0FBQ0gsSUFBSSxDQUFKLElBQVNBLElBQUksQ0FBSixDQUFWLElBQW9CLEdBQTlCO0FBQ0EsUUFBTUksSUFBSSxDQUFDSixJQUFJLENBQUosSUFBU0EsSUFBSSxDQUFKLENBQVYsSUFBb0IsR0FBOUI7QUFDQSxRQUFJRixRQUFKLEVBQWM7QUFDWixVQUFNTyxJQUFJQyxLQUFLQyxJQUFMLENBQVVOLElBQUlBLENBQUosR0FBUUcsSUFBSUEsQ0FBdEIsQ0FBVjtBQUNBLFVBQU1JLElBQUlGLEtBQUtDLElBQUwsQ0FBVUwsSUFBSUEsQ0FBSixHQUFRQyxJQUFJQSxDQUF0QixDQUFWO0FBQ0FMLGVBQVMsQ0FBVCxJQUFjTyxJQUFJRyxDQUFsQjtBQUNBVixlQUFTLENBQVQsSUFBY08sSUFBSUcsQ0FBbEI7QUFDRDtBQUNELFFBQUlULFNBQUosRUFBZTtBQUNiLFVBQU1VLEtBQUtILEtBQUtJLEtBQUwsQ0FBV1AsQ0FBWCxFQUFjRCxDQUFkLENBQVg7QUFDQSxVQUFNUyxLQUFLTCxLQUFLSSxLQUFMLENBQVdOLENBQVgsRUFBY0gsQ0FBZCxDQUFYO0FBQ0FGLGdCQUFVLENBQVYsSUFBZSxDQUFDWSxLQUFLRixFQUFOLElBQVksR0FBM0I7QUFDQVYsZ0JBQVUsQ0FBVixJQUFlLENBQUNZLEtBQUtGLEVBQU4sSUFBWSxHQUEzQjtBQUNEO0FBQ0Y7QUFDRixDQXZCRDs7a0JBeUJlZCxlIiwiZmlsZSI6IjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQge21hdDJkIGFzIE1hdDJkfSBmcm9tIFwiZ2wtbWF0cml4XCJcblxuLyoqXG4gKiBTaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uXG4gKiBTZWU6IGh0dHA6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy84NjE2NzQvZGVjb21wb3NlLWEtMmQtYXJiaXRyYXJ5LXRyYW5zZm9ybS1pbnRvLW9ubHktc2NhbGluZy1hbmQtcm90YXRpb25cbiAqL1xuXG4gLyoqXG4gICogQ2FsY3VsYXRlcyB0aGUgc2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvbiB0byBleHRyYWN0IHRoZVxuICAqIHNjYWxlLCByb3RhdGlvbiwgYW5kIHRyYW5zbGF0aW9uIGZyb20gYSAyeDMgbWF0cml4LlxuICAqIEFueSBtYXRyaXggYnVpbHQgYnkgYWZmaW5lIHRyYW5zZm9ybWF0aW9ucyBjYW4gYmUgZGVjb21wb3NlZFxuICAqIGludG8gYSByb3RhdGlvbipzY2FsZSpyb3RhdGlvbip0cmFuc2xhdGlvblxuICAqIFNlZTogaHR0cDovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzg2MTY3NC9kZWNvbXBvc2UtYS0yZC1hcmJpdHJhcnktdHJhbnNmb3JtLWludG8tb25seS1zY2FsaW5nLWFuZC1yb3RhdGlvblxuICAqIEBwYXJhbSAge1ZlYzJkfSBvdXRUcmFuc2xhdGUgVmVjdG9yIHRvIGhvbGQgdGhlIHRyYW5zbGF0aW9uIGNvbXBvbmVudHNcbiAgKiBAcGFyYW0gIHtWZWMyZH0gb3V0U2NhbGUgICAgIFZlY3RvciB0byBob2xkIHRoZSB4LHkgc2NhbGUgY29tcG9uZW50c1xuICAqIEBwYXJhbSAge1ZlYzJkfSBvdXRSb3RhdGUgICAgVmVjdG9yIHRvIGhvbGQgdGhlIHJvdGF0aW9uIGNvbXBvbmVudHNcbiAgKiBAcGFyYW0gIHtNYXQyZH0gbWF0ICAgICAgICAgIE1hdHJpeCB0byBkZWNvbXBvc2VcbiAgKi9cbk1hdDJkLnN2ZCA9IChvdXRUcmFuc2xhdGUsIG91dFNjYWxlLCBvdXRSb3RhdGUsIG1hdCkgPT4ge1xuICBpZiAob3V0VHJhbnNsYXRlKSB7XG4gICAgb3V0VHJhbnNsYXRlWzBdID0gbWF0WzRdXG4gICAgb3V0VHJhbnNsYXRlWzFdID0gbWF0WzVdXG4gIH1cbiAgaWYgKG91dFNjYWxlIHx8IG91dFJvdGF0ZSkge1xuICAgIGNvbnN0IEUgPSAobWF0WzBdICsgbWF0WzNdKSAvIDIuMFxuICAgIGNvbnN0IEYgPSAobWF0WzBdIC0gbWF0WzNdKSAvIDIuMFxuICAgIGNvbnN0IEcgPSAobWF0WzFdICsgbWF0WzJdKSAvIDIuMFxuICAgIGNvbnN0IEggPSAobWF0WzFdIC0gbWF0WzJdKSAvIDIuMFxuICAgIGlmIChvdXRTY2FsZSkge1xuICAgICAgY29uc3QgUSA9IE1hdGguc3FydChFICogRSArIEggKiBIKVxuICAgICAgY29uc3QgUiA9IE1hdGguc3FydChGICogRiArIEcgKiBHKVxuICAgICAgb3V0U2NhbGVbMF0gPSBRICsgUlxuICAgICAgb3V0U2NhbGVbMV0gPSBRIC0gUlxuICAgIH1cbiAgICBpZiAob3V0Um90YXRlKSB7XG4gICAgICBjb25zdCBhMSA9IE1hdGguYXRhbjIoRywgRilcbiAgICAgIGNvbnN0IGEyID0gTWF0aC5hdGFuMihILCBFKVxuICAgICAgb3V0Um90YXRlWzBdID0gKGEyIC0gYTEpIC8gMi4wXG4gICAgICBvdXRSb3RhdGVbMV0gPSAoYTIgKyBhMSkgLyAyLjBcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF0MmRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvcmUvbWF0MmQuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 5 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _glMatrix = __webpack_require__(1);\n\n/**\n * Singular value decomposition\n * See: http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation\n */\n\n/**\n * Calculates the singular value decomposition to extract the\n * scale, rotation, and translation from a 2x3 matrix.\n * Any matrix built by affine transformations can be decomposed\n * into a rotation*scale*rotation*translation\n * See: http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation\n * @param {Vec2d} outTranslate Vector to hold the translation components\n * @param {Vec2d} outScale Vector to hold the x,y scale components\n * @param {Vec2d} outRotate Vector to hold the rotation components\n * @param {Mat2d} mat Matrix to decompose\n */\n_glMatrix.mat2d.svd = function (outTranslate, outScale, outRotate, mat) {\n if (outTranslate) {\n outTranslate[0] = mat[4];\n outTranslate[1] = mat[5];\n }\n if (outScale || outRotate) {\n var E = (mat[0] + mat[3]) / 2.0;\n var F = (mat[0] - mat[3]) / 2.0;\n var G = (mat[1] + mat[2]) / 2.0;\n var H = (mat[1] - mat[2]) / 2.0;\n if (outScale) {\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n outScale[0] = Q + R;\n outScale[1] = Q - R;\n }\n if (outRotate) {\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n outRotate[0] = (a2 - a1) / 2.0;\n outRotate[1] = (a2 + a1) / 2.0;\n }\n }\n};\n\nexports.default = _glMatrix.mat2d;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL21hdDJkLmpzPzY0YTUiXSwibmFtZXMiOlsic3ZkIiwib3V0VHJhbnNsYXRlIiwib3V0U2NhbGUiLCJvdXRSb3RhdGUiLCJtYXQiLCJFIiwiRiIsIkciLCJIIiwiUSIsIk1hdGgiLCJzcXJ0IiwiUiIsImExIiwiYXRhbjIiLCJhMiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQUVBOztBQUVBOzs7OztBQUtDOzs7Ozs7Ozs7OztBQVdELGdCQUFNQSxHQUFOLEdBQVksVUFBQ0MsWUFBRCxFQUFlQyxRQUFmLEVBQXlCQyxTQUF6QixFQUFvQ0MsR0FBcEMsRUFBNEM7QUFDdEQsTUFBSUgsWUFBSixFQUFrQjtBQUNoQkEsaUJBQWEsQ0FBYixJQUFrQkcsSUFBSSxDQUFKLENBQWxCO0FBQ0FILGlCQUFhLENBQWIsSUFBa0JHLElBQUksQ0FBSixDQUFsQjtBQUNEO0FBQ0QsTUFBSUYsWUFBWUMsU0FBaEIsRUFBMkI7QUFDekIsUUFBTUUsSUFBSSxDQUFDRCxJQUFJLENBQUosSUFBU0EsSUFBSSxDQUFKLENBQVYsSUFBb0IsR0FBOUI7QUFDQSxRQUFNRSxJQUFJLENBQUNGLElBQUksQ0FBSixJQUFTQSxJQUFJLENBQUosQ0FBVixJQUFvQixHQUE5QjtBQUNBLFFBQU1HLElBQUksQ0FBQ0gsSUFBSSxDQUFKLElBQVNBLElBQUksQ0FBSixDQUFWLElBQW9CLEdBQTlCO0FBQ0EsUUFBTUksSUFBSSxDQUFDSixJQUFJLENBQUosSUFBU0EsSUFBSSxDQUFKLENBQVYsSUFBb0IsR0FBOUI7QUFDQSxRQUFJRixRQUFKLEVBQWM7QUFDWixVQUFNTyxJQUFJQyxLQUFLQyxJQUFMLENBQVVOLElBQUlBLENBQUosR0FBUUcsSUFBSUEsQ0FBdEIsQ0FBVjtBQUNBLFVBQU1JLElBQUlGLEtBQUtDLElBQUwsQ0FBVUwsSUFBSUEsQ0FBSixHQUFRQyxJQUFJQSxDQUF0QixDQUFWO0FBQ0FMLGVBQVMsQ0FBVCxJQUFjTyxJQUFJRyxDQUFsQjtBQUNBVixlQUFTLENBQVQsSUFBY08sSUFBSUcsQ0FBbEI7QUFDRDtBQUNELFFBQUlULFNBQUosRUFBZTtBQUNiLFVBQU1VLEtBQUtILEtBQUtJLEtBQUwsQ0FBV1AsQ0FBWCxFQUFjRCxDQUFkLENBQVg7QUFDQSxVQUFNUyxLQUFLTCxLQUFLSSxLQUFMLENBQVdOLENBQVgsRUFBY0gsQ0FBZCxDQUFYO0FBQ0FGLGdCQUFVLENBQVYsSUFBZSxDQUFDWSxLQUFLRixFQUFOLElBQVksR0FBM0I7QUFDQVYsZ0JBQVUsQ0FBVixJQUFlLENBQUNZLEtBQUtGLEVBQU4sSUFBWSxHQUEzQjtBQUNEO0FBQ0Y7QUFDRixDQXZCRCIsImZpbGUiOiI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0IHttYXQyZCBhcyBNYXQyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5cbi8qKlxuICogU2luZ3VsYXIgdmFsdWUgZGVjb21wb3NpdGlvblxuICogU2VlOiBodHRwOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvODYxNjc0L2RlY29tcG9zZS1hLTJkLWFyYml0cmFyeS10cmFuc2Zvcm0taW50by1vbmx5LXNjYWxpbmctYW5kLXJvdGF0aW9uXG4gKi9cblxuIC8qKlxuICAqIENhbGN1bGF0ZXMgdGhlIHNpbmd1bGFyIHZhbHVlIGRlY29tcG9zaXRpb24gdG8gZXh0cmFjdCB0aGVcbiAgKiBzY2FsZSwgcm90YXRpb24sIGFuZCB0cmFuc2xhdGlvbiBmcm9tIGEgMngzIG1hdHJpeC5cbiAgKiBBbnkgbWF0cml4IGJ1aWx0IGJ5IGFmZmluZSB0cmFuc2Zvcm1hdGlvbnMgY2FuIGJlIGRlY29tcG9zZWRcbiAgKiBpbnRvIGEgcm90YXRpb24qc2NhbGUqcm90YXRpb24qdHJhbnNsYXRpb25cbiAgKiBTZWU6IGh0dHA6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy84NjE2NzQvZGVjb21wb3NlLWEtMmQtYXJiaXRyYXJ5LXRyYW5zZm9ybS1pbnRvLW9ubHktc2NhbGluZy1hbmQtcm90YXRpb25cbiAgKiBAcGFyYW0gIHtWZWMyZH0gb3V0VHJhbnNsYXRlIFZlY3RvciB0byBob2xkIHRoZSB0cmFuc2xhdGlvbiBjb21wb25lbnRzXG4gICogQHBhcmFtICB7VmVjMmR9IG91dFNjYWxlICAgICBWZWN0b3IgdG8gaG9sZCB0aGUgeCx5IHNjYWxlIGNvbXBvbmVudHNcbiAgKiBAcGFyYW0gIHtWZWMyZH0gb3V0Um90YXRlICAgIFZlY3RvciB0byBob2xkIHRoZSByb3RhdGlvbiBjb21wb25lbnRzXG4gICogQHBhcmFtICB7TWF0MmR9IG1hdCAgICAgICAgICBNYXRyaXggdG8gZGVjb21wb3NlXG4gICovXG5NYXQyZC5zdmQgPSAob3V0VHJhbnNsYXRlLCBvdXRTY2FsZSwgb3V0Um90YXRlLCBtYXQpID0+IHtcbiAgaWYgKG91dFRyYW5zbGF0ZSkge1xuICAgIG91dFRyYW5zbGF0ZVswXSA9IG1hdFs0XVxuICAgIG91dFRyYW5zbGF0ZVsxXSA9IG1hdFs1XVxuICB9XG4gIGlmIChvdXRTY2FsZSB8fCBvdXRSb3RhdGUpIHtcbiAgICBjb25zdCBFID0gKG1hdFswXSArIG1hdFszXSkgLyAyLjBcbiAgICBjb25zdCBGID0gKG1hdFswXSAtIG1hdFszXSkgLyAyLjBcbiAgICBjb25zdCBHID0gKG1hdFsxXSArIG1hdFsyXSkgLyAyLjBcbiAgICBjb25zdCBIID0gKG1hdFsxXSAtIG1hdFsyXSkgLyAyLjBcbiAgICBpZiAob3V0U2NhbGUpIHtcbiAgICAgIGNvbnN0IFEgPSBNYXRoLnNxcnQoRSAqIEUgKyBIICogSClcbiAgICAgIGNvbnN0IFIgPSBNYXRoLnNxcnQoRiAqIEYgKyBHICogRylcbiAgICAgIG91dFNjYWxlWzBdID0gUSArIFJcbiAgICAgIG91dFNjYWxlWzFdID0gUSAtIFJcbiAgICB9XG4gICAgaWYgKG91dFJvdGF0ZSkge1xuICAgICAgY29uc3QgYTEgPSBNYXRoLmF0YW4yKEcsIEYpXG4gICAgICBjb25zdCBhMiA9IE1hdGguYXRhbjIoSCwgRSlcbiAgICAgIG91dFJvdGF0ZVswXSA9IChhMiAtIGExKSAvIDIuMFxuICAgICAgb3V0Um90YXRlWzFdID0gKGEyICsgYTEpIC8gMi4wXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdDJkXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb3JlL21hdDJkLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar EPS = 1e-5;\nvar quarter = 0.25;\nvar half = 0.5;\nvar two = 2;\n\nMath.QUATER_PI = quarter * Math.PI;\nMath.HALF_PI = half * Math.PI;\nMath.HALF_NPI = -half * Math.PI;\nMath.TWO_PI = two * Math.PI;\nMath.NPI = -Math.PI;\nMath.NQUATER_PI = quarter * Math.NPI;\nMath.NHALF_PI = half * Math.NPI;\nMath.NTWO_PI = two * Math.NPI;\nMath.INV_PI = 1 / Math.PI;\nMath.RAD_TO_DEG = 180 / Math.PI;\nMath.DEG_TO_RAD = Math.PI / 180;\n\n// this could be useful to tweak in your app, depends on your world resolution\nMath.EPS = EPS;\n\n/**\n * Clamp f to be between a min and max.\n * @param {Number} f\n * @param {Number} minv\n * @param {Number} maxv\n * @return {Number}\n */\nfunction clamp(f, minv, maxv) {\n return f < minv ? minv : f > maxv ? maxv : f;\n}\n\n/**\n * Clamp f to be between 0 and 1.\n * @param {Number} f\n * @return {Number}\n */\nfunction clamp01(f) {\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\n/**\n * Linearly interpolate (or extrapolate) between @c f1 and @c f2 by @c t percent.\n * @param {Number} f1\n * @param {Number} f2\n * @param {Number} t\n * @return {Number}\n */\nfunction lerp(f1, f2, t) {\n return f1 * (1 - t) + f2 * t;\n}\n\nMath.clamp = clamp;\nMath.clamp01 = clamp01;\nMath.lerp = lerp;\n\nexports.default = Math;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9tYXRoL21hdGguanM/MDU5NiJdLCJuYW1lcyI6WyJFUFMiLCJxdWFydGVyIiwiaGFsZiIsInR3byIsIk1hdGgiLCJRVUFURVJfUEkiLCJQSSIsIkhBTEZfUEkiLCJIQUxGX05QSSIsIlRXT19QSSIsIk5QSSIsIk5RVUFURVJfUEkiLCJOSEFMRl9QSSIsIk5UV09fUEkiLCJJTlZfUEkiLCJSQURfVE9fREVHIiwiREVHX1RPX1JBRCIsImNsYW1wIiwiZiIsIm1pbnYiLCJtYXh2IiwiY2xhbXAwMSIsImxlcnAiLCJmMSIsImYyIiwidCJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxJQUFNQSxNQUFNLElBQVo7QUFDQSxJQUFNQyxVQUFVLElBQWhCO0FBQ0EsSUFBTUMsT0FBTyxHQUFiO0FBQ0EsSUFBTUMsTUFBTSxDQUFaOztBQUVBQyxLQUFLQyxTQUFMLEdBQWlCSixVQUFVRyxLQUFLRSxFQUFoQztBQUNBRixLQUFLRyxPQUFMLEdBQWVMLE9BQU9FLEtBQUtFLEVBQTNCO0FBQ0FGLEtBQUtJLFFBQUwsR0FBZ0IsQ0FBQ04sSUFBRCxHQUFRRSxLQUFLRSxFQUE3QjtBQUNBRixLQUFLSyxNQUFMLEdBQWNOLE1BQU1DLEtBQUtFLEVBQXpCO0FBQ0FGLEtBQUtNLEdBQUwsR0FBVyxDQUFDTixLQUFLRSxFQUFqQjtBQUNBRixLQUFLTyxVQUFMLEdBQWtCVixVQUFVRyxLQUFLTSxHQUFqQztBQUNBTixLQUFLUSxRQUFMLEdBQWdCVixPQUFPRSxLQUFLTSxHQUE1QjtBQUNBTixLQUFLUyxPQUFMLEdBQWVWLE1BQU1DLEtBQUtNLEdBQTFCO0FBQ0FOLEtBQUtVLE1BQUwsR0FBYyxJQUFJVixLQUFLRSxFQUF2QjtBQUNBRixLQUFLVyxVQUFMLEdBQWtCLE1BQU1YLEtBQUtFLEVBQTdCO0FBQ0FGLEtBQUtZLFVBQUwsR0FBa0JaLEtBQUtFLEVBQUwsR0FBVSxHQUE1Qjs7QUFFQTtBQUNBRixLQUFLSixHQUFMLEdBQVdBLEdBQVg7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTaUIsS0FBVCxDQUFlQyxDQUFmLEVBQWtCQyxJQUFsQixFQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsU0FBT0YsSUFBSUMsSUFBSixHQUFXQSxJQUFYLEdBQW1CRCxJQUFJRSxJQUFKLEdBQVdBLElBQVgsR0FBa0JGLENBQTVDO0FBQ0Q7O0FBRUQ7Ozs7O0FBS0EsU0FBU0csT0FBVCxDQUFpQkgsQ0FBakIsRUFBb0I7QUFDbEIsU0FBT0EsSUFBSSxDQUFKLEdBQVEsQ0FBUixHQUFhQSxJQUFJLENBQUosR0FBUSxDQUFSLEdBQVlBLENBQWhDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTSSxJQUFULENBQWNDLEVBQWQsRUFBa0JDLEVBQWxCLEVBQXNCQyxDQUF0QixFQUF5QjtBQUN2QixTQUFPRixNQUFNLElBQUlFLENBQVYsSUFBZUQsS0FBS0MsQ0FBM0I7QUFDRDs7QUFFRHJCLEtBQUthLEtBQUwsR0FBYUEsS0FBYjtBQUNBYixLQUFLaUIsT0FBTCxHQUFlQSxPQUFmO0FBQ0FqQixLQUFLa0IsSUFBTCxHQUFZQSxJQUFaOztrQkFFZWxCLEkiLCJmaWxlIjoiNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVQUyA9IDFlLTVcbmNvbnN0IHF1YXJ0ZXIgPSAwLjI1XG5jb25zdCBoYWxmID0gMC41XG5jb25zdCB0d28gPSAyXG5cbk1hdGguUVVBVEVSX1BJID0gcXVhcnRlciAqIE1hdGguUElcbk1hdGguSEFMRl9QSSA9IGhhbGYgKiBNYXRoLlBJXG5NYXRoLkhBTEZfTlBJID0gLWhhbGYgKiBNYXRoLlBJXG5NYXRoLlRXT19QSSA9IHR3byAqIE1hdGguUElcbk1hdGguTlBJID0gLU1hdGguUElcbk1hdGguTlFVQVRFUl9QSSA9IHF1YXJ0ZXIgKiBNYXRoLk5QSVxuTWF0aC5OSEFMRl9QSSA9IGhhbGYgKiBNYXRoLk5QSVxuTWF0aC5OVFdPX1BJID0gdHdvICogTWF0aC5OUElcbk1hdGguSU5WX1BJID0gMSAvIE1hdGguUElcbk1hdGguUkFEX1RPX0RFRyA9IDE4MCAvIE1hdGguUElcbk1hdGguREVHX1RPX1JBRCA9IE1hdGguUEkgLyAxODBcblxuLy8gdGhpcyBjb3VsZCBiZSB1c2VmdWwgdG8gdHdlYWsgaW4geW91ciBhcHAsIGRlcGVuZHMgb24geW91ciB3b3JsZCByZXNvbHV0aW9uXG5NYXRoLkVQUyA9IEVQU1xuXG4vKipcbiAqIENsYW1wIGYgdG8gYmUgYmV0d2VlbiBhIG1pbiBhbmQgbWF4LlxuICogQHBhcmFtIHtOdW1iZXJ9IGZcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaW52XG4gKiBAcGFyYW0ge051bWJlcn0gbWF4dlxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBjbGFtcChmLCBtaW52LCBtYXh2KSB7XG4gIHJldHVybiBmIDwgbWludiA/IG1pbnYgOiAoZiA+IG1heHYgPyBtYXh2IDogZilcbn1cblxuLyoqXG4gKiBDbGFtcCBmIHRvIGJlIGJldHdlZW4gMCBhbmQgMS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNsYW1wMDEoZikge1xuICByZXR1cm4gZiA8IDAgPyAwIDogKGYgPiAxID8gMSA6IGYpXG59XG5cbi8qKlxuICogTGluZWFybHkgaW50ZXJwb2xhdGUgKG9yIGV4dHJhcG9sYXRlKSBiZXR3ZWVuIEBjIGYxIGFuZCBAYyBmMiBieSBAYyB0IHBlcmNlbnQuXG4gKiBAcGFyYW0ge051bWJlcn0gZjFcbiAqIEBwYXJhbSB7TnVtYmVyfSBmMlxuICogQHBhcmFtIHtOdW1iZXJ9IHRcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gbGVycChmMSwgZjIsIHQpIHtcbiAgcmV0dXJuIGYxICogKDEgLSB0KSArIGYyICogdFxufVxuXG5NYXRoLmNsYW1wID0gY2xhbXBcbk1hdGguY2xhbXAwMSA9IGNsYW1wMDFcbk1hdGgubGVycCA9IGxlcnBcblxuZXhwb3J0IGRlZmF1bHQgTWF0aFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbWF0aC9tYXRoLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 6 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar EPS = 1e-5;\nvar quarter = 0.25;\nvar half = 0.5;\nvar two = 2;\n\nMath.QUATER_PI = quarter * Math.PI;\nMath.HALF_PI = half * Math.PI;\nMath.HALF_NPI = -half * Math.PI;\nMath.TWO_PI = two * Math.PI;\nMath.NPI = -Math.PI;\nMath.NQUATER_PI = quarter * Math.NPI;\nMath.NHALF_PI = half * Math.NPI;\nMath.NTWO_PI = two * Math.NPI;\nMath.INV_PI = 1 / Math.PI;\nMath.RAD_TO_DEG = 180 / Math.PI;\nMath.DEG_TO_RAD = Math.PI / 180;\n\n// this could be useful to tweak in your app, depends on your world resolution\nMath.EPS = EPS;\n\n/**\n * Clamp f to be between a min and max.\n * @param {Number} f\n * @param {Number} minv\n * @param {Number} maxv\n * @return {Number}\n */\nfunction clamp(f, minv, maxv) {\n return f < minv ? minv : f > maxv ? maxv : f;\n}\n\n/**\n * Clamp f to be between 0 and 1.\n * @param {Number} f\n * @return {Number}\n */\nfunction clamp01(f) {\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\n/**\n * Linearly interpolate (or extrapolate) between @c f1 and @c f2 by @c t percent.\n * @param {Number} f1\n * @param {Number} f2\n * @param {Number} t\n * @return {Number}\n */\nfunction lerp(f1, f2, t) {\n return f1 * (1 - t) + f2 * t;\n}\n\nMath.clamp = clamp;\nMath.clamp01 = clamp01;\nMath.lerp = lerp;\n\nexports.default = Math;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9tYXRoL21hdGguanM/MDU5NiJdLCJuYW1lcyI6WyJFUFMiLCJxdWFydGVyIiwiaGFsZiIsInR3byIsIk1hdGgiLCJRVUFURVJfUEkiLCJQSSIsIkhBTEZfUEkiLCJIQUxGX05QSSIsIlRXT19QSSIsIk5QSSIsIk5RVUFURVJfUEkiLCJOSEFMRl9QSSIsIk5UV09fUEkiLCJJTlZfUEkiLCJSQURfVE9fREVHIiwiREVHX1RPX1JBRCIsImNsYW1wIiwiZiIsIm1pbnYiLCJtYXh2IiwiY2xhbXAwMSIsImxlcnAiLCJmMSIsImYyIiwidCJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxJQUFNQSxNQUFNLElBQVo7QUFDQSxJQUFNQyxVQUFVLElBQWhCO0FBQ0EsSUFBTUMsT0FBTyxHQUFiO0FBQ0EsSUFBTUMsTUFBTSxDQUFaOztBQUVBQyxLQUFLQyxTQUFMLEdBQWlCSixVQUFVRyxLQUFLRSxFQUFoQztBQUNBRixLQUFLRyxPQUFMLEdBQWVMLE9BQU9FLEtBQUtFLEVBQTNCO0FBQ0FGLEtBQUtJLFFBQUwsR0FBZ0IsQ0FBQ04sSUFBRCxHQUFRRSxLQUFLRSxFQUE3QjtBQUNBRixLQUFLSyxNQUFMLEdBQWNOLE1BQU1DLEtBQUtFLEVBQXpCO0FBQ0FGLEtBQUtNLEdBQUwsR0FBVyxDQUFDTixLQUFLRSxFQUFqQjtBQUNBRixLQUFLTyxVQUFMLEdBQWtCVixVQUFVRyxLQUFLTSxHQUFqQztBQUNBTixLQUFLUSxRQUFMLEdBQWdCVixPQUFPRSxLQUFLTSxHQUE1QjtBQUNBTixLQUFLUyxPQUFMLEdBQWVWLE1BQU1DLEtBQUtNLEdBQTFCO0FBQ0FOLEtBQUtVLE1BQUwsR0FBYyxJQUFJVixLQUFLRSxFQUF2QjtBQUNBRixLQUFLVyxVQUFMLEdBQWtCLE1BQU1YLEtBQUtFLEVBQTdCO0FBQ0FGLEtBQUtZLFVBQUwsR0FBa0JaLEtBQUtFLEVBQUwsR0FBVSxHQUE1Qjs7QUFFQTtBQUNBRixLQUFLSixHQUFMLEdBQVdBLEdBQVg7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTaUIsS0FBVCxDQUFlQyxDQUFmLEVBQWtCQyxJQUFsQixFQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsU0FBT0YsSUFBSUMsSUFBSixHQUFXQSxJQUFYLEdBQW1CRCxJQUFJRSxJQUFKLEdBQVdBLElBQVgsR0FBa0JGLENBQTVDO0FBQ0Q7O0FBRUQ7Ozs7O0FBS0EsU0FBU0csT0FBVCxDQUFpQkgsQ0FBakIsRUFBb0I7QUFDbEIsU0FBT0EsSUFBSSxDQUFKLEdBQVEsQ0FBUixHQUFhQSxJQUFJLENBQUosR0FBUSxDQUFSLEdBQVlBLENBQWhDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTSSxJQUFULENBQWNDLEVBQWQsRUFBa0JDLEVBQWxCLEVBQXNCQyxDQUF0QixFQUF5QjtBQUN2QixTQUFPRixNQUFNLElBQUlFLENBQVYsSUFBZUQsS0FBS0MsQ0FBM0I7QUFDRDs7QUFFRHJCLEtBQUthLEtBQUwsR0FBYUEsS0FBYjtBQUNBYixLQUFLaUIsT0FBTCxHQUFlQSxPQUFmO0FBQ0FqQixLQUFLa0IsSUFBTCxHQUFZQSxJQUFaOztrQkFFZWxCLEkiLCJmaWxlIjoiNi5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVQUyA9IDFlLTVcbmNvbnN0IHF1YXJ0ZXIgPSAwLjI1XG5jb25zdCBoYWxmID0gMC41XG5jb25zdCB0d28gPSAyXG5cbk1hdGguUVVBVEVSX1BJID0gcXVhcnRlciAqIE1hdGguUElcbk1hdGguSEFMRl9QSSA9IGhhbGYgKiBNYXRoLlBJXG5NYXRoLkhBTEZfTlBJID0gLWhhbGYgKiBNYXRoLlBJXG5NYXRoLlRXT19QSSA9IHR3byAqIE1hdGguUElcbk1hdGguTlBJID0gLU1hdGguUElcbk1hdGguTlFVQVRFUl9QSSA9IHF1YXJ0ZXIgKiBNYXRoLk5QSVxuTWF0aC5OSEFMRl9QSSA9IGhhbGYgKiBNYXRoLk5QSVxuTWF0aC5OVFdPX1BJID0gdHdvICogTWF0aC5OUElcbk1hdGguSU5WX1BJID0gMSAvIE1hdGguUElcbk1hdGguUkFEX1RPX0RFRyA9IDE4MCAvIE1hdGguUElcbk1hdGguREVHX1RPX1JBRCA9IE1hdGguUEkgLyAxODBcblxuLy8gdGhpcyBjb3VsZCBiZSB1c2VmdWwgdG8gdHdlYWsgaW4geW91ciBhcHAsIGRlcGVuZHMgb24geW91ciB3b3JsZCByZXNvbHV0aW9uXG5NYXRoLkVQUyA9IEVQU1xuXG4vKipcbiAqIENsYW1wIGYgdG8gYmUgYmV0d2VlbiBhIG1pbiBhbmQgbWF4LlxuICogQHBhcmFtIHtOdW1iZXJ9IGZcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaW52XG4gKiBAcGFyYW0ge051bWJlcn0gbWF4dlxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBjbGFtcChmLCBtaW52LCBtYXh2KSB7XG4gIHJldHVybiBmIDwgbWludiA/IG1pbnYgOiAoZiA+IG1heHYgPyBtYXh2IDogZilcbn1cblxuLyoqXG4gKiBDbGFtcCBmIHRvIGJlIGJldHdlZW4gMCBhbmQgMS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNsYW1wMDEoZikge1xuICByZXR1cm4gZiA8IDAgPyAwIDogKGYgPiAxID8gMSA6IGYpXG59XG5cbi8qKlxuICogTGluZWFybHkgaW50ZXJwb2xhdGUgKG9yIGV4dHJhcG9sYXRlKSBiZXR3ZWVuIEBjIGYxIGFuZCBAYyBmMiBieSBAYyB0IHBlcmNlbnQuXG4gKiBAcGFyYW0ge051bWJlcn0gZjFcbiAqIEBwYXJhbSB7TnVtYmVyfSBmMlxuICogQHBhcmFtIHtOdW1iZXJ9IHRcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gbGVycChmMSwgZjIsIHQpIHtcbiAgcmV0dXJuIGYxICogKDEgLSB0KSArIGYyICogdFxufVxuXG5NYXRoLmNsYW1wID0gY2xhbXBcbk1hdGguY2xhbXAwMSA9IGNsYW1wMDFcbk1hdGgubGVycCA9IGxlcnBcblxuZXhwb3J0IGRlZmF1bHQgTWF0aFxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbWF0aC9tYXRoLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _fillStyle = __webpack_require__(17);\n\nvar _fillStyle2 = _interopRequireDefault(_fillStyle);\n\nvar _strokeStyle = __webpack_require__(18);\n\nvar _strokeStyle2 = _interopRequireDefault(_strokeStyle);\n\nvar _transform2d = __webpack_require__(11);\n\nvar _transform2d2 = _interopRequireDefault(_transform2d);\n\nvar _aggregation2 = __webpack_require__(7);\n\nvar _aggregation3 = _interopRequireDefault(_aggregation2);\n\nvar _basicStyle = __webpack_require__(8);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _eventHandler = __webpack_require__(12);\n\nvar _eventHandler2 = _interopRequireDefault(_eventHandler);\n\nvar _glMatrix = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} CoreShapeOptions\n * @property {number} [zIndex=0] Z index draw order of the shape. Lower numbers get drawn before larger numbers\n */\n\n/**\n * Shape geom modification event\n * @event Shape#geomChanged\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n/**\n * Shape modification event\n * @event EventedShape#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n/**\n * @class Defines the core functionality for all shapes\n * @extends {EventHandler}\n */\nvar CoreBaseShape = function (_EventHandler) {\n _inherits(CoreBaseShape, _EventHandler);\n\n /**\n * Creates new core functionality for a shape\n * @param {CoreShapeOptions} [opts]\n * @return {CoreBaseShape}\n */\n function CoreBaseShape(opts) {\n _classCallCheck(this, CoreBaseShape);\n\n var _this = _possibleConstructorReturn(this, (CoreBaseShape.__proto__ || Object.getPrototypeOf(CoreBaseShape)).call(this, [\"changed:xform\", \"changed:style\", \"changed:order\", \"changed:visibility\", \"changed:geom\"]));\n\n _this._aabox = AABox2d.create();\n _this._zIndex = opts && opts.zIndex ? opts.zIndex : 0;\n _this._visible = true;\n _this._geomDirty = false;\n\n _this._fullXform = _glMatrix.mat2d.create();\n return _this;\n }\n\n /**\n * Sets the z index (back to front draw order) of the shape\n * @param {number} zIndex\n * @fires EventedShape#changed\n * @return {CoreBaseShape} this\n */\n\n\n _createClass(CoreBaseShape, [{\n key: \"zIndex\",\n set: function set(zIndex) {\n if (!Number.isInteger(zIndex)) {\n throw new Error(\"zIndex must be an integer\");\n }\n if (zIndex !== this._zIndex) {\n var prev = this._zIndex;\n this._zIndex = zIndex;\n this.fire(\"changed:order\", {\n attr: \"zIndex\",\n prevVal: prev,\n currVal: this._zIndex\n });\n }\n return this;\n }\n\n /**\n * Gets the current z index (i.e. draw/layer order) of the shape\n * @return {number}\n */\n ,\n get: function get() {\n return this._zIndex;\n }\n\n /**\n * Gets a reference to the current axis-aligned bounding box of the\n * shape\n * @return {AABox2d}\n * @readOnly\n */\n\n }, {\n key: \"aabox\",\n get: function get() {\n this._updateAABox();\n return this._aabox;\n }\n\n /**\n * Sets the visibility of the shape\n * @param {Boolean} visible If true, the shape is considered visible\n * @fires EventedShape#changed\n * @return {CoreBaseShape} this\n * @throws {Error} If argument is not a boolean type\n */\n\n }, {\n key: \"visible\",\n set: function set(visible) {\n if (typeof visible !== \"boolean\") {\n throw new Error(\"visible must be a boolean\");\n }\n\n if (visible !== this._visible) {\n this._visible = visible;\n this.fire(\"changed:visibility\", {\n attr: \"visible\",\n prevVal: !this._visible,\n currVal: this._visible\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current visibility of the shape\n * @return {boolean}\n */\n ,\n get: function get() {\n return this._visible;\n }\n }]);\n\n return CoreBaseShape;\n}(_eventHandler2.default);\n\n/**\n * @class Defines the basic functionality of all shapes. This includes\n * mixing in from EventedTransform2d so that affine transformations\n * can be applied to the shape. Also includes mixing in fill and stroke\n * properties so that the shape's renderable properties can be modified.\n * @extends {CoreBaseShape}\n * @mixin {EventedTransform2d}\n * @mixin {EventedFillStyle}\n * @mixin {EventedStrokeStyle}\n */\n\n\nvar BaseShape = function (_aggregation) {\n _inherits(BaseShape, _aggregation);\n\n /**\n * Creates new basic functionality (including transform, fill style, and stroke style properties)\n * for a shape\n * @param {object} opts\n * @return {BaseShape}\n */\n function BaseShape(opts) {\n _classCallCheck(this, BaseShape);\n\n var _this2 = _possibleConstructorReturn(this, (BaseShape.__proto__ || Object.getPrototypeOf(BaseShape)).call(this, opts));\n\n _this2._stateStack = [];\n return _this2;\n }\n\n /**\n * Saves the current state of the shape so that it can be restored later.\n * @return {BaseShape} this\n */\n\n\n _createClass(BaseShape, [{\n key: \"save\",\n value: function save() {\n // Currently only the state of the fill/stroke style properties\n // and the z index are saved. May want to expand this to include\n // all modifiable properties (i.e. transform props and visibility prop)\n var state = new _basicStyle2.default();\n _basicStyle2.default.copyBasicStyle(this, state);\n state.zIndex = this.zIndex;\n this._stateStack.push(state);\n return this;\n }\n\n /**\n * Pops a saved state from the top of the saved state stack\n * @return {BaseShape} this\n */\n\n }, {\n key: \"restore\",\n value: function restore() {\n // Currently only restores the state of the fill/stroke style properties\n // and the z index. May want to expand this to include\n // all modifiable properties (i.e. transform props and visibility prop)\n var state = this._stateStack.pop();\n if (state) {\n _basicStyle2.default.copyBasicStyle(state, this);\n this.zIndex = state.zIndex;\n }\n return this;\n }\n\n /**\n * Gets the visibility of the shape\n * @return {boolean}\n * @override\n */\n\n }, {\n key: \"getGlobalDimensions\",\n\n\n /**\n * Gets the width/height of the shape after the parent transforms are applied\n * @return {Vec2d} Width/Height of the shape after all parent transforms applied\n */\n value: function getGlobalDimensions() {\n var scale = [0, 0];\n _glMatrix.mat2d.svd(null, scale, null, this.globalXform);\n scale[0] *= this.width;\n scale[1] *= this.height;\n return scale;\n }\n\n /**\n * Returns true the shape contains a screen/world space point\n * @param {Point2d} screenPt The point to check in screen/pixel space\n * @param {Poitn2d} worldPt The point to check in world space\n * @param {Mat2d} worldToScreenMatrix The transform matrix from world to screen space\n * @param {CanvasRenderingContext2D} ctx The 2d rendering context\n * @return {boolean} True if the shape contains the point, false otherwise\n */\n\n }, {\n key: \"containsPoint\",\n value: function containsPoint(screenPt, worldPt, worldToScreenMatrix, ctx) {\n // Should we update here, or is it safe to\n // say that this is stateful, meaning a render\n // should have been performed beforehand which\n // would've updated its state\n var rtn = false;\n var aabox = this.aabox;\n\n // Check if the point is contained by the shape's bounds first\n if (this.visible && AABox2d.containsPt(aabox, worldPt)) {\n // re-draw the shape (invisible) so that we can use canvas's\n // isPointInPath/isPointInStroke api calls. Doing that\n // as this should be compatible across all browsers\n ctx.save();\n ctx.setTransform(this._fullXform[0], this._fullXform[1], this._fullXform[2], this._fullXform[3], this._fullXform[4], this._fullXform[5]);\n ctx.beginPath();\n this._draw(ctx);\n ctx.strokeStyle = \"rgba(0,0,0,0)\";\n ctx.lineWidth = this.strokeWidth + 5; // eslint-disable-line no-magic-numbers\n ctx.dashPattern = [];\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n if (this.isFillVisible() && ctx.isPointInPath(screenPt[0], screenPt[1]) || this.isStrokeVisible() && ctx.isPointInStroke(screenPt[0], screenPt[1])) {\n rtn = true;\n }\n ctx.restore();\n }\n return rtn;\n }\n\n /**\n * Debug function to draw the bounds of the shape\n * @param {CanvasRenderingContext2D} ctx 2d rendering context\n * @param {Mat2d} worldToScreenMatrix Transform from world to screen space\n * @param {StrokeStyle} boundsStrokeStyle The stroke style to use to render the bounds\n */\n\n }, {\n key: \"renderBounds\",\n value: function renderBounds(ctx, worldToScreenMatrix, boundsStrokeStyle) {\n ctx.save();\n ctx.setTransform(worldToScreenMatrix[0], worldToScreenMatrix[1], worldToScreenMatrix[2], worldToScreenMatrix[3], worldToScreenMatrix[4], worldToScreenMatrix[5]);\n boundsStrokeStyle.setStrokeCtx(ctx);\n var center = [0, 0];\n var extents = [0, 0];\n var aabox = this.aabox;\n AABox2d.getCenter(center, aabox);\n AABox2d.getExtents(extents, aabox);\n ctx.beginPath();\n ctx.rect(center[0] - extents[0], center[1] - extents[1], extents[0] * 2, extents[1] * 2);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Called when the local transform (does not include parent transforms) of the Transform2d\n * mixin is modified. Used to be notified internally that the shape's bounds needs updating\n * @private\n */\n\n }, {\n key: \"_localXformUpdated\",\n value: function _localXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Called when the global transform (includes parent transforms) of the Transform2d\n * mixin is modified. Used to be notified internally that the shape's bounds needs updating\n * @private\n */\n\n }, {\n key: \"_globalXformUpdated\",\n value: function _globalXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Renders the shape using a 2d rendering context\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @param {Mat2d} worldToScreenMatrix Transform from world to screen space,\n * usually provided by a camera\n * @param {DrawStyleState} styleState Manages the current state of the fill/stroke style attrs\n * of the 2d rendering context. This is self-managed to minimize\n * context state switches\n * @param {boolean} [doFill=null] If provided, used to manually override whether to fill the\n * shape.\n * @param {boolean} [doStroke=null] If provided, used to manually override whether to stroke the\n * shape.\n */\n\n }, {\n key: \"render\",\n value: function render(ctx, worldToScreenMatrix, styleState) {\n var doFill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var doStroke = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\n this.transformCtx(ctx, this._fullXform, worldToScreenMatrix);\n\n ctx.beginPath();\n\n var rtn = this._draw(ctx);\n if (rtn || typeof rtn === \"undefined\") {\n if (this.isFillVisible() && (doFill === null || Boolean(doFill))) {\n styleState.setFillStyle(ctx, this);\n ctx.fill();\n }\n\n if (this.isStrokeVisible() && (doStroke === null || Boolean(doStroke))) {\n styleState.setStrokeStyle(ctx, this);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n }\n }\n }\n\n /**\n * Copies the fill/stroke style from one BasicStyle object to this shape\n * @param {BasicStyle} newStyle The style to copy from.\n * @return {BaseShape} this\n */\n\n }, {\n key: \"setStyle\",\n value: function setStyle(newStyle) {\n _basicStyle2.default.copyBasicStyle(newStyle, this);\n return this;\n }\n\n /**\n * Returns a JSON object containing the properties of this shape\n * @return {object}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n var state = this; // eslint-disable-line consistent-this\n if (this._stateStack && this._stateStack.length) {\n state = this._stateStack[0];\n }\n return Object.assign({\n // type: this.constructor.name,\n // NOTE: I wanted to use the above call, which would keep the type\n // consistent with the name of the class, but this isn't always\n // the case, as was found out a few times when trying to add\n // this to immerse\n visible: this.visible,\n zIndex: state.zIndex\n }, _basicStyle2.default.toJSON(state), _transform2d2.default.toJSON(this));\n }\n\n /**\n * Compares two shapes, usually used to sort the shapes for drawing\n * @param {BaseShape} shape1\n * @param {BaseShape} shape2\n * @return {number} Returns < 0 if shape1 < shape2, > 0 if shape1 > shape2, 0 if shape1 === shape2\n */\n\n }, {\n key: \"visible\",\n get: function get() {\n return this._visible && (this.isFillVisible() || this.isStrokeVisible());\n }\n }], [{\n key: \"shapeCompare\",\n value: function shapeCompare(shape1, shape2) {\n var zIndex1 = shape1.zIndex;\n var zIndex2 = shape2.zIndex;\n if (zIndex1 < zIndex2) {\n return -1;\n } else if (zIndex1 > zIndex2) {\n return 1;\n }\n\n var rtn = _fillStyle2.default.compareFillStyle(shape1, shape2);\n if (!rtn) {\n rtn = _strokeStyle2.default.compareStrokeStyle(shape1, shape2);\n }\n\n return rtn;\n }\n }]);\n\n return BaseShape;\n}((0, _aggregation3.default)(CoreBaseShape, (0, _transform2d.createEventedTransform2dMixin)(\"changed:xform\"), (0, _fillStyle.createEventedFillStyleMixin)(\"changed:style\"), (0, _strokeStyle.createEventedStrokeStyleMixin)(\"changed:style\")));\n\nexports.default = BaseShape;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvYmFzZS1zaGFwZS5qcz9iYmVhIl0sIm5hbWVzIjpbIkFBQm94MmQiLCJDb3JlQmFzZVNoYXBlIiwib3B0cyIsIl9hYWJveCIsImNyZWF0ZSIsIl96SW5kZXgiLCJ6SW5kZXgiLCJfdmlzaWJsZSIsIl9nZW9tRGlydHkiLCJfZnVsbFhmb3JtIiwiTWF0MmQiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJFcnJvciIsInByZXYiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIiwiX3VwZGF0ZUFBQm94IiwidmlzaWJsZSIsIkV2ZW50SGFuZGxlciIsIkJhc2VTaGFwZSIsIl9zdGF0ZVN0YWNrIiwic3RhdGUiLCJCYXNpY1N0eWxlIiwiY29weUJhc2ljU3R5bGUiLCJwdXNoIiwicG9wIiwic2NhbGUiLCJzdmQiLCJnbG9iYWxYZm9ybSIsIndpZHRoIiwiaGVpZ2h0Iiwic2NyZWVuUHQiLCJ3b3JsZFB0Iiwid29ybGRUb1NjcmVlbk1hdHJpeCIsImN0eCIsInJ0biIsImFhYm94IiwiY29udGFpbnNQdCIsInNhdmUiLCJzZXRUcmFuc2Zvcm0iLCJiZWdpblBhdGgiLCJfZHJhdyIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwic3Ryb2tlV2lkdGgiLCJkYXNoUGF0dGVybiIsInN0cm9rZSIsImlzRmlsbFZpc2libGUiLCJpc1BvaW50SW5QYXRoIiwiaXNTdHJva2VWaXNpYmxlIiwiaXNQb2ludEluU3Ryb2tlIiwicmVzdG9yZSIsImJvdW5kc1N0cm9rZVN0eWxlIiwic2V0U3Ryb2tlQ3R4IiwiY2VudGVyIiwiZXh0ZW50cyIsImdldENlbnRlciIsImdldEV4dGVudHMiLCJyZWN0IiwiX2JvdW5kc091dE9mRGF0ZSIsInN0eWxlU3RhdGUiLCJkb0ZpbGwiLCJkb1N0cm9rZSIsInRyYW5zZm9ybUN0eCIsIkJvb2xlYW4iLCJzZXRGaWxsU3R5bGUiLCJmaWxsIiwic2V0U3Ryb2tlU3R5bGUiLCJuZXdTdHlsZSIsImxlbmd0aCIsIk9iamVjdCIsImFzc2lnbiIsInRvSlNPTiIsIlRyYW5zZm9ybTJkIiwic2hhcGUxIiwic2hhcGUyIiwiekluZGV4MSIsInpJbmRleDIiLCJGaWxsU3R5bGUiLCJjb21wYXJlRmlsbFN0eWxlIiwiU3Ryb2tlU3R5bGUiLCJjb21wYXJlU3Ryb2tlU3R5bGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztBQUVBOztJQUFZQSxPOztBQUNaOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQTs7Ozs7QUFLQTs7Ozs7Ozs7O0FBU0E7Ozs7Ozs7OztBQVNBOzs7O0lBSU1DLGE7OztBQUNKOzs7OztBQUtBLHlCQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQUEsOEhBQ1YsQ0FBQyxlQUFELEVBQWtCLGVBQWxCLEVBQW1DLGVBQW5DLEVBQW9ELG9CQUFwRCxFQUEwRSxjQUExRSxDQURVOztBQUVoQixVQUFLQyxNQUFMLEdBQWNILFFBQVFJLE1BQVIsRUFBZDtBQUNBLFVBQUtDLE9BQUwsR0FBZ0JILFFBQVFBLEtBQUtJLE1BQWQsR0FBd0JKLEtBQUtJLE1BQTdCLEdBQXNDLENBQXJEO0FBQ0EsVUFBS0MsUUFBTCxHQUFnQixJQUFoQjtBQUNBLFVBQUtDLFVBQUwsR0FBa0IsS0FBbEI7O0FBRUEsVUFBS0MsVUFBTCxHQUFrQkMsZ0JBQU1OLE1BQU4sRUFBbEI7QUFQZ0I7QUFRakI7O0FBRUQ7Ozs7Ozs7Ozs7c0JBTVdFLE0sRUFBUTtBQUNqQixVQUFJLENBQUNLLE9BQU9DLFNBQVAsQ0FBaUJOLE1BQWpCLENBQUwsRUFBK0I7QUFDN0IsY0FBTSxJQUFJTyxLQUFKLENBQVUsMkJBQVYsQ0FBTjtBQUNEO0FBQ0QsVUFBSVAsV0FBVyxLQUFLRCxPQUFwQixFQUE2QjtBQUMzQixZQUFNUyxPQUFPLEtBQUtULE9BQWxCO0FBQ0EsYUFBS0EsT0FBTCxHQUFlQyxNQUFmO0FBQ0EsYUFBS1MsSUFBTCxDQUFVLGVBQVYsRUFBMkI7QUFDekJDLGdCQUFNLFFB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QUFVRixPQUFPeEUsTUFBdkI7QUFDQSxVQUFJeUUsVUFBVUMsT0FBZCxFQUF1QjtBQUNyQixlQUFPLENBQUMsQ0FBUjtBQUNELE9BRkQsTUFFTyxJQUFJRCxVQUFVQyxPQUFkLEVBQXVCO0FBQzVCLGVBQU8sQ0FBUDtBQUNEOztBQUVELFVBQUkxQyxNQUFNMkMsb0JBQVVDLGdCQUFWLENBQTJCTCxNQUEzQixFQUFtQ0MsTUFBbkMsQ0FBVjtBQUNBLFVBQUksQ0FBQ3hDLEdBQUwsRUFBVTtBQUNSQSxjQUFNNkMsc0JBQVlDLGtCQUFaLENBQStCUCxNQUEvQixFQUF1Q0MsTUFBdkMsQ0FBTjtBQUNEOztBQUVELGFBQU94QyxHQUFQO0FBQ0Q7Ozs7RUF0T29DLDJCQUFZckMsYUFBWixFQUNyQyxnREFBOEIsZUFBOUIsQ0FEcUMsRUFDVyw0Q0FBNEIsZUFBNUIsQ0FEWCxFQUVyQyxnREFBOEIsZUFBOUIsQ0FGcUMsQzs7a0JBQWxCcUIsUyIsImZpbGUiOiI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCBGaWxsU3R5bGUsIHtjcmVhdGVFdmVudGVkRmlsbFN0eWxlTWl4aW59IGZyb20gXCIuLi9zdHlsZS9maWxsLXN0eWxlXCJcbmltcG9ydCBTdHJva2VTdHlsZSwge2NyZWF0ZUV2ZW50ZWRTdHJva2VTdHlsZU1peGlufSBmcm9tIFwiLi4vc3R5bGUvc3Ryb2tlLXN0eWxlXCJcbmltcG9ydCBUcmFuc2Zvcm0yZCwge2NyZWF0ZUV2ZW50ZWRUcmFuc2Zvcm0yZE1peGlufSBmcm9tIFwiLi90cmFuc2Zvcm0yZFwiXG5pbXBvcnQgYWdncmVnYXRpb24gZnJvbSBcIi4uL3V0aWwvYWdncmVnYXRpb25cIlxuaW1wb3J0IEJhc2ljU3R5bGUgZnJvbSBcIi4uL3N0eWxlL2Jhc2ljLXN0eWxlXCJcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSBcIi4uL3V0aWwvZXZlbnQtaGFuZGxlclwiXG5pbXBvcnQge21hdDJkIGFzIE1hdDJkfSBmcm9tIFwiZ2wtbWF0cml4XCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb3JlU2hhcGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3pJbmRleD0wXSBaIGluZGV4IGRyYXcgb3JkZXIgb2YgdGhlIHNoYXBlLiBMb3dlciBudW1iZXJzIGdldCBkcmF3biBiZWZvcmUgbGFyZ2VyIG51bWJlcnNcbiAqL1xuXG4vKipcbiAqIFNoYXBlIGdlb20gbW9kaWZpY2F0aW9uIGV2ZW50XG4gKiBAZXZlbnQgU2hhcGUjZ2VvbUNoYW5nZWRcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0ciBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbW9kaWZpZWRcbiAqIEBwcm9wZXJ0eSB7fSBwcmV2VmFsIFByZXZpb3VzIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcHJpb3IgdG8gbW9kaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBTaGFwZSBtb2RpZmljYXRpb24gZXZlbnRcbiAqIEBldmVudCBFdmVudGVkU2hhcGUjY2hhbmdlZFxuICogQHR5cGUge29iamVjdH1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBtb2RpZmllZFxuICogQHByb3BlcnR5IHt9IHByZXZWYWwgUHJldmlvdXMgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBwcmlvciB0byBtb2RpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7fSBjdXJyVmFsIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcG9zdCBtb2RpZmljYXRpb25cbiAqL1xuXG4vKipcbiAqIEBjbGFzcyBEZWZpbmVzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBzaGFwZXNcbiAqIEBleHRlbmRzIHtFdmVudEhhbmRsZXJ9XG4gKi9cbmNsYXNzIENvcmVCYXNlU2hhcGUgZXh0ZW5kcyBFdmVudEhhbmRsZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBhIHNoYXBlXG4gICAqIEBwYXJhbSAge0NvcmVTaGFwZU9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJuIHtDb3JlQmFzZVNoYXBlfVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIHN1cGVyKFtcImNoYW5nZWQ6eGZvcm1cIiwgXCJjaGFuZ2VkOnN0eWxlXCIsIFwiY2hhbmdlZDpvcmRlclwiLCBcImNoYW5nZWQ6dmlzaWJpbGl0eVwiLCBcImNoYW5nZWQ6Z2VvbVwiXSlcbiAgICB0aGlzLl9hYWJveCA9IEFBQm94MmQuY3JlYXRlKClcbiAgICB0aGlzLl96SW5kZXggPSAob3B0cyAmJiBvcHRzLnpJbmRleCkgPyBvcHRzLnpJbmRleCA6IDBcbiAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZVxuICAgIHRoaXMuX2dlb21EaXJ0eSA9IGZhbHNlXG5cbiAgICB0aGlzLl9mdWxsWGZvcm0gPSBNYXQyZC5jcmVhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHogaW5kZXggKGJhY2sgdG8gZnJvbnQgZHJhdyBvcmRlcikgb2YgdGhlIHNoYXBlXG4gICAqIEBwYXJhbSAge251bWJlcn0gekluZGV4XG4gICAqIEBmaXJlcyAgRXZlbnRlZFNoYXBlI2NoYW5nZWRcbiAgICogQHJldHVybiB7Q29yZUJhc2VTaGFwZX0gICAgICAgIHRoaXNcbiAgICovXG4gIHNldCB6SW5kZXgoekluZGV4KSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHpJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInpJbmRleCBtdXN0IGJlIGFuIGludGVnZXJcIilcbiAgICB9XG4gICAgaWYgKHpJbmRleCAhPT0gdGhpcy5fekluZGV4KSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5fekluZGV4XG4gICAgICB0aGlzLl96SW5kZXggPSB6SW5kZXhcbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6b3JkZXJcIiwge1xuICAgICAgICBhdHRyOiBcInpJbmRleFwiLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiB0aGlzLl96SW5kZXhcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB6IGluZGV4IChpLmUuIGRyYXcvbGF5ZXIgb3JkZXIpIG9mIHRoZSBzaGFwZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgekluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl96SW5kZXhcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgdGhlXG4gICAqIHNoYXBlXG4gICAqIEByZXR1cm4ge0FBQm94MmR9XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0IGFhYm94KCkge1xuICAgIHRoaXMuX3VwZGF0ZUFBQm94KClcbiAgICByZXR1cm4gdGhpcy5fYWFib3hcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzaGFwZVxuICAgKiBAcGFyYW0gIHtCb29sZWFufSB2aXNpYmxlIElmIHRydWUsIHRoZSBzaGFwZSBpcyBjb25zaWRlcmVkIHZpc2libGVcbiAgICogQGZpcmVzICBFdmVudGVkU2hhcGUjY2hhbmdlZFxuICAgKiBAcmV0dXJuIHtDb3JlQmFzZVNoYXBlfSAgICAgICAgIHRoaXNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGFyZ3VtZW50IGlzIG5vdCBhIGJvb2xlYW4gdHlwZVxuICAgKi9cbiAgc2V0IHZpc2libGUodmlzaWJsZSkge1xuICAgIGlmICh0eXBlb2YgdmlzaWJsZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInZpc2libGUgbXVzdCBiZSBhIGJvb2xlYW5cIilcbiAgICB9XG5cbiAgICBpZiAodmlzaWJsZSAhPT0gdGhpcy5fdmlzaWJsZSkge1xuICAgICAgdGhpcy5fdmlzaWJsZSA9IHZpc2libGVcbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6dmlzaWJpbGl0eVwiLCB7XG4gICAgICAgIGF0dHI6IFwidmlzaWJsZVwiLFxuICAgICAgICBwcmV2VmFsOiAhdGhpcy5fdmlzaWJsZSxcbiAgICAgICAgY3VyclZhbDogdGhpcy5fdmlzaWJsZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBvZiB0aGUgc2hhcGVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlXG4gIH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgRGVmaW5lcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiBhbGwgc2hhcGVzLiBUaGlzIGluY2x1ZGVzXG4gKiAgICAgICAgbWl4aW5nIGluIGZyb20gRXZlbnRlZFRyYW5zZm9ybTJkIHNvIHRoYXQgYWZmaW5lIHRyYW5zZm9ybWF0aW9uc1xuICogICAgICAgIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBzaGFwZS4gQWxzbyBpbmNsdWRlcyBtaXhpbmcgaW4gZmlsbCBhbmQgc3Ryb2tlXG4gKiAgICAgICAgcHJvcGVydGllcyBzbyB0aGF0IHRoZSBzaGFwZSdzIHJlbmRlcmFibGUgcHJvcGVydGllcyBjYW4gYmUgbW9kaWZpZWQuXG4gKiBAZXh0ZW5kcyB7Q29yZUJhc2VTaGFwZX1cbiAqIEBtaXhpbiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICogQG1peGluIHtFdmVudGVkRmlsbFN0eWxlfVxuICogQG1peGluIHtFdmVudGVkU3Ryb2tlU3R5bGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VTaGFwZSBleHRlbmRzIGFnZ3JlZ2F0aW9uKENvcmVCYXNlU2hhcGUsXG4gIGNyZWF0ZUV2ZW50ZWRUcmFuc2Zvcm0yZE1peGluKFwiY2hhbmdlZDp4Zm9ybVwiKSwgY3JlYXRlRXZlbnRlZEZpbGxTdHlsZU1peGluKFwiY2hhbmdlZDpzdHlsZVwiKSxcbiAgY3JlYXRlRXZlbnRlZFN0cm9rZVN0eWxlTWl4aW4oXCJjaGFuZ2VkOnN0eWxlXCIpKSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGJhc2ljIGZ1bmN0aW9uYWxpdHkgKGluY2x1ZGluZyB0cmFuc2Zvcm0sIGZpbGwgc3R5bGUsIGFuZCBzdHJva2Ugc3R5bGUgcHJvcGVydGllcylcbiAgICogZm9yIGEgc2hhcGVcbiAgICogQHBhcmFtICB7b2JqZWN0fSBvcHRzXG4gICAqIEByZXR1cm4ge0Jhc2VTaGFwZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX3N0YXRlU3RhY2sgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzaGFwZSBzbyB0aGF0IGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlci5cbiAgICogQHJldHVybiB7QmFzZVNoYXBlfSB0aGlzXG4gICAqL1xuICBzYXZlKCkge1xuICAgIC8vIEN1cnJlbnRseSBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZmlsbC9zdHJva2Ugc3R5bGUgcHJvcGVydGllc1xuICAgIC8vIGFuZCB0aGUgeiBpbmRleCBhcmUgc2F2ZWQuIE1heSB3YW50IHRvIGV4cGFuZCB0aGlzIHRvIGluY2x1ZGVcbiAgICAvLyBhbGwgbW9kaWZpYWJsZSBwcm9wZXJ0aWVzIChpLmUuIHRyYW5zZm9ybSBwcm9wcyBhbmQgdmlzaWJpbGl0eSBwcm9wKVxuICAgIGNvbnN0IHN0YXRlID0gbmV3IEJhc2ljU3R5bGUoKVxuICAgIEJhc2ljU3R5bGUuY29weUJhc2ljU3R5bGUodGhpcywgc3RhdGUpXG4gICAgc3RhdGUuekluZGV4ID0gdGhpcy56SW5kZXhcbiAgICB0aGlzLl9zdGF0ZVN0YWNrLnB1c2goc3RhdGUpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3BzIGEgc2F2ZWQgc3RhdGUgZnJvbSB0aGUgdG9wIG9mIHRoZSBzYXZlZCBzdGF0ZSBzdGFja1xuICAgKiBAcmV0dXJuIHtCYXNlU2hhcGV9IHRoaXNcbiAgICovXG4gIHJlc3RvcmUoKSB7XG4gICAgLy8gQ3VycmVudGx5IG9ubHkgcmVzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBmaWxsL3N0cm9rZSBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgLy8gYW5kIHRoZSB6IGluZGV4LiBNYXkgd2FudCB0byBleHBhbmQgdGhpcyB0byBpbmNsdWRlXG4gICAgLy8gYWxsIG1vZGlmaWFibGUgcHJvcGVydGllcyAoaS5lLiB0cmFuc2Zvcm0gcHJvcHMgYW5kIHZpc2liaWxpdHkgcHJvcClcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlU3RhY2sucG9wKClcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIEJhc2ljU3R5bGUuY29weUJhc2ljU3R5bGUoc3RhdGUsIHRoaXMpXG4gICAgICB0aGlzLnpJbmRleCA9IHN0YXRlLnpJbmRleFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNoYXBlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGUgJiYgKHRoaXMuaXNGaWxsVmlzaWJsZSgpIHx8IHRoaXMuaXNTdHJva2VWaXNpYmxlKCkpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBzaGFwZSBhZnRlciB0aGUgcGFyZW50IHRyYW5zZm9ybXMgYXJlIGFwcGxpZWRcbiAgICogQHJldHVybiB7VmVjMmR9IFdpZHRoL0hlaWdodCBvZiB0aGUgc2hhcGUgYWZ0ZXIgYWxsIHBhcmVudCB0cmFuc2Zvcm1zIGFwcGxpZWRcbiAgICovXG4gIGdldEdsb2JhbERpbWVuc2lvbnMoKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBbMCwgMF1cbiAgICBNYXQyZC5zdmQobnVsbCwgc2NhbGUsIG51bGwsIHRoaXMuZ2xvYmFsWGZvcm0pXG4gICAgc2NhbGVbMF0gKj0gdGhpcy53aWR0aFxuICAgIHNjYWxlWzFdICo9IHRoaXMuaGVpZ2h0XG4gICAgcmV0dXJuIHNjYWxlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHRoZSBzaGFwZSBjb250YWlucyBhIHNjcmVlbi93b3JsZCBzcGFjZSBwb2ludFxuICAgKiBAcGFyYW0gIHtQb2ludDJkfSBzY3JlZW5QdCAgICAgICAgICAgVGhlIHBvaW50IHRvIGNoZWNrIGluIHNjcmVlbi9waXhlbCBzcGFjZVxuICAgKiBAcGFyYW0gIHtQb2l0bjJkfSB3b3JsZFB0ICAgICAgICAgICAgVGhlIHBvaW50IHRvIGNoZWNrIGluIHdvcmxkIHNwYWNlXG4gICAqIEBwYXJhbSAge01hdDJkfSB3b3JsZFRvU2NyZWVuTWF0cml4ICBUaGUgdHJhbnNmb3JtIG1hdHJpeCBmcm9tIHdvcmxkIHRvIHNjcmVlbiBzcGFjZVxuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCBUaGUgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFRydWUgaWYgdGhlIHNoYXBlIGNvbnRhaW5zIHRoZSBwb2ludCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBjb250YWluc1BvaW50KHNjcmVlblB0LCB3b3JsZFB0LCB3b3JsZFRvU2NyZWVuTWF0cml4LCBjdHgpIHtcbiAgICAvLyBTaG91bGQgd2UgdXBkYXRlIGhlcmUsIG9yIGlzIGl0IHNhZmUgdG9cbiAgICAvLyBzYXkgdGhhdCB0aGlzIGlzIHN0YXRlZnVsLCBtZWFuaW5nIGEgcmVuZGVyXG4gICAgLy8gc2hvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgYmVmb3JlaGFuZCB3aGljaFxuICAgIC8vIHdvdWxkJ3ZlIHVwZGF0ZWQgaXRzIHN0YXRlXG4gICAgbGV0IHJ0biA9IGZhbHNlXG4gICAgY29uc3QgYWFib3ggPSB0aGlzLmFhYm94XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcG9pbnQgaXMgY29udGFpbmVkIGJ5IHRoZSBzaGFwZSdzIGJvdW5kcyBmaXJzdFxuICAgIGlmICh0aGlzLnZpc2libGUgJiYgQUFCb3gyZC5jb250YWluc1B0KGFhYm94LCB3b3JsZFB0KSkge1xuICAgICAgLy8gcmUtZHJhdyB0aGUgc2hhcGUgKGludmlzaWJsZSkgc28gdGhhdCB3ZSBjYW4gdXNlIGNhbnZhcydzXG4gICAgICAvLyBpc1BvaW50SW5QYXRoL2lzUG9pbnRJblN0cm9rZSBhcGkgY2FsbHMuIERvaW5nIHRoYXRcbiAgICAgIC8vIGFzIHRoaXMgc2hvdWxkIGJlIGNvbXBhdGlibGUgYWNyb3NzIGFsbCBicm93c2Vyc1xuICAgICAgY3R4LnNhdmUoKVxuICAgICAgY3R4LnNldFRyYW5zZm9ybSh0aGlzLl9mdWxsWGZvcm1bMF0sIHRoaXMuX2Z1bGxYZm9ybVsxXSwgdGhpcy5fZnVsbFhmb3JtWzJdLCB0aGlzLl9mdWxsWGZvcm1bM10sIHRoaXMuX2Z1bGxYZm9ybVs0XSwgdGhpcy5fZnVsbFhmb3JtWzVdKVxuICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICB0aGlzLl9kcmF3KGN0eClcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwicmdiYSgwLDAsMCwwKVwiXG4gICAgICBjdHgubGluZVdpZHRoID0gdGhpcy5zdHJva2VXaWR0aCArIDUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICBjdHguZGFzaFBhdHRlcm4gPSBbXVxuICAgICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICBpZiAoKHRoaXMuaXNGaWxsVmlzaWJsZSgpICYmIGN0eC5pc1BvaW50SW5QYXRoKHNjcmVlblB0WzBdLCBzY3JlZW5QdFsxXSkpIHx8XG4gICAgICAgICh0aGlzLmlzU3Ryb2tlVmlzaWJsZSgpICYmIGN0eC5pc1BvaW50SW5TdHJva2Uoc2NyZWVuUHRbMF0sIHNjcmVlblB0WzFdKSkpIHtcbiAgICAgICAgcnRuID0gdHJ1ZVxuICAgICAgfVxuICAgICAgY3R4LnJlc3RvcmUoKVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICAvKipcbiAgICogRGVidWcgZnVuY3Rpb24gdG8gZHJhdyB0aGUgYm91bmRzIG9mIHRoZSBzaGFwZVxuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAgICAgICAgICAgICAgICAgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtICB7TWF0MmR9IHdvcmxkVG9TY3JlZW5NYXRyaXggVHJhbnNmb3JtIGZyb20gd29ybGQgdG8gc2NyZWVuIHNwYWNlXG4gICAqIEBwYXJhbSAge1N0cm9rZVN0eWxlfSBib3VuZHNTdHJva2VTdHlsZSAgIFRoZSBzdHJva2Ugc3R5bGUgdG8gdXNlIHRvIHJlbmRlciB0aGUgYm91bmRzXG4gICAqL1xuICByZW5kZXJCb3VuZHMoY3R4LCB3b3JsZFRvU2NyZWVuTWF0cml4LCBib3VuZHNTdHJva2VTdHlsZSkge1xuICAgIGN0eC5zYXZlKClcbiAgICBjdHguc2V0VHJhbnNmb3JtKHdvcmxkVG9TY3JlZW5NYXRyaXhbMF0sIHdvcmxkVG9TY3JlZW5NYXRyaXhbMV0sIHdvcmxkVG9TY3JlZW5NYXRyaXhbMl0sIHdvcmxkVG9TY3JlZW5NYXRyaXhbM10sIHdvcmxkVG9TY3JlZW5NYXRyaXhbNF0sIHdvcmxkVG9TY3JlZW5NYXRyaXhbNV0pXG4gICAgYm91bmRzU3Ryb2tlU3R5bGUuc2V0U3Ryb2tlQ3R4KGN0eClcbiAgICBjb25zdCBjZW50ZXIgPSBbMCwgMF1cbiAgICBjb25zdCBleHRlbnRzID0gWzAsIDBdXG4gICAgY29uc3QgYWFib3ggPSB0aGlzLmFhYm94XG4gICAgQUFCb3gyZC5nZXRDZW50ZXIoY2VudGVyLCBhYWJveClcbiAgICBBQUJveDJkLmdldEV4dGVudHMoZXh0ZW50cywgYWFib3gpXG4gICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgY3R4LnJlY3QoY2VudGVyWzBdIC0gZXh0ZW50c1swXSwgY2VudGVyWzFdIC0gZXh0ZW50c1sxXSwgZXh0ZW50c1swXSAqIDIsIGV4dGVudHNbMV0gKiAyKVxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBjdHguc3Ryb2tlKClcbiAgICBjdHgucmVzdG9yZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGxvY2FsIHRyYW5zZm9ybSAoZG9lcyBub3QgaW5jbHVkZSBwYXJlbnQgdHJhbnNmb3Jtcykgb2YgdGhlIFRyYW5zZm9ybTJkXG4gICAqIG1peGluIGlzIG1vZGlmaWVkLiBVc2VkIHRvIGJlIG5vdGlmaWVkIGludGVybmFsbHkgdGhhdCB0aGUgc2hhcGUncyBib3VuZHMgbmVlZHMgdXBkYXRpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9sb2NhbFhmb3JtVXBkYXRlZCgpIHtcbiAgICB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdsb2JhbCB0cmFuc2Zvcm0gKGluY2x1ZGVzIHBhcmVudCB0cmFuc2Zvcm1zKSBvZiB0aGUgVHJhbnNmb3JtMmRcbiAgICogbWl4aW4gaXMgbW9kaWZpZWQuIFVzZWQgdG8gYmUgbm90aWZpZWQgaW50ZXJuYWxseSB0aGF0IHRoZSBzaGFwZSdzIGJvdW5kcyBuZWVkcyB1cGRhdGluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dsb2JhbFhmb3JtVXBkYXRlZCgpIHtcbiAgICB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgc2hhcGUgdXNpbmcgYSAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MmR9IGN0eCAgICAgICAgICAgICAgICAgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtICB7TWF0MmR9IHdvcmxkVG9TY3JlZW5NYXRyaXggVHJhbnNmb3JtIGZyb20gd29ybGQgdG8gc2NyZWVuIHNwYWNlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3VhbGx5IHByb3ZpZGVkIGJ5IGEgY2FtZXJhXG4gICAqIEBwYXJhbSAge0RyYXdTdHlsZVN0YXRlfSBzdHlsZVN0YXRlIE1hbmFnZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZpbGwvc3Ryb2tlIHN0eWxlIGF0dHJzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSAyZCByZW5kZXJpbmcgY29udGV4dC4gVGhpcyBpcyBzZWxmLW1hbmFnZWQgdG8gbWluaW1pemVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCBzdGF0ZSBzd2l0Y2hlc1xuICAgKiBAcGFyYW0gIHtib29sZWFufSBbZG9GaWxsPW51bGxdICAgICBJZiBwcm92aWRlZCwgdXNlZCB0byBtYW51YWxseSBvdmVycmlkZSB3aGV0aGVyIHRvIGZpbGwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlLlxuICAgKiBAcGFyYW0gIHtib29sZWFufSBbZG9TdHJva2U9bnVsbF0gICBJZiBwcm92aWRlZCwgdXNlZCB0byBtYW51YWxseSBvdmVycmlkZSB3aGV0aGVyIHRvIHN0cm9rZSB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUuXG4gICAqL1xuICByZW5kZXIoY3R4LCB3b3JsZFRvU2NyZWVuTWF0cml4LCBzdHlsZVN0YXRlLCBkb0ZpbGwgPSBudWxsLCBkb1N0cm9rZSA9IG51bGwpIHtcbiAgICB0aGlzLnRyYW5zZm9ybUN0eChjdHgsIHRoaXMuX2Z1bGxYZm9ybSwgd29ybGRUb1NjcmVlbk1hdHJpeClcblxuICAgIGN0eC5iZWdpblBhdGgoKVxuXG4gICAgY29uc3QgcnRuID0gdGhpcy5fZHJhdyhjdHgpXG4gICAgaWYgKHJ0biB8fCB0eXBlb2YgcnRuID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodGhpcy5pc0ZpbGxWaXNpYmxlKCkgJiYgKGRvRmlsbCA9PT0gbnVsbCB8fCBCb29sZWFuKGRvRmlsbCkpKSB7XG4gICAgICAgIHN0eWxlU3RhdGUuc2V0RmlsbFN0eWxlKGN0eCwgdGhpcylcbiAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1N0cm9rZVZpc2libGUoKSAmJiAoZG9TdHJva2UgPT09IG51bGwgfHwgQm9vbGVhbihkb1N0cm9rZSkpKSB7XG4gICAgICAgIHN0eWxlU3RhdGUuc2V0U3Ryb2tlU3R5bGUoY3R4LCB0aGlzKVxuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgdGhlIGZpbGwvc3Ryb2tlIHN0eWxlIGZyb20gb25lIEJhc2ljU3R5bGUgb2JqZWN0IHRvIHRoaXMgc2hhcGVcbiAgICogQHBhcmFtIHtCYXNpY1N0eWxlfSBuZXdTdHlsZSBUaGUgc3R5bGUgdG8gY29weSBmcm9tLlxuICAgKiBAcmV0dXJuIHtCYXNlU2hhcGV9IHRoaXNcbiAgICovXG4gIHNldFN0eWxlKG5ld1N0eWxlKSB7XG4gICAgQmFzaWNTdHlsZS5jb3B5QmFzaWNTdHlsZShuZXdTdHlsZSwgdGhpcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgc2hhcGVcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXRoaXNcbiAgICBpZiAodGhpcy5fc3RhdGVTdGFjayAmJiB0aGlzLl9zdGF0ZVN0YWNrLmxlbmd0aCkge1xuICAgICAgc3RhdGUgPSB0aGlzLl9zdGF0ZVN0YWNrWzBdXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgIC8vIHR5cGU6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIC8vIE5PVEU6IEkgd2FudGVkIHRvIHVzZSB0aGUgYWJvdmUgY2FsbCwgd2hpY2ggd291bGQga2VlcCB0aGUgdHlwZVxuICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjbGFzcywgYnV0IHRoaXMgaXNuJ3QgYWx3YXlzXG4gICAgICAvLyB0aGUgY2FzZSwgYXMgd2FzIGZvdW5kIG91dCBhIGZldyB0aW1lcyB3aGVuIHRyeWluZyB0byBhZGRcbiAgICAgIC8vIHRoaXMgdG8gaW1tZXJzZVxuICAgICAgdmlzaWJsZTogdGhpcy52aXNpYmxlLFxuICAgICAgekluZGV4OiBzdGF0ZS56SW5kZXhcbiAgICB9LCBCYXNpY1N0eWxlLnRvSlNPTihzdGF0ZSksIFRyYW5zZm9ybTJkLnRvSlNPTih0aGlzKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gc2hhcGVzLCB1c3VhbGx5IHVzZWQgdG8gc29ydCB0aGUgc2hhcGVzIGZvciBkcmF3aW5nXG4gICAqIEBwYXJhbSAge0Jhc2VTaGFwZX0gc2hhcGUxXG4gICAqIEBwYXJhbSAge0Jhc2VTaGFwZX0gc2hhcGUyXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgIFJldHVybnMgPCAwIGlmIHNoYXBlMSA8IHNoYXBlMiwgPiAwIGlmIHNoYXBlMSA+IHNoYXBlMiwgMCBpZiBzaGFwZTEgPT09IHNoYXBlMlxuICAgKi9cbiAgc3RhdGljIHNoYXBlQ29tcGFyZShzaGFwZTEsIHNoYXBlMikge1xuICAgIGNvbnN0IHpJbmRleDEgPSBzaGFwZTEuekluZGV4XG4gICAgY29uc3QgekluZGV4MiA9IHNoYXBlMi56SW5kZXhcbiAgICBpZiAoekluZGV4MSA8IHpJbmRleDIpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoekluZGV4MSA+IHpJbmRleDIpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgbGV0IHJ0biA9IEZpbGxTdHlsZS5jb21wYXJlRmlsbFN0eWxlKHNoYXBlMSwgc2hhcGUyKVxuICAgIGlmICghcnRuKSB7XG4gICAgICBydG4gPSBTdHJva2VTdHlsZS5jb21wYXJlU3Ryb2tlU3R5bGUoc2hhcGUxLCBzaGFwZTIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NoYXBlcy9iYXNlLXNoYXBlLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 7 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _fillStyle = __webpack_require__(18);\n\nvar _fillStyle2 = _interopRequireDefault(_fillStyle);\n\nvar _strokeStyle = __webpack_require__(19);\n\nvar _strokeStyle2 = _interopRequireDefault(_strokeStyle);\n\nvar _transform2d = __webpack_require__(12);\n\nvar _transform2d2 = _interopRequireDefault(_transform2d);\n\nvar _aggregation2 = __webpack_require__(8);\n\nvar _aggregation3 = _interopRequireDefault(_aggregation2);\n\nvar _basicStyle = __webpack_require__(9);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _eventHandler = __webpack_require__(13);\n\nvar _eventHandler2 = _interopRequireDefault(_eventHandler);\n\nvar _glMatrix = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} CoreShapeOptions\n * @property {number} [zIndex=0] Z index draw order of the shape. Lower numbers get drawn before larger numbers\n */\n\n/**\n * Shape geom modification event\n * @event Shape#geomChanged\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n/**\n * Shape modification event\n * @event EventedShape#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n/**\n * @class Defines the core functionality for all shapes\n * @extends {EventHandler}\n */\nvar CoreBaseShape = function (_EventHandler) {\n _inherits(CoreBaseShape, _EventHandler);\n\n /**\n * Creates new core functionality for a shape\n * @param {CoreShapeOptions} [opts]\n * @return {CoreBaseShape}\n */\n function CoreBaseShape(opts) {\n _classCallCheck(this, CoreBaseShape);\n\n var _this = _possibleConstructorReturn(this, (CoreBaseShape.__proto__ || Object.getPrototypeOf(CoreBaseShape)).call(this, [\"changed:xform\", \"changed:style\", \"changed:order\", \"changed:visibility\", \"changed:geom\"]));\n\n _this._aabox = AABox2d.create();\n _this._zIndex = opts && opts.zIndex ? opts.zIndex : 0;\n _this._visible = true;\n _this._geomDirty = false;\n\n _this._fullXform = _glMatrix.mat2d.create();\n return _this;\n }\n\n /**\n * Sets the z index (back to front draw order) of the shape\n * @param {number} zIndex\n * @fires EventedShape#changed\n * @return {CoreBaseShape} this\n */\n\n\n _createClass(CoreBaseShape, [{\n key: \"zIndex\",\n set: function set(zIndex) {\n if (!Number.isInteger(zIndex)) {\n throw new Error(\"zIndex must be an integer\");\n }\n if (zIndex !== this._zIndex) {\n var prev = this._zIndex;\n this._zIndex = zIndex;\n this.fire(\"changed:order\", {\n attr: \"zIndex\",\n prevVal: prev,\n currVal: this._zIndex\n });\n }\n return this;\n }\n\n /**\n * Gets the current z index (i.e. draw/layer order) of the shape\n * @return {number}\n */\n ,\n get: function get() {\n return this._zIndex;\n }\n\n /**\n * Gets a reference to the current axis-aligned bounding box of the\n * shape\n * @return {AABox2d}\n * @readOnly\n */\n\n }, {\n key: \"aabox\",\n get: function get() {\n this._updateAABox();\n return this._aabox;\n }\n\n /**\n * Sets the visibility of the shape\n * @param {Boolean} visible If true, the shape is considered visible\n * @fires EventedShape#changed\n * @return {CoreBaseShape} this\n * @throws {Error} If argument is not a boolean type\n */\n\n }, {\n key: \"visible\",\n set: function set(visible) {\n if (typeof visible !== \"boolean\") {\n throw new Error(\"visible must be a boolean\");\n }\n\n if (visible !== this._visible) {\n this._visible = visible;\n this.fire(\"changed:visibility\", {\n attr: \"visible\",\n prevVal: !this._visible,\n currVal: this._visible\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current visibility of the shape\n * @return {boolean}\n */\n ,\n get: function get() {\n return this._visible;\n }\n }]);\n\n return CoreBaseShape;\n}(_eventHandler2.default);\n\n/**\n * @class Defines the basic functionality of all shapes. This includes\n * mixing in from EventedTransform2d so that affine transformations\n * can be applied to the shape. Also includes mixing in fill and stroke\n * properties so that the shape's renderable properties can be modified.\n * @extends {CoreBaseShape}\n * @mixin {EventedTransform2d}\n * @mixin {EventedFillStyle}\n * @mixin {EventedStrokeStyle}\n */\n\n\nvar BaseShape = function (_aggregation) {\n _inherits(BaseShape, _aggregation);\n\n /**\n * Creates new basic functionality (including transform, fill style, and stroke style properties)\n * for a shape\n * @param {object} opts\n * @return {BaseShape}\n */\n function BaseShape(opts) {\n _classCallCheck(this, BaseShape);\n\n var _this2 = _possibleConstructorReturn(this, (BaseShape.__proto__ || Object.getPrototypeOf(BaseShape)).call(this, opts));\n\n _this2._stateStack = [];\n return _this2;\n }\n\n /**\n * Saves the current state of the shape so that it can be restored later.\n * @return {BaseShape} this\n */\n\n\n _createClass(BaseShape, [{\n key: \"save\",\n value: function save() {\n // Currently only the state of the fill/stroke style properties\n // and the z index are saved. May want to expand this to include\n // all modifiable properties (i.e. transform props and visibility prop)\n var state = new _basicStyle2.default();\n _basicStyle2.default.copyBasicStyle(this, state);\n state.zIndex = this.zIndex;\n this._stateStack.push(state);\n return this;\n }\n\n /**\n * Pops a saved state from the top of the saved state stack\n * @return {BaseShape} this\n */\n\n }, {\n key: \"restore\",\n value: function restore() {\n // Currently only restores the state of the fill/stroke style properties\n // and the z index. May want to expand this to include\n // all modifiable properties (i.e. transform props and visibility prop)\n var state = this._stateStack.pop();\n if (state) {\n _basicStyle2.default.copyBasicStyle(state, this);\n this.zIndex = state.zIndex;\n }\n return this;\n }\n\n /**\n * Gets the visibility of the shape\n * @return {boolean}\n * @override\n */\n\n }, {\n key: \"getGlobalDimensions\",\n\n\n /**\n * Gets the width/height of the shape after the parent transforms are applied\n * @return {Vec2d} Width/Height of the shape after all parent transforms applied\n */\n value: function getGlobalDimensions() {\n var scale = [0, 0];\n _glMatrix.mat2d.svd(null, scale, null, this.globalXform);\n scale[0] *= this.width;\n scale[1] *= this.height;\n return scale;\n }\n\n /**\n * Returns true the shape contains a screen/world space point\n * @param {Point2d} screenPt The point to check in screen/pixel space\n * @param {Poitn2d} worldPt The point to check in world space\n * @param {Mat2d} worldToScreenMatrix The transform matrix from world to screen space\n * @param {CanvasRenderingContext2D} ctx The 2d rendering context\n * @return {boolean} True if the shape contains the point, false otherwise\n */\n\n }, {\n key: \"containsPoint\",\n value: function containsPoint(screenPt, worldPt, worldToScreenMatrix, ctx) {\n // Should we update here, or is it safe to\n // say that this is stateful, meaning a render\n // should have been performed beforehand which\n // would've updated its state\n var rtn = false;\n var aabox = this.aabox;\n\n // Check if the point is contained by the shape's bounds first\n if (this.visible && AABox2d.containsPt(aabox, worldPt)) {\n // re-draw the shape (invisible) so that we can use canvas's\n // isPointInPath/isPointInStroke api calls. Doing that\n // as this should be compatible across all browsers\n ctx.save();\n ctx.setTransform(this._fullXform[0], this._fullXform[1], this._fullXform[2], this._fullXform[3], this._fullXform[4], this._fullXform[5]);\n ctx.beginPath();\n this._draw(ctx);\n ctx.strokeStyle = \"rgba(0,0,0,0)\";\n ctx.lineWidth = this.strokeWidth + 5; // eslint-disable-line no-magic-numbers\n ctx.dashPattern = [];\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n if (this.isFillVisible() && ctx.isPointInPath(screenPt[0], screenPt[1]) || this.isStrokeVisible() && ctx.isPointInStroke(screenPt[0], screenPt[1])) {\n rtn = true;\n }\n ctx.restore();\n }\n return rtn;\n }\n\n /**\n * Debug function to draw the bounds of the shape\n * @param {CanvasRenderingContext2D} ctx 2d rendering context\n * @param {Mat2d} worldToScreenMatrix Transform from world to screen space\n * @param {StrokeStyle} boundsStrokeStyle The stroke style to use to render the bounds\n */\n\n }, {\n key: \"renderBounds\",\n value: function renderBounds(ctx, worldToScreenMatrix, boundsStrokeStyle) {\n ctx.save();\n ctx.setTransform(worldToScreenMatrix[0], worldToScreenMatrix[1], worldToScreenMatrix[2], worldToScreenMatrix[3], worldToScreenMatrix[4], worldToScreenMatrix[5]);\n boundsStrokeStyle.setStrokeCtx(ctx);\n var center = [0, 0];\n var extents = [0, 0];\n var aabox = this.aabox;\n AABox2d.getCenter(center, aabox);\n AABox2d.getExtents(extents, aabox);\n ctx.beginPath();\n ctx.rect(center[0] - extents[0], center[1] - extents[1], extents[0] * 2, extents[1] * 2);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Called when the local transform (does not include parent transforms) of the Transform2d\n * mixin is modified. Used to be notified internally that the shape's bounds needs updating\n * @private\n */\n\n }, {\n key: \"_localXformUpdated\",\n value: function _localXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Called when the global transform (includes parent transforms) of the Transform2d\n * mixin is modified. Used to be notified internally that the shape's bounds needs updating\n * @private\n */\n\n }, {\n key: \"_globalXformUpdated\",\n value: function _globalXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Renders the shape using a 2d rendering context\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @param {Mat2d} worldToScreenMatrix Transform from world to screen space,\n * usually provided by a camera\n * @param {DrawStyleState} styleState Manages the current state of the fill/stroke style attrs\n * of the 2d rendering context. This is self-managed to minimize\n * context state switches\n * @param {boolean} [doFill=null] If provided, used to manually override whether to fill the\n * shape.\n * @param {boolean} [doStroke=null] If provided, used to manually override whether to stroke the\n * shape.\n */\n\n }, {\n key: \"render\",\n value: function render(ctx, worldToScreenMatrix, styleState) {\n var doFill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var doStroke = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\n this.transformCtx(ctx, this._fullXform, worldToScreenMatrix);\n\n ctx.beginPath();\n\n var rtn = this._draw(ctx);\n if (rtn || typeof rtn === \"undefined\") {\n if (this.isFillVisible() && (doFill === null || Boolean(doFill))) {\n styleState.setFillStyle(ctx, this);\n ctx.fill();\n }\n\n if (this.isStrokeVisible() && (doStroke === null || Boolean(doStroke))) {\n styleState.setStrokeStyle(ctx, this);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n }\n }\n }\n\n /**\n * Copies the fill/stroke style from one BasicStyle object to this shape\n * @param {BasicStyle} newStyle The style to copy from.\n * @return {BaseShape} this\n */\n\n }, {\n key: \"setStyle\",\n value: function setStyle(newStyle) {\n _basicStyle2.default.copyBasicStyle(newStyle, this);\n return this;\n }\n\n /**\n * Returns a JSON object containing the properties of this shape\n * @return {object}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n var state = this; // eslint-disable-line consistent-this\n if (this._stateStack && this._stateStack.length) {\n state = this._stateStack[0];\n }\n return Object.assign({\n // type: this.constructor.name,\n // NOTE: I wanted to use the above call, which would keep the type\n // consistent with the name of the class, but this isn't always\n // the case, as was found out a few times when trying to add\n // this to immerse\n visible: this.visible,\n zIndex: state.zIndex\n }, _basicStyle2.default.toJSON(state), _transform2d2.default.toJSON(this));\n }\n\n /**\n * Compares two shapes, usually used to sort the shapes for drawing\n * @param {BaseShape} shape1\n * @param {BaseShape} shape2\n * @return {number} Returns < 0 if shape1 < shape2, > 0 if shape1 > shape2, 0 if shape1 === shape2\n */\n\n }, {\n key: \"visible\",\n get: function get() {\n return this._visible && (this.isFillVisible() || this.isStrokeVisible());\n }\n }], [{\n key: \"shapeCompare\",\n value: function shapeCompare(shape1, shape2) {\n var zIndex1 = shape1.zIndex;\n var zIndex2 = shape2.zIndex;\n if (zIndex1 < zIndex2) {\n return -1;\n } else if (zIndex1 > zIndex2) {\n return 1;\n }\n\n var rtn = _fillStyle2.default.compareFillStyle(shape1, shape2);\n if (!rtn) {\n rtn = _strokeStyle2.default.compareStrokeStyle(shape1, shape2);\n }\n\n return rtn;\n }\n }]);\n\n return BaseShape;\n}((0, _aggregation3.default)(CoreBaseShape, (0, _transform2d.createEventedTransform2dMixin)(\"changed:xform\"), (0, _fillStyle.createEventedFillStyleMixin)(\"changed:style\"), (0, _strokeStyle.createEventedStrokeStyleMixin)(\"changed:style\")));\n\nexports.default = BaseShape;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvYmFzZS1zaGFwZS5qcz9iYmVhIl0sIm5hbWVzIjpbIkFBQm94MmQiLCJDb3JlQmFzZVNoYXBlIiwib3B0cyIsIl9hYWJveCIsImNyZWF0ZSIsIl96SW5kZXgiLCJ6SW5kZXgiLCJfdmlzaWJsZSIsIl9nZW9tRGlydHkiLCJfZnVsbFhmb3JtIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiRXJyb3IiLCJwcmV2IiwiZmlyZSIsImF0dHIiLCJwcmV2VmFsIiwiY3VyclZhbCIsIl91cGRhdGVBQUJveCIsInZpc2libGUiLCJCYXNlU2hhcGUiLCJfc3RhdGVTdGFjayIsInN0YXRlIiwiY29weUJhc2ljU3R5bGUiLCJwdXNoIiwicG9wIiwic2NhbGUiLCJzdmQiLCJnbG9iYWxYZm9ybSIsIndpZHRoIiwiaGVpZ2h0Iiwic2NyZWVuUHQiLCJ3b3JsZFB0Iiwid29ybGRUb1NjcmVlbk1hdHJpeCIsImN0eCIsInJ0biIsImFhYm94IiwiY29udGFpbnNQdCIsInNhdmUiLCJzZXRUcmFuc2Zvcm0iLCJiZWdpblBhdGgiLCJfZHJhdyIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwic3Ryb2tlV2lkdGgiLCJkYXNoUGF0dGVybiIsInN0cm9rZSIsImlzRmlsbFZpc2libGUiLCJpc1BvaW50SW5QYXRoIiwiaXNTdHJva2VWaXNpYmxlIiwiaXNQb2ludEluU3Ryb2tlIiwicmVzdG9yZSIsImJvdW5kc1N0cm9rZVN0eWxlIiwic2V0U3Ryb2tlQ3R4IiwiY2VudGVyIiwiZXh0ZW50cyIsImdldENlbnRlciIsImdldEV4dGVudHMiLCJyZWN0IiwiX2JvdW5kc091dE9mRGF0ZSIsInN0eWxlU3RhdGUiLCJkb0ZpbGwiLCJkb1N0cm9rZSIsInRyYW5zZm9ybUN0eCIsIkJvb2xlYW4iLCJzZXRGaWxsU3R5bGUiLCJmaWxsIiwic2V0U3Ryb2tlU3R5bGUiLCJuZXdTdHlsZSIsImxlbmd0aCIsIk9iamVjdCIsImFzc2lnbiIsInRvSlNPTiIsInNoYXBlMSIsInNoYXBlMiIsInpJbmRleDEiLCJ6SW5kZXgyIiwiY29tcGFyZUZpbGxTdHlsZSIsImNvbXBhcmVTdHJva2VTdHlsZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FBRUE7O0lBQVlBLE87O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBOzs7Ozs7Ozs7QUFTQTs7Ozs7Ozs7O0FBU0E7Ozs7SUFJTUMsYTs7O0FBQ0o7Ozs7O0FBS0EseUJBQVlDLElBQVosRUFBa0I7QUFBQTs7QUFBQSw4SEFDVixDQUFDLGVBQUQsRUFBa0IsZUFBbEIsRUFBbUMsZUFBbkMsRUFBb0Qsb0JBQXBELEVBQTBFLGNBQTFFLENBRFU7O0FBRWhCLFVBQUtDLE1BQUwsR0FBY0gsUUFBUUksTUFBUixFQUFkO0FBQ0EsVUFBS0MsT0FBTCxHQUFnQkgsUUFBUUEsS0FBS0ksTUFBZCxHQUF3QkosS0FBS0ksTUFBN0IsR0FBc0MsQ0FBckQ7QUFDQSxVQUFLQyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsVUFBS0MsVUFBTCxHQUFrQixLQUFsQjs7QUFFQSxVQUFLQyxVQUFMLEdBQWtCLGdCQUFNTCxNQUFOLEVBQWxCO0FBUGdCO0FBUWpCOztBQUVEOzs7Ozs7Ozs7O3NCQU1XRSxNLEVBQVE7QUFDakIsVUFBSSxDQUFDSSxPQUFPQyxTQUFQLENBQWlCTCxNQUFqQixDQUFMLEVBQStCO0FBQzdCLGNBQU0sSUFBSU0sS0FBSixDQUFVLDJCQUFWLENBQU47QUFDRDtBQUNELFVBQUlOLFdBQVcsS0FBS0QsT0FBcEIsRUFBNkI7QUFDM0IsWUFBTVEsT0FBTyxLQUFLUixPQUFsQjtBQUNBLGFBQUtBLE9BQUwsR0FBZUMsTUFBZjtBQUNBLGFBQUtRLElBQUwsQ0FBVSxlQUFWLEVBQTJCO0FBQ3pCQyxnQkFBTSxRQURtQjtBQUV6QkMsbUJBQVNILElBRmdCO0FBR3pCSSxtQkFBUyxLQUFLWjtBQUhXLFNBQTNCO0FBS0Q7QUFDRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7d0JBSWE7QUFDWCxhQUFPLEtBQUtBLE9BQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7O3dCQU1ZO0FBQ1YsV0FBS2EsWUFBTDtBQUNBLGFBQU8sS0FBS2YsTUFBWjtBQUNEOztBQUVEOzs7Ozs7Ozs7O3NCQU9ZZ0IsTyxFQUFTO0FBQ25CLFVBQUksT0FBT0EsT0FBUCxLQUFtQixTQUF2QixFQUFrQztBQUNoQyxjQUFNLElBQUlQLEtBQUosQ0FBVSwyQkFBVixDQUFOO0FBQ0Q7O0FBRUQsVUFBSU8sWUFBWSxLQUFLWixRQUFyQixFQUErQjtBQUM3QixhQUFLQSxRQUFMLEdBQWdCWSxPQUFoQjtBQUNBLGFBQUtMLElBQUwsQ0FBVSxvQkFBVixFQUFnQztBQUM5QkMsZ0JBQU0sU0FEd0I7QUFFOUJDLG1CQUFTLENBQUMsS0FBS1QsUUFGZTtBQUc5QlUsbUJBQVMsS0FBS1Y7QUFIZ0IsU0FBaEM7QUFLRDs7QUFFRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7d0JBSWM7QUFDWixhQUFPLEtBQUtBLFFBQVo7QUFDRDs7Ozs7O0FBR0g7Ozs7Ozs7Ozs7OztJQVVxQmEsUzs7O0FBSW5COzs7Ozs7QUFNQSxxQkFBWWxCLElBQVosRUFBa0I7QUFBQTs7QUFBQSx1SEFDVkEsSUFEVTs7QUFFaEIsV0FBS21CLFdBQUwsR0FBbUIsRUFBbkI7QUFGZ0I7QUFHakI7O0FBRUQ7Ozs7Ozs7OzJCQUlPO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBTUMsUUFBUSwwQkFBZDtBQUNBLDJCQUFXQyxjQUFYLENBQTBCLElBQTFCLEVBQWdDRCxLQUFoQztBQUNBQSxZQUFNaEIsTUFBTixHQUFlLEtBQUtBLE1BQXBCO0FBQ0EsV0FBS2UsV0FBTCxDQUFpQkcsSUFBakIsQ0FBc0JGLEtBQXRCO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OEJBSVU7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFNQSxRQUFRLEtBQUtELFdBQUwsQ0FBaUJJLEdBQWpCLEVBQWQ7QUFDQSxVQUFJSCxLQUFKLEVBQVc7QUFDVCw2QkFBV0MsY0FBWCxDQUEwQkQsS0FBMUIsRUFBaUMsSUFBakM7QUFDQSxhQUFLaEIsTUFBTCxHQUFjZ0IsTUFBTWhCLE1BQXBCO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7OztBQVNBOzs7OzBDQUlzQjtBQUNwQixVQUFNb0IsUUFBUSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWQ7QUFDQSxzQkFBTUMsR0FBTixDQUFVLElBQVYsRUFBZ0JELEtBQWhCLEVBQXVCLElBQXZCLEVBQTZCLEtBQUtFLFdBQWxDO0FBQ0FGLFlBQU0sQ0FBTixLQUFZLEtBQUtHLEtBQWpCO0FBQ0FILFlBQU0sQ0FBTixLQUFZLEtBQUtJLE1BQWpCO0FBQ0EsYUFBT0osS0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7OztrQ0FRY0ssUSxFQUFVQyxPLEVBQVNDLG1CLEVBQXFCQyxHLEVBQUs7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFJQyxNQUFNLEtBQVY7QUFDQSxVQUFNQyxRQUFRLEtBQUtBLEtBQW5COztBQUVBO0FBQ0EsVUFBSSxLQUFLakIsT0FBTCxJQUFnQm5CLFFBQVFxQyxVQUFSLENBQW1CRCxLQUFuQixFQUEwQkosT0FBMUIsQ0FBcEIsRUFBd0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0FFLFlBQUlJLElBQUo7QUFDQUosWUFBSUssWUFBSixDQUFpQixLQUFLOUIsVUFBTCxDQUFnQixDQUFoQixDQUFqQixFQUFxQyxLQUFLQSxVQUFMLENBQWdCLENBQWhCLENBQXJDLEVBQXlELEtBQUtBLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBekQsRUFBNkUsS0FBS0EsVUFBTCxDQUFnQixDQUFoQixDQUE3RSxFQUFpRyxLQUFLQSxVQUFMLENBQWdCLENBQWhCLENBQWpHLEVBQXFILEtBQUtBLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBckg7QUFDQXlCLFlBQUlNLFNBQUo7QUFDQSxhQUFLQyxLQUFMLENBQVdQLEdBQVg7QUFDQUEsWUFBSVEsV0FBSixHQUFrQixlQUFsQjtBQUNBUixZQUFJUyxTQUFKLEdBQWdCLEtBQUtDLFdBQUwsR0FBbUIsQ0FBbkMsQ0FUc0QsQ0FTakI7QUFDckNWLFlBQUlXLFdBQUosR0FBa0IsRUFBbEI7QUFDQVgsWUFBSUssWUFBSixDQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQixDQUExQixFQUE2QixDQUE3QixFQUFnQyxDQUFoQztBQUNBTCxZQUFJWSxNQUFKO0FBQ0EsWUFBSyxLQUFLQyxhQUFMLE1BQXdCYixJQUFJYyxhQUFKLENBQWtCakIsU0FBUyxDQUFULENBQWxCLEVBQStCQSxTQUFTLENBQVQsQ0FBL0IsQ0FBekIsSUFDRCxLQUFLa0IsZUFBTCxNQUEwQmYsSUFBSWdCLGVBQUosQ0FBb0JuQixTQUFTLENBQVQsQ0FBcEIsRUFBaUNBLFNBQVMsQ0FBVCxDQUFqQyxDQUQ3QixFQUM2RTtBQUMzRUksZ0JBQU0sSUFBTjtBQUNEO0FBQ0RELFlBQUlpQixPQUFKO0FBQ0Q7QUFDRCxhQUFPaEIsR0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7aUNBTWFELEcsRUFBS0QsbUIsRUFBcUJtQixpQixFQUFtQjtBQUN4RGxCLFVBQUlJLElBQUo7QUFDQUosVUFBSUssWUFBSixDQUFpQk4sb0JBQW9CLENBQXBCLENBQWpCLEVBQXlDQSxvQkFBb0IsQ0FBcEIsQ0FBekMsRUFBaUVBLG9CQUFvQixDQUFwQixDQUFqRSxFQUF5RkEsb0JBQW9CLENBQXBCLENBQXpGLEVBQWlIQSxvQkFBb0IsQ0FBcEIsQ0FBakgsRUFBeUlBLG9CQUFvQixDQUFwQixDQUF6STtBQUNBbUIsd0JBQWtCQyxZQUFsQixDQUErQm5CLEdBQS9CO0FBQ0EsVUFBTW9CLFNBQVMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFmO0FBQ0EsVUFBTUMsVUFBVSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWhCO0FBQ0EsVUFBTW5CLFFBQVEsS0FBS0EsS0FBbkI7QUFDQXBDLGNBQVF3RCxTQUFSLENBQWtCRixNQUFsQixFQUEwQmxCLEtBQTFCO0FBQ0FwQyxjQUFReUQsVUFBUixDQUFtQkYsT0FBbkIsRUFBNEJuQixLQUE1QjtBQUNBRixVQUFJTSxTQUFKO0FBQ0FOLFVBQUl3QixJQUFKLENBQVNKLE9BQU8sQ0FBUCxJQUFZQyxRQUFRLENBQVIsQ0FBckIsRUFBaUNELE9BQU8sQ0FBUCxJQUFZQyxRQUFRLENBQVIsQ0FBN0MsRUFBeURBLFFBQVEsQ0FBUixJQUFhLENBQXRFLEVBQXlFQSxRQUFRLENBQVIsSUFBYSxDQUF0RjtBQUNBckIsVUFBSUssWUFBSixDQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQixDQUExQixFQUE2QixDQUE3QixFQUFnQyxDQUFoQztBQUNBTCxVQUFJWSxNQUFKO0FBQ0FaLFVBQUlpQixPQUFKO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3lDQUtxQjtBQUNuQixXQUFLUSxnQkFBTCxHQUF3QixJQUF4QjtBQUNEOztBQUVEOzs7Ozs7OzswQ0FLc0I7QUFDcEIsV0FBS0EsZ0JBQUwsR0FBd0IsSUFBeEI7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OzsyQkFhT3pCLEcsRUFBS0QsbUIsRUFBcUIyQixVLEVBQTRDO0FBQUEsVUFBaENDLE1BQWdDLHVFQUF2QixJQUF1QjtBQUFBLFVBQWpCQyxRQUFpQix1RUFBTixJQUFNOztBQUMzRSxXQUFLQyxZQUFMLENBQWtCN0IsR0FBbEIsRUFBdUIsS0FBS3pCLFVBQTVCLEVBQXdDd0IsbUJBQXhDOztBQUVBQyxVQUFJTSxTQUFKOztBQUVBLFVBQU1MLE1BQU0sS0FBS00sS0FBTCxDQUFXUCxHQUFYLENBQVo7QUFDQSxVQUFJQyxPQUFPLE9BQU9BLEdBQVAsS0FBZSxXQUExQixFQUF1QztBQUNyQyxZQUFJLEtBQUtZLGFBQUwsT0FBeUJjLFdBQVcsSUFBWCxJQUFtQkcsUUFBUUgsTUFBUixDQUE1QyxDQUFKLEVBQWtFO0FBQ2hFRCxxQkFBV0ssWUFBWCxDQUF3Qi9CLEdBQXhCLEVBQTZCLElBQTdCO0FBQ0FBLGNBQUlnQyxJQUFKO0FBQ0Q7O0FBRUQsWUFBSSxLQUFLakIsZUFBTCxPQUEyQmEsYUFBYSxJQUFiLElBQXFCRSxRQUFRRixRQUFSLENBQWhELENBQUosRUFBd0U7QUFDdEVGLHFCQUFXTyxjQUFYLENBQTBCakMsR0FBMUIsRUFBK0IsSUFBL0I7QUFDQUEsY0FBSUssWUFBSixDQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQixDQUExQixFQUE2QixDQUE3QixFQUFnQyxDQUFoQztBQUNBTCxjQUFJWSxNQUFKO0FBQ0Q7QUFDRjtBQUNGOztBQUVEOzs7Ozs7Ozs2QkFLU3NCLFEsRUFBVTtBQUNqQiwyQkFBVzdDLGNBQVgsQ0FBMEI2QyxRQUExQixFQUFvQyxJQUFwQztBQUNBLGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7OzZCQUlTO0FBQ1AsVUFBSTlDLFFBQVEsSUFBWixDQURPLENBQ1U7QUFDakIsVUFBSSxLQUFLRCxXQUFMLElBQW9CLEtBQUtBLFdBQUwsQ0FBaUJnRCxNQUF6QyxFQUFpRDtBQUMvQy9DLGdCQUFRLEtBQUtELFdBQUwsQ0FBaUIsQ0FBakIsQ0FBUjtBQUNEO0FBQ0QsYUFBT2lELE9BQU9DLE1BQVAsQ0FBYztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FwRCxpQkFBUyxLQUFLQSxPQU5LO0FBT25CYixnQkFBUWdCLE1BQU1oQjtBQVBLLE9BQWQsRUFRSixxQkFBV2tFLE1BQVgsQ0FBa0JsRCxLQUFsQixDQVJJLEVBUXNCLHNCQUFZa0QsTUFBWixDQUFtQixJQUFuQixDQVJ0QixDQUFQO0FBU0Q7O0FBRUQ7Ozs7Ozs7Ozt3QkE5SmM7QUFDWixhQUFPLEtBQUtqRSxRQUFMLEtBQWtCLEtBQUt3QyxhQUFMLE1BQXdCLEtBQUtFLGVBQUwsRUFBMUMsQ0FBUDtBQUNEOzs7aUNBa0ttQndCLE0sRUFBUUMsTSxFQUFRO0FBQ2xDLFVBQU1DLFVBQVVGLE9BQU9uRSxNQUF2QjtBQUNBLFVBQU1zRSxVQUFVRixPQUFPcEUsTUFBdkI7QUFDQSxVQUFJcUUsVUFBVUMsT0FBZCxFQUF1QjtBQUNyQixlQUFPLENBQUMsQ0FBUjtBQUNELE9BRkQsTUFFTyxJQUFJRCxVQUFVQyxPQUFkLEVBQXVCO0FBQzVCLGVBQU8sQ0FBUDtBQUNEOztBQUVELFVBQUl6QyxNQUFNLG9CQUFVMEMsZ0JBQVYsQ0FBMkJKLE1BQTNCLEVBQW1DQyxNQUFuQyxDQUFWO0FBQ0EsVUFBSSxDQUFDdkMsR0FBTCxFQUFVO0FBQ1JBLGNBQU0sc0JBQVkyQyxrQkFBWixDQUErQkwsTUFBL0IsRUFBdUNDLE1BQXZDLENBQU47QUFDRDs7QUFFRCxhQUFPdkMsR0FBUDtBQUNEOzs7O0VBdE9vQywyQkFBWWxDLGFBQVosRUFDckMsZ0RBQThCLGVBQTlCLENBRHFDLEVBQ1csNENBQTRCLGVBQTVCLENBRFgsRUFFckMsZ0RBQThCLGVBQTlCLENBRnFDLEM7O2tCQUFsQm1CLFMiLCJmaWxlIjoiNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIEFBQm94MmQgZnJvbSBcIi4uL2NvcmUvYWFib3gyZFwiXG5pbXBvcnQgRmlsbFN0eWxlLCB7Y3JlYXRlRXZlbnRlZEZpbGxTdHlsZU1peGlufSBmcm9tIFwiLi4vc3R5bGUvZmlsbC1zdHlsZVwiXG5pbXBvcnQgU3Ryb2tlU3R5bGUsIHtjcmVhdGVFdmVudGVkU3Ryb2tlU3R5bGVNaXhpbn0gZnJvbSBcIi4uL3N0eWxlL3N0cm9rZS1zdHlsZVwiXG5pbXBvcnQgVHJhbnNmb3JtMmQsIHtjcmVhdGVFdmVudGVkVHJhbnNmb3JtMmRNaXhpbn0gZnJvbSBcIi4vdHJhbnNmb3JtMmRcIlxuaW1wb3J0IGFnZ3JlZ2F0aW9uIGZyb20gXCIuLi91dGlsL2FnZ3JlZ2F0aW9uXCJcbmltcG9ydCBCYXNpY1N0eWxlIGZyb20gXCIuLi9zdHlsZS9iYXNpYy1zdHlsZVwiXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gXCIuLi91dGlsL2V2ZW50LWhhbmRsZXJcIlxuaW1wb3J0IHttYXQyZCBhcyBNYXQyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29yZVNoYXBlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt6SW5kZXg9MF0gWiBpbmRleCBkcmF3IG9yZGVyIG9mIHRoZSBzaGFwZS4gTG93ZXIgbnVtYmVycyBnZXQgZHJhd24gYmVmb3JlIGxhcmdlciBudW1iZXJzXG4gKi9cblxuLyoqXG4gKiBTaGFwZSBnZW9tIG1vZGlmaWNhdGlvbiBldmVudFxuICogQGV2ZW50IFNoYXBlI2dlb21DaGFuZ2VkXG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHIgTmFtZSBvZiB0aGUgYXR0cmlidXRlIG1vZGlmaWVkXG4gKiBAcHJvcGVydHkge30gcHJldlZhbCBQcmV2aW91cyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHByaW9yIHRvIG1vZGlmaWNhdGlvblxuICogQHByb3BlcnR5IHt9IGN1cnJWYWwgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBwb3N0IG1vZGlmaWNhdGlvblxuICovXG5cbi8qKlxuICogU2hhcGUgbW9kaWZpY2F0aW9uIGV2ZW50XG4gKiBAZXZlbnQgRXZlbnRlZFNoYXBlI2NoYW5nZWRcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0ciBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbW9kaWZpZWRcbiAqIEBwcm9wZXJ0eSB7fSBwcmV2VmFsIFByZXZpb3VzIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcHJpb3IgdG8gbW9kaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2xhc3MgRGVmaW5lcyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgc2hhcGVzXG4gKiBAZXh0ZW5kcyB7RXZlbnRIYW5kbGVyfVxuICovXG5jbGFzcyBDb3JlQmFzZVNoYXBlIGV4dGVuZHMgRXZlbnRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSBzaGFwZVxuICAgKiBAcGFyYW0gIHtDb3JlU2hhcGVPcHRpb25zfSBbb3B0c11cbiAgICogQHJldHVybiB7Q29yZUJhc2VTaGFwZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBzdXBlcihbXCJjaGFuZ2VkOnhmb3JtXCIsIFwiY2hhbmdlZDpzdHlsZVwiLCBcImNoYW5nZWQ6b3JkZXJcIiwgXCJjaGFuZ2VkOnZpc2liaWxpdHlcIiwgXCJjaGFuZ2VkOmdlb21cIl0pXG4gICAgdGhpcy5fYWFib3ggPSBBQUJveDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fekluZGV4ID0gKG9wdHMgJiYgb3B0cy56SW5kZXgpID8gb3B0cy56SW5kZXggOiAwXG4gICAgdGhpcy5fdmlzaWJsZSA9IHRydWVcbiAgICB0aGlzLl9nZW9tRGlydHkgPSBmYWxzZVxuXG4gICAgdGhpcy5fZnVsbFhmb3JtID0gTWF0MmQuY3JlYXRlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB6IGluZGV4IChiYWNrIHRvIGZyb250IGRyYXcgb3JkZXIpIG9mIHRoZSBzaGFwZVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHpJbmRleFxuICAgKiBAZmlyZXMgIEV2ZW50ZWRTaGFwZSNjaGFuZ2VkXG4gICAqIEByZXR1cm4ge0NvcmVCYXNlU2hhcGV9ICAgICAgICB0aGlzXG4gICAqL1xuICBzZXQgekluZGV4KHpJbmRleCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih6SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ6SW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyXCIpXG4gICAgfVxuICAgIGlmICh6SW5kZXggIT09IHRoaXMuX3pJbmRleCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3pJbmRleFxuICAgICAgdGhpcy5fekluZGV4ID0gekluZGV4XG4gICAgICB0aGlzLmZpcmUoXCJjaGFuZ2VkOm9yZGVyXCIsIHtcbiAgICAgICAgYXR0cjogXCJ6SW5kZXhcIixcbiAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgY3VyclZhbDogdGhpcy5fekluZGV4XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgeiBpbmRleCAoaS5lLiBkcmF3L2xheWVyIG9yZGVyKSBvZiB0aGUgc2hhcGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHpJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fekluZGV4XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIHRoZVxuICAgKiBzaGFwZVxuICAgKiBAcmV0dXJuIHtBQUJveDJkfVxuICAgKiBAcmVhZE9ubHlcbiAgICovXG4gIGdldCBhYWJveCgpIHtcbiAgICB0aGlzLl91cGRhdGVBQUJveCgpXG4gICAgcmV0dXJuIHRoaXMuX2FhYm94XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc2hhcGVcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gdmlzaWJsZSBJZiB0cnVlLCB0aGUgc2hhcGUgaXMgY29uc2lkZXJlZCB2aXNpYmxlXG4gICAqIEBmaXJlcyAgRXZlbnRlZFNoYXBlI2NoYW5nZWRcbiAgICogQHJldHVybiB7Q29yZUJhc2VTaGFwZX0gICAgICAgICB0aGlzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhcmd1bWVudCBpcyBub3QgYSBib29sZWFuIHR5cGVcbiAgICovXG4gIHNldCB2aXNpYmxlKHZpc2libGUpIHtcbiAgICBpZiAodHlwZW9mIHZpc2libGUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2aXNpYmxlIG11c3QgYmUgYSBib29sZWFuXCIpXG4gICAgfVxuXG4gICAgaWYgKHZpc2libGUgIT09IHRoaXMuX3Zpc2libGUpIHtcbiAgICAgIHRoaXMuX3Zpc2libGUgPSB2aXNpYmxlXG4gICAgICB0aGlzLmZpcmUoXCJjaGFuZ2VkOnZpc2liaWxpdHlcIiwge1xuICAgICAgICBhdHRyOiBcInZpc2libGVcIixcbiAgICAgICAgcHJldlZhbDogIXRoaXMuX3Zpc2libGUsXG4gICAgICAgIGN1cnJWYWw6IHRoaXMuX3Zpc2libGVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZpc2liaWxpdHkgb2YgdGhlIHNoYXBlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVxuICB9XG59XG5cbi8qKlxuICogQGNsYXNzIERlZmluZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgYWxsIHNoYXBlcy4gVGhpcyBpbmNsdWRlc1xuICogICAgICAgIG1peGluZyBpbiBmcm9tIEV2ZW50ZWRUcmFuc2Zvcm0yZCBzbyB0aGF0IGFmZmluZSB0cmFuc2Zvcm1hdGlvbnNcbiAqICAgICAgICBjYW4gYmUgYXBwbGllZCB0byB0aGUgc2hhcGUuIEFsc28gaW5jbHVkZXMgbWl4aW5nIGluIGZpbGwgYW5kIHN0cm9rZVxuICogICAgICAgIHByb3BlcnRpZXMgc28gdGhhdCB0aGUgc2hhcGUncyByZW5kZXJhYmxlIHByb3BlcnRpZXMgY2FuIGJlIG1vZGlmaWVkLlxuICogQGV4dGVuZHMge0NvcmVCYXNlU2hhcGV9XG4gKiBAbWl4aW4ge0V2ZW50ZWRUcmFuc2Zvcm0yZH1cbiAqIEBtaXhpbiB7RXZlbnRlZEZpbGxTdHlsZX1cbiAqIEBtaXhpbiB7RXZlbnRlZFN0cm9rZVN0eWxlfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlU2hhcGUgZXh0ZW5kcyBhZ2dyZWdhdGlvbihDb3JlQmFzZVNoYXBlLFxuICBjcmVhdGVFdmVudGVkVHJhbnNmb3JtMmRNaXhpbihcImNoYW5nZWQ6eGZvcm1cIiksIGNyZWF0ZUV2ZW50ZWRGaWxsU3R5bGVNaXhpbihcImNoYW5nZWQ6c3R5bGVcIiksXG4gIGNyZWF0ZUV2ZW50ZWRTdHJva2VTdHlsZU1peGluKFwiY2hhbmdlZDpzdHlsZVwiKSkge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBiYXNpYyBmdW5jdGlvbmFsaXR5IChpbmNsdWRpbmcgdHJhbnNmb3JtLCBmaWxsIHN0eWxlLCBhbmQgc3Ryb2tlIHN0eWxlIHByb3BlcnRpZXMpXG4gICAqIGZvciBhIHNoYXBlXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0c1xuICAgKiBAcmV0dXJuIHtCYXNlU2hhcGV9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl9zdGF0ZVN0YWNrID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2hhcGUgc28gdGhhdCBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIuXG4gICAqIEByZXR1cm4ge0Jhc2VTaGFwZX0gdGhpc1xuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICAvLyBDdXJyZW50bHkgb25seSB0aGUgc3RhdGUgb2YgdGhlIGZpbGwvc3Ryb2tlIHN0eWxlIHByb3BlcnRpZXNcbiAgICAvLyBhbmQgdGhlIHogaW5kZXggYXJlIHNhdmVkLiBNYXkgd2FudCB0byBleHBhbmQgdGhpcyB0byBpbmNsdWRlXG4gICAgLy8gYWxsIG1vZGlmaWFibGUgcHJvcGVydGllcyAoaS5lLiB0cmFuc2Zvcm0gcHJvcHMgYW5kIHZpc2liaWxpdHkgcHJvcClcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBCYXNpY1N0eWxlKClcbiAgICBCYXNpY1N0eWxlLmNvcHlCYXNpY1N0eWxlKHRoaXMsIHN0YXRlKVxuICAgIHN0YXRlLnpJbmRleCA9IHRoaXMuekluZGV4XG4gICAgdGhpcy5fc3RhdGVTdGFjay5wdXNoKHN0YXRlKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUG9wcyBhIHNhdmVkIHN0YXRlIGZyb20gdGhlIHRvcCBvZiB0aGUgc2F2ZWQgc3RhdGUgc3RhY2tcbiAgICogQHJldHVybiB7QmFzZVNoYXBlfSB0aGlzXG4gICAqL1xuICByZXN0b3JlKCkge1xuICAgIC8vIEN1cnJlbnRseSBvbmx5IHJlc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgZmlsbC9zdHJva2Ugc3R5bGUgcHJvcGVydGllc1xuICAgIC8vIGFuZCB0aGUgeiBpbmRleC4gTWF5IHdhbnQgdG8gZXhwYW5kIHRoaXMgdG8gaW5jbHVkZVxuICAgIC8vIGFsbCBtb2RpZmlhYmxlIHByb3BlcnRpZXMgKGkuZS4gdHJhbnNmb3JtIHByb3BzIGFuZCB2aXNpYmlsaXR5IHByb3ApXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZVN0YWNrLnBvcCgpXG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICBCYXNpY1N0eWxlLmNvcHlCYXNpY1N0eWxlKHN0YXRlLCB0aGlzKVxuICAgICAgdGhpcy56SW5kZXggPSBzdGF0ZS56SW5kZXhcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzaGFwZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlICYmICh0aGlzLmlzRmlsbFZpc2libGUoKSB8fCB0aGlzLmlzU3Ryb2tlVmlzaWJsZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgc2hhcGUgYWZ0ZXIgdGhlIHBhcmVudCB0cmFuc2Zvcm1zIGFyZSBhcHBsaWVkXG4gICAqIEByZXR1cm4ge1ZlYzJkfSBXaWR0aC9IZWlnaHQgb2YgdGhlIHNoYXBlIGFmdGVyIGFsbCBwYXJlbnQgdHJhbnNmb3JtcyBhcHBsaWVkXG4gICAqL1xuICBnZXRHbG9iYWxEaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IHNjYWxlID0gWzAsIDBdXG4gICAgTWF0MmQuc3ZkKG51bGwsIHNjYWxlLCBudWxsLCB0aGlzLmdsb2JhbFhmb3JtKVxuICAgIHNjYWxlWzBdICo9IHRoaXMud2lkdGhcbiAgICBzY2FsZVsxXSAqPSB0aGlzLmhlaWdodFxuICAgIHJldHVybiBzY2FsZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB0aGUgc2hhcGUgY29udGFpbnMgYSBzY3JlZW4vd29ybGQgc3BhY2UgcG9pbnRcbiAgICogQHBhcmFtICB7UG9pbnQyZH0gc2NyZWVuUHQgICAgICAgICAgIFRoZSBwb2ludCB0byBjaGVjayBpbiBzY3JlZW4vcGl4ZWwgc3BhY2VcbiAgICogQHBhcmFtICB7UG9pdG4yZH0gd29ybGRQdCAgICAgICAgICAgIFRoZSBwb2ludCB0byBjaGVjayBpbiB3b3JsZCBzcGFjZVxuICAgKiBAcGFyYW0gIHtNYXQyZH0gd29ybGRUb1NjcmVlbk1hdHJpeCAgVGhlIHRyYW5zZm9ybSBtYXRyaXggZnJvbSB3b3JsZCB0byBzY3JlZW4gc3BhY2VcbiAgICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggVGhlIDJkIHJlbmRlcmluZyBjb250ZXh0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBUcnVlIGlmIHRoZSBzaGFwZSBjb250YWlucyB0aGUgcG9pbnQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgY29udGFpbnNQb2ludChzY3JlZW5QdCwgd29ybGRQdCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgY3R4KSB7XG4gICAgLy8gU2hvdWxkIHdlIHVwZGF0ZSBoZXJlLCBvciBpcyBpdCBzYWZlIHRvXG4gICAgLy8gc2F5IHRoYXQgdGhpcyBpcyBzdGF0ZWZ1bCwgbWVhbmluZyBhIHJlbmRlclxuICAgIC8vIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIGJlZm9yZWhhbmQgd2hpY2hcbiAgICAvLyB3b3VsZCd2ZSB1cGRhdGVkIGl0cyBzdGF0ZVxuICAgIGxldCBydG4gPSBmYWxzZVxuICAgIGNvbnN0IGFhYm94ID0gdGhpcy5hYWJveFxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50IGlzIGNvbnRhaW5lZCBieSB0aGUgc2hhcGUncyBib3VuZHMgZmlyc3RcbiAgICBpZiAodGhpcy52aXNpYmxlICYmIEFBQm94MmQuY29udGFpbnNQdChhYWJveCwgd29ybGRQdCkpIHtcbiAgICAgIC8vIHJlLWRyYXcgdGhlIHNoYXBlIChpbnZpc2libGUpIHNvIHRoYXQgd2UgY2FuIHVzZSBjYW52YXMnc1xuICAgICAgLy8gaXNQb2ludEluUGF0aC9pc1BvaW50SW5TdHJva2UgYXBpIGNhbGxzLiBEb2luZyB0aGF0XG4gICAgICAvLyBhcyB0aGlzIHNob3VsZCBiZSBjb21wYXRpYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnNcbiAgICAgIGN0eC5zYXZlKClcbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0odGhpcy5fZnVsbFhmb3JtWzBdLCB0aGlzLl9mdWxsWGZvcm1bMV0sIHRoaXMuX2Z1bGxYZm9ybVsyXSwgdGhpcy5fZnVsbFhmb3JtWzNdLCB0aGlzLl9mdWxsWGZvcm1bNF0sIHRoaXMuX2Z1bGxYZm9ybVs1XSlcbiAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgdGhpcy5fZHJhdyhjdHgpXG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMClcIlxuICAgICAgY3R4LmxpbmVXaWR0aCA9IHRoaXMuc3Ryb2tlV2lkdGggKyA1IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgICAgY3R4LmRhc2hQYXR0ZXJuID0gW11cbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgaWYgKCh0aGlzLmlzRmlsbFZpc2libGUoKSAmJiBjdHguaXNQb2ludEluUGF0aChzY3JlZW5QdFswXSwgc2NyZWVuUHRbMV0pKSB8fFxuICAgICAgICAodGhpcy5pc1N0cm9rZVZpc2libGUoKSAmJiBjdHguaXNQb2ludEluU3Ryb2tlKHNjcmVlblB0WzBdLCBzY3JlZW5QdFsxXSkpKSB7XG4gICAgICAgIHJ0biA9IHRydWVcbiAgICAgIH1cbiAgICAgIGN0eC5yZXN0b3JlKClcbiAgICB9XG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgLyoqXG4gICAqIERlYnVnIGZ1bmN0aW9uIHRvIGRyYXcgdGhlIGJvdW5kcyBvZiB0aGUgc2hhcGVcbiAgICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggICAgICAgICAgICAgICAgIDJkIHJlbmRlcmluZyBjb250ZXh0XG4gICAqIEBwYXJhbSAge01hdDJkfSB3b3JsZFRvU2NyZWVuTWF0cml4IFRyYW5zZm9ybSBmcm9tIHdvcmxkIHRvIHNjcmVlbiBzcGFjZVxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZX0gYm91bmRzU3Ryb2tlU3R5bGUgICBUaGUgc3Ryb2tlIHN0eWxlIHRvIHVzZSB0byByZW5kZXIgdGhlIGJvdW5kc1xuICAgKi9cbiAgcmVuZGVyQm91bmRzKGN0eCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgYm91bmRzU3Ryb2tlU3R5bGUpIHtcbiAgICBjdHguc2F2ZSgpXG4gICAgY3R4LnNldFRyYW5zZm9ybSh3b3JsZFRvU2NyZWVuTWF0cml4WzBdLCB3b3JsZFRvU2NyZWVuTWF0cml4WzFdLCB3b3JsZFRvU2NyZWVuTWF0cml4WzJdLCB3b3JsZFRvU2NyZWVuTWF0cml4WzNdLCB3b3JsZFRvU2NyZWVuTWF0cml4WzRdLCB3b3JsZFRvU2NyZWVuTWF0cml4WzVdKVxuICAgIGJvdW5kc1N0cm9rZVN0eWxlLnNldFN0cm9rZUN0eChjdHgpXG4gICAgY29uc3QgY2VudGVyID0gWzAsIDBdXG4gICAgY29uc3QgZXh0ZW50cyA9IFswLCAwXVxuICAgIGNvbnN0IGFhYm94ID0gdGhpcy5hYWJveFxuICAgIEFBQm94MmQuZ2V0Q2VudGVyKGNlbnRlciwgYWFib3gpXG4gICAgQUFCb3gyZC5nZXRFeHRlbnRzKGV4dGVudHMsIGFhYm94KVxuICAgIGN0eC5iZWdpblBhdGgoKVxuICAgIGN0eC5yZWN0KGNlbnRlclswXSAtIGV4dGVudHNbMF0sIGNlbnRlclsxXSAtIGV4dGVudHNbMV0sIGV4dGVudHNbMF0gKiAyLCBleHRlbnRzWzFdICogMilcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgY3R4LnN0cm9rZSgpXG4gICAgY3R4LnJlc3RvcmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBsb2NhbCB0cmFuc2Zvcm0gKGRvZXMgbm90IGluY2x1ZGUgcGFyZW50IHRyYW5zZm9ybXMpIG9mIHRoZSBUcmFuc2Zvcm0yZFxuICAgKiBtaXhpbiBpcyBtb2RpZmllZC4gVXNlZCB0byBiZSBub3RpZmllZCBpbnRlcm5hbGx5IHRoYXQgdGhlIHNoYXBlJ3MgYm91bmRzIG5lZWRzIHVwZGF0aW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbG9jYWxYZm9ybVVwZGF0ZWQoKSB7XG4gICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBnbG9iYWwgdHJhbnNmb3JtIChpbmNsdWRlcyBwYXJlbnQgdHJhbnNmb3Jtcykgb2YgdGhlIFRyYW5zZm9ybTJkXG4gICAqIG1peGluIGlzIG1vZGlmaWVkLiBVc2VkIHRvIGJlIG5vdGlmaWVkIGludGVybmFsbHkgdGhhdCB0aGUgc2hhcGUncyBib3VuZHMgbmVlZHMgdXBkYXRpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nbG9iYWxYZm9ybVVwZGF0ZWQoKSB7XG4gICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHNoYXBlIHVzaW5nIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJkfSBjdHggICAgICAgICAgICAgICAgIDJkIHJlbmRlcmluZyBjb250ZXh0XG4gICAqIEBwYXJhbSAge01hdDJkfSB3b3JsZFRvU2NyZWVuTWF0cml4IFRyYW5zZm9ybSBmcm9tIHdvcmxkIHRvIHNjcmVlbiBzcGFjZSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXN1YWxseSBwcm92aWRlZCBieSBhIGNhbWVyYVxuICAgKiBAcGFyYW0gIHtEcmF3U3R5bGVTdGF0ZX0gc3R5bGVTdGF0ZSBNYW5hZ2VzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmaWxsL3N0cm9rZSBzdHlsZSBhdHRyc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgMmQgcmVuZGVyaW5nIGNvbnRleHQuIFRoaXMgaXMgc2VsZi1tYW5hZ2VkIHRvIG1pbmltaXplXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgc3RhdGUgc3dpdGNoZXNcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gW2RvRmlsbD1udWxsXSAgICAgSWYgcHJvdmlkZWQsIHVzZWQgdG8gbWFudWFsbHkgb3ZlcnJpZGUgd2hldGhlciB0byBmaWxsIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZS5cbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gW2RvU3Ryb2tlPW51bGxdICAgSWYgcHJvdmlkZWQsIHVzZWQgdG8gbWFudWFsbHkgb3ZlcnJpZGUgd2hldGhlciB0byBzdHJva2UgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlLlxuICAgKi9cbiAgcmVuZGVyKGN0eCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgc3R5bGVTdGF0ZSwgZG9GaWxsID0gbnVsbCwgZG9TdHJva2UgPSBudWxsKSB7XG4gICAgdGhpcy50cmFuc2Zvcm1DdHgoY3R4LCB0aGlzLl9mdWxsWGZvcm0sIHdvcmxkVG9TY3JlZW5NYXRyaXgpXG5cbiAgICBjdHguYmVnaW5QYXRoKClcblxuICAgIGNvbnN0IHJ0biA9IHRoaXMuX2RyYXcoY3R4KVxuICAgIGlmIChydG4gfHwgdHlwZW9mIHJ0biA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHRoaXMuaXNGaWxsVmlzaWJsZSgpICYmIChkb0ZpbGwgPT09IG51bGwgfHwgQm9vbGVhbihkb0ZpbGwpKSkge1xuICAgICAgICBzdHlsZVN0YXRlLnNldEZpbGxTdHlsZShjdHgsIHRoaXMpXG4gICAgICAgIGN0eC5maWxsKClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNTdHJva2VWaXNpYmxlKCkgJiYgKGRvU3Ryb2tlID09PSBudWxsIHx8IEJvb2xlYW4oZG9TdHJva2UpKSkge1xuICAgICAgICBzdHlsZVN0YXRlLnNldFN0cm9rZVN0eWxlKGN0eCwgdGhpcylcbiAgICAgICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIHRoZSBmaWxsL3N0cm9rZSBzdHlsZSBmcm9tIG9uZSBCYXNpY1N0eWxlIG9iamVjdCB0byB0aGlzIHNoYXBlXG4gICAqIEBwYXJhbSB7QmFzaWNTdHlsZX0gbmV3U3R5bGUgVGhlIHN0eWxlIHRvIGNvcHkgZnJvbS5cbiAgICogQHJldHVybiB7QmFzZVNoYXBlfSB0aGlzXG4gICAqL1xuICBzZXRTdHlsZShuZXdTdHlsZSkge1xuICAgIEJhc2ljU3R5bGUuY29weUJhc2ljU3R5bGUobmV3U3R5bGUsIHRoaXMpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHNoYXBlXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC10aGlzXG4gICAgaWYgKHRoaXMuX3N0YXRlU3RhY2sgJiYgdGhpcy5fc3RhdGVTdGFjay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlID0gdGhpcy5fc3RhdGVTdGFja1swXVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAvLyB0eXBlOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAvLyBOT1RFOiBJIHdhbnRlZCB0byB1c2UgdGhlIGFib3ZlIGNhbGwsIHdoaWNoIHdvdWxkIGtlZXAgdGhlIHR5cGVcbiAgICAgIC8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MsIGJ1dCB0aGlzIGlzbid0IGFsd2F5c1xuICAgICAgLy8gdGhlIGNhc2UsIGFzIHdhcyBmb3VuZCBvdXQgYSBmZXcgdGltZXMgd2hlbiB0cnlpbmcgdG8gYWRkXG4gICAgICAvLyB0aGlzIHRvIGltbWVyc2VcbiAgICAgIHZpc2libGU6IHRoaXMudmlzaWJsZSxcbiAgICAgIHpJbmRleDogc3RhdGUuekluZGV4XG4gICAgfSwgQmFzaWNTdHlsZS50b0pTT04oc3RhdGUpLCBUcmFuc2Zvcm0yZC50b0pTT04odGhpcykpXG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZXMgdHdvIHNoYXBlcywgdXN1YWxseSB1c2VkIHRvIHNvcnQgdGhlIHNoYXBlcyBmb3IgZHJhd2luZ1xuICAgKiBAcGFyYW0gIHtCYXNlU2hhcGV9IHNoYXBlMVxuICAgKiBAcGFyYW0gIHtCYXNlU2hhcGV9IHNoYXBlMlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICBSZXR1cm5zIDwgMCBpZiBzaGFwZTEgPCBzaGFwZTIsID4gMCBpZiBzaGFwZTEgPiBzaGFwZTIsIDAgaWYgc2hhcGUxID09PSBzaGFwZTJcbiAgICovXG4gIHN0YXRpYyBzaGFwZUNvbXBhcmUoc2hhcGUxLCBzaGFwZTIpIHtcbiAgICBjb25zdCB6SW5kZXgxID0gc2hhcGUxLnpJbmRleFxuICAgIGNvbnN0IHpJbmRleDIgPSBzaGFwZTIuekluZGV4XG4gICAgaWYgKHpJbmRleDEgPCB6SW5kZXgyKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKHpJbmRleDEgPiB6SW5kZXgyKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cblxuICAgIGxldCBydG4gPSBGaWxsU3R5bGUuY29tcGFyZUZpbGxTdHlsZShzaGFwZTEsIHNoYXBlMilcbiAgICBpZiAoIXJ0bikge1xuICAgICAgcnRuID0gU3Ryb2tlU3R5bGUuY29tcGFyZVN0cm9rZVN0eWxlKHNoYXBlMSwgc2hhcGUyKVxuICAgIH1cblxuICAgIHJldHVybiBydG5cbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zaGFwZXMvYmFzZS1zaGFwZS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/*\n ** Aggregation -- Aggregation of Base Class and Mixin Classes\n ** Copyright (c) 2015 Ralf S. Engelschall \n **\n ** Permission is hereby granted, free of charge, to any person obtaining\n ** a copy of this software and associated documentation files (the\n ** \"Software\"), to deal in the Software without restriction, including\n ** without limitation the rights to use, copy, modify, merge, publish,\n ** distribute, sublicense, and/or sell copies of the Software, and to\n ** permit persons to whom the Software is furnished to do so, subject to\n ** the following conditions:\n **\n ** The above copyright notice and this permission notice shall be included\n ** in all copies or substantial portions of the Software.\n **\n ** THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/* ==== ECMAScript 6 variant ==== */\n\n/**\n * Creates a new class constructor function using an optional base class\n * and an optional list of mixins. If mixins need initializing, then\n * they should contain an 'initializer' member function\n * @param {function} base base class construct function, if null, a bare-bones\n * base class is used by default\n * @param {...[function]} mixins mixin classes\n * @return {function} new class constructor function\n */\nvar aggregation = function aggregation(base) {\n for (var _len = arguments.length, mixins = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n mixins[_key - 1] = arguments[_key];\n }\n\n /* create aggregation class */\n var aggregate = base ? function (_base) {\n _inherits(__Aggregate, _base);\n\n function __Aggregate() {\n var _ref;\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n _classCallCheck(this, __Aggregate);\n\n /* call mixin's initializer */\n var _this = _possibleConstructorReturn(this, (_ref = __Aggregate.__proto__ || Object.getPrototypeOf(__Aggregate)).call.apply(_ref, [this].concat(args)));\n /* call base class constructor */\n\n\n mixins.forEach(function (mixin) {\n if (typeof mixin.prototype.initializer === \"function\") {\n var _mixin$prototype$init;\n\n (_mixin$prototype$init = mixin.prototype.initializer).call.apply(_mixin$prototype$init, [_this].concat(args));\n }\n });\n return _this;\n }\n\n return __Aggregate;\n }(base) : function () {/* do nothing */};\n\n /* copy properties */\n var copyProps = function copyProps(target, source) {\n Object.getOwnPropertyNames(source).concat(Object.getOwnPropertySymbols(source)).forEach(function (prop) {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (base && prop.match(/^(?:initializer)$/)) {\n return;\n }\n Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop));\n });\n };\n\n /* copy all properties of all mixins into aggregation class */\n mixins.forEach(function (mixin) {\n copyProps(aggregate.prototype, mixin.prototype);\n copyProps(aggregate, mixin);\n });\n\n return aggregate;\n};\n\nexports.default = aggregation;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL2FnZ3JlZ2F0aW9uLmpzP2I4ODAiXSwibmFtZXMiOlsiYWdncmVnYXRpb24iLCJiYXNlIiwibWl4aW5zIiwiYWdncmVnYXRlIiwiYXJncyIsImZvckVhY2giLCJtaXhpbiIsInByb3RvdHlwZSIsImluaXRpYWxpemVyIiwiY2FsbCIsImNvcHlQcm9wcyIsInRhcmdldCIsInNvdXJjZSIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJjb25jYXQiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJwcm9wIiwibWF0Y2giLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTs7QUFFQTs7Ozs7Ozs7O0FBU0EsSUFBTUEsY0FBYyxTQUFkQSxXQUFjLENBQUNDLElBQUQsRUFBcUI7QUFBQSxvQ0FBWEMsTUFBVztBQUFYQSxVQUFXO0FBQUE7O0FBRXZDO0FBQ0EsTUFBTUMsWUFBYUY7QUFBQTs7QUFDakIsMkJBQXFCO0FBQUE7O0FBQUEseUNBQU5HLElBQU07QUFBTkEsWUFBTTtBQUFBOztBQUFBOztBQUluQjtBQUptQix1SkFFVkEsSUFGVTtBQUNuQjs7O0FBSUFGLGFBQU9HLE9BQVAsQ0FBZSxVQUFDQyxLQUFELEVBQVc7QUFDeEIsWUFBSSxPQUFPQSxNQUFNQyxTQUFOLENBQWdCQyxXQUF2QixLQUF1QyxVQUEzQyxFQUF1RDtBQUFBOztBQUFFLHlDQUFNRCxTQUFOLENBQWdCQyxXQUFoQixFQUE0QkMsSUFBNUIsNkNBQTBDTCxJQUExQztBQUFpRDtBQUMzRyxPQUZEO0FBTG1CO0FBUXBCOztBQVRnQjtBQUFBLElBQWlDSCxJQUFqQyxJQVVmLFlBQU0sQ0FBRSxnQkFBa0IsQ0FWOUI7O0FBWUE7QUFDQSxNQUFNUyxZQUFZLFNBQVpBLFNBQVksQ0FBQ0MsTUFBRCxFQUFTQyxNQUFULEVBQW9CO0FBQ3BDQyxXQUFPQyxtQkFBUCxDQUEyQkYsTUFBM0IsRUFDR0csTUFESCxDQUNVRixPQUFPRyxxQkFBUCxDQUE2QkosTUFBN0IsQ0FEVixFQUVHUCxPQUZILENBRVcsVUFBQ1ksSUFBRCxFQUFVO0FBQ2pCLFVBQUlBLEtBQUtDLEtBQUwsQ0FBVyxtRkFBWCxDQUFKLEVBQXFHO0FBQUU7QUFBUTtBQUMvRyxVQUFJakIsUUFBUWdCLEtBQUtDLEtBQUwsQ0FBVyxtQkFBWCxDQUFaLEVBQTZDO0FBQUU7QUFBUTtBQUN2REwsYUFBT00sY0FBUCxDQUFzQlIsTUFBdEIsRUFBOEJNLElBQTlCLEVBQW9DSixPQUFPTyx3QkFBUCxDQUFnQ1IsTUFBaEMsRUFBd0NLLElBQXhDLENBQXBDO0FBQ0QsS0FOSDtBQU9ELEdBUkQ7O0FBVUE7QUFDQWYsU0FBT0csT0FBUCxDQUFlLFVBQUNDLEtBQUQsRUFBVztBQUN4QkksY0FBVVAsVUFBVUksU0FBcEIsRUFBK0JELE1BQU1DLFNBQXJDO0FBQ0FHLGNBQVVQLFNBQVYsRUFBcUJHLEtBQXJCO0FBQ0QsR0FIRDs7QUFLQSxTQUFPSCxTQUFQO0FBQ0QsQ0FqQ0Q7O2tCQW1DZUgsVyIsImZpbGUiOiI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqKiAgQWdncmVnYXRpb24gLS0gQWdncmVnYXRpb24gb2YgQmFzZSBDbGFzcyBhbmQgTWl4aW4gQ2xhc3Nlc1xuICoqICBDb3B5cmlnaHQgKGMpIDIwMTUgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT5cbiAqKlxuICoqICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbiAqKiAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiogIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuICoqICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiogIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICoqICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cbiAqKiAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICoqXG4gKiogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4gKiogIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICoqXG4gKiogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiogIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICoqICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gKiogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiogIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gKiogIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXG4gKiogIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qICA9PT09IEVDTUFTY3JpcHQgNiB2YXJpYW50ID09PT0gICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbiB1c2luZyBhbiBvcHRpb25hbCBiYXNlIGNsYXNzXG4gKiBhbmQgYW4gb3B0aW9uYWwgbGlzdCBvZiBtaXhpbnMuIElmIG1peGlucyBuZWVkIGluaXRpYWxpemluZywgdGhlblxuICogdGhleSBzaG91bGQgY29udGFpbiBhbiAnaW5pdGlhbGl6ZXInIG1lbWJlciBmdW5jdGlvblxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgIGJhc2UgICBiYXNlIGNsYXNzIGNvbnN0cnVjdCBmdW5jdGlvbiwgaWYgbnVsbCwgYSBiYXJlLWJvbmVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgY2xhc3MgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcGFyYW0gIHsuLi5bZnVuY3Rpb25dfSBtaXhpbnMgbWl4aW4gY2xhc3Nlc1xuICogQHJldHVybiB7ZnVuY3Rpb259ICAgICAgICAgICBuZXcgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqL1xuY29uc3QgYWdncmVnYXRpb24gPSAoYmFzZSwgLi4ubWl4aW5zKSA9PiB7XG5cbiAgLyogIGNyZWF0ZSBhZ2dyZWdhdGlvbiBjbGFzcyAgKi9cbiAgY29uc3QgYWdncmVnYXRlID0gKGJhc2UgPyBjbGFzcyBfX0FnZ3JlZ2F0ZSBleHRlbmRzIGJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgIC8qICBjYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3IgICovXG4gICAgICBzdXBlciguLi5hcmdzKVxuXG4gICAgICAvKiAgY2FsbCBtaXhpbidzIGluaXRpYWxpemVyICAqL1xuICAgICAgbWl4aW5zLmZvckVhY2goKG1peGluKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWl4aW4ucHJvdG90eXBlLmluaXRpYWxpemVyID09PSBcImZ1bmN0aW9uXCIpIHsgbWl4aW4ucHJvdG90eXBlLmluaXRpYWxpemVyLmNhbGwodGhpcywgLi4uYXJncykgfVxuICAgICAgfSlcbiAgICB9XG4gIH0gOiAoKSA9PiB7IC8qIGRvIG5vdGhpbmcgKi8gfSlcblxuICAvKiAgY29weSBwcm9wZXJ0aWVzICAqL1xuICBjb25zdCBjb3B5UHJvcHMgPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKSlcbiAgICAgIC5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLm1hdGNoKC9eKD86Y29uc3RydWN0b3J8cHJvdG90eXBlfGFyZ3VtZW50c3xjYWxsZXJ8bmFtZXxiaW5kfGNhbGx8YXBwbHl8dG9TdHJpbmd8bGVuZ3RoKSQvKSkgeyByZXR1cm4gfVxuICAgICAgICBpZiAoYmFzZSAmJiBwcm9wLm1hdGNoKC9eKD86aW5pdGlhbGl6ZXIpJC8pKSB7IHJldHVybiB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBwcm9wKSlcbiAgICAgIH0pXG4gIH1cblxuICAvKiAgY29weSBhbGwgcHJvcGVydGllcyBvZiBhbGwgbWl4aW5zIGludG8gYWdncmVnYXRpb24gY2xhc3MgICovXG4gIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgIGNvcHlQcm9wcyhhZ2dyZWdhdGUucHJvdG90eXBlLCBtaXhpbi5wcm90b3R5cGUpXG4gICAgY29weVByb3BzKGFnZ3JlZ2F0ZSwgbWl4aW4pXG4gIH0pXG5cbiAgcmV0dXJuIGFnZ3JlZ2F0ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBhZ2dyZWdhdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vdXRpbC9hZ2dyZWdhdGlvbi5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 8 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/*\n ** Aggregation -- Aggregation of Base Class and Mixin Classes\n ** Copyright (c) 2015 Ralf S. Engelschall \n **\n ** Permission is hereby granted, free of charge, to any person obtaining\n ** a copy of this software and associated documentation files (the\n ** \"Software\"), to deal in the Software without restriction, including\n ** without limitation the rights to use, copy, modify, merge, publish,\n ** distribute, sublicense, and/or sell copies of the Software, and to\n ** permit persons to whom the Software is furnished to do so, subject to\n ** the following conditions:\n **\n ** The above copyright notice and this permission notice shall be included\n ** in all copies or substantial portions of the Software.\n **\n ** THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/* ==== ECMAScript 6 variant ==== */\n\n/**\n * Creates a new class constructor function using an optional base class\n * and an optional list of mixins. If mixins need initializing, then\n * they should contain an 'initializer' member function\n * @param {function} base base class construct function, if null, a bare-bones\n * base class is used by default\n * @param {...[function]} mixins mixin classes\n * @return {function} new class constructor function\n */\nvar aggregation = function aggregation(base) {\n for (var _len = arguments.length, mixins = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n mixins[_key - 1] = arguments[_key];\n }\n\n /* create aggregation class */\n var aggregate = base ? function (_base) {\n _inherits(__Aggregate, _base);\n\n function __Aggregate() {\n var _ref;\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n _classCallCheck(this, __Aggregate);\n\n /* call mixin's initializer */\n var _this = _possibleConstructorReturn(this, (_ref = __Aggregate.__proto__ || Object.getPrototypeOf(__Aggregate)).call.apply(_ref, [this].concat(args)));\n /* call base class constructor */\n\n\n mixins.forEach(function (mixin) {\n if (typeof mixin.prototype.initializer === \"function\") {\n var _mixin$prototype$init;\n\n (_mixin$prototype$init = mixin.prototype.initializer).call.apply(_mixin$prototype$init, [_this].concat(args));\n }\n });\n return _this;\n }\n\n return __Aggregate;\n }(base) : function () {/* do nothing */};\n\n /* copy properties */\n var copyProps = function copyProps(target, source) {\n Object.getOwnPropertyNames(source).concat(Object.getOwnPropertySymbols(source)).forEach(function (prop) {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (base && prop.match(/^(?:initializer)$/)) {\n return;\n }\n Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop));\n });\n };\n\n /* copy all properties of all mixins into aggregation class */\n mixins.forEach(function (mixin) {\n copyProps(aggregate.prototype, mixin.prototype);\n copyProps(aggregate, mixin);\n });\n\n return aggregate;\n};\n\nexports.default = aggregation;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL2FnZ3JlZ2F0aW9uLmpzP2I4ODAiXSwibmFtZXMiOlsiYWdncmVnYXRpb24iLCJiYXNlIiwibWl4aW5zIiwiYWdncmVnYXRlIiwiYXJncyIsImZvckVhY2giLCJtaXhpbiIsInByb3RvdHlwZSIsImluaXRpYWxpemVyIiwiY2FsbCIsImNvcHlQcm9wcyIsInRhcmdldCIsInNvdXJjZSIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJjb25jYXQiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJwcm9wIiwibWF0Y2giLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTs7QUFFQTs7Ozs7Ozs7O0FBU0EsSUFBTUEsY0FBYyxTQUFkQSxXQUFjLENBQUNDLElBQUQsRUFBcUI7QUFBQSxvQ0FBWEMsTUFBVztBQUFYQSxVQUFXO0FBQUE7O0FBRXZDO0FBQ0EsTUFBTUMsWUFBYUY7QUFBQTs7QUFDakIsMkJBQXFCO0FBQUE7O0FBQUEseUNBQU5HLElBQU07QUFBTkEsWUFBTTtBQUFBOztBQUFBOztBQUluQjtBQUptQix1SkFFVkEsSUFGVTtBQUNuQjs7O0FBSUFGLGFBQU9HLE9BQVAsQ0FBZSxVQUFDQyxLQUFELEVBQVc7QUFDeEIsWUFBSSxPQUFPQSxNQUFNQyxTQUFOLENBQWdCQyxXQUF2QixLQUF1QyxVQUEzQyxFQUF1RDtBQUFBOztBQUFFLHlDQUFNRCxTQUFOLENBQWdCQyxXQUFoQixFQUE0QkMsSUFBNUIsNkNBQTBDTCxJQUExQztBQUFpRDtBQUMzRyxPQUZEO0FBTG1CO0FBUXBCOztBQVRnQjtBQUFBLElBQWlDSCxJQUFqQyxJQVVmLFlBQU0sQ0FBRSxnQkFBa0IsQ0FWOUI7O0FBWUE7QUFDQSxNQUFNUyxZQUFZLFNBQVpBLFNBQVksQ0FBQ0MsTUFBRCxFQUFTQyxNQUFULEVBQW9CO0FBQ3BDQyxXQUFPQyxtQkFBUCxDQUEyQkYsTUFBM0IsRUFDR0csTUFESCxDQUNVRixPQUFPRyxxQkFBUCxDQUE2QkosTUFBN0IsQ0FEVixFQUVHUCxPQUZILENBRVcsVUFBQ1ksSUFBRCxFQUFVO0FBQ2pCLFVBQUlBLEtBQUtDLEtBQUwsQ0FBVyxtRkFBWCxDQUFKLEVBQXFHO0FBQUU7QUFBUTtBQUMvRyxVQUFJakIsUUFBUWdCLEtBQUtDLEtBQUwsQ0FBVyxtQkFBWCxDQUFaLEVBQTZDO0FBQUU7QUFBUTtBQUN2REwsYUFBT00sY0FBUCxDQUFzQlIsTUFBdEIsRUFBOEJNLElBQTlCLEVBQW9DSixPQUFPTyx3QkFBUCxDQUFnQ1IsTUFBaEMsRUFBd0NLLElBQXhDLENBQXBDO0FBQ0QsS0FOSDtBQU9ELEdBUkQ7O0FBVUE7QUFDQWYsU0FBT0csT0FBUCxDQUFlLFVBQUNDLEtBQUQsRUFBVztBQUN4QkksY0FBVVAsVUFBVUksU0FBcEIsRUFBK0JELE1BQU1DLFNBQXJDO0FBQ0FHLGNBQVVQLFNBQVYsRUFBcUJHLEtBQXJCO0FBQ0QsR0FIRDs7QUFLQSxTQUFPSCxTQUFQO0FBQ0QsQ0FqQ0Q7O2tCQW1DZUgsVyIsImZpbGUiOiI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqKiAgQWdncmVnYXRpb24gLS0gQWdncmVnYXRpb24gb2YgQmFzZSBDbGFzcyBhbmQgTWl4aW4gQ2xhc3Nlc1xuICoqICBDb3B5cmlnaHQgKGMpIDIwMTUgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT5cbiAqKlxuICoqICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbiAqKiAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiogIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuICoqICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiogIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICoqICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cbiAqKiAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICoqXG4gKiogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4gKiogIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICoqXG4gKiogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiogIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICoqICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gKiogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiogIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gKiogIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXG4gKiogIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qICA9PT09IEVDTUFTY3JpcHQgNiB2YXJpYW50ID09PT0gICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbiB1c2luZyBhbiBvcHRpb25hbCBiYXNlIGNsYXNzXG4gKiBhbmQgYW4gb3B0aW9uYWwgbGlzdCBvZiBtaXhpbnMuIElmIG1peGlucyBuZWVkIGluaXRpYWxpemluZywgdGhlblxuICogdGhleSBzaG91bGQgY29udGFpbiBhbiAnaW5pdGlhbGl6ZXInIG1lbWJlciBmdW5jdGlvblxuICogQHBhcmFtICB7ZnVuY3Rpb259ICAgIGJhc2UgICBiYXNlIGNsYXNzIGNvbnN0cnVjdCBmdW5jdGlvbiwgaWYgbnVsbCwgYSBiYXJlLWJvbmVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgY2xhc3MgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcGFyYW0gIHsuLi5bZnVuY3Rpb25dfSBtaXhpbnMgbWl4aW4gY2xhc3Nlc1xuICogQHJldHVybiB7ZnVuY3Rpb259ICAgICAgICAgICBuZXcgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqL1xuY29uc3QgYWdncmVnYXRpb24gPSAoYmFzZSwgLi4ubWl4aW5zKSA9PiB7XG5cbiAgLyogIGNyZWF0ZSBhZ2dyZWdhdGlvbiBjbGFzcyAgKi9cbiAgY29uc3QgYWdncmVnYXRlID0gKGJhc2UgPyBjbGFzcyBfX0FnZ3JlZ2F0ZSBleHRlbmRzIGJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgIC8qICBjYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3IgICovXG4gICAgICBzdXBlciguLi5hcmdzKVxuXG4gICAgICAvKiAgY2FsbCBtaXhpbidzIGluaXRpYWxpemVyICAqL1xuICAgICAgbWl4aW5zLmZvckVhY2goKG1peGluKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWl4aW4ucHJvdG90eXBlLmluaXRpYWxpemVyID09PSBcImZ1bmN0aW9uXCIpIHsgbWl4aW4ucHJvdG90eXBlLmluaXRpYWxpemVyLmNhbGwodGhpcywgLi4uYXJncykgfVxuICAgICAgfSlcbiAgICB9XG4gIH0gOiAoKSA9PiB7IC8qIGRvIG5vdGhpbmcgKi8gfSlcblxuICAvKiAgY29weSBwcm9wZXJ0aWVzICAqL1xuICBjb25zdCBjb3B5UHJvcHMgPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKSlcbiAgICAgIC5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLm1hdGNoKC9eKD86Y29uc3RydWN0b3J8cHJvdG90eXBlfGFyZ3VtZW50c3xjYWxsZXJ8bmFtZXxiaW5kfGNhbGx8YXBwbHl8dG9TdHJpbmd8bGVuZ3RoKSQvKSkgeyByZXR1cm4gfVxuICAgICAgICBpZiAoYmFzZSAmJiBwcm9wLm1hdGNoKC9eKD86aW5pdGlhbGl6ZXIpJC8pKSB7IHJldHVybiB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBwcm9wKSlcbiAgICAgIH0pXG4gIH1cblxuICAvKiAgY29weSBhbGwgcHJvcGVydGllcyBvZiBhbGwgbWl4aW5zIGludG8gYWdncmVnYXRpb24gY2xhc3MgICovXG4gIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgIGNvcHlQcm9wcyhhZ2dyZWdhdGUucHJvdG90eXBlLCBtaXhpbi5wcm90b3R5cGUpXG4gICAgY29weVByb3BzKGFnZ3JlZ2F0ZSwgbWl4aW4pXG4gIH0pXG5cbiAgcmV0dXJuIGFnZ3JlZ2F0ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBhZ2dyZWdhdGlvblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vdXRpbC9hZ2dyZWdhdGlvbi5qcyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aggregation2 = __webpack_require__(7);\n\nvar _aggregation3 = _interopRequireDefault(_aggregation2);\n\nvar _fillStyle = __webpack_require__(17);\n\nvar _fillStyle2 = _interopRequireDefault(_fillStyle);\n\nvar _strokeStyle = __webpack_require__(18);\n\nvar _strokeStyle2 = _interopRequireDefault(_strokeStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class Basic shape style for a 2d rendering context\n * @extends {FillStyle}\n * @extends {StrokeStyle}\n */\nvar BasicStyle = function (_aggregation) {\n _inherits(BasicStyle, _aggregation);\n\n function BasicStyle() {\n _classCallCheck(this, BasicStyle);\n\n return _possibleConstructorReturn(this, (BasicStyle.__proto__ || Object.getPrototypeOf(BasicStyle)).apply(this, arguments));\n }\n\n _createClass(BasicStyle, null, [{\n key: \"copyBasicStyle\",\n\n /**\n * Copies the properties from one BasicStyle to another\n * @param {BasicStyle} srcBasicStyle The style to copy from\n * @param {BasicStyle} dstBasicStyle The style to copy to\n */\n value: function copyBasicStyle(srcBasicStyle, dstBasicStyle) {\n _fillStyle2.default.copyFillStyle(srcBasicStyle, dstBasicStyle);\n _strokeStyle2.default.copyStrokeStyle(srcBasicStyle, dstBasicStyle);\n }\n\n /**\n * Converts a BasicStyle instance to a JSON object\n * @param {BasicStyle} basicStyleObj\n * @return {{fillColor : string,\n * strokeColor : string,\n * strokeWidth : number,\n * lineJoin : string,\n * lineCap : string,\n * dashPattern : number[],\n * dashOffset : number\n * }}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON(basicStyleObj) {\n return Object.assign(_fillStyle2.default.toJSON(basicStyleObj), _strokeStyle2.default.toJSON(basicStyleObj));\n }\n }]);\n\n return BasicStyle;\n}((0, _aggregation3.default)(function BaseBasicStyle() {\n _classCallCheck(this, BaseBasicStyle);\n}, _fillStyle2.default, _strokeStyle2.default));\n\nexports.default = BasicStyle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9iYXNpYy1zdHlsZS5qcz9kNTU5Il0sIm5hbWVzIjpbIkJhc2ljU3R5bGUiLCJzcmNCYXNpY1N0eWxlIiwiZHN0QmFzaWNTdHlsZSIsIkZpbGxTdHlsZSIsImNvcHlGaWxsU3R5bGUiLCJTdHJva2VTdHlsZSIsImNvcHlTdHJva2VTdHlsZSIsImJhc2ljU3R5bGVPYmoiLCJPYmplY3QiLCJhc3NpZ24iLCJ0b0pTT04iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUE7Ozs7O0lBS3FCQSxVOzs7Ozs7Ozs7Ozs7QUFDbkI7Ozs7O21DQUtzQkMsYSxFQUFlQyxhLEVBQWU7QUFDbERDLDBCQUFVQyxhQUFWLENBQXdCSCxhQUF4QixFQUF1Q0MsYUFBdkM7QUFDQUcsNEJBQVlDLGVBQVosQ0FBNEJMLGFBQTVCLEVBQTJDQyxhQUEzQztBQUNEOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7MkJBWWNLLGEsRUFBZTtBQUMzQixhQUFPQyxPQUFPQyxNQUFQLENBQWNOLG9CQUFVTyxNQUFWLENBQWlCSCxhQUFqQixDQUFkLEVBQStDRixzQkFBWUssTUFBWixDQUFtQkgsYUFBbkIsQ0FBL0MsQ0FBUDtBQUNEOzs7O0VBekJxQztBQUFBO0FBQUEsR0FBcUNKLG1CQUFyQyxFQUFnREUscUJBQWhELEM7O2tCQUFuQkwsVSIsImZpbGUiOiI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0IGFnZ3JlZ2F0aW9uIGZyb20gXCIuLi91dGlsL2FnZ3JlZ2F0aW9uXCJcbmltcG9ydCBGaWxsU3R5bGUgZnJvbSBcIi4uL3N0eWxlL2ZpbGwtc3R5bGVcIlxuaW1wb3J0IFN0cm9rZVN0eWxlIGZyb20gXCIuLi9zdHlsZS9zdHJva2Utc3R5bGVcIlxuXG4vKipcbiAqIEBjbGFzcyAgQmFzaWMgc2hhcGUgc3R5bGUgZm9yIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAqIEBleHRlbmRzIHtGaWxsU3R5bGV9XG4gKiBAZXh0ZW5kcyB7U3Ryb2tlU3R5bGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2ljU3R5bGUgZXh0ZW5kcyBhZ2dyZWdhdGlvbihjbGFzcyBCYXNlQmFzaWNTdHlsZSB7fSwgRmlsbFN0eWxlLCBTdHJva2VTdHlsZSkge1xuICAvKipcbiAgICogQ29waWVzIHRoZSBwcm9wZXJ0aWVzIGZyb20gb25lIEJhc2ljU3R5bGUgdG8gYW5vdGhlclxuICAgKiBAcGFyYW0gIHtCYXNpY1N0eWxlfSBzcmNCYXNpY1N0eWxlIFRoZSBzdHlsZSB0byBjb3B5IGZyb21cbiAgICogQHBhcmFtICB7QmFzaWNTdHlsZX0gZHN0QmFzaWNTdHlsZSBUaGUgc3R5bGUgdG8gY29weSB0b1xuICAgKi9cbiAgc3RhdGljIGNvcHlCYXNpY1N0eWxlKHNyY0Jhc2ljU3R5bGUsIGRzdEJhc2ljU3R5bGUpIHtcbiAgICBGaWxsU3R5bGUuY29weUZpbGxTdHlsZShzcmNCYXNpY1N0eWxlLCBkc3RCYXNpY1N0eWxlKVxuICAgIFN0cm9rZVN0eWxlLmNvcHlTdHJva2VTdHlsZShzcmNCYXNpY1N0eWxlLCBkc3RCYXNpY1N0eWxlKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgQmFzaWNTdHlsZSBpbnN0YW5jZSB0byBhIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSAge0Jhc2ljU3R5bGV9IGJhc2ljU3R5bGVPYmpcbiAgICogQHJldHVybiB7e2ZpbGxDb2xvciAgIDogc3RyaW5nLFxuICAgKiAgICAgICAgICAgc3Ryb2tlQ29sb3IgOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBzdHJva2VXaWR0aCA6IG51bWJlcixcbiAgICogICAgICAgICAgIGxpbmVKb2luICAgIDogc3RyaW5nLFxuICAgKiAgICAgICAgICAgbGluZUNhcCAgICAgOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBkYXNoUGF0dGVybiA6IG51bWJlcltdLFxuICAgKiAgICAgICAgICAgZGFzaE9mZnNldCAgOiBudW1iZXJcbiAgICogICAgICAgICAgfX1cbiAgICovXG4gIHN0YXRpYyB0b0pTT04oYmFzaWNTdHlsZU9iaikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKEZpbGxTdHlsZS50b0pTT04oYmFzaWNTdHlsZU9iaiksIFN0cm9rZVN0eWxlLnRvSlNPTihiYXNpY1N0eWxlT2JqKSlcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3R5bGUvYmFzaWMtc3R5bGUuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 9 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aggregation2 = __webpack_require__(8);\n\nvar _aggregation3 = _interopRequireDefault(_aggregation2);\n\nvar _fillStyle = __webpack_require__(18);\n\nvar _fillStyle2 = _interopRequireDefault(_fillStyle);\n\nvar _strokeStyle = __webpack_require__(19);\n\nvar _strokeStyle2 = _interopRequireDefault(_strokeStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class Basic shape style for a 2d rendering context\n * @extends {FillStyle}\n * @extends {StrokeStyle}\n */\nvar BasicStyle = function (_aggregation) {\n _inherits(BasicStyle, _aggregation);\n\n function BasicStyle() {\n _classCallCheck(this, BasicStyle);\n\n return _possibleConstructorReturn(this, (BasicStyle.__proto__ || Object.getPrototypeOf(BasicStyle)).apply(this, arguments));\n }\n\n _createClass(BasicStyle, null, [{\n key: \"copyBasicStyle\",\n\n /**\n * Copies the properties from one BasicStyle to another\n * @param {BasicStyle} srcBasicStyle The style to copy from\n * @param {BasicStyle} dstBasicStyle The style to copy to\n */\n value: function copyBasicStyle(srcBasicStyle, dstBasicStyle) {\n _fillStyle2.default.copyFillStyle(srcBasicStyle, dstBasicStyle);\n _strokeStyle2.default.copyStrokeStyle(srcBasicStyle, dstBasicStyle);\n }\n\n /**\n * Converts a BasicStyle instance to a JSON object\n * @param {BasicStyle} basicStyleObj\n * @return {{fillColor : string,\n * strokeColor : string,\n * strokeWidth : number,\n * lineJoin : string,\n * lineCap : string,\n * dashPattern : number[],\n * dashOffset : number\n * }}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON(basicStyleObj) {\n return Object.assign(_fillStyle2.default.toJSON(basicStyleObj), _strokeStyle2.default.toJSON(basicStyleObj));\n }\n }]);\n\n return BasicStyle;\n}((0, _aggregation3.default)(function BaseBasicStyle() {\n _classCallCheck(this, BaseBasicStyle);\n}, _fillStyle2.default, _strokeStyle2.default));\n\nexports.default = BasicStyle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9iYXNpYy1zdHlsZS5qcz9kNTU5Il0sIm5hbWVzIjpbIkJhc2ljU3R5bGUiLCJzcmNCYXNpY1N0eWxlIiwiZHN0QmFzaWNTdHlsZSIsImNvcHlGaWxsU3R5bGUiLCJjb3B5U3Ryb2tlU3R5bGUiLCJiYXNpY1N0eWxlT2JqIiwiT2JqZWN0IiwiYXNzaWduIiwidG9KU09OIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBOzs7OztJQUtxQkEsVTs7Ozs7Ozs7Ozs7O0FBQ25COzs7OzttQ0FLc0JDLGEsRUFBZUMsYSxFQUFlO0FBQ2xELDBCQUFVQyxhQUFWLENBQXdCRixhQUF4QixFQUF1Q0MsYUFBdkM7QUFDQSw0QkFBWUUsZUFBWixDQUE0QkgsYUFBNUIsRUFBMkNDLGFBQTNDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7OzsyQkFZY0csYSxFQUFlO0FBQzNCLGFBQU9DLE9BQU9DLE1BQVAsQ0FBYyxvQkFBVUMsTUFBVixDQUFpQkgsYUFBakIsQ0FBZCxFQUErQyxzQkFBWUcsTUFBWixDQUFtQkgsYUFBbkIsQ0FBL0MsQ0FBUDtBQUNEOzs7O0VBekJxQztBQUFBO0FBQUEsOEM7O2tCQUFuQkwsVSIsImZpbGUiOiI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0IGFnZ3JlZ2F0aW9uIGZyb20gXCIuLi91dGlsL2FnZ3JlZ2F0aW9uXCJcbmltcG9ydCBGaWxsU3R5bGUgZnJvbSBcIi4uL3N0eWxlL2ZpbGwtc3R5bGVcIlxuaW1wb3J0IFN0cm9rZVN0eWxlIGZyb20gXCIuLi9zdHlsZS9zdHJva2Utc3R5bGVcIlxuXG4vKipcbiAqIEBjbGFzcyAgQmFzaWMgc2hhcGUgc3R5bGUgZm9yIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAqIEBleHRlbmRzIHtGaWxsU3R5bGV9XG4gKiBAZXh0ZW5kcyB7U3Ryb2tlU3R5bGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2ljU3R5bGUgZXh0ZW5kcyBhZ2dyZWdhdGlvbihjbGFzcyBCYXNlQmFzaWNTdHlsZSB7fSwgRmlsbFN0eWxlLCBTdHJva2VTdHlsZSkge1xuICAvKipcbiAgICogQ29waWVzIHRoZSBwcm9wZXJ0aWVzIGZyb20gb25lIEJhc2ljU3R5bGUgdG8gYW5vdGhlclxuICAgKiBAcGFyYW0gIHtCYXNpY1N0eWxlfSBzcmNCYXNpY1N0eWxlIFRoZSBzdHlsZSB0byBjb3B5IGZyb21cbiAgICogQHBhcmFtICB7QmFzaWNTdHlsZX0gZHN0QmFzaWNTdHlsZSBUaGUgc3R5bGUgdG8gY29weSB0b1xuICAgKi9cbiAgc3RhdGljIGNvcHlCYXNpY1N0eWxlKHNyY0Jhc2ljU3R5bGUsIGRzdEJhc2ljU3R5bGUpIHtcbiAgICBGaWxsU3R5bGUuY29weUZpbGxTdHlsZShzcmNCYXNpY1N0eWxlLCBkc3RCYXNpY1N0eWxlKVxuICAgIFN0cm9rZVN0eWxlLmNvcHlTdHJva2VTdHlsZShzcmNCYXNpY1N0eWxlLCBkc3RCYXNpY1N0eWxlKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgQmFzaWNTdHlsZSBpbnN0YW5jZSB0byBhIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSAge0Jhc2ljU3R5bGV9IGJhc2ljU3R5bGVPYmpcbiAgICogQHJldHVybiB7e2ZpbGxDb2xvciAgIDogc3RyaW5nLFxuICAgKiAgICAgICAgICAgc3Ryb2tlQ29sb3IgOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBzdHJva2VXaWR0aCA6IG51bWJlcixcbiAgICogICAgICAgICAgIGxpbmVKb2luICAgIDogc3RyaW5nLFxuICAgKiAgICAgICAgICAgbGluZUNhcCAgICAgOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBkYXNoUGF0dGVybiA6IG51bWJlcltdLFxuICAgKiAgICAgICAgICAgZGFzaE9mZnNldCAgOiBudW1iZXJcbiAgICogICAgICAgICAgfX1cbiAgICovXG4gIHN0YXRpYyB0b0pTT04oYmFzaWNTdHlsZU9iaikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKEZpbGxTdHlsZS50b0pTT04oYmFzaWNTdHlsZU9iaiksIFN0cm9rZVN0eWxlLnRvSlNPTihiYXNpY1N0eWxlT2JqKSlcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3R5bGUvYmFzaWMtc3R5bGUuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _glMatrix = __webpack_require__(1);\n\n/**\n * Returns the Z coordinate of a 2D crossproduct\n * @param {Vec2d} v1\n * @param {Vec2d} v2\n * @return {Number} z coord of the 2D crossproduct\n */\n_glMatrix.vec2.cross2d = function (v1, v2) {\n return v1[0] * v2[1] - v1[1] * v2[0];\n};\n\n/**\n * Calculates the angle between two vectors when directionality\n * is unnecessary (only returns an angle between 0 and PI, inclusive)\n * @param {Vec2d} v1\n * @param {Vec2d} v2\n * @return {Number} The angle between two vectors in radians [0, PI]\n */\n_glMatrix.vec2.angleFast = function (v1, v2) {\n return Math.acos(_glMatrix.vec2.dot(v1, v2));\n};\n\n/**\n * Returns the true angle between two vectors\n * @param {Vec2d} v1\n * @param {Vec2d} v2\n * @return {Number} The angle between two vectors in radians [-PI, PI]\n */\n_glMatrix.vec2.angle = function (v1, v2) {\n var c = _glMatrix.vec2.dot(v1, v2);\n var s = _glMatrix.vec2.cross2d(v1, v2);\n var angle = Math.atan2(s, c);\n return angle;\n};\n\n/**\n * Returns the angle of a vector from the positive X direction\n * in a cartesian coordinate system\n * @param {Vec2d} v1\n * @return {Number} The angle in radians [-PI, PI]\n */\n_glMatrix.vec2.anglePosX = function (v) {\n var angle = Math.atan2(v[1], v[0]);\n if (angle < 0) {\n angle *= -1;\n }\n return angle;\n};\n\nexports.default = _glMatrix.vec2;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL3ZlYzJkLmpzPzhkZDMiXSwibmFtZXMiOlsiVmVjMmQiLCJjcm9zczJkIiwidjEiLCJ2MiIsImFuZ2xlRmFzdCIsIk1hdGgiLCJhY29zIiwiZG90IiwiYW5nbGUiLCJjIiwicyIsImF0YW4yIiwiYW5nbGVQb3NYIiwidiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQUVBOztBQUVBOzs7Ozs7QUFNQUEsZUFBTUMsT0FBTixHQUFnQixVQUFDQyxFQUFELEVBQUtDLEVBQUw7QUFBQSxTQUFZRCxHQUFHLENBQUgsSUFBUUMsR0FBRyxDQUFILENBQVIsR0FBZ0JELEdBQUcsQ0FBSCxJQUFRQyxHQUFHLENBQUgsQ0FBcEM7QUFBQSxDQUFoQjs7QUFFQTs7Ozs7OztBQU9BSCxlQUFNSSxTQUFOLEdBQWtCLFVBQUNGLEVBQUQsRUFBS0MsRUFBTDtBQUFBLFNBQVlFLEtBQUtDLElBQUwsQ0FBVU4sZUFBTU8sR0FBTixDQUFVTCxFQUFWLEVBQWNDLEVBQWQsQ0FBVixDQUFaO0FBQUEsQ0FBbEI7O0FBRUE7Ozs7OztBQU1BSCxlQUFNUSxLQUFOLEdBQWMsVUFBQ04sRUFBRCxFQUFLQyxFQUFMLEVBQVk7QUFDeEIsTUFBTU0sSUFBSVQsZUFBTU8sR0FBTixDQUFVTCxFQUFWLEVBQWNDLEVBQWQsQ0FBVjtBQUNBLE1BQU1PLElBQUlWLGVBQU1DLE9BQU4sQ0FBY0MsRUFBZCxFQUFrQkMsRUFBbEIsQ0FBVjtBQUNBLE1BQU1LLFFBQVFILEtBQUtNLEtBQUwsQ0FBV0QsQ0FBWCxFQUFjRCxDQUFkLENBQWQ7QUFDQSxTQUFPRCxLQUFQO0FBQ0QsQ0FMRDs7QUFPQTs7Ozs7O0FBTUFSLGVBQU1ZLFNBQU4sR0FBa0IsYUFBSztBQUNyQixNQUFJSixRQUFRSCxLQUFLTSxLQUFMLENBQVdFLEVBQUUsQ0FBRixDQUFYLEVBQWlCQSxFQUFFLENBQUYsQ0FBakIsQ0FBWjtBQUNBLE1BQUlMLFFBQVEsQ0FBWixFQUFlO0FBQ2JBLGFBQVMsQ0FBQyxDQUFWO0FBQ0Q7QUFDRCxTQUFPQSxLQUFQO0FBQ0QsQ0FORDs7a0JBUWVSLGMiLCJmaWxlIjoiOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCB7dmVjMiBhcyBWZWMyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5cbi8qKlxuICogUmV0dXJucyB0aGUgWiBjb29yZGluYXRlIG9mIGEgMkQgY3Jvc3Nwcm9kdWN0XG4gKiBAcGFyYW0gIHtWZWMyZH0gdjFcbiAqIEBwYXJhbSAge1ZlYzJkfSB2MlxuICogQHJldHVybiB7TnVtYmVyfSAgICB6IGNvb3JkIG9mIHRoZSAyRCBjcm9zc3Byb2R1Y3RcbiAqL1xuVmVjMmQuY3Jvc3MyZCA9ICh2MSwgdjIpID0+IHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYW5nbGUgYmV0d2VlbiB0d28gdmVjdG9ycyB3aGVuIGRpcmVjdGlvbmFsaXR5XG4gKiBpcyB1bm5lY2Vzc2FyeSAob25seSByZXR1cm5zIGFuIGFuZ2xlIGJldHdlZW4gMCBhbmQgUEksIGluY2x1c2l2ZSlcbiAqIEBwYXJhbSAge1ZlYzJkfSB2MVxuICogQHBhcmFtICB7VmVjMmR9IHYyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIFRoZSBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzIGluIHJhZGlhbnMgWzAsIFBJXVxuICovXG5WZWMyZC5hbmdsZUZhc3QgPSAodjEsIHYyKSA9PiBNYXRoLmFjb3MoVmVjMmQuZG90KHYxLCB2MikpXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1ZSBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG4gKiBAcGFyYW0gIHtWZWMyZH0gdjFcbiAqIEBwYXJhbSAge1ZlYzJkfSB2MlxuICogQHJldHVybiB7TnVtYmVyfSAgICBUaGUgYW5nbGUgYmV0d2VlbiB0d28gdmVjdG9ycyBpbiByYWRpYW5zIFstUEksIFBJXVxuICovXG5WZWMyZC5hbmdsZSA9ICh2MSwgdjIpID0+IHtcbiAgY29uc3QgYyA9IFZlYzJkLmRvdCh2MSwgdjIpXG4gIGNvbnN0IHMgPSBWZWMyZC5jcm9zczJkKHYxLCB2MilcbiAgY29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKHMsIGMpXG4gIHJldHVybiBhbmdsZVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFuZ2xlIG9mIGEgdmVjdG9yIGZyb20gdGhlIHBvc2l0aXZlIFggZGlyZWN0aW9uXG4gKiBpbiBhIGNhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbVxuICogQHBhcmFtICB7VmVjMmR9IHYxXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIFRoZSBhbmdsZSBpbiByYWRpYW5zIFstUEksIFBJXVxuICovXG5WZWMyZC5hbmdsZVBvc1ggPSB2ID0+IHtcbiAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMih2WzFdLCB2WzBdKVxuICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgKj0gLTFcbiAgfVxuICByZXR1cm4gYW5nbGVcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVjMmRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvcmUvdmVjMmQuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 10 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _glMatrix = __webpack_require__(1);\n\n/**\n * Returns the Z coordinate of a 2D crossproduct\n * @param {Vec2d} v1\n * @param {Vec2d} v2\n * @return {Number} z coord of the 2D crossproduct\n */\n_glMatrix.vec2.cross2d = function (v1, v2) {\n return v1[0] * v2[1] - v1[1] * v2[0];\n};\n\n/**\n * Calculates the angle between two vectors when directionality\n * is unnecessary (only returns an angle between 0 and PI, inclusive)\n * @param {Vec2d} v1\n * @param {Vec2d} v2\n * @return {Number} The angle between two vectors in radians [0, PI]\n */\n_glMatrix.vec2.angleFast = function (v1, v2) {\n return Math.acos(_glMatrix.vec2.dot(v1, v2));\n};\n\n/**\n * Returns the true angle between two vectors\n * @param {Vec2d} v1\n * @param {Vec2d} v2\n * @return {Number} The angle between two vectors in radians [-PI, PI]\n */\n_glMatrix.vec2.angle = function (v1, v2) {\n var c = _glMatrix.vec2.dot(v1, v2);\n var s = _glMatrix.vec2.cross2d(v1, v2);\n var angle = Math.atan2(s, c);\n return angle;\n};\n\n/**\n * Returns the angle of a vector from the positive X direction\n * in a cartesian coordinate system\n * @param {Vec2d} v1\n * @return {Number} The angle in radians [-PI, PI]\n */\n_glMatrix.vec2.anglePosX = function (v) {\n var angle = Math.atan2(v[1], v[0]);\n if (angle < 0) {\n angle *= -1;\n }\n return angle;\n};\n\nexports.default = _glMatrix.vec2;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb3JlL3ZlYzJkLmpzPzhkZDMiXSwibmFtZXMiOlsiY3Jvc3MyZCIsInYxIiwidjIiLCJhbmdsZUZhc3QiLCJNYXRoIiwiYWNvcyIsImRvdCIsImFuZ2xlIiwiYyIsInMiLCJhdGFuMiIsImFuZ2xlUG9zWCIsInYiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7QUFFQTs7QUFFQTs7Ozs7O0FBTUEsZUFBTUEsT0FBTixHQUFnQixVQUFDQyxFQUFELEVBQUtDLEVBQUw7QUFBQSxTQUFZRCxHQUFHLENBQUgsSUFBUUMsR0FBRyxDQUFILENBQVIsR0FBZ0JELEdBQUcsQ0FBSCxJQUFRQyxHQUFHLENBQUgsQ0FBcEM7QUFBQSxDQUFoQjs7QUFFQTs7Ozs7OztBQU9BLGVBQU1DLFNBQU4sR0FBa0IsVUFBQ0YsRUFBRCxFQUFLQyxFQUFMO0FBQUEsU0FBWUUsS0FBS0MsSUFBTCxDQUFVLGVBQU1DLEdBQU4sQ0FBVUwsRUFBVixFQUFjQyxFQUFkLENBQVYsQ0FBWjtBQUFBLENBQWxCOztBQUVBOzs7Ozs7QUFNQSxlQUFNSyxLQUFOLEdBQWMsVUFBQ04sRUFBRCxFQUFLQyxFQUFMLEVBQVk7QUFDeEIsTUFBTU0sSUFBSSxlQUFNRixHQUFOLENBQVVMLEVBQVYsRUFBY0MsRUFBZCxDQUFWO0FBQ0EsTUFBTU8sSUFBSSxlQUFNVCxPQUFOLENBQWNDLEVBQWQsRUFBa0JDLEVBQWxCLENBQVY7QUFDQSxNQUFNSyxRQUFRSCxLQUFLTSxLQUFMLENBQVdELENBQVgsRUFBY0QsQ0FBZCxDQUFkO0FBQ0EsU0FBT0QsS0FBUDtBQUNELENBTEQ7O0FBT0E7Ozs7OztBQU1BLGVBQU1JLFNBQU4sR0FBa0IsYUFBSztBQUNyQixNQUFJSixRQUFRSCxLQUFLTSxLQUFMLENBQVdFLEVBQUUsQ0FBRixDQUFYLEVBQWlCQSxFQUFFLENBQUYsQ0FBakIsQ0FBWjtBQUNBLE1BQUlMLFFBQVEsQ0FBWixFQUFlO0FBQ2JBLGFBQVMsQ0FBQyxDQUFWO0FBQ0Q7QUFDRCxTQUFPQSxLQUFQO0FBQ0QsQ0FORCIsImZpbGUiOiIxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCB7dmVjMiBhcyBWZWMyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5cbi8qKlxuICogUmV0dXJucyB0aGUgWiBjb29yZGluYXRlIG9mIGEgMkQgY3Jvc3Nwcm9kdWN0XG4gKiBAcGFyYW0gIHtWZWMyZH0gdjFcbiAqIEBwYXJhbSAge1ZlYzJkfSB2MlxuICogQHJldHVybiB7TnVtYmVyfSAgICB6IGNvb3JkIG9mIHRoZSAyRCBjcm9zc3Byb2R1Y3RcbiAqL1xuVmVjMmQuY3Jvc3MyZCA9ICh2MSwgdjIpID0+IHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYW5nbGUgYmV0d2VlbiB0d28gdmVjdG9ycyB3aGVuIGRpcmVjdGlvbmFsaXR5XG4gKiBpcyB1bm5lY2Vzc2FyeSAob25seSByZXR1cm5zIGFuIGFuZ2xlIGJldHdlZW4gMCBhbmQgUEksIGluY2x1c2l2ZSlcbiAqIEBwYXJhbSAge1ZlYzJkfSB2MVxuICogQHBhcmFtICB7VmVjMmR9IHYyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIFRoZSBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzIGluIHJhZGlhbnMgWzAsIFBJXVxuICovXG5WZWMyZC5hbmdsZUZhc3QgPSAodjEsIHYyKSA9PiBNYXRoLmFjb3MoVmVjMmQuZG90KHYxLCB2MikpXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1ZSBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG4gKiBAcGFyYW0gIHtWZWMyZH0gdjFcbiAqIEBwYXJhbSAge1ZlYzJkfSB2MlxuICogQHJldHVybiB7TnVtYmVyfSAgICBUaGUgYW5nbGUgYmV0d2VlbiB0d28gdmVjdG9ycyBpbiByYWRpYW5zIFstUEksIFBJXVxuICovXG5WZWMyZC5hbmdsZSA9ICh2MSwgdjIpID0+IHtcbiAgY29uc3QgYyA9IFZlYzJkLmRvdCh2MSwgdjIpXG4gIGNvbnN0IHMgPSBWZWMyZC5jcm9zczJkKHYxLCB2MilcbiAgY29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKHMsIGMpXG4gIHJldHVybiBhbmdsZVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFuZ2xlIG9mIGEgdmVjdG9yIGZyb20gdGhlIHBvc2l0aXZlIFggZGlyZWN0aW9uXG4gKiBpbiBhIGNhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbVxuICogQHBhcmFtICB7VmVjMmR9IHYxXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIFRoZSBhbmdsZSBpbiByYWRpYW5zIFstUEksIFBJXVxuICovXG5WZWMyZC5hbmdsZVBvc1ggPSB2ID0+IHtcbiAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMih2WzFdLCB2WzBdKVxuICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgKj0gLTFcbiAgfVxuICByZXR1cm4gYW5nbGVcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVjMmRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvcmUvdmVjMmQuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _baseShape = __webpack_require__(6);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _glMatrix = __webpack_require__(1);\n\nvar _math = __webpack_require__(5);\n\nvar _math2 = _interopRequireDefault(_math);\n\nvar _convexHull = __webpack_require__(14);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar identityMatrix = _glMatrix.mat2d.create();\n\n/**\n * Expands an axis-aligned bounding box to encapsulate a 2d vertex\n * defined in an array of vertices, and updates a struct used to\n * store the indices of the vertices that define the final bounds\n * of the vertices\n * @param {AABox2d} box Bounds to expand\n * @param {Point2d} pt 2d vertex to encapsulate\n * @param {number} ptIdx Index of the vertex in its list of vertices\n * @param {number[]} extentIndices Struct to store the indices of the bounding vertices\n * @private\n */\nfunction aaboxEncapsulatePt(box, pt, ptIdx, extentIndices) {\n if (AABox2d.isEmpty(box)) {\n box[0] = pt[0];\n box[2] = pt[0];\n extentIndices[0] = extentIndices[2] = ptIdx;\n box[1] = pt[1];\n box[3] = pt[1];\n extentIndices[1] = extentIndices[3] = ptIdx;\n } else {\n if (pt[0] < box[0]) {\n box[0] = pt[0];\n extentIndices[0] = ptIdx;\n } else if (pt[0] > box[2]) {\n box[2] = pt[0];\n extentIndices[2] = ptIdx;\n }\n\n if (pt[1] < box[1]) {\n box[1] = pt[1];\n extentIndices[1] = ptIdx;\n } else if (pt[1] > box[3]) {\n box[3] = pt[1];\n extentIndices[3] = ptIdx;\n }\n }\n}\n\n/**\n * Function called sequentially to calculate the centroid of a polygon\n * @param {Point2d} centroidPt Current centroid point\n * @param {Point2d} pt1 Point describing one end of an edge of a polygon\n * @param {Point2d} pt2 Point describing other end of an edge of a polygon\n * @private\n */\nfunction buildCentroid(centroidPt, pt1, pt2) {\n var a = pt1[0] * pt2[1] - pt2[0] * pt1[1];\n centroidPt[0] += (pt1[0] + pt2[0]) * a;\n centroidPt[1] += (pt1[1] + pt2[1]) * a;\n return a;\n}\n\n/**\n * Utility function used to check whether an argument is an array\n * of an arraybuffer\n * @param {} obj\n * @return {Boolean} Returns true if object is array-like\n */\nfunction isArray(obj) {\n return Array.isArray(obj) || ArrayBuffer && ArrayBuffer.isView(obj);\n}\n\n/**\n * @typedef {object} PolyLineOptions\n * @property {number[]|Point2d[]} [verts=[]] Initial vertices of the polyline\n */\n\n/**\n * @class Class defining a poly line\n * @extends {BaseShape}\n */\n\nvar PolyLine = function (_BaseShape) {\n _inherits(PolyLine, _BaseShape);\n\n /**\n * Creates a new poly line shape\n * @param {PolyLineOptions} [opts] [description]\n * @return {PolyLine}\n */\n function PolyLine(opts) {\n _classCallCheck(this, PolyLine);\n\n var verts = opts.verts || [];\n\n var _this = _possibleConstructorReturn(this, (PolyLine.__proto__ || Object.getPrototypeOf(PolyLine)).call(this, opts));\n\n if (!isArray(verts) || verts.length === 0 || isArray(verts[0]) && verts.length < 1 || !isArray(verts[0]) && (verts.length < 2 || verts.length % 2 !== 0)) {\n throw new Error(\"PolyLine shapes must be initialized with an array of 2d points and contain at least 1 points\");\n }\n\n // going to build the aabox and store the indices for each vertex\n // that defines the bounds\n _this._extentIndices = [-1, -1, -1, -1];\n _this._localaabox = AABox2d.create();\n _this._verts = [];\n _this._centroid = [0, 0];\n AABox2d.initEmpty(_this._aabox);\n var signedArea = 0;\n var i = 0;\n if (isArray(verts[0])) {\n for (i = 0; i < verts.length - 1; i += 1) {\n _this._verts.push(Point2d.clone(verts[i]));\n aaboxEncapsulatePt(_this._aabox, verts[i], i, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, verts[i], verts[i + 1]);\n }\n _this._verts.push(Point2d.clone(verts[i]));\n aaboxEncapsulatePt(_this._aabox, verts[i], i, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, verts[i], verts[0]);\n } else {\n _this._verts.push(Point2d.create(verts[0], verts[1]));\n aaboxEncapsulatePt(_this._aabox, _this._verts[0], 0, _this._extentIndices);\n var idx = 1;\n for (i = 2; i < verts.length - 2; i += 2, idx += 1) {\n _this._verts.push(Point2d.create(verts[i], verts[i + 1]));\n aaboxEncapsulatePt(_this._aabox, _this._verts[idx], idx, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, _this._verts[idx - 1], _this._verts[idx]);\n }\n _this._verts.push(Point2d.create(verts[i], verts[i + 1]));\n aaboxEncapsulatePt(_this._aabox, _this._verts[idx], idx, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, _this._verts[idx], _this._verts[0]);\n }\n signedArea *= 0.5;\n _this._centroid[0] /= 6.0 * signedArea;\n _this._centroid[1] /= 6.0 * signedArea;\n\n // extract the center of the aabox. We are going to use this as the\n // shape's pivot, so all rotation/scale transformations will be sourced\n // at this location\n var pivot = Point2d.create();\n AABox2d.getCenter(pivot, _this._aabox);\n _this.pivot = pivot;\n\n // now build the convex hull of the vertices.\n // When rebuilding the axis aligned box (a transform is applied for example),\n // there's no need to traverse all the points. All we need to do is traverse\n // the points that define the convex hull to rebuild the bounds\n if (_this._verts.length < 3) {\n _this._convexHull = _this._verts.map(function (val, idx) {\n return idx;\n });\n } else {\n _this._convexHull = (0, _convexHull.simpleHull_2D)(_this._verts);\n }\n return _this;\n }\n\n /**\n * Get the untransformed width/height of the polyline. This is essentially\n * the width/height of the poly's bounds\n * @return {Vec2d} Width/height of the bounds of the polyline\n */\n\n\n _createClass(PolyLine, [{\n key: \"getDimensions\",\n value: function getDimensions() {\n return [this.width, this.height];\n }\n\n /**\n * Get the untransformed width of the polyline. This is the width of the\n * axis-aligned bounds of the poly\n * @return {number} Width of the poly in world-space units\n */\n\n }, {\n key: \"_collapseVerts\",\n\n\n /**\n * Utility function that collapses all the verts, meaning the verts\n * are flattened to their position with local-space transforms applied\n * and then the local transforms are cleared. This is done whenever\n * the vertices of the polygon are modified as it can be a little tricky\n * to re-adjust the pivot/transforms of the vert when new verts are added,\n * deleted, etc.\n * @return {boolean} Returns true if the points were indeed flattened\n * The points wouldn't be flattened if there are no\n * transforms to apply, for example\n * @private\n */\n value: function _collapseVerts() {\n var _this2 = this;\n\n Point2d.set(this._pivot, 0, 0);\n\n // TODO(croot): what if this poly is\n // parented to another transform?\n\n var xform = this.localXform;\n if (_glMatrix.mat2d.equals(xform, identityMatrix)) {\n // if there are no transforms to apply,\n // do nothing - fast out\n return false;\n }\n\n AABox2d.initEmpty(this._aabox);\n\n // flatten all the points to their current world-space position\n // with transforms applied\n for (var i = 0; i < this._verts.length; i += 1) {\n Point2d.transformMat2d(this._verts[i], this._verts[i], xform);\n }\n\n // now recalcute the convex hull of all the transformed points\n if (this._verts.length < 3) {\n this._convexHull = this._verts.map(function (val, idx) {\n return idx;\n });\n } else {\n this._convexHull = (0, _convexHull.simpleHull_2D)(this._verts);\n }\n // use the convex hull points to rebuild the bounds\n this._convexHull.forEach(function (idx) {\n aaboxEncapsulatePt(_this2._aabox, _this2._verts[idx], idx, _this2._extentIndices);\n });\n\n // reset the local transforms\n this.setTransformations(0, 0, 1, 1, 0);\n\n return true;\n }\n\n /**\n * Translates a specific vertex of the polygon by an offset\n * @param {number} vertIndex Index of the vertex to translate\n * @param {Vec2d} t Translation offset, in world-space units\n * @return {PolyLine} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If vertIndex is invalid.\n */\n\n }, {\n key: \"translateVert\",\n value: function translateVert(vertIndex, t) {\n if (vertIndex >= this._verts.length) {\n throw new Error(\"Cannot translate vertex at index \" + vertIndex + \". There are only \" + this._verts.length + \" vertices in the polygon.\");\n }\n\n if (t[0] || t[1]) {\n var prev = Point2d.clone(this._verts[vertIndex]);\n var newPt = Point2d.clone(this._verts[vertIndex]);\n Point2d.addVec2(newPt, newPt, t);\n\n // TODO(croot): this could be made smarter by determining whether\n // this point affects the convex hull or not by checking it's relationship\n // with its neighbors\n this._collapseVerts();\n this._resetAABox = true;\n this._geomDirty = true;\n Point2d.copy(newPt);\n this.fire(\"changed:geom\", {\n attr: \"verts[\" + vertIndex + \"]\",\n prevVal: prev,\n currVal: newPt\n });\n }\n return this;\n }\n }, {\n key: \"setVertPosition\",\n value: function setVertPosition(vertIndex, pos) {\n if (vertIndex >= this._verts.length) {\n throw new Error(\"Cannot translate vertex at index \" + vertIndex + \". There are only \" + this._verts.length + \" vertices in the polygon.\");\n }\n\n if (!Point2d.equals(pos, this._verts[vertIndex])) {\n var prev = Point2d.clone(this._verts[vertIndex]);\n this._collapseVerts();\n Point2d.copy(this._verts[vertIndex], pos);\n\n // TODO(croot): this could be made smarter by determining whether\n // this point affects the convex hull or not by checking it's relationship\n // with its neighbors\n this._resetAABox = true;\n this._geomDirty = true;\n this.fire(\"changed:geom\", {\n attr: \"verts[\" + vertIndex + \"]\",\n prevVal: prev,\n currVal: pos\n });\n }\n }\n }, {\n key: \"insertVert\",\n value: function insertVert(vertIndex, pos) {\n var idx = _math2.default.min(_math2.default.max(vertIndex, 0), this._verts.length);\n this._collapseVerts();\n if (vertIndex >= this._verts.length) {\n this._verts.push(Point2d.clone(pos));\n idx = this._verts.length - 1;\n } else {\n this._verts.splice(vertIndex, 0, Point2d.clone(pos));\n }\n this._resetAABox = true;\n this._geomDirty = true;\n\n this.fire(\"changed:geom:addvert\", {\n attr: \"verts[\" + idx + \"]\",\n currVal: pos\n });\n\n return idx;\n }\n }, {\n key: \"appendVert\",\n value: function appendVert(pos) {\n return this.insertVert(this._verts.length, pos);\n }\n }, {\n key: \"removeVert\",\n value: function removeVert(vertIndex) {\n if (vertIndex >= this._verts.length || vertIndex < 0) {\n throw new Error(\"Cannot remove vertex \" + vertIndex + \". Invalid index. There are only \" + this._verts.length + \" vertices in the shape.\");\n }\n\n var pos = this._verts[vertIndex];\n this._verts.splice(vertIndex, 1);\n this._collapseVerts();\n this._resetAABox = true;\n this._geomDirty = true;\n\n this.fire(\"changed:geom:removevert\", {\n attr: \"verts[\" + vertIndex + \"]\",\n currVal: pos\n });\n\n return vertIndex;\n }\n }, {\n key: \"_rebuildAABox\",\n value: function _rebuildAABox() {\n var _this3 = this;\n\n AABox2d.initEmpty(this._aabox);\n if (this._verts.length < 3) {\n this._convexHull = this._verts.map(function (val, idx) {\n return idx;\n });\n } else {\n this._convexHull = (0, _convexHull.simpleHull_2D)(this._verts);\n }\n this._convexHull.forEach(function (idx) {\n aaboxEncapsulatePt(_this3._aabox, _this3._verts[idx], idx, _this3._extentIndices);\n });\n\n var pivot = Point2d.create(0, 0);\n AABox2d.getCenter(pivot, this._aabox);\n this.pivot = pivot;\n }\n }, {\n key: \"_updateAABox\",\n value: function _updateAABox() {\n var _this4 = this;\n\n if (this._resetAABox) {\n this._rebuildAABox();\n this._resetAABox = false;\n }\n\n if (this._boundsOutOfDate || this._geomDirty) {\n AABox2d.initEmpty(this._aabox);\n var tmppt = [0, 0];\n var xform = this.globalXform;\n this._convexHull.forEach(function (idx) {\n AABox2d.encapsulatePt(_this4._aabox, _this4._aabox, Point2d.transformMat2d(tmppt, _this4._verts[idx], xform));\n });\n this._boundsOutOfDate = false;\n\n if (this._geomDirty) {\n var pivot = Point2d.create();\n pivot[0] = this._verts[this._extentIndices[0]][0] + 0.5 * (this._verts[this._extentIndices[2]][0] - this._verts[this._extentIndices[0]][0]);\n pivot[1] = this._verts[this._extentIndices[1]][1] + 0.5 * (this._verts[this._extentIndices[3]][1] - this._verts[this._extentIndices[1]][1]);\n this.pivot = pivot;\n this._geomDirty = false;\n }\n }\n }\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n var rtn = false;\n if (this._verts.length >= 2) {\n ctx.moveTo(this._verts[0][0], this._verts[0][1]);\n for (var i = 1; i < this._verts.length; i += 1) {\n ctx.lineTo(this._verts[i][0], this._verts[i][1]);\n }\n rtn = true;\n }\n return rtn;\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"PolyLine\", // NOTE: this much match the name of the class\n verts: this.vertsRef.map(function (vert) {\n return [vert[0], vert[1]];\n })\n }, _get(PolyLine.prototype.__proto__ || Object.getPrototypeOf(PolyLine.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"width\",\n get: function get() {\n this._updateAABox();\n if (!this._verts.length || this._extentIndices[0] < 0 || this._extentIndices[2] < 0) {\n return 0;\n }\n\n return this._verts[this._extentIndices[2]][0] - this._verts[this._extentIndices[0]][0];\n }\n\n /**\n * Gets the untransformed height of the polyline. This is the height of the axis-aligned\n * bounds of the poly\n * @return {number} Height of the poly in world-space units\n */\n\n }, {\n key: \"height\",\n get: function get() {\n this._updateAABox();\n if (!this._verts.length || this._extentIndices[0] < 0 || this._extentIndices[2] < 0) {\n return 0;\n }\n\n return this._verts[this._extentIndices[3]][1] - this._verts[this._extentIndices[1]][1];\n }\n\n /**\n * Gets a reference to the vertex array of the polyline\n * @return {Point2d[]}\n * @readOnly\n */\n\n }, {\n key: \"vertsRef\",\n get: function get() {\n return this._verts;\n }\n\n /**\n * Gets the number of vertices in the polyline\n * @return {number}\n */\n\n }, {\n key: \"numVerts\",\n get: function get() {\n return this._verts.length;\n }\n }]);\n\n return PolyLine;\n}(_baseShape2.default);\n\nexports.default = PolyLine;\n\n\nPolyLine.aaboxEncapsulatePt = aaboxEncapsulatePt;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcG9seS1saW5lLmpzPzE4ZDQiXSwibmFtZXMiOlsiQUFCb3gyZCIsIlBvaW50MmQiLCJpZGVudGl0eU1hdHJpeCIsIk1hdDJkIiwiY3JlYXRlIiwiYWFib3hFbmNhcHN1bGF0ZVB0IiwiYm94IiwicHQiLCJwdElkeCIsImV4dGVudEluZGljZXMiLCJpc0VtcHR5IiwiYnVpbGRDZW50cm9pZCIsImNlbnRyb2lkUHQiLCJwdDEiLCJwdDIiLCJhIiwiaXNBcnJheSIsIm9iaiIsIkFycmF5IiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJQb2x5TGluZSIsIm9wdHMiLCJ2ZXJ0cyIsImxlbmd0aCIsIkVycm9yIiwiX2V4dGVudEluZGljZXMiLCJfbG9jYWxhYWJveCIsIl92ZXJ0cyIsIl9jZW50cm9pZCIsImluaXRFbXB0eSIsIl9hYWJveCIsInNpZ25lZEFyZWEiLCJpIiwicHVzaCIsImNsb25lIiwiaWR4IiwicGl2b3QiLCJnZXRDZW50ZXIiLCJfY29udmV4SHVsbCIsIm1hcCIsInZhbCIsIndpZHRoIiwiaGVpZ2h0Iiwic2V0IiwiX3Bpdm90IiwieGZvcm0iLCJsb2NhbFhmb3JtIiwiZXF1YWxzIiwidHJhbnNmb3JtTWF0MmQiLCJmb3JFYWNoIiwic2V0VHJhbnNmb3JtYXRpb25zIiwidmVydEluZGV4IiwidCIsInByZXYiLCJuZXdQdCIsImFkZFZlYzIiLCJfY29sbGFwc2VWZXJ0cyIsIl9yZXNldEFBQm94IiwiX2dlb21EaXJ0eSIsImNvcHkiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIiwicG9zIiwiTWF0aCIsIm1pbiIsIm1heCIsInNwbGljZSIsImluc2VydFZlcnQiLCJfcmVidWlsZEFBQm94IiwiX2JvdW5kc091dE9mRGF0ZSIsInRtcHB0IiwiZ2xvYmFsWGZvcm0iLCJlbmNhcHN1bGF0ZVB0IiwiY3R4IiwicnRuIiwibW92ZVRvIiwibGluZVRvIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZSIsInZl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VztBQUNWLFdBQUtDLFlBQUw7QUFDQSxVQUFJLENBQUMsS0FBS3pELE1BQUwsQ0FBWUosTUFBYixJQUF1QixLQUFLRSxjQUFMLENBQW9CLENBQXBCLElBQXlCLENBQWhELElBQXFELEtBQUtBLGNBQUwsQ0FBb0IsQ0FBcEIsSUFBeUIsQ0FBbEYsRUFBcUY7QUFDbkYsZUFBTyxDQUFQO0FBQ0Q7O0FBRUQsYUFBTyxLQUFLRSxNQUFMLENBQVksS0FBS0YsY0FBTCxDQUFvQixDQUFwQixDQUFaLEVBQW9DLENBQXBDLElBQXlDLEtBQUtFLE1BQUwsQ0FBWSxLQUFLRixjQUFMLENBQW9CLENBQXBCLENBQVosRUFBb0MsQ0FBcEMsQ0FBaEQ7QUFDRDs7QUFFRDs7Ozs7Ozs7d0JBS2E7QUFDWCxXQUFLMkQsWUFBTDtBQUNBLFVBQUksQ0FBQyxLQUFLekQsTUFBTCxDQUFZSixNQUFiLElBQXVCLEtBQUtFLGNBQUwsQ0FBb0IsQ0FBcEIsSUFBeUIsQ0FBaEQsSUFBcUQsS0FBS0EsY0FBTCxDQUFvQixDQUFwQixJQUF5QixDQUFsRixFQUFxRjtBQUNuRixlQUFPLENBQVA7QUFDRDs7QUFFRCxhQUFPLEtBQUtFLE1BQUwsQ0FBWSxLQUFLRixjQUFMLENBQW9CLENBQXBCLENBQVosRUFBb0MsQ0FBcEMsSUFBeUMsS0FBS0UsTUFBTCxDQUFZLEtBQUtGLGNBQUwsQ0FBb0IsQ0FBcEIsQ0FBWixFQUFvQyxDQUFwQyxDQUFoRDtBQUNEOztBQUVEOzs7Ozs7Ozt3QkFLZTtBQUNiLGFBQU8sS0FBS0UsTUFBWjtBQUNEOztBQUVEOzs7Ozs7O3dCQUllO0FBQ2IsYUFBTyxLQUFLQSxNQUFMLENBQVlKLE1BQW5CO0FBQ0Q7Ozs7RUF6SG1DOEQsbUI7O2tCQUFqQmpFLFE7OztBQStVckJBLFNBQVNoQixrQkFBVCxHQUE4QkEsa0JBQTlCIiwiZmlsZSI6IjEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQgQmFzZVNoYXBlIGZyb20gXCIuL2Jhc2Utc2hhcGUuanNcIlxuaW1wb3J0IHttYXQyZCBhcyBNYXQyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcbmltcG9ydCB7c2ltcGxlSHVsbF8yRH0gZnJvbSBcIi4uL21hdGgvY29udmV4LWh1bGxcIlxuXG5jb25zdCBpZGVudGl0eU1hdHJpeCA9IE1hdDJkLmNyZWF0ZSgpXG5cbi8qKlxuICogRXhwYW5kcyBhbiBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IHRvIGVuY2Fwc3VsYXRlIGEgMmQgdmVydGV4XG4gKiBkZWZpbmVkIGluIGFuIGFycmF5IG9mIHZlcnRpY2VzLCBhbmQgdXBkYXRlcyBhIHN0cnVjdCB1c2VkIHRvXG4gKiBzdG9yZSB0aGUgaW5kaWNlcyBvZiB0aGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIGZpbmFsIGJvdW5kc1xuICogb2YgdGhlIHZlcnRpY2VzXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggICAgICAgICAgQm91bmRzIHRvIGV4cGFuZFxuICogQHBhcmFtICB7UG9pbnQyZH0gcHQgICAgICAgICAgIDJkIHZlcnRleCB0byBlbmNhcHN1bGF0ZVxuICogQHBhcmFtICB7bnVtYmVyfSBwdElkeCAgICAgICAgIEluZGV4IG9mIHRoZSB2ZXJ0ZXggaW4gaXRzIGxpc3Qgb2YgdmVydGljZXNcbiAqIEBwYXJhbSAge251bWJlcltdfSBleHRlbnRJbmRpY2VzIFN0cnVjdCB0byBzdG9yZSB0aGUgaW5kaWNlcyBvZiB0aGUgYm91bmRpbmcgdmVydGljZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFhYm94RW5jYXBzdWxhdGVQdChib3gsIHB0LCBwdElkeCwgZXh0ZW50SW5kaWNlcykge1xuICBpZiAoQUFCb3gyZC5pc0VtcHR5KGJveCkpIHtcbiAgICBib3hbMF0gPSBwdFswXVxuICAgIGJveFsyXSA9IHB0WzBdXG4gICAgZXh0ZW50SW5kaWNlc1swXSA9IGV4dGVudEluZGljZXNbMl0gPSBwdElkeFxuICAgIGJveFsxXSA9IHB0WzFdXG4gICAgYm94WzNdID0gcHRbMV1cbiAgICBleHRlbnRJbmRpY2VzWzFdID0gZXh0ZW50SW5kaWNlc1szXSA9IHB0SWR4XG4gIH0gZWxzZSB7XG4gICAgaWYgKHB0WzBdIDwgYm94WzBdKSB7XG4gICAgICBib3hbMF0gPSBwdFswXVxuICAgICAgZXh0ZW50SW5kaWNlc1swXSA9IHB0SWR4XG4gICAgfSBlbHNlIGlmIChwdFswXSA+IGJveFsyXSkge1xuICAgICAgYm94WzJdID0gcHRbMF1cbiAgICAgIGV4dGVudEluZGljZXNbMl0gPSBwdElkeFxuICAgIH1cblxuICAgIGlmIChwdFsxXSA8IGJveFsxXSkge1xuICAgICAgYm94WzFdID0gcHRbMV1cbiAgICAgIGV4dGVudEluZGljZXNbMV0gPSBwdElkeFxuICAgIH0gZWxzZSBpZiAocHRbMV0gPiBib3hbM10pIHtcbiAgICAgIGJveFszXSA9IHB0WzFdXG4gICAgICBleHRlbnRJbmRpY2VzWzNdID0gcHRJZHhcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjYWxsZWQgc2VxdWVudGlhbGx5IHRvIGNhbGN1bGF0ZSB0aGUgY2VudHJvaWQgb2YgYSBwb2x5Z29uXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBjZW50cm9pZFB0IEN1cnJlbnQgY2VudHJvaWQgcG9pbnRcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0MSAgICAgICAgUG9pbnQgZGVzY3JpYmluZyBvbmUgZW5kIG9mIGFuIGVkZ2Ugb2YgYSBwb2x5Z29uXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwdDIgICAgICAgIFBvaW50IGRlc2NyaWJpbmcgb3RoZXIgZW5kIG9mIGFuIGVkZ2Ugb2YgYSBwb2x5Z29uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBidWlsZENlbnRyb2lkKGNlbnRyb2lkUHQsIHB0MSwgcHQyKSB7XG4gIGNvbnN0IGEgPSBwdDFbMF0gKiBwdDJbMV0gLSBwdDJbMF0gKiBwdDFbMV1cbiAgY2VudHJvaWRQdFswXSArPSAocHQxWzBdICsgcHQyWzBdKSAqIGFcbiAgY2VudHJvaWRQdFsxXSArPSAocHQxWzFdICsgcHQyWzFdKSAqIGFcbiAgcmV0dXJuIGFcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBhcmd1bWVudCBpcyBhbiBhcnJheVxuICogb2YgYW4gYXJyYXlidWZmZXJcbiAqIEBwYXJhbSAge30gIG9ialxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYXJyYXktbGlrZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KG9iaikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IChBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb2x5TGluZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyW118UG9pbnQyZFtdfSBbdmVydHM9W11dIEluaXRpYWwgdmVydGljZXMgb2YgdGhlIHBvbHlsaW5lXG4gKi9cblxuLyoqXG4gKiBAY2xhc3MgQ2xhc3MgZGVmaW5pbmcgYSBwb2x5IGxpbmVcbiAqIEBleHRlbmRzIHtCYXNlU2hhcGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbHlMaW5lIGV4dGVuZHMgQmFzZVNoYXBlIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwb2x5IGxpbmUgc2hhcGVcbiAgICogQHBhcmFtICB7UG9seUxpbmVPcHRpb25zfSBbb3B0c10gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtQb2x5TGluZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBjb25zdCB2ZXJ0cyA9IG9wdHMudmVydHMgfHwgW11cbiAgICBzdXBlcihvcHRzKVxuICAgIGlmICghaXNBcnJheSh2ZXJ0cykgfHxcbiAgICAgIHZlcnRzLmxlbmd0aCA9PT0gMCB8fCAoaXNBcnJheSh2ZXJ0c1swXSkgJiYgdmVydHMubGVuZ3RoIDwgMSkgfHxcbiAgICAgICghaXNBcnJheSh2ZXJ0c1swXSkgJiYgKHZlcnRzLmxlbmd0aCA8IDIgfHwgdmVydHMubGVuZ3RoICUgMiAhPT0gMCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb2x5TGluZSBzaGFwZXMgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGFycmF5IG9mIDJkIHBvaW50cyBhbmQgY29udGFpbiBhdCBsZWFzdCAxIHBvaW50c1wiKVxuICAgIH1cblxuICAgIC8vIGdvaW5nIHRvIGJ1aWxkIHRoZSBhYWJveCBhbmQgc3RvcmUgdGhlIGluZGljZXMgZm9yIGVhY2ggdmVydGV4XG4gICAgLy8gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHNcbiAgICB0aGlzLl9leHRlbnRJbmRpY2VzID0gWy0xLCAtMSwgLTEsIC0xXVxuICAgIHRoaXMuX2xvY2FsYWFib3ggPSBBQUJveDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fdmVydHMgPSBbXVxuICAgIHRoaXMuX2NlbnRyb2lkID0gWzAsIDBdXG4gICAgQUFCb3gyZC5pbml0RW1wdHkodGhpcy5fYWFib3gpXG4gICAgbGV0IHNpZ25lZEFyZWEgPSAwXG4gICAgbGV0IGkgPSAwXG4gICAgaWYgKGlzQXJyYXkodmVydHNbMF0pKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdmVydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7XG4gICAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jbG9uZSh2ZXJ0c1tpXSkpXG4gICAgICAgIGFhYm94RW5jYXBzdWxhdGVQdCh0aGlzLl9hYWJveCwgdmVydHNbaV0sIGksIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICAgIHNpZ25lZEFyZWEgKz0gYnVpbGRDZW50cm9pZCh0aGlzLl9jZW50cm9pZCwgdmVydHNbaV0sIHZlcnRzW2kgKyAxXSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jbG9uZSh2ZXJ0c1tpXSkpXG4gICAgICBhYWJveEVuY2Fwc3VsYXRlUHQodGhpcy5fYWFib3gsIHZlcnRzW2ldLCBpLCB0aGlzLl9leHRlbnRJbmRpY2VzKVxuICAgICAgc2lnbmVkQXJlYSArPSBidWlsZENlbnRyb2lkKHRoaXMuX2NlbnRyb2lkLCB2ZXJ0c1tpXSwgdmVydHNbMF0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jcmVhdGUodmVydHNbMF0sIHZlcnRzWzFdKSlcbiAgICAgIGFhYm94RW5jYXBzdWxhdGVQdCh0aGlzLl9hYWJveCwgdGhpcy5fdmVydHNbMF0sIDAsIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICBsZXQgaWR4ID0gMVxuICAgICAgZm9yIChpID0gMjsgaSA8IHZlcnRzLmxlbmd0aCAtIDI7IGkgKz0gMiwgaWR4ICs9IDEpIHtcbiAgICAgICAgdGhpcy5fdmVydHMucHVzaChQb2ludDJkLmNyZWF0ZSh2ZXJ0c1tpXSwgdmVydHNbaSArIDFdKSlcbiAgICAgICAgYWFib3hFbmNhcHN1bGF0ZVB0KHRoaXMuX2FhYm94LCB0aGlzLl92ZXJ0c1tpZHhdLCBpZHgsIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICAgIHNpZ25lZEFyZWEgKz0gYnVpbGRDZW50cm9pZCh0aGlzLl9jZW50cm9pZCwgdGhpcy5fdmVydHNbaWR4IC0gMV0sIHRoaXMuX3ZlcnRzW2lkeF0pXG4gICAgICB9XG4gICAgICB0aGlzLl92ZXJ0cy5wdXNoKFBvaW50MmQuY3JlYXRlKHZlcnRzW2ldLCB2ZXJ0c1tpICsgMV0pKVxuICAgICAgYWFib3hFbmNhcHN1bGF0ZVB0KHRoaXMuX2FhYm94LCB0aGlzLl92ZXJ0c1tpZHhdLCBpZHgsIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICBzaWduZWRBcmVhICs9IGJ1aWxkQ2VudHJvaWQodGhpcy5fY2VudHJvaWQsIHRoaXMuX3ZlcnRzW2lkeF0sIHRoaXMuX3ZlcnRzWzBdKVxuICAgIH1cbiAgICBzaWduZWRBcmVhICo9IDAuNVxuICAgIHRoaXMuX2NlbnRyb2lkWzBdIC89IDYuMCAqIHNpZ25lZEFyZWFcbiAgICB0aGlzLl9jZW50cm9pZFsxXSAvPSA2LjAgKiBzaWduZWRBcmVhXG5cbiAgICAvLyBleHRyYWN0IHRoZSBjZW50ZXIgb2YgdGhlIGFhYm94LiBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgYXMgdGhlXG4gICAgLy8gc2hhcGUncyBwaXZvdCwgc28gYWxsIHJvdGF0aW9uL3NjYWxlIHRyYW5zZm9ybWF0aW9ucyB3aWxsIGJlIHNvdXJjZWRcbiAgICAvLyBhdCB0aGlzIGxvY2F0aW9uXG4gICAgY29uc3QgcGl2b3QgPSBQb2ludDJkLmNyZWF0ZSgpXG4gICAgQUFCb3gyZC5nZXRDZW50ZXIocGl2b3QsIHRoaXMuX2FhYm94KVxuICAgIHRoaXMucGl2b3QgPSBwaXZvdFxuXG4gICAgLy8gbm93IGJ1aWxkIHRoZSBjb252ZXggaHVsbCBvZiB0aGUgdmVydGljZXMuXG4gICAgLy8gV2hlbiByZWJ1aWxkaW5nIHRoZSBheGlzIGFsaWduZWQgYm94IChhIHRyYW5zZm9ybSBpcyBhcHBsaWVkIGZvciBleGFtcGxlKSxcbiAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gdHJhdmVyc2UgYWxsIHRoZSBwb2ludHMuIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHRyYXZlcnNlXG4gICAgLy8gdGhlIHBvaW50cyB0aGF0IGRlZmluZSB0aGUgY29udmV4IGh1bGwgdG8gcmVidWlsZCB0aGUgYm91bmRzXG4gICAgaWYgKHRoaXMuX3ZlcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSB0aGlzLl92ZXJ0cy5tYXAoKHZhbCwgaWR4KSA9PiBpZHgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSBzaW1wbGVIdWxsXzJEKHRoaXMuX3ZlcnRzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVudHJhbnNmb3JtZWQgd2lkdGgvaGVpZ2h0IG9mIHRoZSBwb2x5bGluZS4gVGhpcyBpcyBlc3NlbnRpYWxseVxuICAgKiB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBwb2x5J3MgYm91bmRzXG4gICAqIEByZXR1cm4ge1ZlYzJkfSBXaWR0aC9oZWlnaHQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgcG9seWxpbmVcbiAgICovXG4gIGdldERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVudHJhbnNmb3JtZWQgd2lkdGggb2YgdGhlIHBvbHlsaW5lLiBUaGlzIGlzIHRoZSB3aWR0aCBvZiB0aGVcbiAgICogYXhpcy1hbGlnbmVkIGJvdW5kcyBvZiB0aGUgcG9seVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFdpZHRoIG9mIHRoZSBwb2x5IGluIHdvcmxkLXNwYWNlIHVuaXRzXG4gICAqL1xuICBnZXQgd2lkdGgoKSB7XG4gICAgdGhpcy5fdXBkYXRlQUFCb3goKVxuICAgIGlmICghdGhpcy5fdmVydHMubGVuZ3RoIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMF0gPCAwIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMl0gPCAwKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzJdXVswXSAtIHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMF1dWzBdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdW50cmFuc2Zvcm1lZCBoZWlnaHQgb2YgdGhlIHBvbHlsaW5lLiBUaGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIGF4aXMtYWxpZ25lZFxuICAgKiBib3VuZHMgb2YgdGhlIHBvbHlcbiAgICogQHJldHVybiB7bnVtYmVyfSBIZWlnaHQgb2YgdGhlIHBvbHkgaW4gd29ybGQtc3BhY2UgdW5pdHNcbiAgICovXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgdGhpcy5fdXBkYXRlQUFCb3goKVxuICAgIGlmICghdGhpcy5fdmVydHMubGVuZ3RoIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMF0gPCAwIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMl0gPCAwKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzNdXVsxXSAtIHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMV1dWzFdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgdmVydGV4IGFycmF5IG9mIHRoZSBwb2x5bGluZVxuICAgKiBAcmV0dXJuIHtQb2ludDJkW119XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0IHZlcnRzUmVmKCkge1xuICAgIHJldHVybiB0aGlzLl92ZXJ0c1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB0aGUgcG9seWxpbmVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG51bVZlcnRzKCkge1xuICAgIHJldHVybiB0aGlzLl92ZXJ0cy5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgY29sbGFwc2VzIGFsbCB0aGUgdmVydHMsIG1lYW5pbmcgdGhlIHZlcnRzXG4gICAqIGFyZSBmbGF0dGVuZWQgdG8gdGhlaXIgcG9zaXRpb24gd2l0aCBsb2NhbC1zcGFjZSB0cmFuc2Zvcm1zIGFwcGxpZWRcbiAgICogYW5kIHRoZW4gdGhlIGxvY2FsIHRyYW5zZm9ybXMgYXJlIGNsZWFyZWQuIFRoaXMgaXMgZG9uZSB3aGVuZXZlclxuICAgKiB0aGUgdmVydGljZXMgb2YgdGhlIHBvbHlnb24gYXJlIG1vZGlmaWVkIGFzIGl0IGNhbiBiZSBhIGxpdHRsZSB0cmlja3lcbiAgICogdG8gcmUtYWRqdXN0IHRoZSBwaXZvdC90cmFuc2Zvcm1zIG9mIHRoZSB2ZXJ0IHdoZW4gbmV3IHZlcnRzIGFyZSBhZGRlZCxcbiAgICogZGVsZXRlZCwgZXRjLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50cyB3ZXJlIGluZGVlZCBmbGF0dGVuZWRcbiAgICogICAgICAgICAgICAgICAgICAgVGhlIHBvaW50cyB3b3VsZG4ndCBiZSBmbGF0dGVuZWQgaWYgdGhlcmUgYXJlIG5vXG4gICAqICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgdG8gYXBwbHksIGZvciBleGFtcGxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY29sbGFwc2VWZXJ0cygpIHtcbiAgICBQb2ludDJkLnNldCh0aGlzLl9waXZvdCwgMCwgMClcblxuICAgIC8vIFRPRE8oY3Jvb3QpOiB3aGF0IGlmIHRoaXMgcG9seSBpc1xuICAgIC8vIHBhcmVudGVkIHRvIGFub3RoZXIgdHJhbnNmb3JtP1xuXG4gICAgY29uc3QgeGZvcm0gPSB0aGlzLmxvY2FsWGZvcm1cbiAgICBpZiAoTWF0MmQuZXF1YWxzKHhmb3JtLCBpZGVudGl0eU1hdHJpeCkpIHtcbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyB0cmFuc2Zvcm1zIHRvIGFwcGx5LFxuICAgICAgLy8gZG8gbm90aGluZyAtIGZhc3Qgb3V0XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBBQUJveDJkLmluaXRFbXB0eSh0aGlzLl9hYWJveClcblxuICAgIC8vIGZsYXR0ZW4gYWxsIHRoZSBwb2ludHMgdG8gdGhlaXIgY3VycmVudCB3b3JsZC1zcGFjZSBwb3NpdGlvblxuICAgIC8vIHdpdGggdHJhbnNmb3JtcyBhcHBsaWVkXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92ZXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl92ZXJ0c1tpXSwgdGhpcy5fdmVydHNbaV0sIHhmb3JtKVxuICAgIH1cblxuICAgIC8vIG5vdyByZWNhbGN1dGUgdGhlIGNvbnZleCBodWxsIG9mIGFsbCB0aGUgdHJhbnNmb3JtZWQgcG9pbnRzXG4gICAgaWYgKHRoaXMuX3ZlcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSB0aGlzLl92ZXJ0cy5tYXAoKHZhbCwgaWR4KSA9PiBpZHgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSBzaW1wbGVIdWxsXzJEKHRoaXMuX3ZlcnRzKVxuICAgIH1cbiAgICAvLyB1c2UgdGhlIGNvbnZleCBodWxsIHBvaW50cyB0byByZWJ1aWxkIHRoZSBib3VuZHNcbiAgICB0aGlzLl9jb252ZXhIdWxsLmZvckVhY2goaWR4ID0+IHtcbiAgICAgIGFhYm94RW5jYXBzdWxhdGVQdCh0aGlzLl9hYWJveCwgdGhpcy5fdmVydHNbaWR4XSwgaWR4LCB0aGlzLl9leHRlbnRJbmRpY2VzKVxuICAgIH0pXG5cbiAgICAvLyByZXNldCB0aGUgbG9jYWwgdHJhbnNmb3Jtc1xuICAgIHRoaXMuc2V0VHJhbnNmb3JtYXRpb25zKDAsIDAsIDEsIDEsIDApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYSBzcGVjaWZpYyB2ZXJ0ZXggb2YgdGhlIHBvbHlnb24gYnkgYW4gb2Zmc2V0XG4gICAqIEBwYXJhbSAge251bWJlcn0gdmVydEluZGV4IEluZGV4IG9mIHRoZSB2ZXJ0ZXggdG8gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSAge1ZlYzJkfSB0ICAgICAgICAgVHJhbnNsYXRpb24gb2Zmc2V0LCBpbiB3b3JsZC1zcGFjZSB1bml0c1xuICAgKiBAcmV0dXJuIHtQb2x5TGluZX0gICAgICAgICAgIHRoaXNcbiAgICogQGZpcmVzIHtTaGFwZSNnZW9tQ2hhbmdlZH1cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHZlcnRJbmRleCBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdHJhbnNsYXRlVmVydCh2ZXJ0SW5kZXgsIHQpIHtcbiAgICBpZiAodmVydEluZGV4ID49IHRoaXMuX3ZlcnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdHJhbnNsYXRlIHZlcnRleCBhdCBpbmRleCAke3ZlcnRJbmRleH0uIFRoZXJlIGFyZSBvbmx5ICR7dGhpcy5fdmVydHMubGVuZ3RofSB2ZXJ0aWNlcyBpbiB0aGUgcG9seWdvbi5gKVxuICAgIH1cblxuICAgIGlmICh0WzBdIHx8IHRbMV0pIHtcbiAgICAgIGNvbnN0IHByZXYgPSBQb2ludDJkLmNsb25lKHRoaXMuX3ZlcnRzW3ZlcnRJbmRleF0pXG4gICAgICBjb25zdCBuZXdQdCA9IFBvaW50MmQuY2xvbmUodGhpcy5fdmVydHNbdmVydEluZGV4XSlcbiAgICAgIFBvaW50MmQuYWRkVmVjMihuZXdQdCwgbmV3UHQsIHQpXG5cbiAgICAgIC8vIFRPRE8oY3Jvb3QpOiB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBkZXRlcm1pbmluZyB3aGV0aGVyXG4gICAgICAvLyB0aGlzIHBvaW50IGFmZmVjdHMgdGhlIGNvbnZleCBodWxsIG9yIG5vdCBieSBjaGVja2luZyBpdCdzIHJlbGF0aW9uc2hpcFxuICAgICAgLy8gd2l0aCBpdHMgbmVpZ2hib3JzXG4gICAgICB0aGlzLl9jb2xsYXBzZVZlcnRzKClcbiAgICAgIHRoaXMuX3Jlc2V0QUFCb3ggPSB0cnVlXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlXG4gICAgICBQb2ludDJkLmNvcHkobmV3UHQpXG4gICAgICB0aGlzLmZpcmUoXCJjaGFuZ2VkOmdlb21cIiwge1xuICAgICAgICBhdHRyOiBgdmVydHNbJHt2ZXJ0SW5kZXh9XWAsXG4gICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgIGN1cnJWYWw6IG5ld1B0XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2V0VmVydFBvc2l0aW9uKHZlcnRJbmRleCwgcG9zKSB7XG4gICAgaWYgKHZlcnRJbmRleCA+PSB0aGlzLl92ZXJ0cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHRyYW5zbGF0ZSB2ZXJ0ZXggYXQgaW5kZXggJHt2ZXJ0SW5kZXh9LiBUaGVyZSBhcmUgb25seSAke3RoaXMuX3ZlcnRzLmxlbmd0aH0gdmVydGljZXMgaW4gdGhlIHBvbHlnb24uYClcbiAgICB9XG5cbiAgICBpZiAoIVBvaW50MmQuZXF1YWxzKHBvcywgdGhpcy5fdmVydHNbdmVydEluZGV4XSkpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBQb2ludDJkLmNsb25lKHRoaXMuX3ZlcnRzW3ZlcnRJbmRleF0pXG4gICAgICB0aGlzLl9jb2xsYXBzZVZlcnRzKClcbiAgICAgIFBvaW50MmQuY29weSh0aGlzLl92ZXJ0c1t2ZXJ0SW5kZXhdLCBwb3MpXG5cbiAgICAgIC8vIFRPRE8oY3Jvb3QpOiB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBkZXRlcm1pbmluZyB3aGV0aGVyXG4gICAgICAvLyB0aGlzIHBvaW50IGFmZmVjdHMgdGhlIGNvbnZleCBodWxsIG9yIG5vdCBieSBjaGVja2luZyBpdCdzIHJlbGF0aW9uc2hpcFxuICAgICAgLy8gd2l0aCBpdHMgbmVpZ2hib3JzXG4gICAgICB0aGlzLl9yZXNldEFBQm94ID0gdHJ1ZVxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5maXJlKFwiY2hhbmdlZDpnZW9tXCIsIHtcbiAgICAgICAgYXR0cjogYHZlcnRzWyR7dmVydEluZGV4fV1gLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiBwb3NcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaW5zZXJ0VmVydCh2ZXJ0SW5kZXgsIHBvcykge1xuICAgIGxldCBpZHggPSBNYXRoLm1pbihNYXRoLm1heCh2ZXJ0SW5kZXgsIDApLCB0aGlzLl92ZXJ0cy5sZW5ndGgpXG4gICAgdGhpcy5fY29sbGFwc2VWZXJ0cygpXG4gICAgaWYgKHZlcnRJbmRleCA+PSB0aGlzLl92ZXJ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jbG9uZShwb3MpKVxuICAgICAgaWR4ID0gdGhpcy5fdmVydHMubGVuZ3RoIC0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92ZXJ0cy5zcGxpY2UodmVydEluZGV4LCAwLCBQb2ludDJkLmNsb25lKHBvcykpXG4gICAgfVxuICAgIHRoaXMuX3Jlc2V0QUFCb3ggPSB0cnVlXG4gICAgdGhpcy5fZ2VvbURpcnR5ID0gdHJ1ZVxuXG4gICAgdGhpcy5maXJlKFwiY2hhbmdlZDpnZW9tOmFkZHZlcnRcIiwge1xuICAgICAgYXR0cjogYHZlcnRzWyR7aWR4fV1gLFxuICAgICAgY3VyclZhbDogcG9zXG4gICAgfSlcblxuICAgIHJldHVybiBpZHhcbiAgfVxuXG4gIGFwcGVuZFZlcnQocG9zKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0VmVydCh0aGlzLl92ZXJ0cy5sZW5ndGgsIHBvcylcbiAgfVxuXG4gIHJlbW92ZVZlcnQodmVydEluZGV4KSB7XG4gICAgaWYgKHZlcnRJbmRleCA+PSB0aGlzLl92ZXJ0cy5sZW5ndGggfHwgdmVydEluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVtb3ZlIHZlcnRleCAke3ZlcnRJbmRleH0uIEludmFsaWQgaW5kZXguIFRoZXJlIGFyZSBvbmx5ICR7dGhpcy5fdmVydHMubGVuZ3RofSB2ZXJ0aWNlcyBpbiB0aGUgc2hhcGUuYClcbiAgICB9XG5cbiAgICBjb25zdCBwb3MgPSB0aGlzLl92ZXJ0c1t2ZXJ0SW5kZXhdXG4gICAgdGhpcy5fdmVydHMuc3BsaWNlKHZlcnRJbmRleCwgMSlcbiAgICB0aGlzLl9jb2xsYXBzZVZlcnRzKClcbiAgICB0aGlzLl9yZXNldEFBQm94ID0gdHJ1ZVxuICAgIHRoaXMuX2dlb21EaXJ0eSA9IHRydWVcblxuICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbTpyZW1vdmV2ZXJ0XCIsIHtcbiAgICAgIGF0dHI6IGB2ZXJ0c1ske3ZlcnRJbmRleH1dYCxcbiAgICAgIGN1cnJWYWw6IHBvc1xuICAgIH0pXG5cbiAgICByZXR1cm4gdmVydEluZGV4XG4gIH1cblxuICBfcmVidWlsZEFBQm94KCkge1xuICAgIEFBQm94MmQuaW5pdEVtcHR5KHRoaXMuX2FhYm94KVxuICAgIGlmICh0aGlzLl92ZXJ0cy5sZW5ndGggPCAzKSB7XG4gICAgICB0aGlzLl9jb252ZXhIdWxsID0gdGhpcy5fdmVydHMubWFwKCh2YWwsIGlkeCkgPT4gaWR4KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb252ZXhIdWxsID0gc2ltcGxlSHVsbF8yRCh0aGlzLl92ZXJ0cylcbiAgICB9XG4gICAgdGhpcy5fY29udmV4SHVsbC5mb3JFYWNoKGlkeCA9PiB7XG4gICAgICBhYWJveEVuY2Fwc3VsYXRlUHQodGhpcy5fYWFib3gsIHRoaXMuX3ZlcnRzW2lkeF0sIGlkeCwgdGhpcy5fZXh0ZW50SW5kaWNlcylcbiAgICB9KVxuXG4gICAgY29uc3QgcGl2b3QgPSBQb2ludDJkLmNyZWF0ZSgwLCAwKVxuICAgIEFBQm94MmQuZ2V0Q2VudGVyKHBpdm90LCB0aGlzLl9hYWJveClcbiAgICB0aGlzLnBpdm90ID0gcGl2b3RcbiAgfVxuXG4gIF91cGRhdGVBQUJveCgpIHtcbiAgICBpZiAodGhpcy5fcmVzZXRBQUJveCkge1xuICAgICAgdGhpcy5fcmVidWlsZEFBQm94KClcbiAgICAgIHRoaXMuX3Jlc2V0QUFCb3ggPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib3VuZHNPdXRPZkRhdGUgfHwgdGhpcy5fZ2VvbURpcnR5KSB7XG4gICAgICBBQUJveDJkLmluaXRFbXB0eSh0aGlzLl9hYWJveClcbiAgICAgIGNvbnN0IHRtcHB0ID0gWzAsIDBdXG4gICAgICBjb25zdCB4Zm9ybSA9IHRoaXMuZ2xvYmFsWGZvcm1cbiAgICAgIHRoaXMuX2NvbnZleEh1bGwuZm9yRWFjaChpZHggPT4ge1xuICAgICAgICBBQUJveDJkLmVuY2Fwc3VsYXRlUHQodGhpcy5fYWFib3gsIHRoaXMuX2FhYm94LCBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcHB0LCB0aGlzLl92ZXJ0c1tpZHhdLCB4Zm9ybSkpXG4gICAgICB9KVxuICAgICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gZmFsc2VcblxuICAgICAgaWYgKHRoaXMuX2dlb21EaXJ0eSkge1xuICAgICAgICBjb25zdCBwaXZvdCA9IFBvaW50MmQuY3JlYXRlKClcbiAgICAgICAgcGl2b3RbMF0gPSB0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzBdXVswXSArIDAuNSAqICh0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzJdXVswXSAtIHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMF1dWzBdKVxuICAgICAgICBwaXZvdFsxXSA9IHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMV1dWzFdICsgMC41ICogKHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbM11dWzFdIC0gdGhpcy5fdmVydHNbdGhpcy5fZXh0ZW50SW5kaWNlc1sxXV1bMV0pXG4gICAgICAgIHRoaXMucGl2b3QgPSBwaXZvdFxuICAgICAgICB0aGlzLl9nZW9tRGlydHkgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9kcmF3KGN0eCkge1xuICAgIGxldCBydG4gPSBmYWxzZVxuICAgIGlmICh0aGlzLl92ZXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgY3R4Lm1vdmVUbyh0aGlzLl92ZXJ0c1swXVswXSwgdGhpcy5fdmVydHNbMF1bMV0pXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX3ZlcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGN0eC5saW5lVG8odGhpcy5fdmVydHNbaV1bMF0sIHRoaXMuX3ZlcnRzW2ldWzFdKVxuICAgICAgfVxuICAgICAgcnRuID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgdHlwZTogXCJQb2x5TGluZVwiLCAvLyBOT1RFOiB0aGlzIG11Y2ggbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGNsYXNzXG4gICAgICB2ZXJ0czogdGhpcy52ZXJ0c1JlZi5tYXAodmVydCA9PiBbdmVydFswXSwgdmVydFsxXV0pXG4gICAgfSwgc3VwZXIudG9KU09OKCkpXG4gIH1cblxufVxuXG5Qb2x5TGluZS5hYWJveEVuY2Fwc3VsYXRlUHQgPSBhYWJveEVuY2Fwc3VsYXRlUHRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NoYXBlcy9wb2x5LWxpbmUuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 11 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _baseShape = __webpack_require__(7);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _glMatrix = __webpack_require__(1);\n\nvar _math = __webpack_require__(6);\n\nvar _math2 = _interopRequireDefault(_math);\n\nvar _convexHull = __webpack_require__(15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar identityMatrix = _glMatrix.mat2d.create();\n\n/**\n * Expands an axis-aligned bounding box to encapsulate a 2d vertex\n * defined in an array of vertices, and updates a struct used to\n * store the indices of the vertices that define the final bounds\n * of the vertices\n * @param {AABox2d} box Bounds to expand\n * @param {Point2d} pt 2d vertex to encapsulate\n * @param {number} ptIdx Index of the vertex in its list of vertices\n * @param {number[]} extentIndices Struct to store the indices of the bounding vertices\n * @private\n */\nfunction aaboxEncapsulatePt(box, pt, ptIdx, extentIndices) {\n if (AABox2d.isEmpty(box)) {\n box[0] = pt[0];\n box[2] = pt[0];\n extentIndices[0] = extentIndices[2] = ptIdx;\n box[1] = pt[1];\n box[3] = pt[1];\n extentIndices[1] = extentIndices[3] = ptIdx;\n } else {\n if (pt[0] < box[0]) {\n box[0] = pt[0];\n extentIndices[0] = ptIdx;\n } else if (pt[0] > box[2]) {\n box[2] = pt[0];\n extentIndices[2] = ptIdx;\n }\n\n if (pt[1] < box[1]) {\n box[1] = pt[1];\n extentIndices[1] = ptIdx;\n } else if (pt[1] > box[3]) {\n box[3] = pt[1];\n extentIndices[3] = ptIdx;\n }\n }\n}\n\n/**\n * Function called sequentially to calculate the centroid of a polygon\n * @param {Point2d} centroidPt Current centroid point\n * @param {Point2d} pt1 Point describing one end of an edge of a polygon\n * @param {Point2d} pt2 Point describing other end of an edge of a polygon\n * @private\n */\nfunction buildCentroid(centroidPt, pt1, pt2) {\n var a = pt1[0] * pt2[1] - pt2[0] * pt1[1];\n centroidPt[0] += (pt1[0] + pt2[0]) * a;\n centroidPt[1] += (pt1[1] + pt2[1]) * a;\n return a;\n}\n\n/**\n * Utility function used to check whether an argument is an array\n * of an arraybuffer\n * @param {} obj\n * @return {Boolean} Returns true if object is array-like\n */\nfunction isArray(obj) {\n return Array.isArray(obj) || ArrayBuffer && ArrayBuffer.isView(obj);\n}\n\n/**\n * @typedef {object} PolyLineOptions\n * @property {number[]|Point2d[]} [verts=[]] Initial vertices of the polyline\n */\n\n/**\n * @class Class defining a poly line\n * @extends {BaseShape}\n */\n\nvar PolyLine = function (_BaseShape) {\n _inherits(PolyLine, _BaseShape);\n\n /**\n * Creates a new poly line shape\n * @param {PolyLineOptions} [opts] [description]\n * @return {PolyLine}\n */\n function PolyLine(opts) {\n _classCallCheck(this, PolyLine);\n\n var verts = opts.verts || [];\n\n var _this = _possibleConstructorReturn(this, (PolyLine.__proto__ || Object.getPrototypeOf(PolyLine)).call(this, opts));\n\n if (!isArray(verts) || verts.length === 0 || isArray(verts[0]) && verts.length < 1 || !isArray(verts[0]) && (verts.length < 2 || verts.length % 2 !== 0)) {\n throw new Error(\"PolyLine shapes must be initialized with an array of 2d points and contain at least 1 points\");\n }\n\n // going to build the aabox and store the indices for each vertex\n // that defines the bounds\n _this._extentIndices = [-1, -1, -1, -1];\n _this._localaabox = AABox2d.create();\n _this._verts = [];\n _this._centroid = [0, 0];\n AABox2d.initEmpty(_this._aabox);\n var signedArea = 0;\n var i = 0;\n if (isArray(verts[0])) {\n for (i = 0; i < verts.length - 1; i += 1) {\n _this._verts.push(Point2d.clone(verts[i]));\n aaboxEncapsulatePt(_this._aabox, verts[i], i, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, verts[i], verts[i + 1]);\n }\n _this._verts.push(Point2d.clone(verts[i]));\n aaboxEncapsulatePt(_this._aabox, verts[i], i, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, verts[i], verts[0]);\n } else {\n _this._verts.push(Point2d.create(verts[0], verts[1]));\n aaboxEncapsulatePt(_this._aabox, _this._verts[0], 0, _this._extentIndices);\n var idx = 1;\n for (i = 2; i < verts.length - 2; i += 2, idx += 1) {\n _this._verts.push(Point2d.create(verts[i], verts[i + 1]));\n aaboxEncapsulatePt(_this._aabox, _this._verts[idx], idx, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, _this._verts[idx - 1], _this._verts[idx]);\n }\n _this._verts.push(Point2d.create(verts[i], verts[i + 1]));\n aaboxEncapsulatePt(_this._aabox, _this._verts[idx], idx, _this._extentIndices);\n signedArea += buildCentroid(_this._centroid, _this._verts[idx], _this._verts[0]);\n }\n signedArea *= 0.5;\n _this._centroid[0] /= 6.0 * signedArea;\n _this._centroid[1] /= 6.0 * signedArea;\n\n // extract the center of the aabox. We are going to use this as the\n // shape's pivot, so all rotation/scale transformations will be sourced\n // at this location\n var pivot = Point2d.create();\n AABox2d.getCenter(pivot, _this._aabox);\n _this.pivot = pivot;\n\n // now build the convex hull of the vertices.\n // When rebuilding the axis aligned box (a transform is applied for example),\n // there's no need to traverse all the points. All we need to do is traverse\n // the points that define the convex hull to rebuild the bounds\n if (_this._verts.length < 3) {\n _this._convexHull = _this._verts.map(function (val, idx) {\n return idx;\n });\n } else {\n _this._convexHull = (0, _convexHull.simpleHull_2D)(_this._verts);\n }\n return _this;\n }\n\n /**\n * Get the untransformed width/height of the polyline. This is essentially\n * the width/height of the poly's bounds\n * @return {Vec2d} Width/height of the bounds of the polyline\n */\n\n\n _createClass(PolyLine, [{\n key: \"getDimensions\",\n value: function getDimensions() {\n return [this.width, this.height];\n }\n\n /**\n * Get the untransformed width of the polyline. This is the width of the\n * axis-aligned bounds of the poly\n * @return {number} Width of the poly in world-space units\n */\n\n }, {\n key: \"_collapseVerts\",\n\n\n /**\n * Utility function that collapses all the verts, meaning the verts\n * are flattened to their position with local-space transforms applied\n * and then the local transforms are cleared. This is done whenever\n * the vertices of the polygon are modified as it can be a little tricky\n * to re-adjust the pivot/transforms of the vert when new verts are added,\n * deleted, etc.\n * @return {boolean} Returns true if the points were indeed flattened\n * The points wouldn't be flattened if there are no\n * transforms to apply, for example\n * @private\n */\n value: function _collapseVerts() {\n var _this2 = this;\n\n Point2d.set(this._pivot, 0, 0);\n\n // TODO(croot): what if this poly is\n // parented to another transform?\n\n var xform = this.localXform;\n if (_glMatrix.mat2d.equals(xform, identityMatrix)) {\n // if there are no transforms to apply,\n // do nothing - fast out\n return false;\n }\n\n AABox2d.initEmpty(this._aabox);\n\n // flatten all the points to their current world-space position\n // with transforms applied\n for (var i = 0; i < this._verts.length; i += 1) {\n Point2d.transformMat2d(this._verts[i], this._verts[i], xform);\n }\n\n // now recalcute the convex hull of all the transformed points\n if (this._verts.length < 3) {\n this._convexHull = this._verts.map(function (val, idx) {\n return idx;\n });\n } else {\n this._convexHull = (0, _convexHull.simpleHull_2D)(this._verts);\n }\n // use the convex hull points to rebuild the bounds\n this._convexHull.forEach(function (idx) {\n aaboxEncapsulatePt(_this2._aabox, _this2._verts[idx], idx, _this2._extentIndices);\n });\n\n // reset the local transforms\n this.setTransformations(0, 0, 1, 1, 0);\n\n return true;\n }\n\n /**\n * Translates a specific vertex of the polygon by an offset\n * @param {number} vertIndex Index of the vertex to translate\n * @param {Vec2d} t Translation offset, in world-space units\n * @return {PolyLine} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If vertIndex is invalid.\n */\n\n }, {\n key: \"translateVert\",\n value: function translateVert(vertIndex, t) {\n if (vertIndex >= this._verts.length) {\n throw new Error(\"Cannot translate vertex at index \" + vertIndex + \". There are only \" + this._verts.length + \" vertices in the polygon.\");\n }\n\n if (t[0] || t[1]) {\n var prev = Point2d.clone(this._verts[vertIndex]);\n var newPt = Point2d.clone(this._verts[vertIndex]);\n Point2d.addVec2(newPt, newPt, t);\n\n // TODO(croot): this could be made smarter by determining whether\n // this point affects the convex hull or not by checking it's relationship\n // with its neighbors\n this._collapseVerts();\n this._resetAABox = true;\n this._geomDirty = true;\n Point2d.copy(newPt);\n this.fire(\"changed:geom\", {\n attr: \"verts[\" + vertIndex + \"]\",\n prevVal: prev,\n currVal: newPt\n });\n }\n return this;\n }\n }, {\n key: \"setVertPosition\",\n value: function setVertPosition(vertIndex, pos) {\n if (vertIndex >= this._verts.length) {\n throw new Error(\"Cannot translate vertex at index \" + vertIndex + \". There are only \" + this._verts.length + \" vertices in the polygon.\");\n }\n\n if (!Point2d.equals(pos, this._verts[vertIndex])) {\n var prev = Point2d.clone(this._verts[vertIndex]);\n this._collapseVerts();\n Point2d.copy(this._verts[vertIndex], pos);\n\n // TODO(croot): this could be made smarter by determining whether\n // this point affects the convex hull or not by checking it's relationship\n // with its neighbors\n this._resetAABox = true;\n this._geomDirty = true;\n this.fire(\"changed:geom\", {\n attr: \"verts[\" + vertIndex + \"]\",\n prevVal: prev,\n currVal: pos\n });\n }\n }\n }, {\n key: \"insertVert\",\n value: function insertVert(vertIndex, pos) {\n var idx = _math2.default.min(_math2.default.max(vertIndex, 0), this._verts.length);\n this._collapseVerts();\n if (vertIndex >= this._verts.length) {\n this._verts.push(Point2d.clone(pos));\n idx = this._verts.length - 1;\n } else {\n this._verts.splice(vertIndex, 0, Point2d.clone(pos));\n }\n this._resetAABox = true;\n this._geomDirty = true;\n\n this.fire(\"changed:geom:addvert\", {\n attr: \"verts[\" + idx + \"]\",\n currVal: pos\n });\n\n return idx;\n }\n }, {\n key: \"appendVert\",\n value: function appendVert(pos) {\n return this.insertVert(this._verts.length, pos);\n }\n }, {\n key: \"removeVert\",\n value: function removeVert(vertIndex) {\n if (vertIndex >= this._verts.length || vertIndex < 0) {\n throw new Error(\"Cannot remove vertex \" + vertIndex + \". Invalid index. There are only \" + this._verts.length + \" vertices in the shape.\");\n }\n\n var pos = this._verts[vertIndex];\n this._verts.splice(vertIndex, 1);\n this._collapseVerts();\n this._resetAABox = true;\n this._geomDirty = true;\n\n this.fire(\"changed:geom:removevert\", {\n attr: \"verts[\" + vertIndex + \"]\",\n currVal: pos\n });\n\n return vertIndex;\n }\n }, {\n key: \"_rebuildAABox\",\n value: function _rebuildAABox() {\n var _this3 = this;\n\n AABox2d.initEmpty(this._aabox);\n if (this._verts.length < 3) {\n this._convexHull = this._verts.map(function (val, idx) {\n return idx;\n });\n } else {\n this._convexHull = (0, _convexHull.simpleHull_2D)(this._verts);\n }\n this._convexHull.forEach(function (idx) {\n aaboxEncapsulatePt(_this3._aabox, _this3._verts[idx], idx, _this3._extentIndices);\n });\n\n var pivot = Point2d.create(0, 0);\n AABox2d.getCenter(pivot, this._aabox);\n this.pivot = pivot;\n }\n }, {\n key: \"_updateAABox\",\n value: function _updateAABox() {\n var _this4 = this;\n\n if (this._resetAABox) {\n this._rebuildAABox();\n this._resetAABox = false;\n }\n\n if (this._boundsOutOfDate || this._geomDirty) {\n AABox2d.initEmpty(this._aabox);\n var tmppt = [0, 0];\n var xform = this.globalXform;\n this._convexHull.forEach(function (idx) {\n AABox2d.encapsulatePt(_this4._aabox, _this4._aabox, Point2d.transformMat2d(tmppt, _this4._verts[idx], xform));\n });\n this._boundsOutOfDate = false;\n\n if (this._geomDirty) {\n var pivot = Point2d.create();\n pivot[0] = this._verts[this._extentIndices[0]][0] + 0.5 * (this._verts[this._extentIndices[2]][0] - this._verts[this._extentIndices[0]][0]);\n pivot[1] = this._verts[this._extentIndices[1]][1] + 0.5 * (this._verts[this._extentIndices[3]][1] - this._verts[this._extentIndices[1]][1]);\n this.pivot = pivot;\n this._geomDirty = false;\n }\n }\n }\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n var rtn = false;\n if (this._verts.length >= 2) {\n ctx.moveTo(this._verts[0][0], this._verts[0][1]);\n for (var i = 1; i < this._verts.length; i += 1) {\n ctx.lineTo(this._verts[i][0], this._verts[i][1]);\n }\n rtn = true;\n }\n return rtn;\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"PolyLine\", // NOTE: this much match the name of the class\n verts: this.vertsRef.map(function (vert) {\n return [vert[0], vert[1]];\n })\n }, _get(PolyLine.prototype.__proto__ || Object.getPrototypeOf(PolyLine.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"width\",\n get: function get() {\n this._updateAABox();\n if (!this._verts.length || this._extentIndices[0] < 0 || this._extentIndices[2] < 0) {\n return 0;\n }\n\n return this._verts[this._extentIndices[2]][0] - this._verts[this._extentIndices[0]][0];\n }\n\n /**\n * Gets the untransformed height of the polyline. This is the height of the axis-aligned\n * bounds of the poly\n * @return {number} Height of the poly in world-space units\n */\n\n }, {\n key: \"height\",\n get: function get() {\n this._updateAABox();\n if (!this._verts.length || this._extentIndices[0] < 0 || this._extentIndices[2] < 0) {\n return 0;\n }\n\n return this._verts[this._extentIndices[3]][1] - this._verts[this._extentIndices[1]][1];\n }\n\n /**\n * Gets a reference to the vertex array of the polyline\n * @return {Point2d[]}\n * @readOnly\n */\n\n }, {\n key: \"vertsRef\",\n get: function get() {\n return this._verts;\n }\n\n /**\n * Gets the number of vertices in the polyline\n * @return {number}\n */\n\n }, {\n key: \"numVerts\",\n get: function get() {\n return this._verts.length;\n }\n }]);\n\n return PolyLine;\n}(_baseShape2.default);\n\nexports.default = PolyLine;\n\n\nPolyLine.aaboxEncapsulatePt = aaboxEncapsulatePt;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcG9seS1saW5lLmpzPzE4ZDQiXSwibmFtZXMiOlsiQUFCb3gyZCIsIlBvaW50MmQiLCJpZGVudGl0eU1hdHJpeCIsImNyZWF0ZSIsImFhYm94RW5jYXBzdWxhdGVQdCIsImJveCIsInB0IiwicHRJZHgiLCJleHRlbnRJbmRpY2VzIiwiaXNFbXB0eSIsImJ1aWxkQ2VudHJvaWQiLCJjZW50cm9pZFB0IiwicHQxIiwicHQyIiwiYSIsImlzQXJyYXkiLCJvYmoiLCJBcnJheSIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiUG9seUxpbmUiLCJvcHRzIiwidmVydHMiLCJsZW5ndGgiLCJFcnJvciIsIl9leHRlbnRJbmRpY2VzIiwiX2xvY2FsYWFib3giLCJfdmVydHMiLCJfY2VudHJvaWQiLCJpbml0RW1wdHkiLCJfYWFib3giLCJzaWduZWRBcmVhIiwiaSIsInB1c2giLCJjbG9uZSIsImlkeCIsInBpdm90IiwiZ2V0Q2VudGVyIiwiX2NvbnZleEh1bGwiLCJtYXAiLCJ2YWwiLCJ3aWR0aCIsImhlaWdodCIsInNldCIsIl9waXZvdCIsInhmb3JtIiwibG9jYWxYZm9ybSIsImVxdWFscyIsInRyYW5zZm9ybU1hdDJkIiwiZm9yRWFjaCIsInNldFRyYW5zZm9ybWF0aW9ucyIsInZlcnRJbmRleCIsInQiLCJwcmV2IiwibmV3UHQiLCJhZGRWZWMyIiwiX2NvbGxhcHNlVmVydHMiLCJfcmVzZXRBQUJveCIsIl9nZW9tRGlydHkiLCJjb3B5IiwiZmlyZSIsImF0dHIiLCJwcmV2VmFsIiwiY3VyclZhbCIsInBvcyIsIm1pbiIsIm1heCIsInNwbGljZSIsImluc2VydFZlcnQiLCJfcmVidWlsZEFBQm94IiwiX2JvdW5kc091dE9mRGF0ZSIsInRtcHB0IiwiZ2xvYmFsWGZvcm0iLCJlbmNhcHN1bGF0ZVB0IiwiY3R4IiwicnRuIiwibW92ZVRvIiwibGluZVRvIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZSIsInZlcnRzUmVmIiwidmVydCIs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QUFLeEQsTUFBTCxDQUFZSixNQUFiLElBQXVCLEtBQUtFLGNBQUwsQ0FBb0IsQ0FBcEIsSUFBeUIsQ0FBaEQsSUFBcUQsS0FBS0EsY0FBTCxDQUFvQixDQUFwQixJQUF5QixDQUFsRixFQUFxRjtBQUNuRixlQUFPLENBQVA7QUFDRDs7QUFFRCxhQUFPLEtBQUtFLE1BQUwsQ0FBWSxLQUFLRixjQUFMLENBQW9CLENBQXBCLENBQVosRUFBb0MsQ0FBcEMsSUFBeUMsS0FBS0UsTUFBTCxDQUFZLEtBQUtGLGNBQUwsQ0FBb0IsQ0FBcEIsQ0FBWixFQUFvQyxDQUFwQyxDQUFoRDtBQUNEOztBQUVEOzs7Ozs7Ozt3QkFLYTtBQUNYLFdBQUswRCxZQUFMO0FBQ0EsVUFBSSxDQUFDLEtBQUt4RCxNQUFMLENBQVlKLE1BQWIsSUFBdUIsS0FBS0UsY0FBTCxDQUFvQixDQUFwQixJQUF5QixDQUFoRCxJQUFxRCxLQUFLQSxjQUFMLENBQW9CLENBQXBCLElBQXlCLENBQWxGLEVBQXFGO0FBQ25GLGVBQU8sQ0FBUDtBQUNEOztBQUVELGFBQU8sS0FBS0UsTUFBTCxDQUFZLEtBQUtGLGNBQUwsQ0FBb0IsQ0FBcEIsQ0FBWixFQUFvQyxDQUFwQyxJQUF5QyxLQUFLRSxNQUFMLENBQVksS0FBS0YsY0FBTCxDQUFvQixDQUFwQixDQUFaLEVBQW9DLENBQXBDLENBQWhEO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3dCQUtlO0FBQ2IsYUFBTyxLQUFLRSxNQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7d0JBSWU7QUFDYixhQUFPLEtBQUtBLE1BQUwsQ0FBWUosTUFBbkI7QUFDRDs7Ozs7O2tCQXpIa0JILFE7OztBQStVckJBLFNBQVNoQixrQkFBVCxHQUE4QkEsa0JBQTlCIiwiZmlsZSI6IjExLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQgQmFzZVNoYXBlIGZyb20gXCIuL2Jhc2Utc2hhcGUuanNcIlxuaW1wb3J0IHttYXQyZCBhcyBNYXQyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcbmltcG9ydCB7c2ltcGxlSHVsbF8yRH0gZnJvbSBcIi4uL21hdGgvY29udmV4LWh1bGxcIlxuXG5jb25zdCBpZGVudGl0eU1hdHJpeCA9IE1hdDJkLmNyZWF0ZSgpXG5cbi8qKlxuICogRXhwYW5kcyBhbiBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IHRvIGVuY2Fwc3VsYXRlIGEgMmQgdmVydGV4XG4gKiBkZWZpbmVkIGluIGFuIGFycmF5IG9mIHZlcnRpY2VzLCBhbmQgdXBkYXRlcyBhIHN0cnVjdCB1c2VkIHRvXG4gKiBzdG9yZSB0aGUgaW5kaWNlcyBvZiB0aGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIGZpbmFsIGJvdW5kc1xuICogb2YgdGhlIHZlcnRpY2VzXG4gKiBAcGFyYW0gIHtBQUJveDJkfSBib3ggICAgICAgICAgQm91bmRzIHRvIGV4cGFuZFxuICogQHBhcmFtICB7UG9pbnQyZH0gcHQgICAgICAgICAgIDJkIHZlcnRleCB0byBlbmNhcHN1bGF0ZVxuICogQHBhcmFtICB7bnVtYmVyfSBwdElkeCAgICAgICAgIEluZGV4IG9mIHRoZSB2ZXJ0ZXggaW4gaXRzIGxpc3Qgb2YgdmVydGljZXNcbiAqIEBwYXJhbSAge251bWJlcltdfSBleHRlbnRJbmRpY2VzIFN0cnVjdCB0byBzdG9yZSB0aGUgaW5kaWNlcyBvZiB0aGUgYm91bmRpbmcgdmVydGljZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFhYm94RW5jYXBzdWxhdGVQdChib3gsIHB0LCBwdElkeCwgZXh0ZW50SW5kaWNlcykge1xuICBpZiAoQUFCb3gyZC5pc0VtcHR5KGJveCkpIHtcbiAgICBib3hbMF0gPSBwdFswXVxuICAgIGJveFsyXSA9IHB0WzBdXG4gICAgZXh0ZW50SW5kaWNlc1swXSA9IGV4dGVudEluZGljZXNbMl0gPSBwdElkeFxuICAgIGJveFsxXSA9IHB0WzFdXG4gICAgYm94WzNdID0gcHRbMV1cbiAgICBleHRlbnRJbmRpY2VzWzFdID0gZXh0ZW50SW5kaWNlc1szXSA9IHB0SWR4XG4gIH0gZWxzZSB7XG4gICAgaWYgKHB0WzBdIDwgYm94WzBdKSB7XG4gICAgICBib3hbMF0gPSBwdFswXVxuICAgICAgZXh0ZW50SW5kaWNlc1swXSA9IHB0SWR4XG4gICAgfSBlbHNlIGlmIChwdFswXSA+IGJveFsyXSkge1xuICAgICAgYm94WzJdID0gcHRbMF1cbiAgICAgIGV4dGVudEluZGljZXNbMl0gPSBwdElkeFxuICAgIH1cblxuICAgIGlmIChwdFsxXSA8IGJveFsxXSkge1xuICAgICAgYm94WzFdID0gcHRbMV1cbiAgICAgIGV4dGVudEluZGljZXNbMV0gPSBwdElkeFxuICAgIH0gZWxzZSBpZiAocHRbMV0gPiBib3hbM10pIHtcbiAgICAgIGJveFszXSA9IHB0WzFdXG4gICAgICBleHRlbnRJbmRpY2VzWzNdID0gcHRJZHhcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjYWxsZWQgc2VxdWVudGlhbGx5IHRvIGNhbGN1bGF0ZSB0aGUgY2VudHJvaWQgb2YgYSBwb2x5Z29uXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBjZW50cm9pZFB0IEN1cnJlbnQgY2VudHJvaWQgcG9pbnRcbiAqIEBwYXJhbSAge1BvaW50MmR9IHB0MSAgICAgICAgUG9pbnQgZGVzY3JpYmluZyBvbmUgZW5kIG9mIGFuIGVkZ2Ugb2YgYSBwb2x5Z29uXG4gKiBAcGFyYW0gIHtQb2ludDJkfSBwdDIgICAgICAgIFBvaW50IGRlc2NyaWJpbmcgb3RoZXIgZW5kIG9mIGFuIGVkZ2Ugb2YgYSBwb2x5Z29uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBidWlsZENlbnRyb2lkKGNlbnRyb2lkUHQsIHB0MSwgcHQyKSB7XG4gIGNvbnN0IGEgPSBwdDFbMF0gKiBwdDJbMV0gLSBwdDJbMF0gKiBwdDFbMV1cbiAgY2VudHJvaWRQdFswXSArPSAocHQxWzBdICsgcHQyWzBdKSAqIGFcbiAgY2VudHJvaWRQdFsxXSArPSAocHQxWzFdICsgcHQyWzFdKSAqIGFcbiAgcmV0dXJuIGFcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBhcmd1bWVudCBpcyBhbiBhcnJheVxuICogb2YgYW4gYXJyYXlidWZmZXJcbiAqIEBwYXJhbSAge30gIG9ialxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYXJyYXktbGlrZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KG9iaikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IChBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb2x5TGluZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyW118UG9pbnQyZFtdfSBbdmVydHM9W11dIEluaXRpYWwgdmVydGljZXMgb2YgdGhlIHBvbHlsaW5lXG4gKi9cblxuLyoqXG4gKiBAY2xhc3MgQ2xhc3MgZGVmaW5pbmcgYSBwb2x5IGxpbmVcbiAqIEBleHRlbmRzIHtCYXNlU2hhcGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbHlMaW5lIGV4dGVuZHMgQmFzZVNoYXBlIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwb2x5IGxpbmUgc2hhcGVcbiAgICogQHBhcmFtICB7UG9seUxpbmVPcHRpb25zfSBbb3B0c10gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtQb2x5TGluZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBjb25zdCB2ZXJ0cyA9IG9wdHMudmVydHMgfHwgW11cbiAgICBzdXBlcihvcHRzKVxuICAgIGlmICghaXNBcnJheSh2ZXJ0cykgfHxcbiAgICAgIHZlcnRzLmxlbmd0aCA9PT0gMCB8fCAoaXNBcnJheSh2ZXJ0c1swXSkgJiYgdmVydHMubGVuZ3RoIDwgMSkgfHxcbiAgICAgICghaXNBcnJheSh2ZXJ0c1swXSkgJiYgKHZlcnRzLmxlbmd0aCA8IDIgfHwgdmVydHMubGVuZ3RoICUgMiAhPT0gMCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb2x5TGluZSBzaGFwZXMgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGFycmF5IG9mIDJkIHBvaW50cyBhbmQgY29udGFpbiBhdCBsZWFzdCAxIHBvaW50c1wiKVxuICAgIH1cblxuICAgIC8vIGdvaW5nIHRvIGJ1aWxkIHRoZSBhYWJveCBhbmQgc3RvcmUgdGhlIGluZGljZXMgZm9yIGVhY2ggdmVydGV4XG4gICAgLy8gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHNcbiAgICB0aGlzLl9leHRlbnRJbmRpY2VzID0gWy0xLCAtMSwgLTEsIC0xXVxuICAgIHRoaXMuX2xvY2FsYWFib3ggPSBBQUJveDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fdmVydHMgPSBbXVxuICAgIHRoaXMuX2NlbnRyb2lkID0gWzAsIDBdXG4gICAgQUFCb3gyZC5pbml0RW1wdHkodGhpcy5fYWFib3gpXG4gICAgbGV0IHNpZ25lZEFyZWEgPSAwXG4gICAgbGV0IGkgPSAwXG4gICAgaWYgKGlzQXJyYXkodmVydHNbMF0pKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdmVydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7XG4gICAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jbG9uZSh2ZXJ0c1tpXSkpXG4gICAgICAgIGFhYm94RW5jYXBzdWxhdGVQdCh0aGlzLl9hYWJveCwgdmVydHNbaV0sIGksIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICAgIHNpZ25lZEFyZWEgKz0gYnVpbGRDZW50cm9pZCh0aGlzLl9jZW50cm9pZCwgdmVydHNbaV0sIHZlcnRzW2kgKyAxXSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jbG9uZSh2ZXJ0c1tpXSkpXG4gICAgICBhYWJveEVuY2Fwc3VsYXRlUHQodGhpcy5fYWFib3gsIHZlcnRzW2ldLCBpLCB0aGlzLl9leHRlbnRJbmRpY2VzKVxuICAgICAgc2lnbmVkQXJlYSArPSBidWlsZENlbnRyb2lkKHRoaXMuX2NlbnRyb2lkLCB2ZXJ0c1tpXSwgdmVydHNbMF0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jcmVhdGUodmVydHNbMF0sIHZlcnRzWzFdKSlcbiAgICAgIGFhYm94RW5jYXBzdWxhdGVQdCh0aGlzLl9hYWJveCwgdGhpcy5fdmVydHNbMF0sIDAsIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICBsZXQgaWR4ID0gMVxuICAgICAgZm9yIChpID0gMjsgaSA8IHZlcnRzLmxlbmd0aCAtIDI7IGkgKz0gMiwgaWR4ICs9IDEpIHtcbiAgICAgICAgdGhpcy5fdmVydHMucHVzaChQb2ludDJkLmNyZWF0ZSh2ZXJ0c1tpXSwgdmVydHNbaSArIDFdKSlcbiAgICAgICAgYWFib3hFbmNhcHN1bGF0ZVB0KHRoaXMuX2FhYm94LCB0aGlzLl92ZXJ0c1tpZHhdLCBpZHgsIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICAgIHNpZ25lZEFyZWEgKz0gYnVpbGRDZW50cm9pZCh0aGlzLl9jZW50cm9pZCwgdGhpcy5fdmVydHNbaWR4IC0gMV0sIHRoaXMuX3ZlcnRzW2lkeF0pXG4gICAgICB9XG4gICAgICB0aGlzLl92ZXJ0cy5wdXNoKFBvaW50MmQuY3JlYXRlKHZlcnRzW2ldLCB2ZXJ0c1tpICsgMV0pKVxuICAgICAgYWFib3hFbmNhcHN1bGF0ZVB0KHRoaXMuX2FhYm94LCB0aGlzLl92ZXJ0c1tpZHhdLCBpZHgsIHRoaXMuX2V4dGVudEluZGljZXMpXG4gICAgICBzaWduZWRBcmVhICs9IGJ1aWxkQ2VudHJvaWQodGhpcy5fY2VudHJvaWQsIHRoaXMuX3ZlcnRzW2lkeF0sIHRoaXMuX3ZlcnRzWzBdKVxuICAgIH1cbiAgICBzaWduZWRBcmVhICo9IDAuNVxuICAgIHRoaXMuX2NlbnRyb2lkWzBdIC89IDYuMCAqIHNpZ25lZEFyZWFcbiAgICB0aGlzLl9jZW50cm9pZFsxXSAvPSA2LjAgKiBzaWduZWRBcmVhXG5cbiAgICAvLyBleHRyYWN0IHRoZSBjZW50ZXIgb2YgdGhlIGFhYm94LiBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgYXMgdGhlXG4gICAgLy8gc2hhcGUncyBwaXZvdCwgc28gYWxsIHJvdGF0aW9uL3NjYWxlIHRyYW5zZm9ybWF0aW9ucyB3aWxsIGJlIHNvdXJjZWRcbiAgICAvLyBhdCB0aGlzIGxvY2F0aW9uXG4gICAgY29uc3QgcGl2b3QgPSBQb2ludDJkLmNyZWF0ZSgpXG4gICAgQUFCb3gyZC5nZXRDZW50ZXIocGl2b3QsIHRoaXMuX2FhYm94KVxuICAgIHRoaXMucGl2b3QgPSBwaXZvdFxuXG4gICAgLy8gbm93IGJ1aWxkIHRoZSBjb252ZXggaHVsbCBvZiB0aGUgdmVydGljZXMuXG4gICAgLy8gV2hlbiByZWJ1aWxkaW5nIHRoZSBheGlzIGFsaWduZWQgYm94IChhIHRyYW5zZm9ybSBpcyBhcHBsaWVkIGZvciBleGFtcGxlKSxcbiAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gdHJhdmVyc2UgYWxsIHRoZSBwb2ludHMuIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHRyYXZlcnNlXG4gICAgLy8gdGhlIHBvaW50cyB0aGF0IGRlZmluZSB0aGUgY29udmV4IGh1bGwgdG8gcmVidWlsZCB0aGUgYm91bmRzXG4gICAgaWYgKHRoaXMuX3ZlcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSB0aGlzLl92ZXJ0cy5tYXAoKHZhbCwgaWR4KSA9PiBpZHgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSBzaW1wbGVIdWxsXzJEKHRoaXMuX3ZlcnRzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVudHJhbnNmb3JtZWQgd2lkdGgvaGVpZ2h0IG9mIHRoZSBwb2x5bGluZS4gVGhpcyBpcyBlc3NlbnRpYWxseVxuICAgKiB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBwb2x5J3MgYm91bmRzXG4gICAqIEByZXR1cm4ge1ZlYzJkfSBXaWR0aC9oZWlnaHQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgcG9seWxpbmVcbiAgICovXG4gIGdldERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVudHJhbnNmb3JtZWQgd2lkdGggb2YgdGhlIHBvbHlsaW5lLiBUaGlzIGlzIHRoZSB3aWR0aCBvZiB0aGVcbiAgICogYXhpcy1hbGlnbmVkIGJvdW5kcyBvZiB0aGUgcG9seVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFdpZHRoIG9mIHRoZSBwb2x5IGluIHdvcmxkLXNwYWNlIHVuaXRzXG4gICAqL1xuICBnZXQgd2lkdGgoKSB7XG4gICAgdGhpcy5fdXBkYXRlQUFCb3goKVxuICAgIGlmICghdGhpcy5fdmVydHMubGVuZ3RoIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMF0gPCAwIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMl0gPCAwKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzJdXVswXSAtIHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMF1dWzBdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdW50cmFuc2Zvcm1lZCBoZWlnaHQgb2YgdGhlIHBvbHlsaW5lLiBUaGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIGF4aXMtYWxpZ25lZFxuICAgKiBib3VuZHMgb2YgdGhlIHBvbHlcbiAgICogQHJldHVybiB7bnVtYmVyfSBIZWlnaHQgb2YgdGhlIHBvbHkgaW4gd29ybGQtc3BhY2UgdW5pdHNcbiAgICovXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgdGhpcy5fdXBkYXRlQUFCb3goKVxuICAgIGlmICghdGhpcy5fdmVydHMubGVuZ3RoIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMF0gPCAwIHx8IHRoaXMuX2V4dGVudEluZGljZXNbMl0gPCAwKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzNdXVsxXSAtIHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMV1dWzFdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgdmVydGV4IGFycmF5IG9mIHRoZSBwb2x5bGluZVxuICAgKiBAcmV0dXJuIHtQb2ludDJkW119XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0IHZlcnRzUmVmKCkge1xuICAgIHJldHVybiB0aGlzLl92ZXJ0c1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB0aGUgcG9seWxpbmVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG51bVZlcnRzKCkge1xuICAgIHJldHVybiB0aGlzLl92ZXJ0cy5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgY29sbGFwc2VzIGFsbCB0aGUgdmVydHMsIG1lYW5pbmcgdGhlIHZlcnRzXG4gICAqIGFyZSBmbGF0dGVuZWQgdG8gdGhlaXIgcG9zaXRpb24gd2l0aCBsb2NhbC1zcGFjZSB0cmFuc2Zvcm1zIGFwcGxpZWRcbiAgICogYW5kIHRoZW4gdGhlIGxvY2FsIHRyYW5zZm9ybXMgYXJlIGNsZWFyZWQuIFRoaXMgaXMgZG9uZSB3aGVuZXZlclxuICAgKiB0aGUgdmVydGljZXMgb2YgdGhlIHBvbHlnb24gYXJlIG1vZGlmaWVkIGFzIGl0IGNhbiBiZSBhIGxpdHRsZSB0cmlja3lcbiAgICogdG8gcmUtYWRqdXN0IHRoZSBwaXZvdC90cmFuc2Zvcm1zIG9mIHRoZSB2ZXJ0IHdoZW4gbmV3IHZlcnRzIGFyZSBhZGRlZCxcbiAgICogZGVsZXRlZCwgZXRjLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50cyB3ZXJlIGluZGVlZCBmbGF0dGVuZWRcbiAgICogICAgICAgICAgICAgICAgICAgVGhlIHBvaW50cyB3b3VsZG4ndCBiZSBmbGF0dGVuZWQgaWYgdGhlcmUgYXJlIG5vXG4gICAqICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgdG8gYXBwbHksIGZvciBleGFtcGxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY29sbGFwc2VWZXJ0cygpIHtcbiAgICBQb2ludDJkLnNldCh0aGlzLl9waXZvdCwgMCwgMClcblxuICAgIC8vIFRPRE8oY3Jvb3QpOiB3aGF0IGlmIHRoaXMgcG9seSBpc1xuICAgIC8vIHBhcmVudGVkIHRvIGFub3RoZXIgdHJhbnNmb3JtP1xuXG4gICAgY29uc3QgeGZvcm0gPSB0aGlzLmxvY2FsWGZvcm1cbiAgICBpZiAoTWF0MmQuZXF1YWxzKHhmb3JtLCBpZGVudGl0eU1hdHJpeCkpIHtcbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyB0cmFuc2Zvcm1zIHRvIGFwcGx5LFxuICAgICAgLy8gZG8gbm90aGluZyAtIGZhc3Qgb3V0XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBBQUJveDJkLmluaXRFbXB0eSh0aGlzLl9hYWJveClcblxuICAgIC8vIGZsYXR0ZW4gYWxsIHRoZSBwb2ludHMgdG8gdGhlaXIgY3VycmVudCB3b3JsZC1zcGFjZSBwb3NpdGlvblxuICAgIC8vIHdpdGggdHJhbnNmb3JtcyBhcHBsaWVkXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92ZXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl92ZXJ0c1tpXSwgdGhpcy5fdmVydHNbaV0sIHhmb3JtKVxuICAgIH1cblxuICAgIC8vIG5vdyByZWNhbGN1dGUgdGhlIGNvbnZleCBodWxsIG9mIGFsbCB0aGUgdHJhbnNmb3JtZWQgcG9pbnRzXG4gICAgaWYgKHRoaXMuX3ZlcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSB0aGlzLl92ZXJ0cy5tYXAoKHZhbCwgaWR4KSA9PiBpZHgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnZleEh1bGwgPSBzaW1wbGVIdWxsXzJEKHRoaXMuX3ZlcnRzKVxuICAgIH1cbiAgICAvLyB1c2UgdGhlIGNvbnZleCBodWxsIHBvaW50cyB0byByZWJ1aWxkIHRoZSBib3VuZHNcbiAgICB0aGlzLl9jb252ZXhIdWxsLmZvckVhY2goaWR4ID0+IHtcbiAgICAgIGFhYm94RW5jYXBzdWxhdGVQdCh0aGlzLl9hYWJveCwgdGhpcy5fdmVydHNbaWR4XSwgaWR4LCB0aGlzLl9leHRlbnRJbmRpY2VzKVxuICAgIH0pXG5cbiAgICAvLyByZXNldCB0aGUgbG9jYWwgdHJhbnNmb3Jtc1xuICAgIHRoaXMuc2V0VHJhbnNmb3JtYXRpb25zKDAsIDAsIDEsIDEsIDApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYSBzcGVjaWZpYyB2ZXJ0ZXggb2YgdGhlIHBvbHlnb24gYnkgYW4gb2Zmc2V0XG4gICAqIEBwYXJhbSAge251bWJlcn0gdmVydEluZGV4IEluZGV4IG9mIHRoZSB2ZXJ0ZXggdG8gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSAge1ZlYzJkfSB0ICAgICAgICAgVHJhbnNsYXRpb24gb2Zmc2V0LCBpbiB3b3JsZC1zcGFjZSB1bml0c1xuICAgKiBAcmV0dXJuIHtQb2x5TGluZX0gICAgICAgICAgIHRoaXNcbiAgICogQGZpcmVzIHtTaGFwZSNnZW9tQ2hhbmdlZH1cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHZlcnRJbmRleCBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdHJhbnNsYXRlVmVydCh2ZXJ0SW5kZXgsIHQpIHtcbiAgICBpZiAodmVydEluZGV4ID49IHRoaXMuX3ZlcnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdHJhbnNsYXRlIHZlcnRleCBhdCBpbmRleCAke3ZlcnRJbmRleH0uIFRoZXJlIGFyZSBvbmx5ICR7dGhpcy5fdmVydHMubGVuZ3RofSB2ZXJ0aWNlcyBpbiB0aGUgcG9seWdvbi5gKVxuICAgIH1cblxuICAgIGlmICh0WzBdIHx8IHRbMV0pIHtcbiAgICAgIGNvbnN0IHByZXYgPSBQb2ludDJkLmNsb25lKHRoaXMuX3ZlcnRzW3ZlcnRJbmRleF0pXG4gICAgICBjb25zdCBuZXdQdCA9IFBvaW50MmQuY2xvbmUodGhpcy5fdmVydHNbdmVydEluZGV4XSlcbiAgICAgIFBvaW50MmQuYWRkVmVjMihuZXdQdCwgbmV3UHQsIHQpXG5cbiAgICAgIC8vIFRPRE8oY3Jvb3QpOiB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBkZXRlcm1pbmluZyB3aGV0aGVyXG4gICAgICAvLyB0aGlzIHBvaW50IGFmZmVjdHMgdGhlIGNvbnZleCBodWxsIG9yIG5vdCBieSBjaGVja2luZyBpdCdzIHJlbGF0aW9uc2hpcFxuICAgICAgLy8gd2l0aCBpdHMgbmVpZ2hib3JzXG4gICAgICB0aGlzLl9jb2xsYXBzZVZlcnRzKClcbiAgICAgIHRoaXMuX3Jlc2V0QUFCb3ggPSB0cnVlXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlXG4gICAgICBQb2ludDJkLmNvcHkobmV3UHQpXG4gICAgICB0aGlzLmZpcmUoXCJjaGFuZ2VkOmdlb21cIiwge1xuICAgICAgICBhdHRyOiBgdmVydHNbJHt2ZXJ0SW5kZXh9XWAsXG4gICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgIGN1cnJWYWw6IG5ld1B0XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2V0VmVydFBvc2l0aW9uKHZlcnRJbmRleCwgcG9zKSB7XG4gICAgaWYgKHZlcnRJbmRleCA+PSB0aGlzLl92ZXJ0cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHRyYW5zbGF0ZSB2ZXJ0ZXggYXQgaW5kZXggJHt2ZXJ0SW5kZXh9LiBUaGVyZSBhcmUgb25seSAke3RoaXMuX3ZlcnRzLmxlbmd0aH0gdmVydGljZXMgaW4gdGhlIHBvbHlnb24uYClcbiAgICB9XG5cbiAgICBpZiAoIVBvaW50MmQuZXF1YWxzKHBvcywgdGhpcy5fdmVydHNbdmVydEluZGV4XSkpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBQb2ludDJkLmNsb25lKHRoaXMuX3ZlcnRzW3ZlcnRJbmRleF0pXG4gICAgICB0aGlzLl9jb2xsYXBzZVZlcnRzKClcbiAgICAgIFBvaW50MmQuY29weSh0aGlzLl92ZXJ0c1t2ZXJ0SW5kZXhdLCBwb3MpXG5cbiAgICAgIC8vIFRPRE8oY3Jvb3QpOiB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBkZXRlcm1pbmluZyB3aGV0aGVyXG4gICAgICAvLyB0aGlzIHBvaW50IGFmZmVjdHMgdGhlIGNvbnZleCBodWxsIG9yIG5vdCBieSBjaGVja2luZyBpdCdzIHJlbGF0aW9uc2hpcFxuICAgICAgLy8gd2l0aCBpdHMgbmVpZ2hib3JzXG4gICAgICB0aGlzLl9yZXNldEFBQm94ID0gdHJ1ZVxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5maXJlKFwiY2hhbmdlZDpnZW9tXCIsIHtcbiAgICAgICAgYXR0cjogYHZlcnRzWyR7dmVydEluZGV4fV1gLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiBwb3NcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaW5zZXJ0VmVydCh2ZXJ0SW5kZXgsIHBvcykge1xuICAgIGxldCBpZHggPSBNYXRoLm1pbihNYXRoLm1heCh2ZXJ0SW5kZXgsIDApLCB0aGlzLl92ZXJ0cy5sZW5ndGgpXG4gICAgdGhpcy5fY29sbGFwc2VWZXJ0cygpXG4gICAgaWYgKHZlcnRJbmRleCA+PSB0aGlzLl92ZXJ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3ZlcnRzLnB1c2goUG9pbnQyZC5jbG9uZShwb3MpKVxuICAgICAgaWR4ID0gdGhpcy5fdmVydHMubGVuZ3RoIC0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92ZXJ0cy5zcGxpY2UodmVydEluZGV4LCAwLCBQb2ludDJkLmNsb25lKHBvcykpXG4gICAgfVxuICAgIHRoaXMuX3Jlc2V0QUFCb3ggPSB0cnVlXG4gICAgdGhpcy5fZ2VvbURpcnR5ID0gdHJ1ZVxuXG4gICAgdGhpcy5maXJlKFwiY2hhbmdlZDpnZW9tOmFkZHZlcnRcIiwge1xuICAgICAgYXR0cjogYHZlcnRzWyR7aWR4fV1gLFxuICAgICAgY3VyclZhbDogcG9zXG4gICAgfSlcblxuICAgIHJldHVybiBpZHhcbiAgfVxuXG4gIGFwcGVuZFZlcnQocG9zKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0VmVydCh0aGlzLl92ZXJ0cy5sZW5ndGgsIHBvcylcbiAgfVxuXG4gIHJlbW92ZVZlcnQodmVydEluZGV4KSB7XG4gICAgaWYgKHZlcnRJbmRleCA+PSB0aGlzLl92ZXJ0cy5sZW5ndGggfHwgdmVydEluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVtb3ZlIHZlcnRleCAke3ZlcnRJbmRleH0uIEludmFsaWQgaW5kZXguIFRoZXJlIGFyZSBvbmx5ICR7dGhpcy5fdmVydHMubGVuZ3RofSB2ZXJ0aWNlcyBpbiB0aGUgc2hhcGUuYClcbiAgICB9XG5cbiAgICBjb25zdCBwb3MgPSB0aGlzLl92ZXJ0c1t2ZXJ0SW5kZXhdXG4gICAgdGhpcy5fdmVydHMuc3BsaWNlKHZlcnRJbmRleCwgMSlcbiAgICB0aGlzLl9jb2xsYXBzZVZlcnRzKClcbiAgICB0aGlzLl9yZXNldEFBQm94ID0gdHJ1ZVxuICAgIHRoaXMuX2dlb21EaXJ0eSA9IHRydWVcblxuICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbTpyZW1vdmV2ZXJ0XCIsIHtcbiAgICAgIGF0dHI6IGB2ZXJ0c1ske3ZlcnRJbmRleH1dYCxcbiAgICAgIGN1cnJWYWw6IHBvc1xuICAgIH0pXG5cbiAgICByZXR1cm4gdmVydEluZGV4XG4gIH1cblxuICBfcmVidWlsZEFBQm94KCkge1xuICAgIEFBQm94MmQuaW5pdEVtcHR5KHRoaXMuX2FhYm94KVxuICAgIGlmICh0aGlzLl92ZXJ0cy5sZW5ndGggPCAzKSB7XG4gICAgICB0aGlzLl9jb252ZXhIdWxsID0gdGhpcy5fdmVydHMubWFwKCh2YWwsIGlkeCkgPT4gaWR4KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb252ZXhIdWxsID0gc2ltcGxlSHVsbF8yRCh0aGlzLl92ZXJ0cylcbiAgICB9XG4gICAgdGhpcy5fY29udmV4SHVsbC5mb3JFYWNoKGlkeCA9PiB7XG4gICAgICBhYWJveEVuY2Fwc3VsYXRlUHQodGhpcy5fYWFib3gsIHRoaXMuX3ZlcnRzW2lkeF0sIGlkeCwgdGhpcy5fZXh0ZW50SW5kaWNlcylcbiAgICB9KVxuXG4gICAgY29uc3QgcGl2b3QgPSBQb2ludDJkLmNyZWF0ZSgwLCAwKVxuICAgIEFBQm94MmQuZ2V0Q2VudGVyKHBpdm90LCB0aGlzLl9hYWJveClcbiAgICB0aGlzLnBpdm90ID0gcGl2b3RcbiAgfVxuXG4gIF91cGRhdGVBQUJveCgpIHtcbiAgICBpZiAodGhpcy5fcmVzZXRBQUJveCkge1xuICAgICAgdGhpcy5fcmVidWlsZEFBQm94KClcbiAgICAgIHRoaXMuX3Jlc2V0QUFCb3ggPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib3VuZHNPdXRPZkRhdGUgfHwgdGhpcy5fZ2VvbURpcnR5KSB7XG4gICAgICBBQUJveDJkLmluaXRFbXB0eSh0aGlzLl9hYWJveClcbiAgICAgIGNvbnN0IHRtcHB0ID0gWzAsIDBdXG4gICAgICBjb25zdCB4Zm9ybSA9IHRoaXMuZ2xvYmFsWGZvcm1cbiAgICAgIHRoaXMuX2NvbnZleEh1bGwuZm9yRWFjaChpZHggPT4ge1xuICAgICAgICBBQUJveDJkLmVuY2Fwc3VsYXRlUHQodGhpcy5fYWFib3gsIHRoaXMuX2FhYm94LCBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcHB0LCB0aGlzLl92ZXJ0c1tpZHhdLCB4Zm9ybSkpXG4gICAgICB9KVxuICAgICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gZmFsc2VcblxuICAgICAgaWYgKHRoaXMuX2dlb21EaXJ0eSkge1xuICAgICAgICBjb25zdCBwaXZvdCA9IFBvaW50MmQuY3JlYXRlKClcbiAgICAgICAgcGl2b3RbMF0gPSB0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzBdXVswXSArIDAuNSAqICh0aGlzLl92ZXJ0c1t0aGlzLl9leHRlbnRJbmRpY2VzWzJdXVswXSAtIHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMF1dWzBdKVxuICAgICAgICBwaXZvdFsxXSA9IHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbMV1dWzFdICsgMC41ICogKHRoaXMuX3ZlcnRzW3RoaXMuX2V4dGVudEluZGljZXNbM11dWzFdIC0gdGhpcy5fdmVydHNbdGhpcy5fZXh0ZW50SW5kaWNlc1sxXV1bMV0pXG4gICAgICAgIHRoaXMucGl2b3QgPSBwaXZvdFxuICAgICAgICB0aGlzLl9nZW9tRGlydHkgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9kcmF3KGN0eCkge1xuICAgIGxldCBydG4gPSBmYWxzZVxuICAgIGlmICh0aGlzLl92ZXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgY3R4Lm1vdmVUbyh0aGlzLl92ZXJ0c1swXVswXSwgdGhpcy5fdmVydHNbMF1bMV0pXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX3ZlcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGN0eC5saW5lVG8odGhpcy5fdmVydHNbaV1bMF0sIHRoaXMuX3ZlcnRzW2ldWzFdKVxuICAgICAgfVxuICAgICAgcnRuID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgdHlwZTogXCJQb2x5TGluZVwiLCAvLyBOT1RFOiB0aGlzIG11Y2ggbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGNsYXNzXG4gICAgICB2ZXJ0czogdGhpcy52ZXJ0c1JlZi5tYXAodmVydCA9PiBbdmVydFswXSwgdmVydFsxXV0pXG4gICAgfSwgc3VwZXIudG9KU09OKCkpXG4gIH1cblxufVxuXG5Qb2x5TGluZS5hYWJveEVuY2Fwc3VsYXRlUHQgPSBhYWJveEVuY2Fwc3VsYXRlUHRcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NoYXBlcy9wb2x5LWxpbmUuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.buildXformMatrix = buildXformMatrix;\nexports.createEventedTransform2dMixin = createEventedTransform2dMixin;\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _glMatrix = __webpack_require__(1);\n\nvar _aggregation = __webpack_require__(7);\n\nvar _aggregation2 = _interopRequireDefault(_aggregation);\n\nvar _math = __webpack_require__(5);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Builds a 2D transformation matrix (2x3 matrix) from a rotation (in degrees),\n * an x,y scale, a translation, and a pivot (an offset from the origin to\n * apply the transformation around)\n * @param {Mat2d} mat Matrix to store the result of the operation\n * @param {number} rdeg rotation, in degrees\n * @param {Vec2d} s Scale vector, in x & y\n * @param {Vec2d} t Translation vector, in x & y\n * @param {Vec2d} pivot Offset from origin to apply the transformation\n * @return {Mat2d} Matrix referenced by the mat argument\n */\nfunction buildXformMatrix(mat, rdeg, s, t, pivot) {\n _glMatrix.mat2d.identity(mat);\n _glMatrix.mat2d.translate(mat, mat, [t[0] + pivot[0], t[1] + pivot[1]]);\n _glMatrix.mat2d.rotate(mat, mat, _math2.default.DEG_TO_RAD * rdeg);\n _glMatrix.mat2d.scale(mat, mat, s);\n _glMatrix.mat2d.translate(mat, mat, [-pivot[0], -pivot[1]]);\n return mat;\n}\n\n/**\n * Utility function to dirty all the descendants of a transform node.\n * This is called when a transform node has been modified in some way\n * that it's children need to be notified about.\n * @param {Transform2d[]} children\n */\nfunction dirtyChildren(children) {\n children.forEach(function (child) {\n child._xformDirty = true;\n dirtyChildren(child._children);\n });\n}\n\n/**\n * @typedef {object} Transform2dOptions\n * @property {Point2d} [position = [0,0]] Position in world space coords\n * @property {Vec2d} [scale = [1,1]] Scale in world space coords\n * @property {number} [rotation = 0] Rotation in degrees\n * @property {Vec2d} [pivot = [0, 0]] Offset from origin to apply the setTransformations\n */\n\n/**\n * @class Class to manage basic 2d affine transformations\n * @mixin Can also be used as a mixin\n */\n\nvar Transform2d = function () {\n /**\n * Creates a new Transform2d\n * @param {Transform2dOptions} [opts]\n * @return {Transform2d}\n */\n function Transform2d(opts) {\n _classCallCheck(this, Transform2d);\n\n this.initializer(opts);\n }\n\n /**\n * Initializes a transform 2d object from options\n * @param {Transform2dOptions} [opts]\n * @private\n */\n\n\n _createClass(Transform2d, [{\n key: \"_initTransformFromOptions\",\n value: function _initTransformFromOptions(opts) {\n if (!opts) {\n return;\n }\n\n if (typeof opts.position !== \"undefined\") {\n this.setPosition(opts.position);\n }\n\n if (typeof opts.scale !== \"undefined\") {\n this.setScale(opts.scale);\n }\n\n if (typeof opts.rotation !== \"undefined\") {\n this.setRotation(opts.rotation);\n }\n\n if (typeof opts.pivot !== \"undefined\") {\n this.pivot = opts.pivot;\n }\n }\n\n /**\n * Initializes a transform 2d object from options,\n * called from either constructor (if used as base class)\n * or base mixin class (if used as a mixin)\n * @param {Transform2dOptions} [opts]\n * @protected\n */\n\n }, {\n key: \"initializer\",\n value: function initializer(opts) {\n this._localXform = _glMatrix.mat2d.create();\n this._lxformDirty = false;\n\n this._pivot = Point2d.create(0, 0);\n\n this._pos = Point2d.create(0, 0);\n this._scale = _glMatrix.vec2.fromValues(1, 1);\n this._rotDeg = 0;\n\n this._globalXform = _glMatrix.mat2d.create();\n this._xformDirty = false;\n this._parent = null;\n this._children = new Set();\n\n this._initTransformFromOptions(opts);\n }\n\n /**\n * Adds a child to this transform node\n * @param {Transform2d} childXform\n */\n\n }, {\n key: \"addChildXform\",\n value: function addChildXform(childXform) {\n if (!this._children.has(childXform)) {\n this._children.add(childXform);\n if (childXform._parent) {\n childXform._parent.removeChild(childXform);\n }\n childXform._parent = this;\n childXform._xformDirty = true;\n dirtyChildren(childXform._children);\n }\n }\n\n /**\n * Removes a child from this transform node\n * @param {Transform2d} childXform\n */\n\n }, {\n key: \"removeChildXform\",\n value: function removeChildXform(childXform) {\n this._children.delete(childXform);\n }\n\n /**\n * Unparents this node from its parent, if it has one\n */\n\n }, {\n key: \"unparentXform\",\n value: function unparentXform() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n _glMatrix.mat2d.copy(this._globalXform, this.localXform);\n }\n }\n\n /**\n * Sets the pivot of the transform\n * @param {Vec2d} pivot Offset vector from the origin to apply the transformations\n * @return {Transform2d}\n */\n\n }, {\n key: \"getPosition\",\n\n\n /**\n * Gets the current unparented position of the transform\n * @return {Point2d} This is the position of the node as if it were unparented\n */\n value: function getPosition() {\n return _glMatrix.vec2.clone(this._pos);\n }\n\n /**\n * Gets the reference to the unparented position of the transform, avoiding\n * a copy\n * @return {Point2d}\n * @readOnly\n */\n\n }, {\n key: \"getPositionRef\",\n value: function getPositionRef() {\n return this._pos;\n }\n\n /**\n * Gets the current world position of the transform, this is its position\n * after all parent transformations have been applied\n * @return {Point2d}\n */\n\n }, {\n key: \"getWorldPosition\",\n value: function getWorldPosition() {\n var xform = this.globalXform;\n return Point2d.create(xform[4], xform[5]);\n }\n\n /**\n * Sets the unparented world position of the transform\n * @param {Point2d} pos\n */\n\n }, {\n key: \"setPosition\",\n value: function setPosition(pos) {\n Point2d.copy(this._pos, pos);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n\n /**\n * Translates the unparented world position of the transform by an offset\n * @param {Vec2d} translation\n * @return {Transform2d}\n */\n\n }, {\n key: \"translate\",\n value: function translate(translation) {\n if (translation[0] || translation[1]) {\n Point2d.addVec2(this._pos, this._pos, translation);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n return this;\n }\n\n /**\n * Gets the current unparented x,y scale of the transform\n * @return {Vec2d}\n */\n\n }, {\n key: \"getScale\",\n value: function getScale() {\n return _glMatrix.vec2.clone(this._scale);\n }\n\n /**\n * Gets the current unparented x/y scale reference of the transform\n * avoiding a copy\n * @return {Vec2d}\n * @readOnly\n */\n\n }, {\n key: \"getScaleRef\",\n value: function getScaleRef() {\n return this._scale;\n }\n\n /**\n * Sets the unparented scale of the transform\n * @param {Vec2d} scale\n * @return {Transform2d}\n */\n\n }, {\n key: \"setScale\",\n value: function setScale(scale) {\n _glMatrix.vec2.copy(this._scale, scale);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n return this;\n }\n\n /**\n * Scales the current unparented scale by a 2d multiplier\n * @param {Vec2d} scaleMult\n * @return {Transform2d}\n */\n\n }, {\n key: \"scale\",\n value: function scale(scaleMult) {\n if (scaleMult[0] !== 1 || scaleMult[1] !== 1) {\n _glMatrix.vec2.multiply(this._scale, this._scale, scaleMult);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n return this;\n }\n\n /**\n * Gets the current unparented rotation in degrees of the transform\n * @return {number}\n */\n\n }, {\n key: \"getRotation\",\n value: function getRotation() {\n return this._rotDeg;\n }\n\n /**\n * Sets the unparented rotation of the transform\n * @param {number} deg Rotation in degrees\n * @return {Transform2d}\n */\n\n }, {\n key: \"setRotation\",\n value: function setRotation(deg) {\n this._rotDeg = deg;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n return this;\n }\n\n /**\n * Adds an additional rotation in degrees to the current rotation\n * of the transform\n * @param {number} deg Rotation offset in degrees\n * @return {Transform2d}\n */\n\n }, {\n key: \"rotate\",\n value: function rotate(deg) {\n if (deg) {\n this._rotDeg += deg;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n return this;\n }\n\n /**\n * Utility function to dirty all the descendants of this node\n * @private\n */\n\n }, {\n key: \"_dirtyChildren\",\n value: function _dirtyChildren() {\n dirtyChildren(this._children);\n }\n\n /**\n * Updates the local affine matrix if marked as dirty\n * If derived/mixin classes have a _localXformUpdates method\n * defined, that will be called here when the local transform\n * is updated.\n * @private\n */\n\n }, {\n key: \"_updatelocalxform\",\n value: function _updatelocalxform() {\n if (this._lxformDirty) {\n buildXformMatrix(this._localXform, this._rotDeg, this._scale, this._pos, this._pivot);\n if (this._localXformUpdated) {\n this._localXformUpdated();\n }\n this._lxformDirty = false;\n }\n }\n\n /**\n * Updates the global 2x3 matrix of the transform if marked dirty\n * If derived/mixin classes have a _globalXformUpdates method\n * defined, that will be called here when the global transform\n * is updated.\n * @private\n */\n\n }, {\n key: \"_updateglobalxform\",\n value: function _updateglobalxform() {\n if (this._lxformDirty || this._xformDirty) {\n this._updatelocalxform();\n if (this._parent) {\n _glMatrix.mat2d.multiply(this._globalXform, this._parent.globalXform, this._localXform);\n } else {\n _glMatrix.mat2d.copy(this._globalXform, this._localXform);\n }\n if (this._globalXformUpdated) {\n this._globalXformUpdated();\n }\n this._xformDirty = false;\n }\n }\n\n /**\n * Gets the current local transformation matrix of the node.\n * @return {Mat2d}\n */\n\n }, {\n key: \"transformCtx\",\n\n\n /**\n * Sets the transform state of a 2d rendering context\n * @param {CanvasRenderingContext2D} ctx\n * @param {Mat2d} currMatrix The current matrix used to store the result of the\n * model-view-projection-screen matrix multiplication for this node\n * @param {Mat2d} worldToScreenMatrix The current world-to-screen tranform\n */\n value: function transformCtx(ctx, currMatrix, worldToScreenMatrix) {\n _glMatrix.mat2d.multiply(currMatrix, worldToScreenMatrix, this.globalXform);\n\n ctx.setTransform(currMatrix[0], currMatrix[1], currMatrix[2], currMatrix[3], currMatrix[4], currMatrix[5]);\n }\n\n /**\n * Converts a Transform2d instance to a JSON object\n * @param {Transform2d} xformObj\n * @return {{position: Point2d, scale: Vec2d, rotation: number, pivot: Vec2d}}\n */\n\n }, {\n key: \"pivot\",\n set: function set(pivot) {\n Point2d.copy(this._pivot, pivot);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n return this;\n }\n\n /**\n * Gets the current pivot of the transform\n * @return {Vec2d}\n */\n ,\n get: function get() {\n return Point2d.clone(this._pivot);\n }\n\n /**\n * Gets the current pivot reference of the transform.\n * @return {[type]} [description]\n * @readOnly\n */\n\n }, {\n key: \"pivotRef\",\n get: function get() {\n return this._pivot;\n }\n\n /**\n * Gets the parent transform node, if one is attached\n * @return {Transform2d}\n */\n\n }, {\n key: \"parent\",\n get: function get() {\n return this._parent;\n }\n }, {\n key: \"localXform\",\n get: function get() {\n this._updatelocalxform();\n return this._localXform;\n }\n\n /**\n * Gets the current global transformation matrix of the node. This is essentially\n * its local transform multiplied against all the local transforms of its parents.\n * This is ultimately used to convert a point from object space to world space, and\n * inversely, from world space to object space.\n * @return {Mat2d}\n */\n\n }, {\n key: \"globalXform\",\n get: function get() {\n this._updateglobalxform();\n return this._globalXform;\n }\n }], [{\n key: \"toJSON\",\n value: function toJSON(xformObj) {\n // TODO(croot): How do we deal with parenting here?\n // To properly deal with this, we may need to supply an\n // identifier for every created object... This may likely\n // need to be a name string supplied by the user\n var pos = xformObj.getPositionRef();\n var scale = xformObj.getScaleRef();\n var pivot = xformObj.pivotRef;\n return {\n position: [pos[0], pos[1]],\n scale: [scale[0], scale[1]],\n rotation: xformObj.getRotation(),\n pivot: [pivot[0], pivot[1]]\n };\n }\n }]);\n\n return Transform2d;\n}();\n\n/**\n * Creates a new Transform2d mixin class that is intended to be mixed in with\n * a class that inherits from the EventHandler class\n * @param {string} eventName Type name of the event fired when the transform is modified\n * @return {function} Mixin\n */\n\n\nexports.default = Transform2d;\nfunction createEventedTransform2dMixin(eventName) {\n /**\n * Transform2d modification event\n * @event EventedTransform2d#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n /**\n * @mixin Transform2d mixin with event firing when modified\n */\n return (0, _aggregation2.default)(null, Transform2d, function () {\n function EventedTransform2d() {\n _classCallCheck(this, EventedTransform2d);\n }\n\n _createClass(EventedTransform2d, [{\n key: \"setPosition\",\n\n\n /**\n * Sets the unparented position of the transform.\n * @param {Point2d} pos\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n value: function setPosition(pos) {\n if (!Point2d.equals(pos, this._pos)) {\n var prev = [this._pos[0], this._pos[1]];\n Point2d.copy(this._pos, pos);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"position\",\n prevVal: prev,\n currVal: pos\n });\n }\n return this;\n }\n\n /**\n * Translates the unparented position of a transform by an offset.\n * @param {Vec2d} translation\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"translate\",\n value: function translate(translation) {\n if (translation[0] || translation[1]) {\n var prev = [this._pos[0], this._pos[1]];\n Point2d.addVec2(this._pos, this._pos, translation);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"position\",\n prevVal: prev,\n currVal: [this._pos[0], this._pos[1]]\n });\n }\n return this;\n }\n\n /**\n * Sets the unparented 2d scale of the transform\n * @param {Vec2d} scale\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"setScale\",\n value: function setScale(scale) {\n if (!_glMatrix.vec2.equals(scale, this._scale)) {\n var prev = [this._scale[0], this._scale[1]];\n _glMatrix.vec2.copy(this._scale, scale);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"size\",\n prevVal: prev,\n currVal: scale\n });\n }\n return this;\n }\n\n /**\n * Multiplies the current unparented scale of the transform by a 2d scalar\n * @param {Vec2d} scaleMult\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"scale\",\n value: function scale(scaleMult) {\n if (scaleMult[0] !== 1 || scaleMult[1] !== 1) {\n var prev = [this._scale[0], this._scale[1]];\n _glMatrix.vec2.multiply(this._scale, this._scale, scaleMult);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"size\",\n prevVal: prev,\n currVal: [this._scale[0], this._scale[1]]\n });\n }\n return this;\n }\n\n /**\n * Sets the unparented rotation of the transform in degrees\n * @param {number} deg Rotation angle in degrees\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"setRotation\",\n value: function setRotation(deg) {\n var degToUse = deg % 360;\n if (degToUse !== this._rotDeg) {\n var prev = this._rotDeg;\n this._rotDeg = degToUse;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"orientation\",\n prevVal: prev,\n curral: this._rotDeg\n });\n }\n }\n\n /**\n * Adds a rotation angle in degrees to the current unparented\n * rotation of the transform.\n * @param {number} deg Additional rotation angle in degrees\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"rotate\",\n value: function rotate(deg) {\n if (deg) {\n var prev = this._rotDeg;\n this._rotDeg += deg;\n this._rotDeg %= 360;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"orientation\",\n prevVal: prev,\n curral: this._rotDeg\n });\n }\n return this;\n }\n\n /**\n * Utility function to reset all the unparented transform parameters\n * @param {number} tx Translation in x in world units\n * @param {number} ty Translation in y in world units\n * @param {number} sx Scale in x in world units\n * @param {number} sy Scale in y in world units\n * @param {number} deg Rotation angle degrees\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"setTransformations\",\n value: function setTransformations(tx, ty, sx, sy, deg) {\n var attrs = [];\n var prevVals = [];\n var currVals = [];\n if (typeof tx !== \"undefined\" && typeof ty !== \"undefined\" && (!_glMatrix.glMatrix.equals(tx, this._pos[0]) || !_glMatrix.glMatrix.equals(ty, this._pos[1]))) {\n var prev = Point2d.clone(this._pos);\n this._pos[0] = tx;\n this._pos[1] = ty;\n attrs.push(\"position\");\n prevVals.push(prev);\n currVals.push(Point2d.clone(this._pos));\n }\n\n if (typeof sx !== \"undefined\" && typeof sy !== \"undefined\" && (!_glMatrix.glMatrix.equals(sx, this._scale[0]) || !_glMatrix.glMatrix.equals(sy, this._scale[1]))) {\n var _prev = _glMatrix.vec2.clone(this._scale);\n _glMatrix.vec2.set(this._scale, sx, sy);\n attrs.push(\"size\");\n prevVals.push(_prev);\n currVals.push(_glMatrix.vec2.clone(this._scale));\n }\n\n if (typeof deg !== \"undefined\") {\n var degToUse = deg % 360;\n if (!_glMatrix.glMatrix.equals(degToUse, this._rotDeg)) {\n var _prev2 = this._rotDeg;\n this._rotDeg = degToUse;\n attrs.push(\"orientation\");\n prevVals.push(_prev2);\n currVals.push(this._rotDeg);\n }\n }\n\n if (attrs.length) {\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attrs: attrs,\n prevVals: prevVals,\n currVals: currVals\n });\n }\n return this;\n }\n }, {\n key: \"pivot\",\n\n /**\n * Sets the unparented pivot of the transform. The pivot is\n * the offset from the transform's primary position where the\n * transformation is applied.\n * @param {Vec2d} pivot\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n set: function set(pivot) {\n if (!Point2d.equals(pivot, this._pivot)) {\n var prev = [this._pivot[0], this._pivot[1]];\n Point2d.copy(this._pivot, pivot);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"pivot\",\n prevVal: prev,\n currVal: pivot\n });\n }\n return this;\n }\n\n /**\n * Gets a copy of the unparented pivot of the transform\n * @return {Vec2d}\n */\n ,\n get: function get() {\n return Point2d.clone(this._pivot);\n }\n }]);\n\n return EventedTransform2d;\n }());\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvdHJhbnNmb3JtMmQuanM/ZDAwMiJdLCJuYW1lcyI6WyJidWlsZFhmb3JtTWF0cml4IiwiY3JlYXRlRXZlbnRlZFRyYW5zZm9ybTJkTWl4aW4iLCJQb2ludDJkIiwibWF0IiwicmRlZyIsInMiLCJ0IiwicGl2b3QiLCJNYXQyZCIsImlkZW50aXR5IiwidHJhbnNsYXRlIiwicm90YXRlIiwiTWF0aCIsIkRFR19UT19SQUQiLCJzY2FsZSIsImRpcnR5Q2hpbGRyZW4iLCJjaGlsZHJlbiIsImZvckVhY2giLCJjaGlsZCIsIl94Zm9ybURpcnR5IiwiX2NoaWxkcmVuIiwiVHJhbnNmb3JtMmQiLCJvcHRzIiwiaW5pdGlhbGl6ZXIiLCJwb3NpdGlvbiIsInNldFBvc2l0aW9uIiwic2V0U2NhbGUiLCJyb3RhdGlvbiIsInNldFJvdGF0aW9uIiwiX2xvY2FsWGZvcm0iLCJjcmVhdGUiLCJfbHhmb3JtRGlydHkiLCJfcGl2b3QiLCJfcG9zIiwiX3NjYWxlIiwiVmVjMmQiLCJmcm9tVmFsdWVzIiwiX3JvdERlZyIsIl9nbG9iYWxYZm9ybSIsIl9wYXJlbnQiLCJTZXQiLCJfaW5pdFRyYW5zZm9ybUZyb21PcHRpb25zIiwiY2hpbGRYZm9ybSIsImhhcyIsImFkZCIsInJlbW92ZUNoaWxkIiwiZGVsZXRlIiwiY29weSIsImxvY2FsWGZvcm0iLCJjbG9uZSIsInhmb3JtIiwiZ2xvYmFsWGZvcm0iLCJwb3MiLCJ0cmFuc2xhdGlvbiIsImFkZFZlYzIiLCJzY2FsZU11bHQiLCJtdWx0aXBseSIsImRlZyIsIl9sb2NhbFhmb3JtVXBkYXRlZCIsIl91cGRhdGVsb2NhbHhmb3JtIiwiX2dsb2JhbFhmb3JtVXBkYXRlZCIsImN0eCIsImN1cnJNYXRyaXgiLCJ3b3JsZFRvU2NyZWVuTWF0cml4Iiwic2V0VHJhbnNmb3JtIiwiX3VwZGF0ZWdsb2JhbHhmb3JtIiwieGZvcm1PYmoiLCJnZXRQb3NpdGlvblJlZiIsImdldFNjYWxlUmVmIiwicGl2b3RSZWYiLCJnZXRSb3RhdGlvbiIsImV2ZW50TmFtZSIsImVxdWFscyIsInByZXYiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIiwiZGVnVG9Vc2UiLCJjdXJyYWwiLCJ0eCIsInR5Iiwic3giLCJzeSIsImF0dHJzIiwicHJldlZhbHMiLCJjdXJyVmFscyIsIkdMTWF0cml4IiwicHVzaCIsInNldCIsImxlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O1FBa0JnQkEsZ0IsR0FBQUEsZ0I7UUE2WkFDLDZCLEdBQUFBLDZCOztBQTdhaEI7O0lBQVlDLE87O0FBQ1o7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7OztBQUVBOzs7Ozs7Ozs7OztBQVdPLFNBQVNGLGdCQUFULENBQTBCRyxHQUExQixFQUErQkMsSUFBL0IsRUFBcUNDLENBQXJDLEVBQXdDQyxDQUF4QyxFQUEyQ0MsS0FBM0MsRUFBa0Q7QUFDdkRDLGtCQUFNQyxRQUFOLENBQWVOLEdBQWY7QUFDQUssa0JBQU1FLFNBQU4sQ0FBZ0JQLEdBQWhCLEVBQXFCQSxHQUFyQixFQUEwQixDQUFDRyxFQUFFLENBQUYsSUFBT0MsTUFBTSxDQUFOLENBQVIsRUFBa0JELEVBQUUsQ0FBRixJQUFPQyxNQUFNLENBQU4sQ0FBekIsQ0FBMUI7QUFDQUMsa0JBQU1HLE1BQU4sQ0FBYVIsR0FBYixFQUFrQkEsR0FBbEIsRUFBdUJTLGVBQUtDLFVBQUwsR0FBa0JULElBQXpDO0FBQ0FJLGtCQUFNTSxLQUFOLENBQVlYLEdBQVosRUFBaUJBLEdBQWpCLEVBQXNCRSxDQUF0QjtBQUNBRyxrQkFBTUUsU0FBTixDQUFnQlAsR0FBaEIsRUFBcUJBLEdBQXJCLEVBQTBCLENBQUMsQ0FBQ0ksTUFBTSxDQUFOLENBQUYsRUFBWSxDQUFDQSxNQUFNLENBQU4sQ0FBYixDQUExQjtBQUNBLFNBQU9KLEdBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTUEsU0FBU1ksYUFBVCxDQUF1QkMsUUFBdkIsRUFBaUM7QUFDL0JBLFdBQVNDLE9BQVQsQ0FBaUIsaUJBQVM7QUFDeEJDLFVB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WUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsd0JBQWMsS0FBS0ssU0FBbkI7QUFDQSxlQUFLc0QsSUFBTCxDQUFVSCxTQUFWLEVBQXFCO0FBQ25CYSx3QkFEbUI7QUFFbkJDLDhCQUZtQjtBQUduQkM7QUFIbUIsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEO0FBcE5JO0FBQUE7O0FBQ0w7Ozs7Ozs7O0FBREssd0JBU0svRSxLQVRMLEVBU1k7QUFDZixZQUFJLENBQUNMLFFBQVFzRSxNQUFSLENBQWVqRSxLQUFmLEVBQXNCLEtBQUt5QixNQUEzQixDQUFMLEVBQXlDO0FBQ3ZDLGNBQU15QyxPQUFPLENBQUMsS0FBS3pDLE1BQUwsQ0FBWSxDQUFaLENBQUQsRUFBaUIsS0FBS0EsTUFBTCxDQUFZLENBQVosQ0FBakIsQ0FBYjtBQUNBOUIsa0JBQVE2QyxJQUFSLENBQWEsS0FBS2YsTUFBbEIsRUFBMEJ6QixLQUExQjtBQUNBLGVBQUt3QixZQUFMLEdBQW9CLElBQXBCO0FBQ0FoQix3QkFBYyxLQUFLSyxTQUFuQjtBQUNBLGVBQUtzRCxJQUFMLENBQVVILFNBQVYsRUFBcUI7QUFDbkJJLGtCQUFNLE9BRGE7QUFFbkJDLHFCQUFTSCxJQUZVO0FBR25CSSxxQkFBU3RFO0FBSFUsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7O0FBeEJLO0FBQUEsMEJBNEJPO0FBQ1YsZUFBT0wsUUFBUStDLEtBQVIsQ0FBYyxLQUFLakIsTUFBbkIsQ0FBUDtBQUNEO0FBOUJJOztBQUFBO0FBQUEsTUFBUDtBQXNORCIsImZpbGUiOiIxMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQge2dsTWF0cml4IGFzIEdMTWF0cml4LCBtYXQyZCBhcyBNYXQyZCwgdmVjMiBhcyBWZWMyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5pbXBvcnQgYWdncmVnYXRpb24gZnJvbSBcIi4uL3V0aWwvYWdncmVnYXRpb25cIlxuaW1wb3J0IE1hdGggZnJvbSBcIi4uL21hdGgvbWF0aFwiXG5cbi8qKlxuICogQnVpbGRzIGEgMkQgdHJhbnNmb3JtYXRpb24gbWF0cml4ICgyeDMgbWF0cml4KSBmcm9tIGEgcm90YXRpb24gKGluIGRlZ3JlZXMpLFxuICogYW4geCx5IHNjYWxlLCBhIHRyYW5zbGF0aW9uLCBhbmQgYSBwaXZvdCAoYW4gb2Zmc2V0IGZyb20gdGhlIG9yaWdpbiB0b1xuICogYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIGFyb3VuZClcbiAqIEBwYXJhbSAge01hdDJkfSBtYXQgICBNYXRyaXggdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHJkZWcgIHJvdGF0aW9uLCBpbiBkZWdyZWVzXG4gKiBAcGFyYW0gIHtWZWMyZH0gcyAgICAgU2NhbGUgdmVjdG9yLCBpbiB4ICYgeVxuICogQHBhcmFtICB7VmVjMmR9IHQgICAgIFRyYW5zbGF0aW9uIHZlY3RvciwgaW4geCAmIHlcbiAqIEBwYXJhbSAge1ZlYzJkfSBwaXZvdCBPZmZzZXQgZnJvbSBvcmlnaW4gdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uXG4gKiBAcmV0dXJuIHtNYXQyZH0gICAgICAgTWF0cml4IHJlZmVyZW5jZWQgYnkgdGhlIG1hdCBhcmd1bWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRYZm9ybU1hdHJpeChtYXQsIHJkZWcsIHMsIHQsIHBpdm90KSB7XG4gIE1hdDJkLmlkZW50aXR5KG1hdClcbiAgTWF0MmQudHJhbnNsYXRlKG1hdCwgbWF0LCBbdFswXSArIHBpdm90WzBdLCB0WzFdICsgcGl2b3RbMV1dKVxuICBNYXQyZC5yb3RhdGUobWF0LCBtYXQsIE1hdGguREVHX1RPX1JBRCAqIHJkZWcpXG4gIE1hdDJkLnNjYWxlKG1hdCwgbWF0LCBzKVxuICBNYXQyZC50cmFuc2xhdGUobWF0LCBtYXQsIFstcGl2b3RbMF0sIC1waXZvdFsxXV0pXG4gIHJldHVybiBtYXRcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGRpcnR5IGFsbCB0aGUgZGVzY2VuZGFudHMgb2YgYSB0cmFuc2Zvcm0gbm9kZS5cbiAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB0cmFuc2Zvcm0gbm9kZSBoYXMgYmVlbiBtb2RpZmllZCBpbiBzb21lIHdheVxuICogdGhhdCBpdCdzIGNoaWxkcmVuIG5lZWQgdG8gYmUgbm90aWZpZWQgYWJvdXQuXG4gKiBAcGFyYW0gIHtUcmFuc2Zvcm0yZFtdfSBjaGlsZHJlblxuICovXG5mdW5jdGlvbiBkaXJ0eUNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgIGNoaWxkLl94Zm9ybURpcnR5ID0gdHJ1ZVxuICAgIGRpcnR5Q2hpbGRyZW4oY2hpbGQuX2NoaWxkcmVuKVxuICB9KVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRyYW5zZm9ybTJkT3B0aW9uc1xuICogQHByb3BlcnR5IHtQb2ludDJkfSBbcG9zaXRpb24gPSBbMCwwXV0gUG9zaXRpb24gaW4gd29ybGQgc3BhY2UgY29vcmRzXG4gKiBAcHJvcGVydHkge1ZlYzJkfSBbc2NhbGUgPSBbMSwxXV0gU2NhbGUgaW4gd29ybGQgc3BhY2UgY29vcmRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3JvdGF0aW9uID0gMF0gUm90YXRpb24gaW4gZGVncmVlc1xuICogQHByb3BlcnR5IHtWZWMyZH0gW3Bpdm90ID0gWzAsIDBdXSBPZmZzZXQgZnJvbSBvcmlnaW4gdG8gYXBwbHkgdGhlIHNldFRyYW5zZm9ybWF0aW9uc1xuICovXG5cbi8qKlxuICogQGNsYXNzIENsYXNzIHRvIG1hbmFnZSBiYXNpYyAyZCBhZmZpbmUgdHJhbnNmb3JtYXRpb25zXG4gKiBAbWl4aW4gQ2FuIGFsc28gYmUgdXNlZCBhcyBhIG1peGluXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYW5zZm9ybTJkIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVHJhbnNmb3JtMmRcbiAgICogQHBhcmFtICB7VHJhbnNmb3JtMmRPcHRpb25zfSBbb3B0c11cbiAgICogQHJldHVybiB7VHJhbnNmb3JtMmR9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgdGhpcy5pbml0aWFsaXplcihvcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgdHJhbnNmb3JtIDJkIG9iamVjdCBmcm9tIG9wdGlvbnNcbiAgICogQHBhcmFtICB7VHJhbnNmb3JtMmRPcHRpb25zfSBbb3B0c11cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0VHJhbnNmb3JtRnJvbU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBvc2l0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKG9wdHMucG9zaXRpb24pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnNjYWxlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNldFNjYWxlKG9wdHMuc2NhbGUpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnJvdGF0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNldFJvdGF0aW9uKG9wdHMucm90YXRpb24pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBpdm90ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnBpdm90ID0gb3B0cy5waXZvdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIHRyYW5zZm9ybSAyZCBvYmplY3QgZnJvbSBvcHRpb25zLFxuICAgKiBjYWxsZWQgZnJvbSBlaXRoZXIgY29uc3RydWN0b3IgKGlmIHVzZWQgYXMgYmFzZSBjbGFzcylcbiAgICogb3IgYmFzZSBtaXhpbiBjbGFzcyAoaWYgdXNlZCBhcyBhIG1peGluKVxuICAgKiBAcGFyYW0gIHtUcmFuc2Zvcm0yZE9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBpbml0aWFsaXplcihvcHRzKSB7XG4gICAgdGhpcy5fbG9jYWxYZm9ybSA9IE1hdDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fbHhmb3JtRGlydHkgPSBmYWxzZVxuXG4gICAgdGhpcy5fcGl2b3QgPSBQb2ludDJkLmNyZWF0ZSgwLCAwKVxuXG4gICAgdGhpcy5fcG9zID0gUG9pbnQyZC5jcmVhdGUoMCwgMClcbiAgICB0aGlzLl9zY2FsZSA9IFZlYzJkLmZyb21WYWx1ZXMoMSwgMSlcbiAgICB0aGlzLl9yb3REZWcgPSAwXG5cbiAgICB0aGlzLl9nbG9iYWxYZm9ybSA9IE1hdDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5feGZvcm1EaXJ0eSA9IGZhbHNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbFxuICAgIHRoaXMuX2NoaWxkcmVuID0gbmV3IFNldCgpXG5cbiAgICB0aGlzLl9pbml0VHJhbnNmb3JtRnJvbU9wdGlvbnMob3B0cylcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgdG8gdGhpcyB0cmFuc2Zvcm0gbm9kZVxuICAgKiBAcGFyYW0ge1RyYW5zZm9ybTJkfSBjaGlsZFhmb3JtXG4gICAqL1xuICBhZGRDaGlsZFhmb3JtKGNoaWxkWGZvcm0pIHtcbiAgICBpZiAoIXRoaXMuX2NoaWxkcmVuLmhhcyhjaGlsZFhmb3JtKSkge1xuICAgICAgdGhpcy5fY2hpbGRyZW4uYWRkKGNoaWxkWGZvcm0pXG4gICAgICBpZiAoY2hpbGRYZm9ybS5fcGFyZW50KSB7XG4gICAgICAgIGNoaWxkWGZvcm0uX3BhcmVudC5yZW1vdmVDaGlsZChjaGlsZFhmb3JtKVxuICAgICAgfVxuICAgICAgY2hpbGRYZm9ybS5fcGFyZW50ID0gdGhpc1xuICAgICAgY2hpbGRYZm9ybS5feGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgIGRpcnR5Q2hpbGRyZW4oY2hpbGRYZm9ybS5fY2hpbGRyZW4pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjaGlsZCBmcm9tIHRoaXMgdHJhbnNmb3JtIG5vZGVcbiAgICogQHBhcmFtICB7VHJhbnNmb3JtMmR9IGNoaWxkWGZvcm1cbiAgICovXG4gIHJlbW92ZUNoaWxkWGZvcm0oY2hpbGRYZm9ybSkge1xuICAgIHRoaXMuX2NoaWxkcmVuLmRlbGV0ZShjaGlsZFhmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIFVucGFyZW50cyB0aGlzIG5vZGUgZnJvbSBpdHMgcGFyZW50LCBpZiBpdCBoYXMgb25lXG4gICAqL1xuICB1bnBhcmVudFhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKVxuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbFxuICAgICAgTWF0MmQuY29weSh0aGlzLl9nbG9iYWxYZm9ybSwgdGhpcy5sb2NhbFhmb3JtKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwaXZvdCBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEBwYXJhbSAge1ZlYzJkfSBwaXZvdCBPZmZzZXQgdmVjdG9yIGZyb20gdGhlIG9yaWdpbiB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb25zXG4gICAqIEByZXR1cm4ge1RyYW5zZm9ybTJkfVxuICAgKi9cbiAgc2V0IHBpdm90KHBpdm90KSB7XG4gICAgUG9pbnQyZC5jb3B5KHRoaXMuX3Bpdm90LCBwaXZvdClcbiAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBwaXZvdCBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge1ZlYzJkfVxuICAgKi9cbiAgZ2V0IHBpdm90KCkge1xuICAgIHJldHVybiBQb2ludDJkLmNsb25lKHRoaXMuX3Bpdm90KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgcGl2b3QgcmVmZXJlbmNlIG9mIHRoZSB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmVhZE9ubHlcbiAgICovXG4gIGdldCBwaXZvdFJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGl2b3RcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJlbnQgdHJhbnNmb3JtIG5vZGUsIGlmIG9uZSBpcyBhdHRhY2hlZFxuICAgKiBAcmV0dXJuIHtUcmFuc2Zvcm0yZH1cbiAgICovXG4gIGdldCBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdW5wYXJlbnRlZCBwb3NpdGlvbiBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge1BvaW50MmR9IFRoaXMgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGFzIGlmIGl0IHdlcmUgdW5wYXJlbnRlZFxuICAgKi9cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIFZlYzJkLmNsb25lKHRoaXMuX3BvcylcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHVucGFyZW50ZWQgcG9zaXRpb24gb2YgdGhlIHRyYW5zZm9ybSwgYXZvaWRpbmdcbiAgICogYSBjb3B5XG4gICAqIEByZXR1cm4ge1BvaW50MmR9XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0UG9zaXRpb25SZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgd29ybGQgcG9zaXRpb24gb2YgdGhlIHRyYW5zZm9ybSwgdGhpcyBpcyBpdHMgcG9zaXRpb25cbiAgICogYWZ0ZXIgYWxsIHBhcmVudCB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWRcbiAgICogQHJldHVybiB7UG9pbnQyZH1cbiAgICovXG4gIGdldFdvcmxkUG9zaXRpb24oKSB7XG4gICAgY29uc3QgeGZvcm0gPSB0aGlzLmdsb2JhbFhmb3JtXG4gICAgcmV0dXJuIFBvaW50MmQuY3JlYXRlKHhmb3JtWzRdLCB4Zm9ybVs1XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHdvcmxkIHBvc2l0aW9uIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtQb2ludDJkfSBwb3NcbiAgICovXG4gIHNldFBvc2l0aW9uKHBvcykge1xuICAgIFBvaW50MmQuY29weSh0aGlzLl9wb3MsIHBvcylcbiAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgdGhlIHVucGFyZW50ZWQgd29ybGQgcG9zaXRpb24gb2YgdGhlIHRyYW5zZm9ybSBieSBhbiBvZmZzZXRcbiAgICogQHBhcmFtICB7VmVjMmR9IHRyYW5zbGF0aW9uXG4gICAqIEByZXR1cm4ge1RyYW5zZm9ybTJkfVxuICAgKi9cbiAgdHJhbnNsYXRlKHRyYW5zbGF0aW9uKSB7XG4gICAgaWYgKHRyYW5zbGF0aW9uWzBdIHx8IHRyYW5zbGF0aW9uWzFdKSB7XG4gICAgICBQb2ludDJkLmFkZFZlYzIodGhpcy5fcG9zLCB0aGlzLl9wb3MsIHRyYW5zbGF0aW9uKVxuICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdW5wYXJlbnRlZCB4LHkgc2NhbGUgb2YgdGhlIHRyYW5zZm9ybVxuICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICovXG4gIGdldFNjYWxlKCkge1xuICAgIHJldHVybiBWZWMyZC5jbG9uZSh0aGlzLl9zY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVucGFyZW50ZWQgeC95IHNjYWxlIHJlZmVyZW5jZSBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIGF2b2lkaW5nIGEgY29weVxuICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICogQHJlYWRPbmx5XG4gICAqL1xuICBnZXRTY2FsZVJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NhbGVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHNjYWxlIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtWZWMyZH0gc2NhbGVcbiAgICogQHJldHVybiB7VHJhbnNmb3JtMmR9XG4gICAqL1xuICBzZXRTY2FsZShzY2FsZSkge1xuICAgIFZlYzJkLmNvcHkodGhpcy5fc2NhbGUsIHNjYWxlKVxuICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZXMgdGhlIGN1cnJlbnQgdW5wYXJlbnRlZCBzY2FsZSBieSBhIDJkIG11bHRpcGxpZXJcbiAgICogQHBhcmFtICB7VmVjMmR9IHNjYWxlTXVsdFxuICAgKiBAcmV0dXJuIHtUcmFuc2Zvcm0yZH1cbiAgICovXG4gIHNjYWxlKHNjYWxlTXVsdCkge1xuICAgIGlmIChzY2FsZU11bHRbMF0gIT09IDEgfHwgc2NhbGVNdWx0WzFdICE9PSAxKSB7XG4gICAgICBWZWMyZC5tdWx0aXBseSh0aGlzLl9zY2FsZSwgdGhpcy5fc2NhbGUsIHNjYWxlTXVsdClcbiAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVucGFyZW50ZWQgcm90YXRpb24gaW4gZGVncmVlcyBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldFJvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3REZWdcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHJvdGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZyBSb3RhdGlvbiBpbiBkZWdyZWVzXG4gICAqIEByZXR1cm4ge1RyYW5zZm9ybTJkfVxuICAgKi9cbiAgc2V0Um90YXRpb24oZGVnKSB7XG4gICAgdGhpcy5fcm90RGVnID0gZGVnXG4gICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWRkaXRpb25hbCByb3RhdGlvbiBpbiBkZWdyZWVzIHRvIHRoZSBjdXJyZW50IHJvdGF0aW9uXG4gICAqIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtICB7bnVtYmVyfSBkZWcgUm90YXRpb24gb2Zmc2V0IGluIGRlZ3JlZXNcbiAgICogQHJldHVybiB7VHJhbnNmb3JtMmR9XG4gICAqL1xuICByb3RhdGUoZGVnKSB7XG4gICAgaWYgKGRlZykge1xuICAgICAgdGhpcy5fcm90RGVnICs9IGRlZ1xuICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGlydHkgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGlzIG5vZGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kaXJ0eUNoaWxkcmVuKCkge1xuICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgbG9jYWwgYWZmaW5lIG1hdHJpeCBpZiBtYXJrZWQgYXMgZGlydHlcbiAgICogSWYgZGVyaXZlZC9taXhpbiBjbGFzc2VzIGhhdmUgYSBfbG9jYWxYZm9ybVVwZGF0ZXMgbWV0aG9kXG4gICAqIGRlZmluZWQsIHRoYXQgd2lsbCBiZSBjYWxsZWQgaGVyZSB3aGVuIHRoZSBsb2NhbCB0cmFuc2Zvcm1cbiAgICogaXMgdXBkYXRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVsb2NhbHhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9seGZvcm1EaXJ0eSkge1xuICAgICAgYnVpbGRYZm9ybU1hdHJpeCh0aGlzLl9sb2NhbFhmb3JtLCB0aGlzLl9yb3REZWcsIHRoaXMuX3NjYWxlLCB0aGlzLl9wb3MsIHRoaXMuX3Bpdm90KVxuICAgICAgaWYgKHRoaXMuX2xvY2FsWGZvcm1VcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsWGZvcm1VcGRhdGVkKClcbiAgICAgIH1cbiAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZ2xvYmFsIDJ4MyBtYXRyaXggb2YgdGhlIHRyYW5zZm9ybSBpZiBtYXJrZWQgZGlydHlcbiAgICogSWYgZGVyaXZlZC9taXhpbiBjbGFzc2VzIGhhdmUgYSBfZ2xvYmFsWGZvcm1VcGRhdGVzIG1ldGhvZFxuICAgKiBkZWZpbmVkLCB0aGF0IHdpbGwgYmUgY2FsbGVkIGhlcmUgd2hlbiB0aGUgZ2xvYmFsIHRyYW5zZm9ybVxuICAgKiBpcyB1cGRhdGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZWdsb2JhbHhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9seGZvcm1EaXJ0eSB8fCB0aGlzLl94Zm9ybURpcnR5KSB7XG4gICAgICB0aGlzLl91cGRhdGVsb2NhbHhmb3JtKClcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgTWF0MmQubXVsdGlwbHkodGhpcy5fZ2xvYmFsWGZvcm0sIHRoaXMuX3BhcmVudC5nbG9iYWxYZm9ybSwgdGhpcy5fbG9jYWxYZm9ybSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE1hdDJkLmNvcHkodGhpcy5fZ2xvYmFsWGZvcm0sIHRoaXMuX2xvY2FsWGZvcm0pXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fZ2xvYmFsWGZvcm1VcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuX2dsb2JhbFhmb3JtVXBkYXRlZCgpXG4gICAgICB9XG4gICAgICB0aGlzLl94Zm9ybURpcnR5ID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIG5vZGUuXG4gICAqIEByZXR1cm4ge01hdDJkfVxuICAgKi9cbiAgZ2V0IGxvY2FsWGZvcm0oKSB7XG4gICAgdGhpcy5fdXBkYXRlbG9jYWx4Zm9ybSgpXG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsWGZvcm1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGdsb2JhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIG5vZGUuIFRoaXMgaXMgZXNzZW50aWFsbHlcbiAgICogaXRzIGxvY2FsIHRyYW5zZm9ybSBtdWx0aXBsaWVkIGFnYWluc3QgYWxsIHRoZSBsb2NhbCB0cmFuc2Zvcm1zIG9mIGl0cyBwYXJlbnRzLlxuICAgKiBUaGlzIGlzIHVsdGltYXRlbHkgdXNlZCB0byBjb252ZXJ0IGEgcG9pbnQgZnJvbSBvYmplY3Qgc3BhY2UgdG8gd29ybGQgc3BhY2UsIGFuZFxuICAgKiBpbnZlcnNlbHksIGZyb20gd29ybGQgc3BhY2UgdG8gb2JqZWN0IHNwYWNlLlxuICAgKiBAcmV0dXJuIHtNYXQyZH1cbiAgICovXG4gIGdldCBnbG9iYWxYZm9ybSgpIHtcbiAgICB0aGlzLl91cGRhdGVnbG9iYWx4Zm9ybSgpXG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbFhmb3JtXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdHJhbnNmb3JtIHN0YXRlIG9mIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHhcbiAgICogQHBhcmFtICB7TWF0MmR9IGN1cnJNYXRyaXggICAgICAgICAgVGhlIGN1cnJlbnQgbWF0cml4IHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtdmlldy1wcm9qZWN0aW9uLXNjcmVlbiBtYXRyaXggbXVsdGlwbGljYXRpb24gZm9yIHRoaXMgbm9kZVxuICAgKiBAcGFyYW0gIHtNYXQyZH0gd29ybGRUb1NjcmVlbk1hdHJpeCBUaGUgY3VycmVudCB3b3JsZC10by1zY3JlZW4gdHJhbmZvcm1cbiAgICovXG4gIHRyYW5zZm9ybUN0eChjdHgsIGN1cnJNYXRyaXgsIHdvcmxkVG9TY3JlZW5NYXRyaXgpIHtcbiAgICBNYXQyZC5tdWx0aXBseShjdXJyTWF0cml4LCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLmdsb2JhbFhmb3JtKVxuXG4gICAgY3R4LnNldFRyYW5zZm9ybShjdXJyTWF0cml4WzBdLFxuICAgICAgY3Vyck1hdHJpeFsxXSxcbiAgICAgIGN1cnJNYXRyaXhbMl0sXG4gICAgICBjdXJyTWF0cml4WzNdLFxuICAgICAgY3Vyck1hdHJpeFs0XSxcbiAgICAgIGN1cnJNYXRyaXhbNV0pXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBUcmFuc2Zvcm0yZCBpbnN0YW5jZSB0byBhIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSAge1RyYW5zZm9ybTJkfSB4Zm9ybU9ialxuICAgKiBAcmV0dXJuIHt7cG9zaXRpb246IFBvaW50MmQsIHNjYWxlOiBWZWMyZCwgcm90YXRpb246IG51bWJlciwgcGl2b3Q6IFZlYzJkfX1cbiAgICovXG4gIHN0YXRpYyB0b0pTT04oeGZvcm1PYmopIHtcbiAgICAvLyBUT0RPKGNyb290KTogSG93IGRvIHdlIGRlYWwgd2l0aCBwYXJlbnRpbmcgaGVyZT9cbiAgICAvLyBUbyBwcm9wZXJseSBkZWFsIHdpdGggdGhpcywgd2UgbWF5IG5lZWQgdG8gc3VwcGx5IGFuXG4gICAgLy8gaWRlbnRpZmllciBmb3IgZXZlcnkgY3JlYXRlZCBvYmplY3QuLi4gVGhpcyBtYXkgbGlrZWx5XG4gICAgLy8gbmVlZCB0byBiZSBhIG5hbWUgc3RyaW5nIHN1cHBsaWVkIGJ5IHRoZSB1c2VyXG4gICAgY29uc3QgcG9zID0geGZvcm1PYmouZ2V0UG9zaXRpb25SZWYoKVxuICAgIGNvbnN0IHNjYWxlID0geGZvcm1PYmouZ2V0U2NhbGVSZWYoKVxuICAgIGNvbnN0IHBpdm90ID0geGZvcm1PYmoucGl2b3RSZWZcbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IFtwb3NbMF0sIHBvc1sxXV0sXG4gICAgICBzY2FsZTogW3NjYWxlWzBdLCBzY2FsZVsxXV0sXG4gICAgICByb3RhdGlvbjogeGZvcm1PYmouZ2V0Um90YXRpb24oKSxcbiAgICAgIHBpdm90OiBbcGl2b3RbMF0sIHBpdm90WzFdXVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVHJhbnNmb3JtMmQgbWl4aW4gY2xhc3MgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBtaXhlZCBpbiB3aXRoXG4gKiBhIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgRXZlbnRIYW5kbGVyIGNsYXNzXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGV2ZW50TmFtZSBUeXBlIG5hbWUgb2YgdGhlIGV2ZW50IGZpcmVkIHdoZW4gdGhlIHRyYW5zZm9ybSBpcyBtb2RpZmllZFxuICogQHJldHVybiB7ZnVuY3Rpb259ICAgICAgICAgICBNaXhpblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRlZFRyYW5zZm9ybTJkTWl4aW4oZXZlbnROYW1lKSB7XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0yZCBtb2RpZmljYXRpb24gZXZlbnRcbiAgICogQGV2ZW50IEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBtb2RpZmllZFxuICAgKiBAcHJvcGVydHkge30gcHJldlZhbCBQcmV2aW91cyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHByaW9yIHRvIG1vZGlmaWNhdGlvblxuICAgKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWl4aW4gVHJhbnNmb3JtMmQgbWl4aW4gd2l0aCBldmVudCBmaXJpbmcgd2hlbiBtb2RpZmllZFxuICAgKi9cbiAgcmV0dXJuIGFnZ3JlZ2F0aW9uKG51bGwsIFRyYW5zZm9ybTJkLCBjbGFzcyBFdmVudGVkVHJhbnNmb3JtMmQge1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHVucGFyZW50ZWQgcGl2b3Qgb2YgdGhlIHRyYW5zZm9ybS4gVGhlIHBpdm90IGlzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSB0cmFuc2Zvcm0ncyBwcmltYXJ5IHBvc2l0aW9uIHdoZXJlIHRoZVxuICAgICAqIHRyYW5zZm9ybWF0aW9uIGlzIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtWZWMyZH0gcGl2b3RcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHNldCBwaXZvdChwaXZvdCkge1xuICAgICAgaWYgKCFQb2ludDJkLmVxdWFscyhwaXZvdCwgdGhpcy5fcGl2b3QpKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBbdGhpcy5fcGl2b3RbMF0sIHRoaXMuX3Bpdm90WzFdXVxuICAgICAgICBQb2ludDJkLmNvcHkodGhpcy5fcGl2b3QsIHBpdm90KVxuICAgICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwicGl2b3RcIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJWYWw6IHBpdm90XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjb3B5IG9mIHRoZSB1bnBhcmVudGVkIHBpdm90IG9mIHRoZSB0cmFuc2Zvcm1cbiAgICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICAgKi9cbiAgICBnZXQgcGl2b3QoKSB7XG4gICAgICByZXR1cm4gUG9pbnQyZC5jbG9uZSh0aGlzLl9waXZvdClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHBvc2l0aW9uIG9mIHRoZSB0cmFuc2Zvcm0uXG4gICAgICogQHBhcmFtIHtQb2ludDJkfSBwb3NcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHNldFBvc2l0aW9uKHBvcykge1xuICAgICAgaWYgKCFQb2ludDJkLmVxdWFscyhwb3MsIHRoaXMuX3BvcykpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IFt0aGlzLl9wb3NbMF0sIHRoaXMuX3Bvc1sxXV1cbiAgICAgICAgUG9pbnQyZC5jb3B5KHRoaXMuX3BvcywgcG9zKVxuICAgICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwicG9zaXRpb25cIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJWYWw6IHBvc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIHRoZSB1bnBhcmVudGVkIHBvc2l0aW9uIG9mIGEgdHJhbnNmb3JtIGJ5IGFuIG9mZnNldC5cbiAgICAgKiBAcGFyYW0gIHtWZWMyZH0gdHJhbnNsYXRpb25cbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZSh0cmFuc2xhdGlvbikge1xuICAgICAgaWYgKHRyYW5zbGF0aW9uWzBdIHx8IHRyYW5zbGF0aW9uWzFdKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBbdGhpcy5fcG9zWzBdLCB0aGlzLl9wb3NbMV1dXG4gICAgICAgIFBvaW50MmQuYWRkVmVjMih0aGlzLl9wb3MsIHRoaXMuX3BvcywgdHJhbnNsYXRpb24pXG4gICAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJwb3NpdGlvblwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VyclZhbDogW3RoaXMuX3Bvc1swXSwgdGhpcy5fcG9zWzFdXVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIDJkIHNjYWxlIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICAgKiBAcGFyYW0ge1ZlYzJkfSBzY2FsZVxuICAgICAqIEBmaXJlcyAgRXZlbnRlZFRyYW5zZm9ybTJkI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkVHJhbnNmb3JtMmR9XG4gICAgICovXG4gICAgc2V0U2NhbGUoc2NhbGUpIHtcbiAgICAgIGlmICghVmVjMmQuZXF1YWxzKHNjYWxlLCB0aGlzLl9zY2FsZSkpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IFt0aGlzLl9zY2FsZVswXSwgdGhpcy5fc2NhbGVbMV1dXG4gICAgICAgIFZlYzJkLmNvcHkodGhpcy5fc2NhbGUsIHNjYWxlKVxuICAgICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwic2l6ZVwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VyclZhbDogc2NhbGVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbGllcyB0aGUgY3VycmVudCB1bnBhcmVudGVkIHNjYWxlIG9mIHRoZSB0cmFuc2Zvcm0gYnkgYSAyZCBzY2FsYXJcbiAgICAgKiBAcGFyYW0gIHtWZWMyZH0gc2NhbGVNdWx0XG4gICAgICogQGZpcmVzICBFdmVudGVkVHJhbnNmb3JtMmQjY2hhbmdlZFxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRUcmFuc2Zvcm0yZH1cbiAgICAgKi9cbiAgICBzY2FsZShzY2FsZU11bHQpIHtcbiAgICAgIGlmIChzY2FsZU11bHRbMF0gIT09IDEgfHwgc2NhbGVNdWx0WzFdICE9PSAxKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBbdGhpcy5fc2NhbGVbMF0sIHRoaXMuX3NjYWxlWzFdXVxuICAgICAgICBWZWMyZC5tdWx0aXBseSh0aGlzLl9zY2FsZSwgdGhpcy5fc2NhbGUsIHNjYWxlTXVsdClcbiAgICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gICAgICAgIHRoaXMuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICBhdHRyOiBcInNpemVcIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJWYWw6IFt0aGlzLl9zY2FsZVswXSwgdGhpcy5fc2NhbGVbMV1dXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHVucGFyZW50ZWQgcm90YXRpb24gb2YgdGhlIHRyYW5zZm9ybSBpbiBkZWdyZWVzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlZyBSb3RhdGlvbiBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICogQGZpcmVzICBFdmVudGVkVHJhbnNmb3JtMmQjY2hhbmdlZFxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRUcmFuc2Zvcm0yZH1cbiAgICAgKi9cbiAgICBzZXRSb3RhdGlvbihkZWcpIHtcbiAgICAgIGNvbnN0IGRlZ1RvVXNlID0gZGVnICUgMzYwXG4gICAgICBpZiAoZGVnVG9Vc2UgIT09IHRoaXMuX3JvdERlZykge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fcm90RGVnXG4gICAgICAgIHRoaXMuX3JvdERlZyA9IGRlZ1RvVXNlXG4gICAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJvcmllbnRhdGlvblwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VycmFsOiB0aGlzLl9yb3REZWdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcm90YXRpb24gYW5nbGUgaW4gZGVncmVlcyB0byB0aGUgY3VycmVudCB1bnBhcmVudGVkXG4gICAgICogcm90YXRpb24gb2YgdGhlIHRyYW5zZm9ybS5cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGRlZyBBZGRpdGlvbmFsIHJvdGF0aW9uIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHJvdGF0ZShkZWcpIHtcbiAgICAgIGlmIChkZWcpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3JvdERlZ1xuICAgICAgICB0aGlzLl9yb3REZWcgKz0gZGVnXG4gICAgICAgIHRoaXMuX3JvdERlZyAlPSAzNjBcbiAgICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gICAgICAgIHRoaXMuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICBhdHRyOiBcIm9yaWVudGF0aW9uXCIsXG4gICAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgICBjdXJyYWw6IHRoaXMuX3JvdERlZ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHJlc2V0IGFsbCB0aGUgdW5wYXJlbnRlZCB0cmFuc2Zvcm0gcGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eCAgVHJhbnNsYXRpb24gaW4geCBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eSAgVHJhbnNsYXRpb24gaW4geSBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzeCAgU2NhbGUgaW4geCBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzeSAgU2NhbGUgaW4geSBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWcgUm90YXRpb24gYW5nbGUgZGVncmVlc1xuICAgICAqIEBmaXJlcyAgRXZlbnRlZFRyYW5zZm9ybTJkI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkVHJhbnNmb3JtMmR9XG4gICAgICovXG4gICAgc2V0VHJhbnNmb3JtYXRpb25zKHR4LCB0eSwgc3gsIHN5LCBkZWcpIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gW11cbiAgICAgIGNvbnN0IHByZXZWYWxzID0gW11cbiAgICAgIGNvbnN0IGN1cnJWYWxzID0gW11cbiAgICAgIGlmICh0eXBlb2YgdHggIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHR5ICE9PSBcInVuZGVmaW5lZFwiICYmICghR0xNYXRyaXguZXF1YWxzKHR4LCB0aGlzLl9wb3NbMF0pIHx8ICFHTE1hdHJpeC5lcXVhbHModHksIHRoaXMuX3Bvc1sxXSkpKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBQb2ludDJkLmNsb25lKHRoaXMuX3BvcylcbiAgICAgICAgdGhpcy5fcG9zWzBdID0gdHhcbiAgICAgICAgdGhpcy5fcG9zWzFdID0gdHlcbiAgICAgICAgYXR0cnMucHVzaChcInBvc2l0aW9uXCIpXG4gICAgICAgIHByZXZWYWxzLnB1c2gocHJldilcbiAgICAgICAgY3VyclZhbHMucHVzaChQb2ludDJkLmNsb25lKHRoaXMuX3BvcykpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ggIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHN5ICE9PSBcInVuZGVmaW5lZFwiICYmICghR0xNYXRyaXguZXF1YWxzKHN4LCB0aGlzLl9zY2FsZVswXSkgfHwgIUdMTWF0cml4LmVxdWFscyhzeSwgdGhpcy5fc2NhbGVbMV0pKSkge1xuICAgICAgICBjb25zdCBwcmV2ID0gVmVjMmQuY2xvbmUodGhpcy5fc2NhbGUpXG4gICAgICAgIFZlYzJkLnNldCh0aGlzLl9zY2FsZSwgc3gsIHN5KVxuICAgICAgICBhdHRycy5wdXNoKFwic2l6ZVwiKVxuICAgICAgICBwcmV2VmFscy5wdXNoKHByZXYpXG4gICAgICAgIGN1cnJWYWxzLnB1c2goVmVjMmQuY2xvbmUodGhpcy5fc2NhbGUpKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlZyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCBkZWdUb1VzZSA9IGRlZyAlIDM2MFxuICAgICAgICBpZiAoIUdMTWF0cml4LmVxdWFscyhkZWdUb1VzZSwgdGhpcy5fcm90RGVnKSkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLl9yb3REZWdcbiAgICAgICAgICB0aGlzLl9yb3REZWcgPSBkZWdUb1VzZVxuICAgICAgICAgIGF0dHJzLnB1c2goXCJvcmllbnRhdGlvblwiKVxuICAgICAgICAgIHByZXZWYWxzLnB1c2gocHJldilcbiAgICAgICAgICBjdXJyVmFscy5wdXNoKHRoaXMuX3JvdERlZylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYXR0cnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cnMsXG4gICAgICAgICAgcHJldlZhbHMsXG4gICAgICAgICAgY3VyclZhbHNcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9KVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2hhcGVzL3RyYW5zZm9ybTJkLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 12 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.buildXformMatrix = buildXformMatrix;\nexports.createEventedTransform2dMixin = createEventedTransform2dMixin;\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _glMatrix = __webpack_require__(1);\n\nvar _aggregation = __webpack_require__(8);\n\nvar _aggregation2 = _interopRequireDefault(_aggregation);\n\nvar _math = __webpack_require__(6);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Builds a 2D transformation matrix (2x3 matrix) from a rotation (in degrees),\n * an x,y scale, a translation, and a pivot (an offset from the origin to\n * apply the transformation around)\n * @param {Mat2d} mat Matrix to store the result of the operation\n * @param {number} rdeg rotation, in degrees\n * @param {Vec2d} s Scale vector, in x & y\n * @param {Vec2d} t Translation vector, in x & y\n * @param {Vec2d} pivot Offset from origin to apply the transformation\n * @return {Mat2d} Matrix referenced by the mat argument\n */\nfunction buildXformMatrix(mat, rdeg, s, t, pivot) {\n _glMatrix.mat2d.identity(mat);\n _glMatrix.mat2d.translate(mat, mat, [t[0] + pivot[0], t[1] + pivot[1]]);\n _glMatrix.mat2d.rotate(mat, mat, _math2.default.DEG_TO_RAD * rdeg);\n _glMatrix.mat2d.scale(mat, mat, s);\n _glMatrix.mat2d.translate(mat, mat, [-pivot[0], -pivot[1]]);\n return mat;\n}\n\n/**\n * Utility function to dirty all the descendants of a transform node.\n * This is called when a transform node has been modified in some way\n * that it's children need to be notified about.\n * @param {Transform2d[]} children\n */\nfunction dirtyChildren(children) {\n children.forEach(function (child) {\n child._xformDirty = true;\n dirtyChildren(child._children);\n });\n}\n\n/**\n * @typedef {object} Transform2dOptions\n * @property {Point2d} [position = [0,0]] Position in world space coords\n * @property {Vec2d} [scale = [1,1]] Scale in world space coords\n * @property {number} [rotation = 0] Rotation in degrees\n * @property {Vec2d} [pivot = [0, 0]] Offset from origin to apply the setTransformations\n */\n\n/**\n * @class Class to manage basic 2d affine transformations\n * @mixin Can also be used as a mixin\n */\n\nvar Transform2d = function () {\n /**\n * Creates a new Transform2d\n * @param {Transform2dOptions} [opts]\n * @return {Transform2d}\n */\n function Transform2d(opts) {\n _classCallCheck(this, Transform2d);\n\n this.initializer(opts);\n }\n\n /**\n * Initializes a transform 2d object from options\n * @param {Transform2dOptions} [opts]\n * @private\n */\n\n\n _createClass(Transform2d, [{\n key: \"_initTransformFromOptions\",\n value: function _initTransformFromOptions(opts) {\n if (!opts) {\n return;\n }\n\n if (typeof opts.position !== \"undefined\") {\n this.setPosition(opts.position);\n }\n\n if (typeof opts.scale !== \"undefined\") {\n this.setScale(opts.scale);\n }\n\n if (typeof opts.rotation !== \"undefined\") {\n this.setRotation(opts.rotation);\n }\n\n if (typeof opts.pivot !== \"undefined\") {\n this.pivot = opts.pivot;\n }\n }\n\n /**\n * Initializes a transform 2d object from options,\n * called from either constructor (if used as base class)\n * or base mixin class (if used as a mixin)\n * @param {Transform2dOptions} [opts]\n * @protected\n */\n\n }, {\n key: \"initializer\",\n value: function initializer(opts) {\n this._localXform = _glMatrix.mat2d.create();\n this._lxformDirty = false;\n\n this._pivot = Point2d.create(0, 0);\n\n this._pos = Point2d.create(0, 0);\n this._scale = _glMatrix.vec2.fromValues(1, 1);\n this._rotDeg = 0;\n\n this._globalXform = _glMatrix.mat2d.create();\n this._xformDirty = false;\n this._parent = null;\n this._children = new Set();\n\n this._initTransformFromOptions(opts);\n }\n\n /**\n * Adds a child to this transform node\n * @param {Transform2d} childXform\n */\n\n }, {\n key: \"addChildXform\",\n value: function addChildXform(childXform) {\n if (!this._children.has(childXform)) {\n this._children.add(childXform);\n if (childXform._parent) {\n childXform._parent.removeChild(childXform);\n }\n childXform._parent = this;\n childXform._xformDirty = true;\n dirtyChildren(childXform._children);\n }\n }\n\n /**\n * Removes a child from this transform node\n * @param {Transform2d} childXform\n */\n\n }, {\n key: \"removeChildXform\",\n value: function removeChildXform(childXform) {\n this._children.delete(childXform);\n }\n\n /**\n * Unparents this node from its parent, if it has one\n */\n\n }, {\n key: \"unparentXform\",\n value: function unparentXform() {\n if (this._parent) {\n this._parent.removeChild(this);\n this._parent = null;\n _glMatrix.mat2d.copy(this._globalXform, this.localXform);\n }\n }\n\n /**\n * Sets the pivot of the transform\n * @param {Vec2d} pivot Offset vector from the origin to apply the transformations\n * @return {Transform2d}\n */\n\n }, {\n key: \"getPosition\",\n\n\n /**\n * Gets the current unparented position of the transform\n * @return {Point2d} This is the position of the node as if it were unparented\n */\n value: function getPosition() {\n return _glMatrix.vec2.clone(this._pos);\n }\n\n /**\n * Gets the reference to the unparented position of the transform, avoiding\n * a copy\n * @return {Point2d}\n * @readOnly\n */\n\n }, {\n key: \"getPositionRef\",\n value: function getPositionRef() {\n return this._pos;\n }\n\n /**\n * Gets the current world position of the transform, this is its position\n * after all parent transformations have been applied\n * @return {Point2d}\n */\n\n }, {\n key: \"getWorldPosition\",\n value: function getWorldPosition() {\n var xform = this.globalXform;\n return Point2d.create(xform[4], xform[5]);\n }\n\n /**\n * Sets the unparented world position of the transform\n * @param {Point2d} pos\n */\n\n }, {\n key: \"setPosition\",\n value: function setPosition(pos) {\n Point2d.copy(this._pos, pos);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n\n /**\n * Translates the unparented world position of the transform by an offset\n * @param {Vec2d} translation\n * @return {Transform2d}\n */\n\n }, {\n key: \"translate\",\n value: function translate(translation) {\n if (translation[0] || translation[1]) {\n Point2d.addVec2(this._pos, this._pos, translation);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n return this;\n }\n\n /**\n * Gets the current unparented x,y scale of the transform\n * @return {Vec2d}\n */\n\n }, {\n key: \"getScale\",\n value: function getScale() {\n return _glMatrix.vec2.clone(this._scale);\n }\n\n /**\n * Gets the current unparented x/y scale reference of the transform\n * avoiding a copy\n * @return {Vec2d}\n * @readOnly\n */\n\n }, {\n key: \"getScaleRef\",\n value: function getScaleRef() {\n return this._scale;\n }\n\n /**\n * Sets the unparented scale of the transform\n * @param {Vec2d} scale\n * @return {Transform2d}\n */\n\n }, {\n key: \"setScale\",\n value: function setScale(scale) {\n _glMatrix.vec2.copy(this._scale, scale);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n return this;\n }\n\n /**\n * Scales the current unparented scale by a 2d multiplier\n * @param {Vec2d} scaleMult\n * @return {Transform2d}\n */\n\n }, {\n key: \"scale\",\n value: function scale(scaleMult) {\n if (scaleMult[0] !== 1 || scaleMult[1] !== 1) {\n _glMatrix.vec2.multiply(this._scale, this._scale, scaleMult);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n return this;\n }\n\n /**\n * Gets the current unparented rotation in degrees of the transform\n * @return {number}\n */\n\n }, {\n key: \"getRotation\",\n value: function getRotation() {\n return this._rotDeg;\n }\n\n /**\n * Sets the unparented rotation of the transform\n * @param {number} deg Rotation in degrees\n * @return {Transform2d}\n */\n\n }, {\n key: \"setRotation\",\n value: function setRotation(deg) {\n this._rotDeg = deg;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n return this;\n }\n\n /**\n * Adds an additional rotation in degrees to the current rotation\n * of the transform\n * @param {number} deg Rotation offset in degrees\n * @return {Transform2d}\n */\n\n }, {\n key: \"rotate\",\n value: function rotate(deg) {\n if (deg) {\n this._rotDeg += deg;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n }\n return this;\n }\n\n /**\n * Utility function to dirty all the descendants of this node\n * @private\n */\n\n }, {\n key: \"_dirtyChildren\",\n value: function _dirtyChildren() {\n dirtyChildren(this._children);\n }\n\n /**\n * Updates the local affine matrix if marked as dirty\n * If derived/mixin classes have a _localXformUpdates method\n * defined, that will be called here when the local transform\n * is updated.\n * @private\n */\n\n }, {\n key: \"_updatelocalxform\",\n value: function _updatelocalxform() {\n if (this._lxformDirty) {\n buildXformMatrix(this._localXform, this._rotDeg, this._scale, this._pos, this._pivot);\n if (this._localXformUpdated) {\n this._localXformUpdated();\n }\n this._lxformDirty = false;\n }\n }\n\n /**\n * Updates the global 2x3 matrix of the transform if marked dirty\n * If derived/mixin classes have a _globalXformUpdates method\n * defined, that will be called here when the global transform\n * is updated.\n * @private\n */\n\n }, {\n key: \"_updateglobalxform\",\n value: function _updateglobalxform() {\n if (this._lxformDirty || this._xformDirty) {\n this._updatelocalxform();\n if (this._parent) {\n _glMatrix.mat2d.multiply(this._globalXform, this._parent.globalXform, this._localXform);\n } else {\n _glMatrix.mat2d.copy(this._globalXform, this._localXform);\n }\n if (this._globalXformUpdated) {\n this._globalXformUpdated();\n }\n this._xformDirty = false;\n }\n }\n\n /**\n * Gets the current local transformation matrix of the node.\n * @return {Mat2d}\n */\n\n }, {\n key: \"transformCtx\",\n\n\n /**\n * Sets the transform state of a 2d rendering context\n * @param {CanvasRenderingContext2D} ctx\n * @param {Mat2d} currMatrix The current matrix used to store the result of the\n * model-view-projection-screen matrix multiplication for this node\n * @param {Mat2d} worldToScreenMatrix The current world-to-screen tranform\n */\n value: function transformCtx(ctx, currMatrix, worldToScreenMatrix) {\n _glMatrix.mat2d.multiply(currMatrix, worldToScreenMatrix, this.globalXform);\n\n ctx.setTransform(currMatrix[0], currMatrix[1], currMatrix[2], currMatrix[3], currMatrix[4], currMatrix[5]);\n }\n\n /**\n * Converts a Transform2d instance to a JSON object\n * @param {Transform2d} xformObj\n * @return {{position: Point2d, scale: Vec2d, rotation: number, pivot: Vec2d}}\n */\n\n }, {\n key: \"pivot\",\n set: function set(pivot) {\n Point2d.copy(this._pivot, pivot);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n return this;\n }\n\n /**\n * Gets the current pivot of the transform\n * @return {Vec2d}\n */\n ,\n get: function get() {\n return Point2d.clone(this._pivot);\n }\n\n /**\n * Gets the current pivot reference of the transform.\n * @return {[type]} [description]\n * @readOnly\n */\n\n }, {\n key: \"pivotRef\",\n get: function get() {\n return this._pivot;\n }\n\n /**\n * Gets the parent transform node, if one is attached\n * @return {Transform2d}\n */\n\n }, {\n key: \"parent\",\n get: function get() {\n return this._parent;\n }\n }, {\n key: \"localXform\",\n get: function get() {\n this._updatelocalxform();\n return this._localXform;\n }\n\n /**\n * Gets the current global transformation matrix of the node. This is essentially\n * its local transform multiplied against all the local transforms of its parents.\n * This is ultimately used to convert a point from object space to world space, and\n * inversely, from world space to object space.\n * @return {Mat2d}\n */\n\n }, {\n key: \"globalXform\",\n get: function get() {\n this._updateglobalxform();\n return this._globalXform;\n }\n }], [{\n key: \"toJSON\",\n value: function toJSON(xformObj) {\n // TODO(croot): How do we deal with parenting here?\n // To properly deal with this, we may need to supply an\n // identifier for every created object... This may likely\n // need to be a name string supplied by the user\n var pos = xformObj.getPositionRef();\n var scale = xformObj.getScaleRef();\n var pivot = xformObj.pivotRef;\n return {\n position: [pos[0], pos[1]],\n scale: [scale[0], scale[1]],\n rotation: xformObj.getRotation(),\n pivot: [pivot[0], pivot[1]]\n };\n }\n }]);\n\n return Transform2d;\n}();\n\n/**\n * Creates a new Transform2d mixin class that is intended to be mixed in with\n * a class that inherits from the EventHandler class\n * @param {string} eventName Type name of the event fired when the transform is modified\n * @return {function} Mixin\n */\n\n\nexports.default = Transform2d;\nfunction createEventedTransform2dMixin(eventName) {\n /**\n * Transform2d modification event\n * @event EventedTransform2d#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n /**\n * @mixin Transform2d mixin with event firing when modified\n */\n return (0, _aggregation2.default)(null, Transform2d, function () {\n function EventedTransform2d() {\n _classCallCheck(this, EventedTransform2d);\n }\n\n _createClass(EventedTransform2d, [{\n key: \"setPosition\",\n\n\n /**\n * Sets the unparented position of the transform.\n * @param {Point2d} pos\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n value: function setPosition(pos) {\n if (!Point2d.equals(pos, this._pos)) {\n var prev = [this._pos[0], this._pos[1]];\n Point2d.copy(this._pos, pos);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"position\",\n prevVal: prev,\n currVal: pos\n });\n }\n return this;\n }\n\n /**\n * Translates the unparented position of a transform by an offset.\n * @param {Vec2d} translation\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"translate\",\n value: function translate(translation) {\n if (translation[0] || translation[1]) {\n var prev = [this._pos[0], this._pos[1]];\n Point2d.addVec2(this._pos, this._pos, translation);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"position\",\n prevVal: prev,\n currVal: [this._pos[0], this._pos[1]]\n });\n }\n return this;\n }\n\n /**\n * Sets the unparented 2d scale of the transform\n * @param {Vec2d} scale\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"setScale\",\n value: function setScale(scale) {\n if (!_glMatrix.vec2.equals(scale, this._scale)) {\n var prev = [this._scale[0], this._scale[1]];\n _glMatrix.vec2.copy(this._scale, scale);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"size\",\n prevVal: prev,\n currVal: scale\n });\n }\n return this;\n }\n\n /**\n * Multiplies the current unparented scale of the transform by a 2d scalar\n * @param {Vec2d} scaleMult\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"scale\",\n value: function scale(scaleMult) {\n if (scaleMult[0] !== 1 || scaleMult[1] !== 1) {\n var prev = [this._scale[0], this._scale[1]];\n _glMatrix.vec2.multiply(this._scale, this._scale, scaleMult);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"size\",\n prevVal: prev,\n currVal: [this._scale[0], this._scale[1]]\n });\n }\n return this;\n }\n\n /**\n * Sets the unparented rotation of the transform in degrees\n * @param {number} deg Rotation angle in degrees\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"setRotation\",\n value: function setRotation(deg) {\n var degToUse = deg % 360;\n if (degToUse !== this._rotDeg) {\n var prev = this._rotDeg;\n this._rotDeg = degToUse;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"orientation\",\n prevVal: prev,\n curral: this._rotDeg\n });\n }\n }\n\n /**\n * Adds a rotation angle in degrees to the current unparented\n * rotation of the transform.\n * @param {number} deg Additional rotation angle in degrees\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"rotate\",\n value: function rotate(deg) {\n if (deg) {\n var prev = this._rotDeg;\n this._rotDeg += deg;\n this._rotDeg %= 360;\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"orientation\",\n prevVal: prev,\n curral: this._rotDeg\n });\n }\n return this;\n }\n\n /**\n * Utility function to reset all the unparented transform parameters\n * @param {number} tx Translation in x in world units\n * @param {number} ty Translation in y in world units\n * @param {number} sx Scale in x in world units\n * @param {number} sy Scale in y in world units\n * @param {number} deg Rotation angle degrees\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n\n }, {\n key: \"setTransformations\",\n value: function setTransformations(tx, ty, sx, sy, deg) {\n var attrs = [];\n var prevVals = [];\n var currVals = [];\n if (typeof tx !== \"undefined\" && typeof ty !== \"undefined\" && (!_glMatrix.glMatrix.equals(tx, this._pos[0]) || !_glMatrix.glMatrix.equals(ty, this._pos[1]))) {\n var prev = Point2d.clone(this._pos);\n this._pos[0] = tx;\n this._pos[1] = ty;\n attrs.push(\"position\");\n prevVals.push(prev);\n currVals.push(Point2d.clone(this._pos));\n }\n\n if (typeof sx !== \"undefined\" && typeof sy !== \"undefined\" && (!_glMatrix.glMatrix.equals(sx, this._scale[0]) || !_glMatrix.glMatrix.equals(sy, this._scale[1]))) {\n var _prev = _glMatrix.vec2.clone(this._scale);\n _glMatrix.vec2.set(this._scale, sx, sy);\n attrs.push(\"size\");\n prevVals.push(_prev);\n currVals.push(_glMatrix.vec2.clone(this._scale));\n }\n\n if (typeof deg !== \"undefined\") {\n var degToUse = deg % 360;\n if (!_glMatrix.glMatrix.equals(degToUse, this._rotDeg)) {\n var _prev2 = this._rotDeg;\n this._rotDeg = degToUse;\n attrs.push(\"orientation\");\n prevVals.push(_prev2);\n currVals.push(this._rotDeg);\n }\n }\n\n if (attrs.length) {\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attrs: attrs,\n prevVals: prevVals,\n currVals: currVals\n });\n }\n return this;\n }\n }, {\n key: \"pivot\",\n\n /**\n * Sets the unparented pivot of the transform. The pivot is\n * the offset from the transform's primary position where the\n * transformation is applied.\n * @param {Vec2d} pivot\n * @fires EventedTransform2d#changed\n * @return {EventedTransform2d}\n */\n set: function set(pivot) {\n if (!Point2d.equals(pivot, this._pivot)) {\n var prev = [this._pivot[0], this._pivot[1]];\n Point2d.copy(this._pivot, pivot);\n this._lxformDirty = true;\n dirtyChildren(this._children);\n this.fire(eventName, {\n attr: \"pivot\",\n prevVal: prev,\n currVal: pivot\n });\n }\n return this;\n }\n\n /**\n * Gets a copy of the unparented pivot of the transform\n * @return {Vec2d}\n */\n ,\n get: function get() {\n return Point2d.clone(this._pivot);\n }\n }]);\n\n return EventedTransform2d;\n }());\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvdHJhbnNmb3JtMmQuanM/ZDAwMiJdLCJuYW1lcyI6WyJidWlsZFhmb3JtTWF0cml4IiwiY3JlYXRlRXZlbnRlZFRyYW5zZm9ybTJkTWl4aW4iLCJQb2ludDJkIiwibWF0IiwicmRlZyIsInMiLCJ0IiwicGl2b3QiLCJpZGVudGl0eSIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsIkRFR19UT19SQUQiLCJzY2FsZSIsImRpcnR5Q2hpbGRyZW4iLCJjaGlsZHJlbiIsImZvckVhY2giLCJjaGlsZCIsIl94Zm9ybURpcnR5IiwiX2NoaWxkcmVuIiwiVHJhbnNmb3JtMmQiLCJvcHRzIiwiaW5pdGlhbGl6ZXIiLCJwb3NpdGlvbiIsInNldFBvc2l0aW9uIiwic2V0U2NhbGUiLCJyb3RhdGlvbiIsInNldFJvdGF0aW9uIiwiX2xvY2FsWGZvcm0iLCJjcmVhdGUiLCJfbHhmb3JtRGlydHkiLCJfcGl2b3QiLCJfcG9zIiwiX3NjYWxlIiwiZnJvbVZhbHVlcyIsIl9yb3REZWciLCJfZ2xvYmFsWGZvcm0iLCJfcGFyZW50IiwiU2V0IiwiX2luaXRUcmFuc2Zvcm1Gcm9tT3B0aW9ucyIsImNoaWxkWGZvcm0iLCJoYXMiLCJhZGQiLCJyZW1vdmVDaGlsZCIsImRlbGV0ZSIsImNvcHkiLCJsb2NhbFhmb3JtIiwiY2xvbmUiLCJ4Zm9ybSIsImdsb2JhbFhmb3JtIiwicG9zIiwidHJhbnNsYXRpb24iLCJhZGRWZWMyIiwic2NhbGVNdWx0IiwibXVsdGlwbHkiLCJkZWciLCJfbG9jYWxYZm9ybVVwZGF0ZWQiLCJfdXBkYXRlbG9jYWx4Zm9ybSIsIl9nbG9iYWxYZm9ybVVwZGF0ZWQiLCJjdHgiLCJjdXJyTWF0cml4Iiwid29ybGRUb1NjcmVlbk1hdHJpeCIsInNldFRyYW5zZm9ybSIsIl91cGRhdGVnbG9iYWx4Zm9ybSIsInhmb3JtT2JqIiwiZ2V0UG9zaXRpb25SZWYiLCJnZXRTY2FsZVJlZiIsInBpdm90UmVmIiwiZ2V0Um90YXRpb24iLCJldmVudE5hbWUiLCJlcXVhbHMiLCJwcmV2IiwiZmlyZSIsImF0dHIiLCJwcmV2VmFsIiwiY3VyclZhbCIsImRlZ1RvVXNlIiwiY3VycmFsIiwidHgiLCJ0eSIsInN4Iiwic3kiLCJhdHRycyIsInByZXZWYWxzIiwiY3VyclZhbHMiLCJwdXNoIiwic2V0IiwibGVuZ3RoIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7UUFrQmdCQSxnQixHQUFBQSxnQjtRQTZaQUMsNkIsR0FBQUEsNkI7O0FBN2FoQjs7SUFBWUMsTzs7QUFDWjs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7O0FBV08sU0FBU0YsZ0JBQVQsQ0FBMEJHLEdBQTFCLEVBQStCQyxJQUEvQixFQUFxQ0MsQ0FBckMsRUFBd0NDLENBQXhDLEVBQTJDQyxLQUEzQyxFQUFrRDtBQUN2RCxrQkFBTUMsUUFBTixDQUFlTCxHQUFmO0FBQ0Esa0JBQU1NLFNBQU4sQ0FBZ0JOLEdBQWhCLEVBQXFCQSxHQUFyQixFQUEwQixDQUFDRyxFQUFFLENBQUYsSUFBT0MsTUFBTSxDQUFOLENBQVIsRUFBa0JELEVBQUUsQ0FBRixJQUFPQyxNQUFNLENBQU4sQ0FBekIsQ0FBMUI7QUFDQSxrQkFBTUcsTUFBTixDQUFhUCxHQUFiLEVBQWtCQSxHQUFsQixFQUF1QixlQUFLUSxVQUFMLEdBQWtCUCxJQUF6QztBQUNBLGtCQUFNUSxLQUFOLENBQVlULEdBQVosRUFBaUJBLEdBQWpCLEVBQXNCRSxDQUF0QjtBQUNBLGtCQUFNSSxTQUFOLENBQWdCTixHQUFoQixFQUFxQkEsR0FBckIsRUFBMEIsQ0FBQyxDQUFDSSxNQUFNLENBQU4sQ0FBRixFQUFZLENBQUNBLE1BQU0sQ0FBTixDQUFiLENBQTFCO0FBQ0EsU0FBT0osR0FBUDtBQUNEOztBQUVEOzs7Ozs7QUFNQSxTQUFTVSxhQUFULENBQXVCQyxRQUF2QixFQUFpQztBQUMvQkEsV0FBU0MsT0FBVCxDQUFpQixpQkFBUztBQUN4QkMsVUFBTUMsV0FBTixHQUFvQixJQUFwQjtBQUNBSixrQkFBY0csTUFBTUUsU0FBcEI7QUFDRCxHQUhEO0FBSUQ7O0FBRUQ7Ozs7Ozs7O0FBUUE7Ozs7O0lBSXFCQyxXO0FBQ25COzs7OztBQUtBLHVCQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQ2hCLFNBQUtDLFdBQUwsQ0FBaUJELElBQWpCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs4Q0FLMEJBLEksRUFBTTtBQUM5QixVQUFJLENBQUNBLElBQUwsRUFBVztBQUNUO0FBQ0Q7O0FBRUQsVUFBSSxPQUFPQSxLQUFLRSxRQUFaLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDLGFBQUtDLFdBQUwsQ0FBaUJILEtBQUtFLFFBQXRCO0FBQ0Q7O0FBRUQsVUFBSSxPQUFPRixLQUFLUixLQUFaLEtBQXNCLFdBQTFCLEVBQXVDO0FBQ3JDLGFBQUtZLFFBQUwsQ0FBY0osS0FBS1IsS0FBbkI7QUFDRDs7QUFFRCxVQUFJLE9BQU9RLEtBQUtLLFFBQVosS0FBeUIsV0FBN0IsRUFBMEM7QUFDeEMsYUFBS0MsV0FBTCxDQUFpQk4sS0FBS0ssUUFBdEI7QUFDRDs7QUFFRCxVQUFJLE9BQU9MLEtBQUtiLEtBQVosS0FBc0IsV0FBMUIsRUFBdUM7QUFDckMsYUFBS0EsS0FBTCxHQUFhYSxLQUFLYixLQUFsQjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7Ozs7Z0NBT1lhLEksRUFBTTtBQUNoQixXQUFLTyxXQUFMLEdBQW1CLGdCQUFNQyxNQUFOLEVBQW5CO0FBQ0EsV0FBS0MsWUFBTCxHQUFvQixLQUFwQjs7QUFFQSxXQUFLQyxNQUFMLEdBQWM1QixRQUFRMEIsTUFBUixDQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBZDs7QUFFQSxXQUFLRyxJQUFMLEdBQVk3QixRQUFRMEIsTUFBUixDQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBWjtBQUNBLFdBQUtJLE1BQUwsR0FBYyxlQUFNQyxVQUFOLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLENBQWQ7QUFDQSxXQUFLQyxPQUFMLEdBQWUsQ0FBZjs7QUFFQSxXQUFLQyxZQUFMLEdBQW9CLGdCQUFNUCxNQUFOLEVBQXBCO0FBQ0EsV0FBS1gsV0FBTCxHQUFtQixLQUFuQjtBQUNBLFdBQUttQixPQUFMLEdBQWUsSUFBZjtBQUNBLFdBQUtsQixTQUFMLEdBQWlCLElBQUltQixHQUFKLEVBQWpCOztBQUVBLFdBQUtDLHlCQUFMLENBQStCbEIsSUFBL0I7QUFDRDs7QUFFRDs7Ozs7OztrQ0FJY21CLFUsRUFBWTtBQUN4QixVQUFJLENBQUMsS0FBS3JCLFNBQUwsQ0FBZXNCLEdBQWYsQ0FBbUJELFVBQW5CLENBQUwsRUFBcUM7QUFDbkMsYUFBS3JCLFNBQUwsQ0FBZXVCLEdBQWYsQ0FBbUJGLFVBQW5CO0FBQ0EsWUFBSUEsV0FBV0gsT0FBZixFQUF3QjtBQUN0QkcscUJBQVdILE9BQVgsQ0FBbUJNLFdBQW5CLENBQStCSCxVQUEvQjtBQUNEO0FBQ0RBLG1CQUFXSCxPQUFYLEdBQXFCLElBQXJCO0FBQ0FHLG1CQUFXdEIsV0FBWCxHQUF5QixJQUF6QjtBQUNBSixzQkFBYzBCLFdBQVdyQixTQUF6QjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7cUNBSWlCcUIsVSxFQUFZO0FBQzNCLFdBQUtyQixTQUFMLENBQWV5QixNQUFmLENBQXNCSixVQUF0QjtBQUNEOztBQUVEOzs7Ozs7b0NBR2dCO0FBQ2QsVUFBSSxLQUFLSCxPQUFULEVBQWtCO0FBQ2hCLGFBQUtBLE9BQUwsQ0FBYU0sV0FBYixDQUF5QixJQUF6QjtBQUNBLGFBQUtOLE9BQUwsR0FBZSxJQUFmO0FBQ0Esd0JBQU1RLElBQU4sQ0FBVyxLQUFLVCxZQUFoQixFQUE4QixLQUFLVSxVQUFuQztBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7Ozs7QUFxQ0E7Ozs7a0NBSWM7QUFDWixhQUFPLGVBQU1DLEtBQU4sQ0FBWSxLQUFLZixJQUFqQixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OztxQ0FNaUI7QUFDZixhQUFPLEtBQUtBLElBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7dUNBS21CO0FBQ2pCLFVBQU1nQixRQUFRLEtBQUtDLFdBQW5CO0FBQ0EsYUFBTzlDLFFBQVEwQixNQUFSLENBQWVtQixNQUFNLENBQU4sQ0FBZixFQUF5QkEsTUFBTSxDQUFOLENBQXpCLENBQVA7QUFDRDs7QUFFRDs7Ozs7OztnQ0FJWUUsRyxFQUFLO0FBQ2YvQyxjQUFRMEMsSUFBUixDQUFhLEtBQUtiLElBQWxCLEVBQXdCa0IsR0FBeEI7QUFDQSxXQUFLcEIsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsb0JBQWMsS0FBS0ssU0FBbkI7QUFDRDs7QUFFRDs7Ozs7Ozs7OEJBS1VnQyxXLEVBQWE7QUFDckIsVUFBSUEsWUFBWSxDQUFaLEtBQWtCQSxZQUFZLENBQVosQ0FBdEIsRUFBc0M7QUFDcENoRCxnQkFBUWlELE9BQVIsQ0FBZ0IsS0FBS3BCLElBQXJCLEVBQTJCLEtBQUtBLElBQWhDLEVBQXNDbUIsV0FBdEM7QUFDQSxhQUFLckIsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsc0JBQWMsS0FBS0ssU0FBbkI7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7OytCQUlXO0FBQ1QsYUFBTyxlQUFNNEIsS0FBTixDQUFZLEtBQUtkLE1BQWpCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O2tDQU1jO0FBQ1osYUFBTyxLQUFLQSxNQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OzZCQUtTcEIsSyxFQUFPO0FBQ2QscUJBQU1nQyxJQUFOLENBQVcsS0FBS1osTUFBaEIsRUFBd0JwQixLQUF4QjtBQUNBLFdBQUtpQixZQUFMLEdBQW9CLElBQXBCO0FBQ0FoQixvQkFBYyxLQUFLSyxTQUFuQjtBQUNBLGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7OzswQkFLTWtDLFMsRUFBVztBQUNmLFVBQUlBLFVBQVUsQ0FBVixNQUFpQixDQUFqQixJQUFzQkEsVUFBVSxDQUFWLE1BQWlCLENBQTNDLEVBQThDO0FBQzVDLHVCQUFNQyxRQUFOLENBQWUsS0FBS3JCLE1BQXBCLEVBQTRCLEtBQUtBLE1BQWpDLEVBQXlDb0IsU0FBekM7QUFDQSxhQUFLdkIsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsc0JBQWMsS0FBS0ssU0FBbkI7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7O2tDQUljO0FBQ1osYUFBTyxLQUFLZ0IsT0FBWjtBQUNEOztBQUVEOzs7Ozs7OztnQ0FLWW9CLEcsRUFBSztBQUNmLFdBQUtwQixPQUFMLEdBQWVvQixHQUFmO0FBQ0EsV0FBS3pCLFlBQUwsR0FBb0IsSUFBcEI7QUFDQWhCLG9CQUFjLEtBQUtLLFNBQW5CO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OzsyQkFNT29DLEcsRUFBSztBQUNWLFVBQUlBLEdBQUosRUFBUztBQUNQLGFBQUtwQixPQUFMLElBQWdCb0IsR0FBaEI7QUFDQSxhQUFLekIsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsc0JBQWMsS0FBS0ssU0FBbkI7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7O3FDQUlpQjtBQUNmTCxvQkFBYyxLQUFLSyxTQUFuQjtBQUNEOztBQUVEOzs7Ozs7Ozs7O3dDQU9vQjtBQUNsQixVQUFJLEtBQUtXLFlBQVQsRUFBdUI7QUFDckI3Qix5QkFBaUIsS0FBSzJCLFdBQXRCLEVBQW1DLEtBQUtPLE9BQXhDLEVBQWlELEtBQUtGLE1BQXRELEVBQThELEtBQUtELElBQW5FLEVBQXlFLEtBQUtELE1BQTlFO0FBQ0EsWUFBSSxLQUFLeUIsa0JBQVQsRUFBNkI7QUFDM0IsZUFBS0Esa0JBQUw7QUFDRDtBQUNELGFBQUsxQixZQUFMLEdBQW9CLEtBQXBCO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7Ozt5Q0FPcUI7QUFDbkIsVUFBSSxLQUFLQSxZQUFMLElBQXFCLEtBQUtaLFdBQTlCLEVBQTJDO0FBQ3pDLGFBQUt1QyxpQkFBTDtBQUNBLFlBQUksS0FBS3BCLE9BQVQsRUFBa0I7QUFDaEIsMEJBQU1pQixRQUFOLENBQWUsS0FBS2xCLFlBQXBCLEVBQWtDLEtBQUtDLE9BQUwsQ0FBYVksV0FBL0MsRUFBNEQsS0FBS3JCLFdBQWpFO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsMEJBQU1pQixJQUFOLENBQVcsS0FBS1QsWUFBaEIsRUFBOEIsS0FBS1IsV0FBbkM7QUFDRDtBQUNELFlBQUksS0FBSzhCLG1CQUFULEVBQThCO0FBQzVCLGVBQUtBLG1CQUFMO0FBQ0Q7QUFDRCxhQUFLeEMsV0FBTCxHQUFtQixLQUFuQjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7OztBQXFCQTs7Ozs7OztpQ0FPYXlDLEcsRUFBS0MsVSxFQUFZQyxtQixFQUFxQjtBQUNqRCxzQkFBTVAsUUFBTixDQUFlTSxVQUFmLEVBQTJCQyxtQkFBM0IsRUFBZ0QsS0FBS1osV0FBckQ7O0FBRUFVLFVBQUlHLFlBQUosQ0FBaUJGLFdBQVcsQ0FBWCxDQUFqQixFQUNFQSxXQUFXLENBQVgsQ0FERixFQUVFQSxXQUFXLENBQVgsQ0FGRixFQUdFQSxXQUFXLENBQVgsQ0FIRixFQUlFQSxXQUFXLENBQVgsQ0FKRixFQUtFQSxXQUFXLENBQVgsQ0FMRjtBQU1EOztBQUVEOzs7Ozs7OztzQkF6UFVwRCxLLEVBQU87QUFDZkwsY0FBUTBDLElBQVIsQ0FBYSxLQUFLZCxNQUFsQixFQUEwQnZCLEtBQTFCO0FBQ0EsV0FBS3NCLFlBQUwsR0FBb0IsSUFBcEI7QUFDQWhCLG9CQUFjLEtBQUtLLFNBQW5CO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlZO0FBQ1YsYUFBT2hCLFFBQVE0QyxLQUFSLENBQWMsS0FBS2hCLE1BQW5CLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7d0JBS2U7QUFDYixhQUFPLEtBQUtBLE1BQVo7QUFDRDs7QUFFRDs7Ozs7Ozt3QkFJYTtBQUNYLGFBQU8sS0FBS00sT0FBWjtBQUNEOzs7d0JBd0xnQjtBQUNmLFdBQUtvQixpQkFBTDtBQUNBLGFBQU8sS0FBSzdCLFdBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozt3QkFPa0I7QUFDaEIsV0FBS21DLGtCQUFMO0FBQ0EsYUFBTyxLQUFLM0IsWUFBWjtBQUNEOzs7MkJBeUJhNEIsUSxFQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBTWQsTUFBTWMsU0FBU0MsY0FBVCxFQUFaO0FBQ0EsVUFBTXBELFFBQVFtRCxTQUFTRSxXQUFULEVBQWQ7QUFDQSxVQUFNMUQsUUFBUXdELFNBQVNHLFFBQXZCO0FBQ0EsYUFBTztBQUNMNUMsa0JBQVUsQ0FBQzJCLElBQUksQ0FBSixDQUFELEVBQVNBLElBQUksQ0FBSixDQUFULENBREw7QUFFTHJDLGVBQU8sQ0FBQ0EsTUFBTSxDQUFOLENBQUQsRUFBV0EsTUFBTSxDQUFOLENBQVgsQ0FGRjtBQUdMYSxrQkFBVXNDLFNBQVNJLFdBQVQsRUFITDtBQUlMNUQsZUFBTyxDQUFDQSxNQUFNLENBQU4sQ0FBRCxFQUFXQSxNQUFNLENBQU4sQ0FBWDtBQUpGLE9BQVA7QUFNRDs7Ozs7O0FBR0g7Ozs7Ozs7O2tCQXJYcUJZLFc7QUEyWGQsU0FBU2xCLDZCQUFULENBQXVDbUUsU0FBdkMsRUFBa0Q7QUFDdkQ7Ozs7Ozs7OztBQVNBOzs7QUFHQSxTQUFPLDJCQUFZLElBQVosRUFBa0JqRCxXQUFsQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOzs7QUFnQ0w7Ozs7OztBQWhDSyxrQ0FzQ084QixHQXRDUCxFQXNDWTtBQUNmLFlBQUksQ0FBQy9DLFFBQVFtRSxNQUFSLENBQWVwQixHQUFmLEVBQW9CLEtBQUtsQixJQUF6QixDQUFMLEVBQXFDO0FBQ25DLGNBQU11QyxPQUFPLENBQUMsS0FBS3ZDLElBQUwsQ0FBVSxDQUFWLENBQUQsRUFBZSxLQUFLQSxJQUFMLENBQVUsQ0FBVixDQUFmLENBQWI7QUFDQTdCLGtCQUFRMEMsSUFBUixDQUFhLEtBQUtiLElBQWxCLEVBQXdCa0IsR0FBeEI7QUFDQSxlQUFLcEIsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsd0JBQWMsS0FBS0ssU0FBbkI7QUFDQSxlQUFLcUQsSUFBTCxDQUFVSCxTQUFWLEVBQXFCO0FBQ25CSSxrQkFBTSxVQURhO0FBRW5CQyxxQkFBU0gsSUFGVTtBQUduQkkscUJBQVN6QjtBQUhVLFdBQXJCO0FBS0Q7QUFDRCxlQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7OztBQXJESztBQUFBO0FBQUEsZ0NBMkRLQyxXQTNETCxFQTJEa0I7QUFDckIsWUFBSUEsWUFBWSxDQUFaLEtBQWtCQSxZQUFZLENBQVosQ0FBdEIsRUFBc0M7QUFDcEMsY0FBTW9CLE9BQU8sQ0FBQyxLQUFLdkMsSUFBTCxDQUFVLENBQVYsQ0FBRCxFQUFlLEtBQUtBLElBQUwsQ0FBVSxDQUFWLENBQWYsQ0FBYjtBQUNBN0Isa0JBQVFpRCxPQUFSLENBQWdCLEtBQUtwQixJQUFyQixFQUEyQixLQUFLQSxJQUFoQyxFQUFzQ21CLFdBQXRDO0FBQ0EsZUFBS3JCLFlBQUwsR0FBb0IsSUFBcEI7QUFDQWhCLHdCQUFjLEtBQUtLLFNBQW5CO0FBQ0EsZUFBS3FELElBQUwsQ0FBVUgsU0FBVixFQUFxQjtBQUNuQkksa0JBQU0sVUFEYTtBQUVuQkMscUJBQVNILElBRlU7QUFHbkJJLHFCQUFTLENBQUMsS0FBSzNDLElBQUwsQ0FBVSxDQUFWLENBQUQsRUFBZSxLQUFLQSxJQUFMLENBQVUsQ0FBVixDQUFmO0FBSFUsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7O0FBMUVLO0FBQUE7QUFBQSwrQkFnRkluQixLQWhGSixFQWdGVztBQUNkLFlBQUksQ0FBQyxlQUFNeUQsTUFBTixDQUFhekQsS0FBYixFQUFvQixLQUFLb0IsTUFBekIsQ0FBTCxFQUF1QztBQUNyQyxjQUFNc0MsT0FBTyxDQUFDLEtBQUt0QyxNQUFMLENBQVksQ0FBWixDQUFELEVBQWlCLEtBQUtBLE1BQUwsQ0FBWSxDQUFaLENBQWpCLENBQWI7QUFDQSx5QkFBTVksSUFBTixDQUFXLEtBQUtaLE1BQWhCLEVBQXdCcEIsS0FBeEI7QUFDQSxlQUFLaUIsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsd0JBQWMsS0FBS0ssU0FBbkI7QUFDQSxlQUFLcUQsSUFBTCxDQUFVSCxTQUFWLEVBQXFCO0FBQ25CSSxrQkFBTSxNQURhO0FBRW5CQyxxQkFBU0gsSUFGVTtBQUduQkkscUJBQVM5RDtBQUhVLFdBQXJCO0FBS0Q7QUFDRCxlQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7OztBQS9GSztBQUFBO0FBQUEsNEJBcUdDd0MsU0FyR0QsRUFxR1k7QUFDZixZQUFJQSxVQUFVLENBQVYsTUFBaUIsQ0FBakIsSUFBc0JBLFVBQVUsQ0FBVixNQUFpQixDQUEzQyxFQUE4QztBQUM1QyxjQUFNa0IsT0FBTyxDQUFDLEtBQUt0QyxNQUFMLENBQVksQ0FBWixDQUFELEVBQWlCLEtBQUtBLE1BQUwsQ0FBWSxDQUFaLENBQWpCLENBQWI7QUFDQSx5QkFBTXFCLFFBQU4sQ0FBZSxLQUFLckIsTUFBcEIsRUFBNEIsS0FBS0EsTUFBakMsRUFBeUNvQixTQUF6QztBQUNBLGVBQUt2QixZQUFMLEdBQW9CLElBQXBCO0FBQ0FoQix3QkFBYyxLQUFLSyxTQUFuQjtBQUNBLGVBQUtxRCxJQUFMLENBQVVILFNBQVYsRUFBcUI7QUFDbkJJLGtCQUFNLE1BRGE7QUFFbkJDLHFCQUFTSCxJQUZVO0FBR25CSSxxQkFBUyxDQUFDLEtBQUsxQyxNQUFMLENBQVksQ0FBWixDQUFELEVBQWlCLEtBQUtBLE1BQUwsQ0FBWSxDQUFaLENBQWpCO0FBSFUsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7O0FBcEhLO0FBQUE7QUFBQSxrQ0EwSE9zQixHQTFIUCxFQTBIWTtBQUNmLFlBQU1xQixXQUFXckIsTUFBTSxHQUF2QjtBQUNBLFlBQUlxQixhQUFhLEtBQUt6QyxPQUF0QixFQUErQjtBQUM3QixjQUFNb0MsT0FBTyxLQUFLcEMsT0FBbEI7QUFDQSxlQUFLQSxPQUFMLEdBQWV5QyxRQUFmO0FBQ0EsZUFBSzlDLFlBQUwsR0FBb0IsSUFBcEI7QUFDQWhCLHdCQUFjLEtBQUtLLFNBQW5CO0FBQ0EsZUFBS3FELElBQUwsQ0FBVUgsU0FBVixFQUFxQjtBQUNuQkksa0JBQU0sYUFEYTtBQUVuQkMscUJBQVNILElBRlU7QUFHbkJNLG9CQUFRLEtBQUsxQztBQUhNLFdBQXJCO0FBS0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7QUF6SUs7QUFBQTtBQUFBLDZCQWdKRW9CLEdBaEpGLEVBZ0pPO0FBQ1YsWUFBSUEsR0FBSixFQUFTO0FBQ1AsY0FBTWdCLE9BQU8sS0FBS3BDLE9BQWxCO0FBQ0EsZUFBS0EsT0FBTCxJQUFnQm9CLEdBQWhCO0FBQ0EsZUFBS3BCLE9BQUwsSUFBZ0IsR0FBaEI7QUFDQSxlQUFLTCxZQUFMLEdBQW9CLElBQXBCO0FBQ0FoQix3QkFBYyxLQUFLSyxTQUFuQjtBQUNBLGVBQUtxRCxJQUFMLENBQVVILFNBQVYsRUFBcUI7QUFDbkJJLGtCQUFNLGFBRGE7QUFFbkJDLHFCQUFTSCxJQUZVO0FBR25CTSxvQkFBUSxLQUFLMUM7QUFITSxXQUFyQjtBQUtEO0FBQ0QsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O0FBaEtLO0FBQUE7QUFBQSx5Q0EwS2MyQyxFQTFLZCxFQTBLa0JDLEVBMUtsQixFQTBLc0JDLEVBMUt0QixFQTBLMEJDLEVBMUsxQixFQTBLOEIxQixHQTFLOUIsRUEwS21DO0FBQ3RDLFlBQU0yQixRQUFRLEVBQWQ7QUFDQSxZQUFNQyxXQUFXLEVBQWpCO0FBQ0EsWUFBTUMsV0FBVyxFQUFqQjtBQUNBLFlBQUksT0FBT04sRUFBUCxLQUFjLFdBQWQsSUFBNkIsT0FBT0MsRUFBUCxLQUFjLFdBQTNDLEtBQTJELENBQUMsbUJBQVNULE1BQVQsQ0FBZ0JRLEVBQWhCLEVBQW9CLEtBQUs5QyxJQUFMLENBQVUsQ0FBVixDQUFwQixDQUFELElBQXNDLENBQUMsbUJBQVNzQyxNQUFULENBQWdCUyxFQUFoQixFQUFvQixLQUFLL0MsSUFBTCxDQUFVLENBQVYsQ0FBcEIsQ0FBbEcsQ0FBSixFQUEwSTtBQUN4SSxjQUFNdUMsT0FBT3BFLFFBQVE0QyxLQUFSLENBQWMsS0FBS2YsSUFBbkIsQ0FBYjtBQUNBLGVBQUtBLElBQUwsQ0FBVSxDQUFWLElBQWU4QyxFQUFmO0FBQ0EsZUFBSzlDLElBQUwsQ0FBVSxDQUFWLElBQWUrQyxFQUFmO0FBQ0FHLGdCQUFNRyxJQUFOLENBQVcsVUFBWDtBQUNBRixtQkFBU0UsSUFBVCxDQUFjZCxJQUFkO0FBQ0FhLG1CQUFTQyxJQUFULENBQWNsRixRQUFRNEMsS0FBUixDQUFjLEtBQUtmLElBQW5CLENBQWQ7QUFDRDs7QUFFRCxZQUFJLE9BQU9nRCxFQUFQLEtBQWMsV0FBZCxJQUE2QixPQUFPQyxFQUFQLEtBQWMsV0FBM0MsS0FBMkQsQ0FBQyxtQkFBU1gsTUFBVCxDQUFnQlUsRUFBaEIsRUFBb0IsS0FBSy9DLE1BQUwsQ0FBWSxDQUFaLENBQXBCLENBQUQsSUFBd0MsQ0FBQyxtQkFBU3FDLE1BQVQsQ0FBZ0JXLEVBQWhCLEVBQW9CLEtBQUtoRCxNQUFMLENBQVksQ0FBWixDQUFwQixDQUFwRyxDQUFKLEVBQThJO0FBQzVJLGNBQU1zQyxRQUFPLGVBQU14QixLQUFOLENBQVksS0FBS2QsTUFBakIsQ0FBYjtBQUNBLHlCQUFNcUQsR0FBTixDQUFVLEtBQUtyRCxNQUFmLEVBQXVCK0MsRUFBdkIsRUFBMkJDLEVBQTNCO0FBQ0FDLGdCQUFNRyxJQUFOLENBQVcsTUFBWDtBQUNBRixtQkFBU0UsSUFBVCxDQUFjZCxLQUFkO0FBQ0FhLG1CQUFTQyxJQUFULENBQWMsZUFBTXRDLEtBQU4sQ0FBWSxLQUFLZCxNQUFqQixDQUFkO0FBQ0Q7O0FBRUQsWUFBSSxPQUFPc0IsR0FBUCxLQUFlLFdBQW5CLEVBQWdDO0FBQzlCLGNBQU1xQixXQUFXckIsTUFBTSxHQUF2QjtBQUNBLGNBQUksQ0FBQyxtQkFBU2UsTUFBVCxDQUFnQk0sUUFBaEIsRUFBMEIsS0FBS3pDLE9BQS9CLENBQUwsRUFBOEM7QUFDNUMsZ0JBQU1vQyxTQUFPLEtBQUtwQyxPQUFsQjtBQUNBLGlCQUFLQSxPQUFMLEdBQWV5QyxRQUFmO0FBQ0FNLGtCQUFNRyxJQUFOLENBQVcsYUFBWDtBQUNBRixxQkFBU0UsSUFBVCxDQUFjZCxNQUFkO0FBQ0FhLHFCQUFTQyxJQUFULENBQWMsS0FBS2xELE9BQW5CO0FBQ0Q7QUFDRjs7QUFFRCxZQUFJK0MsTUFBTUssTUFBVixFQUFrQjtBQUNoQixlQUFLekQsWUFBTCxHQUFvQixJQUFwQjtBQUNBaEIsd0JBQWMsS0FBS0ssU0FBbkI7QUFDQSxlQUFLcUQsSUFBTCxDQUFVSCxTQUFWLEVBQXFCO0FBQ25CYSx3QkFEbUI7QUFFbkJDLDhCQUZtQjtBQUduQkM7QUFIbUIsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEO0FBcE5JO0FBQUE7O0FBQ0w7Ozs7Ozs7O0FBREssd0JBU0s1RSxLQVRMLEVBU1k7QUFDZixZQUFJLENBQUNMLFFBQVFtRSxNQUFSLENBQWU5RCxLQUFmLEVBQXNCLEtBQUt1QixNQUEzQixDQUFMLEVBQXlDO0FBQ3ZDLGNBQU13QyxPQUFPLENBQUMsS0FBS3hDLE1BQUwsQ0FBWSxDQUFaLENBQUQsRUFBaUIsS0FBS0EsTUFBTCxDQUFZLENBQVosQ0FBakIsQ0FBYjtBQUNBNUIsa0JBQVEwQyxJQUFSLENBQWEsS0FBS2QsTUFBbEIsRUFBMEJ2QixLQUExQjtBQUNBLGVBQUtzQixZQUFMLEdBQW9CLElBQXBCO0FBQ0FoQix3QkFBYyxLQUFLSyxTQUFuQjtBQUNBLGVBQUtxRCxJQUFMLENBQVVILFNBQVYsRUFBcUI7QUFDbkJJLGtCQUFNLE9BRGE7QUFFbkJDLHFCQUFTSCxJQUZVO0FBR25CSSxxQkFBU25FO0FBSFUsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7O0FBeEJLO0FBQUEsMEJBNEJPO0FBQ1YsZUFBT0wsUUFBUTRDLEtBQVIsQ0FBYyxLQUFLaEIsTUFBbkIsQ0FBUDtBQUNEO0FBOUJJOztBQUFBO0FBQUEsTUFBUDtBQXNORCIsImZpbGUiOiIxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQge2dsTWF0cml4IGFzIEdMTWF0cml4LCBtYXQyZCBhcyBNYXQyZCwgdmVjMiBhcyBWZWMyZH0gZnJvbSBcImdsLW1hdHJpeFwiXG5pbXBvcnQgYWdncmVnYXRpb24gZnJvbSBcIi4uL3V0aWwvYWdncmVnYXRpb25cIlxuaW1wb3J0IE1hdGggZnJvbSBcIi4uL21hdGgvbWF0aFwiXG5cbi8qKlxuICogQnVpbGRzIGEgMkQgdHJhbnNmb3JtYXRpb24gbWF0cml4ICgyeDMgbWF0cml4KSBmcm9tIGEgcm90YXRpb24gKGluIGRlZ3JlZXMpLFxuICogYW4geCx5IHNjYWxlLCBhIHRyYW5zbGF0aW9uLCBhbmQgYSBwaXZvdCAoYW4gb2Zmc2V0IGZyb20gdGhlIG9yaWdpbiB0b1xuICogYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIGFyb3VuZClcbiAqIEBwYXJhbSAge01hdDJkfSBtYXQgICBNYXRyaXggdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHJkZWcgIHJvdGF0aW9uLCBpbiBkZWdyZWVzXG4gKiBAcGFyYW0gIHtWZWMyZH0gcyAgICAgU2NhbGUgdmVjdG9yLCBpbiB4ICYgeVxuICogQHBhcmFtICB7VmVjMmR9IHQgICAgIFRyYW5zbGF0aW9uIHZlY3RvciwgaW4geCAmIHlcbiAqIEBwYXJhbSAge1ZlYzJkfSBwaXZvdCBPZmZzZXQgZnJvbSBvcmlnaW4gdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uXG4gKiBAcmV0dXJuIHtNYXQyZH0gICAgICAgTWF0cml4IHJlZmVyZW5jZWQgYnkgdGhlIG1hdCBhcmd1bWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRYZm9ybU1hdHJpeChtYXQsIHJkZWcsIHMsIHQsIHBpdm90KSB7XG4gIE1hdDJkLmlkZW50aXR5KG1hdClcbiAgTWF0MmQudHJhbnNsYXRlKG1hdCwgbWF0LCBbdFswXSArIHBpdm90WzBdLCB0WzFdICsgcGl2b3RbMV1dKVxuICBNYXQyZC5yb3RhdGUobWF0LCBtYXQsIE1hdGguREVHX1RPX1JBRCAqIHJkZWcpXG4gIE1hdDJkLnNjYWxlKG1hdCwgbWF0LCBzKVxuICBNYXQyZC50cmFuc2xhdGUobWF0LCBtYXQsIFstcGl2b3RbMF0sIC1waXZvdFsxXV0pXG4gIHJldHVybiBtYXRcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGRpcnR5IGFsbCB0aGUgZGVzY2VuZGFudHMgb2YgYSB0cmFuc2Zvcm0gbm9kZS5cbiAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB0cmFuc2Zvcm0gbm9kZSBoYXMgYmVlbiBtb2RpZmllZCBpbiBzb21lIHdheVxuICogdGhhdCBpdCdzIGNoaWxkcmVuIG5lZWQgdG8gYmUgbm90aWZpZWQgYWJvdXQuXG4gKiBAcGFyYW0gIHtUcmFuc2Zvcm0yZFtdfSBjaGlsZHJlblxuICovXG5mdW5jdGlvbiBkaXJ0eUNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgIGNoaWxkLl94Zm9ybURpcnR5ID0gdHJ1ZVxuICAgIGRpcnR5Q2hpbGRyZW4oY2hpbGQuX2NoaWxkcmVuKVxuICB9KVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRyYW5zZm9ybTJkT3B0aW9uc1xuICogQHByb3BlcnR5IHtQb2ludDJkfSBbcG9zaXRpb24gPSBbMCwwXV0gUG9zaXRpb24gaW4gd29ybGQgc3BhY2UgY29vcmRzXG4gKiBAcHJvcGVydHkge1ZlYzJkfSBbc2NhbGUgPSBbMSwxXV0gU2NhbGUgaW4gd29ybGQgc3BhY2UgY29vcmRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3JvdGF0aW9uID0gMF0gUm90YXRpb24gaW4gZGVncmVlc1xuICogQHByb3BlcnR5IHtWZWMyZH0gW3Bpdm90ID0gWzAsIDBdXSBPZmZzZXQgZnJvbSBvcmlnaW4gdG8gYXBwbHkgdGhlIHNldFRyYW5zZm9ybWF0aW9uc1xuICovXG5cbi8qKlxuICogQGNsYXNzIENsYXNzIHRvIG1hbmFnZSBiYXNpYyAyZCBhZmZpbmUgdHJhbnNmb3JtYXRpb25zXG4gKiBAbWl4aW4gQ2FuIGFsc28gYmUgdXNlZCBhcyBhIG1peGluXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYW5zZm9ybTJkIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVHJhbnNmb3JtMmRcbiAgICogQHBhcmFtICB7VHJhbnNmb3JtMmRPcHRpb25zfSBbb3B0c11cbiAgICogQHJldHVybiB7VHJhbnNmb3JtMmR9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgdGhpcy5pbml0aWFsaXplcihvcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgdHJhbnNmb3JtIDJkIG9iamVjdCBmcm9tIG9wdGlvbnNcbiAgICogQHBhcmFtICB7VHJhbnNmb3JtMmRPcHRpb25zfSBbb3B0c11cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0VHJhbnNmb3JtRnJvbU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBvc2l0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKG9wdHMucG9zaXRpb24pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnNjYWxlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNldFNjYWxlKG9wdHMuc2NhbGUpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnJvdGF0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNldFJvdGF0aW9uKG9wdHMucm90YXRpb24pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBpdm90ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnBpdm90ID0gb3B0cy5waXZvdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIHRyYW5zZm9ybSAyZCBvYmplY3QgZnJvbSBvcHRpb25zLFxuICAgKiBjYWxsZWQgZnJvbSBlaXRoZXIgY29uc3RydWN0b3IgKGlmIHVzZWQgYXMgYmFzZSBjbGFzcylcbiAgICogb3IgYmFzZSBtaXhpbiBjbGFzcyAoaWYgdXNlZCBhcyBhIG1peGluKVxuICAgKiBAcGFyYW0gIHtUcmFuc2Zvcm0yZE9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBpbml0aWFsaXplcihvcHRzKSB7XG4gICAgdGhpcy5fbG9jYWxYZm9ybSA9IE1hdDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fbHhmb3JtRGlydHkgPSBmYWxzZVxuXG4gICAgdGhpcy5fcGl2b3QgPSBQb2ludDJkLmNyZWF0ZSgwLCAwKVxuXG4gICAgdGhpcy5fcG9zID0gUG9pbnQyZC5jcmVhdGUoMCwgMClcbiAgICB0aGlzLl9zY2FsZSA9IFZlYzJkLmZyb21WYWx1ZXMoMSwgMSlcbiAgICB0aGlzLl9yb3REZWcgPSAwXG5cbiAgICB0aGlzLl9nbG9iYWxYZm9ybSA9IE1hdDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5feGZvcm1EaXJ0eSA9IGZhbHNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbFxuICAgIHRoaXMuX2NoaWxkcmVuID0gbmV3IFNldCgpXG5cbiAgICB0aGlzLl9pbml0VHJhbnNmb3JtRnJvbU9wdGlvbnMob3B0cylcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgdG8gdGhpcyB0cmFuc2Zvcm0gbm9kZVxuICAgKiBAcGFyYW0ge1RyYW5zZm9ybTJkfSBjaGlsZFhmb3JtXG4gICAqL1xuICBhZGRDaGlsZFhmb3JtKGNoaWxkWGZvcm0pIHtcbiAgICBpZiAoIXRoaXMuX2NoaWxkcmVuLmhhcyhjaGlsZFhmb3JtKSkge1xuICAgICAgdGhpcy5fY2hpbGRyZW4uYWRkKGNoaWxkWGZvcm0pXG4gICAgICBpZiAoY2hpbGRYZm9ybS5fcGFyZW50KSB7XG4gICAgICAgIGNoaWxkWGZvcm0uX3BhcmVudC5yZW1vdmVDaGlsZChjaGlsZFhmb3JtKVxuICAgICAgfVxuICAgICAgY2hpbGRYZm9ybS5fcGFyZW50ID0gdGhpc1xuICAgICAgY2hpbGRYZm9ybS5feGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgIGRpcnR5Q2hpbGRyZW4oY2hpbGRYZm9ybS5fY2hpbGRyZW4pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjaGlsZCBmcm9tIHRoaXMgdHJhbnNmb3JtIG5vZGVcbiAgICogQHBhcmFtICB7VHJhbnNmb3JtMmR9IGNoaWxkWGZvcm1cbiAgICovXG4gIHJlbW92ZUNoaWxkWGZvcm0oY2hpbGRYZm9ybSkge1xuICAgIHRoaXMuX2NoaWxkcmVuLmRlbGV0ZShjaGlsZFhmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIFVucGFyZW50cyB0aGlzIG5vZGUgZnJvbSBpdHMgcGFyZW50LCBpZiBpdCBoYXMgb25lXG4gICAqL1xuICB1bnBhcmVudFhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKVxuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbFxuICAgICAgTWF0MmQuY29weSh0aGlzLl9nbG9iYWxYZm9ybSwgdGhpcy5sb2NhbFhmb3JtKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwaXZvdCBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEBwYXJhbSAge1ZlYzJkfSBwaXZvdCBPZmZzZXQgdmVjdG9yIGZyb20gdGhlIG9yaWdpbiB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb25zXG4gICAqIEByZXR1cm4ge1RyYW5zZm9ybTJkfVxuICAgKi9cbiAgc2V0IHBpdm90KHBpdm90KSB7XG4gICAgUG9pbnQyZC5jb3B5KHRoaXMuX3Bpdm90LCBwaXZvdClcbiAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBwaXZvdCBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge1ZlYzJkfVxuICAgKi9cbiAgZ2V0IHBpdm90KCkge1xuICAgIHJldHVybiBQb2ludDJkLmNsb25lKHRoaXMuX3Bpdm90KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgcGl2b3QgcmVmZXJlbmNlIG9mIHRoZSB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmVhZE9ubHlcbiAgICovXG4gIGdldCBwaXZvdFJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGl2b3RcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJlbnQgdHJhbnNmb3JtIG5vZGUsIGlmIG9uZSBpcyBhdHRhY2hlZFxuICAgKiBAcmV0dXJuIHtUcmFuc2Zvcm0yZH1cbiAgICovXG4gIGdldCBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdW5wYXJlbnRlZCBwb3NpdGlvbiBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge1BvaW50MmR9IFRoaXMgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGFzIGlmIGl0IHdlcmUgdW5wYXJlbnRlZFxuICAgKi9cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIFZlYzJkLmNsb25lKHRoaXMuX3BvcylcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHVucGFyZW50ZWQgcG9zaXRpb24gb2YgdGhlIHRyYW5zZm9ybSwgYXZvaWRpbmdcbiAgICogYSBjb3B5XG4gICAqIEByZXR1cm4ge1BvaW50MmR9XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0UG9zaXRpb25SZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgd29ybGQgcG9zaXRpb24gb2YgdGhlIHRyYW5zZm9ybSwgdGhpcyBpcyBpdHMgcG9zaXRpb25cbiAgICogYWZ0ZXIgYWxsIHBhcmVudCB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWRcbiAgICogQHJldHVybiB7UG9pbnQyZH1cbiAgICovXG4gIGdldFdvcmxkUG9zaXRpb24oKSB7XG4gICAgY29uc3QgeGZvcm0gPSB0aGlzLmdsb2JhbFhmb3JtXG4gICAgcmV0dXJuIFBvaW50MmQuY3JlYXRlKHhmb3JtWzRdLCB4Zm9ybVs1XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHdvcmxkIHBvc2l0aW9uIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtQb2ludDJkfSBwb3NcbiAgICovXG4gIHNldFBvc2l0aW9uKHBvcykge1xuICAgIFBvaW50MmQuY29weSh0aGlzLl9wb3MsIHBvcylcbiAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgdGhlIHVucGFyZW50ZWQgd29ybGQgcG9zaXRpb24gb2YgdGhlIHRyYW5zZm9ybSBieSBhbiBvZmZzZXRcbiAgICogQHBhcmFtICB7VmVjMmR9IHRyYW5zbGF0aW9uXG4gICAqIEByZXR1cm4ge1RyYW5zZm9ybTJkfVxuICAgKi9cbiAgdHJhbnNsYXRlKHRyYW5zbGF0aW9uKSB7XG4gICAgaWYgKHRyYW5zbGF0aW9uWzBdIHx8IHRyYW5zbGF0aW9uWzFdKSB7XG4gICAgICBQb2ludDJkLmFkZFZlYzIodGhpcy5fcG9zLCB0aGlzLl9wb3MsIHRyYW5zbGF0aW9uKVxuICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdW5wYXJlbnRlZCB4LHkgc2NhbGUgb2YgdGhlIHRyYW5zZm9ybVxuICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICovXG4gIGdldFNjYWxlKCkge1xuICAgIHJldHVybiBWZWMyZC5jbG9uZSh0aGlzLl9zY2FsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVucGFyZW50ZWQgeC95IHNjYWxlIHJlZmVyZW5jZSBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIGF2b2lkaW5nIGEgY29weVxuICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICogQHJlYWRPbmx5XG4gICAqL1xuICBnZXRTY2FsZVJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NhbGVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHNjYWxlIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtWZWMyZH0gc2NhbGVcbiAgICogQHJldHVybiB7VHJhbnNmb3JtMmR9XG4gICAqL1xuICBzZXRTY2FsZShzY2FsZSkge1xuICAgIFZlYzJkLmNvcHkodGhpcy5fc2NhbGUsIHNjYWxlKVxuICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZXMgdGhlIGN1cnJlbnQgdW5wYXJlbnRlZCBzY2FsZSBieSBhIDJkIG11bHRpcGxpZXJcbiAgICogQHBhcmFtICB7VmVjMmR9IHNjYWxlTXVsdFxuICAgKiBAcmV0dXJuIHtUcmFuc2Zvcm0yZH1cbiAgICovXG4gIHNjYWxlKHNjYWxlTXVsdCkge1xuICAgIGlmIChzY2FsZU11bHRbMF0gIT09IDEgfHwgc2NhbGVNdWx0WzFdICE9PSAxKSB7XG4gICAgICBWZWMyZC5tdWx0aXBseSh0aGlzLl9zY2FsZSwgdGhpcy5fc2NhbGUsIHNjYWxlTXVsdClcbiAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVucGFyZW50ZWQgcm90YXRpb24gaW4gZGVncmVlcyBvZiB0aGUgdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldFJvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3REZWdcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHJvdGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZyBSb3RhdGlvbiBpbiBkZWdyZWVzXG4gICAqIEByZXR1cm4ge1RyYW5zZm9ybTJkfVxuICAgKi9cbiAgc2V0Um90YXRpb24oZGVnKSB7XG4gICAgdGhpcy5fcm90RGVnID0gZGVnXG4gICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWRkaXRpb25hbCByb3RhdGlvbiBpbiBkZWdyZWVzIHRvIHRoZSBjdXJyZW50IHJvdGF0aW9uXG4gICAqIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICogQHBhcmFtICB7bnVtYmVyfSBkZWcgUm90YXRpb24gb2Zmc2V0IGluIGRlZ3JlZXNcbiAgICogQHJldHVybiB7VHJhbnNmb3JtMmR9XG4gICAqL1xuICByb3RhdGUoZGVnKSB7XG4gICAgaWYgKGRlZykge1xuICAgICAgdGhpcy5fcm90RGVnICs9IGRlZ1xuICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGlydHkgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGlzIG5vZGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kaXJ0eUNoaWxkcmVuKCkge1xuICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgbG9jYWwgYWZmaW5lIG1hdHJpeCBpZiBtYXJrZWQgYXMgZGlydHlcbiAgICogSWYgZGVyaXZlZC9taXhpbiBjbGFzc2VzIGhhdmUgYSBfbG9jYWxYZm9ybVVwZGF0ZXMgbWV0aG9kXG4gICAqIGRlZmluZWQsIHRoYXQgd2lsbCBiZSBjYWxsZWQgaGVyZSB3aGVuIHRoZSBsb2NhbCB0cmFuc2Zvcm1cbiAgICogaXMgdXBkYXRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVsb2NhbHhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9seGZvcm1EaXJ0eSkge1xuICAgICAgYnVpbGRYZm9ybU1hdHJpeCh0aGlzLl9sb2NhbFhmb3JtLCB0aGlzLl9yb3REZWcsIHRoaXMuX3NjYWxlLCB0aGlzLl9wb3MsIHRoaXMuX3Bpdm90KVxuICAgICAgaWYgKHRoaXMuX2xvY2FsWGZvcm1VcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsWGZvcm1VcGRhdGVkKClcbiAgICAgIH1cbiAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZ2xvYmFsIDJ4MyBtYXRyaXggb2YgdGhlIHRyYW5zZm9ybSBpZiBtYXJrZWQgZGlydHlcbiAgICogSWYgZGVyaXZlZC9taXhpbiBjbGFzc2VzIGhhdmUgYSBfZ2xvYmFsWGZvcm1VcGRhdGVzIG1ldGhvZFxuICAgKiBkZWZpbmVkLCB0aGF0IHdpbGwgYmUgY2FsbGVkIGhlcmUgd2hlbiB0aGUgZ2xvYmFsIHRyYW5zZm9ybVxuICAgKiBpcyB1cGRhdGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZWdsb2JhbHhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9seGZvcm1EaXJ0eSB8fCB0aGlzLl94Zm9ybURpcnR5KSB7XG4gICAgICB0aGlzLl91cGRhdGVsb2NhbHhmb3JtKClcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgTWF0MmQubXVsdGlwbHkodGhpcy5fZ2xvYmFsWGZvcm0sIHRoaXMuX3BhcmVudC5nbG9iYWxYZm9ybSwgdGhpcy5fbG9jYWxYZm9ybSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE1hdDJkLmNvcHkodGhpcy5fZ2xvYmFsWGZvcm0sIHRoaXMuX2xvY2FsWGZvcm0pXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fZ2xvYmFsWGZvcm1VcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuX2dsb2JhbFhmb3JtVXBkYXRlZCgpXG4gICAgICB9XG4gICAgICB0aGlzLl94Zm9ybURpcnR5ID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIG5vZGUuXG4gICAqIEByZXR1cm4ge01hdDJkfVxuICAgKi9cbiAgZ2V0IGxvY2FsWGZvcm0oKSB7XG4gICAgdGhpcy5fdXBkYXRlbG9jYWx4Zm9ybSgpXG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsWGZvcm1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGdsb2JhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIG5vZGUuIFRoaXMgaXMgZXNzZW50aWFsbHlcbiAgICogaXRzIGxvY2FsIHRyYW5zZm9ybSBtdWx0aXBsaWVkIGFnYWluc3QgYWxsIHRoZSBsb2NhbCB0cmFuc2Zvcm1zIG9mIGl0cyBwYXJlbnRzLlxuICAgKiBUaGlzIGlzIHVsdGltYXRlbHkgdXNlZCB0byBjb252ZXJ0IGEgcG9pbnQgZnJvbSBvYmplY3Qgc3BhY2UgdG8gd29ybGQgc3BhY2UsIGFuZFxuICAgKiBpbnZlcnNlbHksIGZyb20gd29ybGQgc3BhY2UgdG8gb2JqZWN0IHNwYWNlLlxuICAgKiBAcmV0dXJuIHtNYXQyZH1cbiAgICovXG4gIGdldCBnbG9iYWxYZm9ybSgpIHtcbiAgICB0aGlzLl91cGRhdGVnbG9iYWx4Zm9ybSgpXG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbFhmb3JtXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdHJhbnNmb3JtIHN0YXRlIG9mIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHhcbiAgICogQHBhcmFtICB7TWF0MmR9IGN1cnJNYXRyaXggICAgICAgICAgVGhlIGN1cnJlbnQgbWF0cml4IHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtdmlldy1wcm9qZWN0aW9uLXNjcmVlbiBtYXRyaXggbXVsdGlwbGljYXRpb24gZm9yIHRoaXMgbm9kZVxuICAgKiBAcGFyYW0gIHtNYXQyZH0gd29ybGRUb1NjcmVlbk1hdHJpeCBUaGUgY3VycmVudCB3b3JsZC10by1zY3JlZW4gdHJhbmZvcm1cbiAgICovXG4gIHRyYW5zZm9ybUN0eChjdHgsIGN1cnJNYXRyaXgsIHdvcmxkVG9TY3JlZW5NYXRyaXgpIHtcbiAgICBNYXQyZC5tdWx0aXBseShjdXJyTWF0cml4LCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLmdsb2JhbFhmb3JtKVxuXG4gICAgY3R4LnNldFRyYW5zZm9ybShjdXJyTWF0cml4WzBdLFxuICAgICAgY3Vyck1hdHJpeFsxXSxcbiAgICAgIGN1cnJNYXRyaXhbMl0sXG4gICAgICBjdXJyTWF0cml4WzNdLFxuICAgICAgY3Vyck1hdHJpeFs0XSxcbiAgICAgIGN1cnJNYXRyaXhbNV0pXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBUcmFuc2Zvcm0yZCBpbnN0YW5jZSB0byBhIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSAge1RyYW5zZm9ybTJkfSB4Zm9ybU9ialxuICAgKiBAcmV0dXJuIHt7cG9zaXRpb246IFBvaW50MmQsIHNjYWxlOiBWZWMyZCwgcm90YXRpb246IG51bWJlciwgcGl2b3Q6IFZlYzJkfX1cbiAgICovXG4gIHN0YXRpYyB0b0pTT04oeGZvcm1PYmopIHtcbiAgICAvLyBUT0RPKGNyb290KTogSG93IGRvIHdlIGRlYWwgd2l0aCBwYXJlbnRpbmcgaGVyZT9cbiAgICAvLyBUbyBwcm9wZXJseSBkZWFsIHdpdGggdGhpcywgd2UgbWF5IG5lZWQgdG8gc3VwcGx5IGFuXG4gICAgLy8gaWRlbnRpZmllciBmb3IgZXZlcnkgY3JlYXRlZCBvYmplY3QuLi4gVGhpcyBtYXkgbGlrZWx5XG4gICAgLy8gbmVlZCB0byBiZSBhIG5hbWUgc3RyaW5nIHN1cHBsaWVkIGJ5IHRoZSB1c2VyXG4gICAgY29uc3QgcG9zID0geGZvcm1PYmouZ2V0UG9zaXRpb25SZWYoKVxuICAgIGNvbnN0IHNjYWxlID0geGZvcm1PYmouZ2V0U2NhbGVSZWYoKVxuICAgIGNvbnN0IHBpdm90ID0geGZvcm1PYmoucGl2b3RSZWZcbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IFtwb3NbMF0sIHBvc1sxXV0sXG4gICAgICBzY2FsZTogW3NjYWxlWzBdLCBzY2FsZVsxXV0sXG4gICAgICByb3RhdGlvbjogeGZvcm1PYmouZ2V0Um90YXRpb24oKSxcbiAgICAgIHBpdm90OiBbcGl2b3RbMF0sIHBpdm90WzFdXVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVHJhbnNmb3JtMmQgbWl4aW4gY2xhc3MgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBtaXhlZCBpbiB3aXRoXG4gKiBhIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgRXZlbnRIYW5kbGVyIGNsYXNzXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGV2ZW50TmFtZSBUeXBlIG5hbWUgb2YgdGhlIGV2ZW50IGZpcmVkIHdoZW4gdGhlIHRyYW5zZm9ybSBpcyBtb2RpZmllZFxuICogQHJldHVybiB7ZnVuY3Rpb259ICAgICAgICAgICBNaXhpblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRlZFRyYW5zZm9ybTJkTWl4aW4oZXZlbnROYW1lKSB7XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0yZCBtb2RpZmljYXRpb24gZXZlbnRcbiAgICogQGV2ZW50IEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBtb2RpZmllZFxuICAgKiBAcHJvcGVydHkge30gcHJldlZhbCBQcmV2aW91cyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHByaW9yIHRvIG1vZGlmaWNhdGlvblxuICAgKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWl4aW4gVHJhbnNmb3JtMmQgbWl4aW4gd2l0aCBldmVudCBmaXJpbmcgd2hlbiBtb2RpZmllZFxuICAgKi9cbiAgcmV0dXJuIGFnZ3JlZ2F0aW9uKG51bGwsIFRyYW5zZm9ybTJkLCBjbGFzcyBFdmVudGVkVHJhbnNmb3JtMmQge1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHVucGFyZW50ZWQgcGl2b3Qgb2YgdGhlIHRyYW5zZm9ybS4gVGhlIHBpdm90IGlzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSB0cmFuc2Zvcm0ncyBwcmltYXJ5IHBvc2l0aW9uIHdoZXJlIHRoZVxuICAgICAqIHRyYW5zZm9ybWF0aW9uIGlzIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtWZWMyZH0gcGl2b3RcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHNldCBwaXZvdChwaXZvdCkge1xuICAgICAgaWYgKCFQb2ludDJkLmVxdWFscyhwaXZvdCwgdGhpcy5fcGl2b3QpKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBbdGhpcy5fcGl2b3RbMF0sIHRoaXMuX3Bpdm90WzFdXVxuICAgICAgICBQb2ludDJkLmNvcHkodGhpcy5fcGl2b3QsIHBpdm90KVxuICAgICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwicGl2b3RcIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJWYWw6IHBpdm90XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjb3B5IG9mIHRoZSB1bnBhcmVudGVkIHBpdm90IG9mIHRoZSB0cmFuc2Zvcm1cbiAgICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICAgKi9cbiAgICBnZXQgcGl2b3QoKSB7XG4gICAgICByZXR1cm4gUG9pbnQyZC5jbG9uZSh0aGlzLl9waXZvdClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIHBvc2l0aW9uIG9mIHRoZSB0cmFuc2Zvcm0uXG4gICAgICogQHBhcmFtIHtQb2ludDJkfSBwb3NcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHNldFBvc2l0aW9uKHBvcykge1xuICAgICAgaWYgKCFQb2ludDJkLmVxdWFscyhwb3MsIHRoaXMuX3BvcykpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IFt0aGlzLl9wb3NbMF0sIHRoaXMuX3Bvc1sxXV1cbiAgICAgICAgUG9pbnQyZC5jb3B5KHRoaXMuX3BvcywgcG9zKVxuICAgICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwicG9zaXRpb25cIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJWYWw6IHBvc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIHRoZSB1bnBhcmVudGVkIHBvc2l0aW9uIG9mIGEgdHJhbnNmb3JtIGJ5IGFuIG9mZnNldC5cbiAgICAgKiBAcGFyYW0gIHtWZWMyZH0gdHJhbnNsYXRpb25cbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZSh0cmFuc2xhdGlvbikge1xuICAgICAgaWYgKHRyYW5zbGF0aW9uWzBdIHx8IHRyYW5zbGF0aW9uWzFdKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBbdGhpcy5fcG9zWzBdLCB0aGlzLl9wb3NbMV1dXG4gICAgICAgIFBvaW50MmQuYWRkVmVjMih0aGlzLl9wb3MsIHRoaXMuX3BvcywgdHJhbnNsYXRpb24pXG4gICAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJwb3NpdGlvblwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VyclZhbDogW3RoaXMuX3Bvc1swXSwgdGhpcy5fcG9zWzFdXVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB1bnBhcmVudGVkIDJkIHNjYWxlIG9mIHRoZSB0cmFuc2Zvcm1cbiAgICAgKiBAcGFyYW0ge1ZlYzJkfSBzY2FsZVxuICAgICAqIEBmaXJlcyAgRXZlbnRlZFRyYW5zZm9ybTJkI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkVHJhbnNmb3JtMmR9XG4gICAgICovXG4gICAgc2V0U2NhbGUoc2NhbGUpIHtcbiAgICAgIGlmICghVmVjMmQuZXF1YWxzKHNjYWxlLCB0aGlzLl9zY2FsZSkpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IFt0aGlzLl9zY2FsZVswXSwgdGhpcy5fc2NhbGVbMV1dXG4gICAgICAgIFZlYzJkLmNvcHkodGhpcy5fc2NhbGUsIHNjYWxlKVxuICAgICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IHRydWVcbiAgICAgICAgZGlydHlDaGlsZHJlbih0aGlzLl9jaGlsZHJlbilcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwic2l6ZVwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VyclZhbDogc2NhbGVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbGllcyB0aGUgY3VycmVudCB1bnBhcmVudGVkIHNjYWxlIG9mIHRoZSB0cmFuc2Zvcm0gYnkgYSAyZCBzY2FsYXJcbiAgICAgKiBAcGFyYW0gIHtWZWMyZH0gc2NhbGVNdWx0XG4gICAgICogQGZpcmVzICBFdmVudGVkVHJhbnNmb3JtMmQjY2hhbmdlZFxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRUcmFuc2Zvcm0yZH1cbiAgICAgKi9cbiAgICBzY2FsZShzY2FsZU11bHQpIHtcbiAgICAgIGlmIChzY2FsZU11bHRbMF0gIT09IDEgfHwgc2NhbGVNdWx0WzFdICE9PSAxKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBbdGhpcy5fc2NhbGVbMF0sIHRoaXMuX3NjYWxlWzFdXVxuICAgICAgICBWZWMyZC5tdWx0aXBseSh0aGlzLl9zY2FsZSwgdGhpcy5fc2NhbGUsIHNjYWxlTXVsdClcbiAgICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gICAgICAgIHRoaXMuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICBhdHRyOiBcInNpemVcIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJWYWw6IFt0aGlzLl9zY2FsZVswXSwgdGhpcy5fc2NhbGVbMV1dXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHVucGFyZW50ZWQgcm90YXRpb24gb2YgdGhlIHRyYW5zZm9ybSBpbiBkZWdyZWVzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlZyBSb3RhdGlvbiBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICogQGZpcmVzICBFdmVudGVkVHJhbnNmb3JtMmQjY2hhbmdlZFxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRUcmFuc2Zvcm0yZH1cbiAgICAgKi9cbiAgICBzZXRSb3RhdGlvbihkZWcpIHtcbiAgICAgIGNvbnN0IGRlZ1RvVXNlID0gZGVnICUgMzYwXG4gICAgICBpZiAoZGVnVG9Vc2UgIT09IHRoaXMuX3JvdERlZykge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fcm90RGVnXG4gICAgICAgIHRoaXMuX3JvdERlZyA9IGRlZ1RvVXNlXG4gICAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJvcmllbnRhdGlvblwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VycmFsOiB0aGlzLl9yb3REZWdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcm90YXRpb24gYW5nbGUgaW4gZGVncmVlcyB0byB0aGUgY3VycmVudCB1bnBhcmVudGVkXG4gICAgICogcm90YXRpb24gb2YgdGhlIHRyYW5zZm9ybS5cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGRlZyBBZGRpdGlvbmFsIHJvdGF0aW9uIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRUcmFuc2Zvcm0yZCNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICAgICAqL1xuICAgIHJvdGF0ZShkZWcpIHtcbiAgICAgIGlmIChkZWcpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3JvdERlZ1xuICAgICAgICB0aGlzLl9yb3REZWcgKz0gZGVnXG4gICAgICAgIHRoaXMuX3JvdERlZyAlPSAzNjBcbiAgICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSB0cnVlXG4gICAgICAgIGRpcnR5Q2hpbGRyZW4odGhpcy5fY2hpbGRyZW4pXG4gICAgICAgIHRoaXMuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICBhdHRyOiBcIm9yaWVudGF0aW9uXCIsXG4gICAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgICBjdXJyYWw6IHRoaXMuX3JvdERlZ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHJlc2V0IGFsbCB0aGUgdW5wYXJlbnRlZCB0cmFuc2Zvcm0gcGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eCAgVHJhbnNsYXRpb24gaW4geCBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eSAgVHJhbnNsYXRpb24gaW4geSBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzeCAgU2NhbGUgaW4geCBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzeSAgU2NhbGUgaW4geSBpbiB3b3JsZCB1bml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWcgUm90YXRpb24gYW5nbGUgZGVncmVlc1xuICAgICAqIEBmaXJlcyAgRXZlbnRlZFRyYW5zZm9ybTJkI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkVHJhbnNmb3JtMmR9XG4gICAgICovXG4gICAgc2V0VHJhbnNmb3JtYXRpb25zKHR4LCB0eSwgc3gsIHN5LCBkZWcpIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gW11cbiAgICAgIGNvbnN0IHByZXZWYWxzID0gW11cbiAgICAgIGNvbnN0IGN1cnJWYWxzID0gW11cbiAgICAgIGlmICh0eXBlb2YgdHggIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHR5ICE9PSBcInVuZGVmaW5lZFwiICYmICghR0xNYXRyaXguZXF1YWxzKHR4LCB0aGlzLl9wb3NbMF0pIHx8ICFHTE1hdHJpeC5lcXVhbHModHksIHRoaXMuX3Bvc1sxXSkpKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBQb2ludDJkLmNsb25lKHRoaXMuX3BvcylcbiAgICAgICAgdGhpcy5fcG9zWzBdID0gdHhcbiAgICAgICAgdGhpcy5fcG9zWzFdID0gdHlcbiAgICAgICAgYXR0cnMucHVzaChcInBvc2l0aW9uXCIpXG4gICAgICAgIHByZXZWYWxzLnB1c2gocHJldilcbiAgICAgICAgY3VyclZhbHMucHVzaChQb2ludDJkLmNsb25lKHRoaXMuX3BvcykpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ggIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHN5ICE9PSBcInVuZGVmaW5lZFwiICYmICghR0xNYXRyaXguZXF1YWxzKHN4LCB0aGlzLl9zY2FsZVswXSkgfHwgIUdMTWF0cml4LmVxdWFscyhzeSwgdGhpcy5fc2NhbGVbMV0pKSkge1xuICAgICAgICBjb25zdCBwcmV2ID0gVmVjMmQuY2xvbmUodGhpcy5fc2NhbGUpXG4gICAgICAgIFZlYzJkLnNldCh0aGlzLl9zY2FsZSwgc3gsIHN5KVxuICAgICAgICBhdHRycy5wdXNoKFwic2l6ZVwiKVxuICAgICAgICBwcmV2VmFscy5wdXNoKHByZXYpXG4gICAgICAgIGN1cnJWYWxzLnB1c2goVmVjMmQuY2xvbmUodGhpcy5fc2NhbGUpKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlZyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCBkZWdUb1VzZSA9IGRlZyAlIDM2MFxuICAgICAgICBpZiAoIUdMTWF0cml4LmVxdWFscyhkZWdUb1VzZSwgdGhpcy5fcm90RGVnKSkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLl9yb3REZWdcbiAgICAgICAgICB0aGlzLl9yb3REZWcgPSBkZWdUb1VzZVxuICAgICAgICAgIGF0dHJzLnB1c2goXCJvcmllbnRhdGlvblwiKVxuICAgICAgICAgIHByZXZWYWxzLnB1c2gocHJldilcbiAgICAgICAgICBjdXJyVmFscy5wdXNoKHRoaXMuX3JvdERlZylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYXR0cnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2x4Zm9ybURpcnR5ID0gdHJ1ZVxuICAgICAgICBkaXJ0eUNoaWxkcmVuKHRoaXMuX2NoaWxkcmVuKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cnMsXG4gICAgICAgICAgcHJldlZhbHMsXG4gICAgICAgICAgY3VyclZhbHNcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9KVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2hhcGVzL3RyYW5zZm9ybTJkLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\n/**\n @typedef EventObject\n @type {object}\n @property {string} type - the type of the event\n @property {string} target - the target object that fired the event\n /\n\n/**\n * This callback is displayed as a global member.\n * @callback EventCallback\n * @param {EventObject} Event object describing the event being fired\n */\n\n/**\n * Recursively fires hierarchical events from an handler's registered\n * event types. For example, if an event is registered as \"changed:color\",\n * both a \"changed:color\" and \"changed\" event is fired, so listeners who\n * only generically care if something changed on an object can be notified.\n * @param {Map} currMap map datastructure holding all hierarchical events and callbacks\n * @param {string[]} subtypes the \":\" separated list of the event\n * @param {number} currIdx the current index of subtypes being processed\n * @param {Object} fireData the event object to fire\n * @return {number} total number of listeners called\n * @private\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction recursiveFire(currMap, subtypes, currIdx, fireData) {\n var _this = this;\n\n if (currIdx >= subtypes.length) {\n return 0;\n }\n\n var cnt = 0;\n var data = null;\n data = currMap.get(subtypes[currIdx]);\n if (data) {\n cnt = recursiveFire(data[0], subtypes, currIdx + 1, fireData);\n data[1].forEach(function (listener) {\n return listener.call(_this, fireData);\n });\n cnt += data[1].length;\n }\n return cnt;\n}\n\n/**\n * Recursively deletes specific listeners from a handlers event\n * data structure. For instance, if the same callback is used for both\n * a \"changed\" and a \"changed:color\" event, and that callback is deleted\n * from the \"changed\" event, it is also deleted from the \"changed:color\" event\n * @param {Object} currNode Current node of the map data structure being processed\n * @param {function[]} listeners Array of listeners to delete\n * @private\n */\nfunction recursiveDelete(currNode, listeners) {\n var index = -1;\n var subnodes = currNode[0];\n var nodelisteners = currNode[1];\n if (nodelisteners.length) {\n listeners.forEach(function (listener) {\n if ((index = nodelisteners.indexOf(listener)) >= 0) {\n nodelisteners.splice(index, 1);\n }\n });\n }\n subnodes.forEach(function (node) {\n recursiveDelete(node, listeners);\n });\n}\n\n/**\n * Validates that an input is a string or an array of strings, and if the former\n * returns a 1-element string array\n * @param {string|string[]} intype\n * @return {string[]}\n * @private\n */\nfunction arrayify(intype) {\n var arrayToUse = intype;\n if (typeof intype === \"string\") {\n arrayToUse = [intype];\n } else if (!Array.isArray(intype)) {\n throw new Error(\"Input must be an array of strings\");\n }\n return arrayToUse;\n}\n\n/** Class for managing events and listeners. Can be used as a base class or a mixin (using @see {@link aggregation}) */\n\nvar EventHandler = function () {\n\n /**\n * Create a new event handler\n * @param {string|string[]} eventsToRegister initial events to register\n */\n function EventHandler(eventsToRegister) {\n _classCallCheck(this, EventHandler);\n\n this.initializer(eventsToRegister);\n }\n\n /**\n * Initializes an event handler object\n * @param {string|string[]} eventsToRegister events to initialize event handler with\n * @see {@link aggregation}\n */\n\n\n _createClass(EventHandler, [{\n key: \"initializer\",\n value: function initializer(eventsToRegister) {\n this._listeners = new Map();\n this.registerEvents(eventsToRegister);\n }\n\n /**\n * Registers new events for the event handler\n * @param {string|string[]} events new event(s) to register\n */\n\n }, {\n key: \"registerEvents\",\n value: function registerEvents(events) {\n var _this2 = this;\n\n if (!events) {\n return;\n }\n\n var eventsToUse = arrayify(events);\n if (typeof events === \"string\") {\n eventsToUse = [events];\n } else if (!Array.isArray(events)) {\n throw new Error(\"Events must be an array of strings\");\n }\n\n eventsToUse.forEach(function (event) {\n var subevents = event.split(\":\");\n var currMap = _this2._listeners;\n for (var i = 0; i < subevents.length; i += 1) {\n var data = currMap.get(subevents[i]);\n if (!data) {\n data = [new Map(), []];\n currMap.set(subevents[i], data);\n }\n currMap = data[0];\n }\n });\n }\n\n /**\n * Adds a new listener to a specific event or list of different events\n * @param {string|string[]} types event(s) this listener is listening to\n * @param {EventCallback} listener function to be called when events destribed by types is fired\n * @return {EventHandler} this\n */\n\n }, {\n key: \"on\",\n value: function on(types, listener) {\n var _this3 = this;\n\n var typesToUse = arrayify(types);\n typesToUse.forEach(function (type) {\n var subtypes = type.split(\":\");\n var currMap = _this3._listeners;\n var data = null;\n subtypes.forEach(function (subtype) {\n data = currMap.get(subtype);\n if (!data) {\n var keys = [];\n currMap.forEach(function (val, key) {\n return keys.push(key);\n });\n throw new Error(type + \" is not a valid event type. The registered event types at this level are [\" + keys + \"]\");\n }\n currMap = data[0];\n });\n if (data[1].indexOf(listener) < 0) {\n data[1].push(listener);\n }\n });\n\n return this;\n }\n\n /**\n * Removes a listener from specific events\n * @param {string|string[]} types event(s) the listener is being removed from\n * @param {EventCallback} listener callback function to be cleared from the specified event types\n * @return {EventHandler} this\n */\n\n }, {\n key: \"off\",\n value: function off(types, listener) {\n var _this4 = this;\n\n var typesToUse = arrayify(types);\n var listeners = listener;\n if (!Array.isArray(listeners)) {\n listeners = [listener];\n }\n typesToUse.forEach(function (type) {\n var subtypes = type.split(\":\");\n var currMap = _this4._listeners;\n var data = null;\n var i = 0;\n for (i = 0; i < subtypes.length; i += 1) {\n data = currMap.get(subtypes[i]);\n if (!data) {\n break;\n }\n currMap = data[0];\n }\n if (data) {\n recursiveDelete(data, listeners);\n }\n });\n return this;\n }\n\n /**\n * Sets up a lister callback to only be called once\n * @param {string|string[]} types event(s) the listener is listening to\n * @param {EventCallback} listener callback function to be called with event(s) are fired\n * @return {EventHandler} this\n */\n\n }, {\n key: \"once\",\n value: function once(types, listener) {\n var _this5 = this;\n\n var wrapper = function wrapper(data) {\n _this5.off(types, wrapper);\n listener.call(_this5, data);\n };\n this.on(types, wrapper);\n return this;\n }\n\n /**\n * Fires a specific event and calls any listeners of that event type.\n * @param {string} type Event type to fire\n * @param {Object} data Additional data to fire with the event\n * @return {EventHandler} this\n */\n\n }, {\n key: \"fire\",\n value: function fire(type, data) {\n var subtypes = type.split(\":\");\n\n var fireData = {\n type: type,\n target: this\n };\n\n Object.assign(fireData, data);\n\n recursiveFire(this._listeners, subtypes, 0, fireData);\n\n // To ensure that no error events are dropped, print them to the\n // console if they have no listeners.\n // if (!numFires && endsWith(type, \"error\")) {\n // console.error((data && data.error) || data || \"Empty error event\")\n // }\n\n if (this._eventParent) {\n fireData = {};\n Object.getOwnPropertyNames(data).forEach(function (key) {\n fireData[key] = data[key];\n });\n this._eventParent.fire(type, fireData);\n }\n\n return this;\n }\n\n /**\n * Returns whether or not this event hander fires a specific event type\n * @param {string} type Event type\n * @return {Boolean}\n */\n\n }, {\n key: \"listens\",\n value: function listens(type) {\n var subtypes = type.split(\":\");\n var currMap = this._listeners;\n var data = null;\n for (var i = 0; i < subtypes.length; i += 1) {\n data = currMap.get(subtypes[i]);\n if (!data) {\n break;\n }\n currMap = data[0];\n }\n return data || this._eventParent && this._eventParent.listens(type);\n }\n\n /**\n * Sets a parent event handler\n * @param {EventHandler} parent\n * @param {object} data\n */\n\n }, {\n key: \"setEventedParent\",\n value: function setEventedParent(parent, data) {\n this._eventParent = parent;\n this._eventParentData = data;\n\n return this;\n }\n }]);\n\n return EventHandler;\n}();\n\nexports.default = EventHandler;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL2V2ZW50LWhhbmRsZXIuanM/MWM0OSJdLCJuYW1lcyI6WyJyZWN1cnNpdmVGaXJlIiwiY3Vyck1hcCIsInN1YnR5cGVzIiwiY3VycklkeCIsImZpcmVEYXRhIiwibGVuZ3RoIiwiY250IiwiZGF0YSIsImdldCIsImZvckVhY2giLCJsaXN0ZW5lciIsImNhbGwiLCJyZWN1cnNpdmVEZWxldGUiLCJjdXJyTm9kZSIsImxpc3RlbmVycyIsImluZGV4Iiwic3Vibm9kZXMiLCJub2RlbGlzdGVuZXJzIiwiaW5kZXhPZiIsInNwbGljZSIsIm5vZGUiLCJhcnJheWlmeSIsImludHlwZSIsImFycmF5VG9Vc2UiLCJBcnJheSIsImlzQXJyYXkiLCJFcnJvciIsIkV2ZW50SGFuZGxlciIsImV2ZW50c1RvUmVnaXN0ZXIiLCJpbml0aWFsaXplciIsIl9saXN0ZW5lcnMiLCJNYXAiLCJyZWdpc3RlckV2ZW50cyIsImV2ZW50cyIsImV2ZW50c1RvVXNlIiwic3ViZXZlbnRzIiwiZXZlbnQiLCJzcGxpdCIsImkiLCJzZXQiLCJ0eXBlcyIsInR5cGVzVG9Vc2UiLCJ0eXBlIiwic3VidHlwZSIsImtleXMiLCJ2YWwiLCJrZXkiLCJwdXNoIiwid3JhcHBlciIsIm9mZiIsIm9uIiwidGFyZ2V0IiwiT2JqZWN0IiwiYXNzaWduIiwiX2V2ZW50UGFyZW50IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZpcmUiLCJsaXN0ZW5zIiwicGFyZW50IiwiX2V2ZW50UGFyZW50RGF0YSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUFhQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBU0EsYUFBVCxDQUF1QkMsT0FBdkIsRUFBZ0NDLFFBQWhDLEVBQTBDQyxPQUExQyxFQUFtREMsUUFBbkQsRUFBNkQ7QUFBQTs7QUFDM0QsTUFBSUQsV0FBV0QsU0FBU0csTUFBeEIsRUFBZ0M7QUFDOUIsV0FBTyxDQUFQO0FBQ0Q7O0FBRUQsTUFBSUMs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RUEsYUFBTyxJQUFQO0FBQ0Q7Ozs7OztrQkE3TGtCb0IsWSIsImZpbGUiOiIxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbi8qKlxuICBAdHlwZWRlZiBFdmVudE9iamVjdFxuICBAdHlwZSB7b2JqZWN0fVxuICBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBldmVudFxuICBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gdGhlIHRhcmdldCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnRcbiAvXG5cbi8qKlxuICogVGhpcyBjYWxsYmFjayBpcyBkaXNwbGF5ZWQgYXMgYSBnbG9iYWwgbWVtYmVyLlxuICogQGNhbGxiYWNrIEV2ZW50Q2FsbGJhY2tcbiAqIEBwYXJhbSB7RXZlbnRPYmplY3R9IEV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudCBiZWluZyBmaXJlZFxuICovXG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZmlyZXMgaGllcmFyY2hpY2FsIGV2ZW50cyBmcm9tIGFuIGhhbmRsZXIncyByZWdpc3RlcmVkXG4gKiBldmVudCB0eXBlcy4gRm9yIGV4YW1wbGUsIGlmIGFuIGV2ZW50IGlzIHJlZ2lzdGVyZWQgYXMgXCJjaGFuZ2VkOmNvbG9yXCIsXG4gKiBib3RoIGEgXCJjaGFuZ2VkOmNvbG9yXCIgYW5kIFwiY2hhbmdlZFwiIGV2ZW50IGlzIGZpcmVkLCBzbyBsaXN0ZW5lcnMgd2hvXG4gKiBvbmx5IGdlbmVyaWNhbGx5IGNhcmUgaWYgc29tZXRoaW5nIGNoYW5nZWQgb24gYW4gb2JqZWN0IGNhbiBiZSBub3RpZmllZC5cbiAqIEBwYXJhbSAge01hcH0gY3Vyck1hcCAgbWFwIGRhdGFzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgaGllcmFyY2hpY2FsIGV2ZW50cyBhbmQgY2FsbGJhY2tzXG4gKiBAcGFyYW0gIHtzdHJpbmdbXX0gc3VidHlwZXMgdGhlIFwiOlwiIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBldmVudFxuICogQHBhcmFtICB7bnVtYmVyfSBjdXJySWR4ICB0aGUgY3VycmVudCBpbmRleCBvZiBzdWJ0eXBlcyBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSAge09iamVjdH0gZmlyZURhdGEgdGhlIGV2ZW50IG9iamVjdCB0byBmaXJlXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBsaXN0ZW5lcnMgY2FsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVGaXJlKGN1cnJNYXAsIHN1YnR5cGVzLCBjdXJySWR4LCBmaXJlRGF0YSkge1xuICBpZiAoY3VycklkeCA+PSBzdWJ0eXBlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgbGV0IGNudCA9IDBcbiAgbGV0IGRhdGEgPSBudWxsXG4gIGRhdGEgPSBjdXJyTWFwLmdldChzdWJ0eXBlc1tjdXJySWR4XSlcbiAgaWYgKGRhdGEpIHtcbiAgICBjbnQgPSByZWN1cnNpdmVGaXJlKGRhdGFbMF0sIHN1YnR5cGVzLCBjdXJySWR4ICsgMSwgZmlyZURhdGEpXG4gICAgZGF0YVsxXS5mb3JFYWNoKGxpc3RlbmVyID0+IGxpc3RlbmVyLmNhbGwodGhpcywgZmlyZURhdGEpKVxuICAgIGNudCArPSBkYXRhWzFdLmxlbmd0aFxuICB9XG4gIHJldHVybiBjbnRcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBkZWxldGVzIHNwZWNpZmljIGxpc3RlbmVycyBmcm9tIGEgaGFuZGxlcnMgZXZlbnRcbiAqIGRhdGEgc3RydWN0dXJlLiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIHVzZWQgZm9yIGJvdGhcbiAqIGEgXCJjaGFuZ2VkXCIgYW5kIGEgXCJjaGFuZ2VkOmNvbG9yXCIgZXZlbnQsIGFuZCB0aGF0IGNhbGxiYWNrIGlzIGRlbGV0ZWRcbiAqIGZyb20gdGhlIFwiY2hhbmdlZFwiIGV2ZW50LCBpdCBpcyBhbHNvIGRlbGV0ZWQgZnJvbSB0aGUgXCJjaGFuZ2VkOmNvbG9yXCIgZXZlbnRcbiAqIEBwYXJhbSAge09iamVjdH0gY3Vyck5vZGUgIEN1cnJlbnQgbm9kZSBvZiB0aGUgbWFwIGRhdGEgc3RydWN0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtICB7ZnVuY3Rpb25bXX0gbGlzdGVuZXJzIEFycmF5IG9mIGxpc3RlbmVycyB0byBkZWxldGVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY3Vyc2l2ZURlbGV0ZShjdXJyTm9kZSwgbGlzdGVuZXJzKSB7XG4gIGxldCBpbmRleCA9IC0xXG4gIGNvbnN0IHN1Ym5vZGVzID0gY3Vyck5vZGVbMF1cbiAgY29uc3Qgbm9kZWxpc3RlbmVycyA9IGN1cnJOb2RlWzFdXG4gIGlmIChub2RlbGlzdGVuZXJzLmxlbmd0aCkge1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgIGlmICgoaW5kZXggPSBub2RlbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpKSA+PSAwKSB7XG4gICAgICAgIG5vZGVsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgc3Vibm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgIHJlY3Vyc2l2ZURlbGV0ZShub2RlLCBsaXN0ZW5lcnMpXG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgYW4gaW5wdXQgaXMgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGlmIHRoZSBmb3JtZXJcbiAqIHJldHVybnMgYSAxLWVsZW1lbnQgc3RyaW5nIGFycmF5XG4gKiBAcGFyYW0gIHtzdHJpbmd8c3RyaW5nW119IGludHlwZVxuICogQHJldHVybiB7c3RyaW5nW119XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhcnJheWlmeShpbnR5cGUpIHtcbiAgbGV0IGFycmF5VG9Vc2UgPSBpbnR5cGVcbiAgaWYgKHR5cGVvZiBpbnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBhcnJheVRvVXNlID0gW2ludHlwZV1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShpbnR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzXCIpXG4gIH1cbiAgcmV0dXJuIGFycmF5VG9Vc2Vcbn1cblxuLyoqIENsYXNzIGZvciBtYW5hZ2luZyBldmVudHMgYW5kIGxpc3RlbmVycy4gQ2FuIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIG9yIGEgbWl4aW4gKHVzaW5nIEBzZWUge0BsaW5rIGFnZ3JlZ2F0aW9ufSkgKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50SGFuZGxlciB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSAge3N0cmluZ3xzdHJpbmdbXX0gZXZlbnRzVG9SZWdpc3RlciBpbml0aWFsIGV2ZW50cyB0byByZWdpc3RlclxuICAgKi9cbiAgY29uc3RydWN0b3IoZXZlbnRzVG9SZWdpc3Rlcikge1xuICAgIHRoaXMuaW5pdGlhbGl6ZXIoZXZlbnRzVG9SZWdpc3RlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbiBldmVudCBoYW5kbGVyIG9iamVjdFxuICAgKiBAcGFyYW0gIHtzdHJpbmd8c3RyaW5nW119IGV2ZW50c1RvUmVnaXN0ZXIgZXZlbnRzIHRvIGluaXRpYWxpemUgZXZlbnQgaGFuZGxlciB3aXRoXG4gICAqIEBzZWUgIHtAbGluayBhZ2dyZWdhdGlvbn1cbiAgICovXG4gIGluaXRpYWxpemVyKGV2ZW50c1RvUmVnaXN0ZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBuZXcgTWFwKClcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRzKGV2ZW50c1RvUmVnaXN0ZXIpXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBldmVudHMgZm9yIHRoZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSAge3N0cmluZ3xzdHJpbmdbXX0gZXZlbnRzIG5ldyBldmVudChzKSB0byByZWdpc3RlclxuICAgKi9cbiAgcmVnaXN0ZXJFdmVudHMoZXZlbnRzKSB7XG4gICAgaWYgKCFldmVudHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBldmVudHNUb1VzZSA9IGFycmF5aWZ5KGV2ZW50cylcbiAgICBpZiAodHlwZW9mIGV2ZW50cyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZXZlbnRzVG9Vc2UgPSBbZXZlbnRzXVxuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoZXZlbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXZlbnRzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc1wiKVxuICAgIH1cblxuICAgIGV2ZW50c1RvVXNlLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgY29uc3Qgc3ViZXZlbnRzID0gZXZlbnQuc3BsaXQoXCI6XCIpXG4gICAgICBsZXQgY3Vyck1hcCA9IHRoaXMuX2xpc3RlbmVyc1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJldmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBjdXJyTWFwLmdldChzdWJldmVudHNbaV0pXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBbbmV3IE1hcCgpLCBbXV1cbiAgICAgICAgICBjdXJyTWFwLnNldChzdWJldmVudHNbaV0sIGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgY3Vyck1hcCA9IGRhdGFbMF1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgbGlzdGVuZXIgdG8gYSBzcGVjaWZpYyBldmVudCBvciBsaXN0IG9mIGRpZmZlcmVudCBldmVudHNcbiAgICogQHBhcmFtICB7c3RyaW5nfHN0cmluZ1tdfSB0eXBlcyAgICBldmVudChzKSB0aGlzIGxpc3RlbmVyIGlzIGxpc3RlbmluZyB0b1xuICAgKiBAcGFyYW0gIHtFdmVudENhbGxiYWNrfSBsaXN0ZW5lciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBldmVudHMgZGVzdHJpYmVkIGJ5IHR5cGVzIGlzIGZpcmVkXG4gICAqIEByZXR1cm4ge0V2ZW50SGFuZGxlcn0gICAgICAgICAgdGhpc1xuICAgKi9cbiAgb24odHlwZXMsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgdHlwZXNUb1VzZSA9IGFycmF5aWZ5KHR5cGVzKVxuICAgIHR5cGVzVG9Vc2UuZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGNvbnN0IHN1YnR5cGVzID0gdHlwZS5zcGxpdChcIjpcIilcbiAgICAgIGxldCBjdXJyTWFwID0gdGhpcy5fbGlzdGVuZXJzXG4gICAgICBsZXQgZGF0YSA9IG51bGxcbiAgICAgIHN1YnR5cGVzLmZvckVhY2goc3VidHlwZSA9PiB7XG4gICAgICAgIGRhdGEgPSBjdXJyTWFwLmdldChzdWJ0eXBlKVxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gW11cbiAgICAgICAgICBjdXJyTWFwLmZvckVhY2goKHZhbCwga2V5KSA9PiBrZXlzLnB1c2goa2V5KSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dHlwZX0gaXMgbm90IGEgdmFsaWQgZXZlbnQgdHlwZS4gVGhlIHJlZ2lzdGVyZWQgZXZlbnQgdHlwZXMgYXQgdGhpcyBsZXZlbCBhcmUgWyR7a2V5c31dYClcbiAgICAgICAgfVxuICAgICAgICBjdXJyTWFwID0gZGF0YVswXVxuICAgICAgfSlcbiAgICAgIGlmIChkYXRhWzFdLmluZGV4T2YobGlzdGVuZXIpIDwgMCkge1xuICAgICAgICBkYXRhWzFdLnB1c2gobGlzdGVuZXIpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gc3BlY2lmaWMgZXZlbnRzXG4gICAqIEBwYXJhbSAge3N0cmluZ3xzdHJpbmdbXX0gdHlwZXMgICAgZXZlbnQocykgdGhlIGxpc3RlbmVyIGlzIGJlaW5nIHJlbW92ZWQgZnJvbVxuICAgKiBAcGFyYW0gIHtFdmVudENhbGxiYWNrfSBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjbGVhcmVkIGZyb20gdGhlIHNwZWNpZmllZCBldmVudCB0eXBlc1xuICAgKiBAcmV0dXJuIHtFdmVudEhhbmRsZXJ9ICAgICAgICAgIHRoaXNcbiAgICovXG4gIG9mZih0eXBlcywgbGlzdGVuZXIpIHtcbiAgICBjb25zdCB0eXBlc1RvVXNlID0gYXJyYXlpZnkodHlwZXMpXG4gICAgbGV0IGxpc3RlbmVycyA9IGxpc3RlbmVyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3RlbmVycykpIHtcbiAgICAgIGxpc3RlbmVycyA9IFtsaXN0ZW5lcl1cbiAgICB9XG4gICAgdHlwZXNUb1VzZS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICAgY29uc3Qgc3VidHlwZXMgPSB0eXBlLnNwbGl0KFwiOlwiKVxuICAgICAgbGV0IGN1cnJNYXAgPSB0aGlzLl9saXN0ZW5lcnNcbiAgICAgIGxldCBkYXRhID0gbnVsbFxuICAgICAgbGV0IGkgPSAwXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3VidHlwZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZGF0YSA9IGN1cnJNYXAuZ2V0KHN1YnR5cGVzW2ldKVxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGN1cnJNYXAgPSBkYXRhWzBdXG4gICAgICB9XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZWN1cnNpdmVEZWxldGUoZGF0YSwgbGlzdGVuZXJzKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGEgbGlzdGVyIGNhbGxiYWNrIHRvIG9ubHkgYmUgY2FsbGVkIG9uY2VcbiAgICogQHBhcmFtICB7c3RyaW5nfHN0cmluZ1tdfSB0eXBlcyAgICBldmVudChzKSB0aGUgbGlzdGVuZXIgaXMgbGlzdGVuaW5nIHRvXG4gICAqIEBwYXJhbSAge0V2ZW50Q2FsbGJhY2t9IGxpc3RlbmVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIGV2ZW50KHMpIGFyZSBmaXJlZFxuICAgKiBAcmV0dXJuIHtFdmVudEhhbmRsZXJ9ICAgICAgICAgIHRoaXNcbiAgICovXG4gIG9uY2UodHlwZXMsIGxpc3RlbmVyKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IChkYXRhKSA9PiB7XG4gICAgICB0aGlzLm9mZih0eXBlcywgd3JhcHBlcilcbiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZGF0YSlcbiAgICB9XG4gICAgdGhpcy5vbih0eXBlcywgd3JhcHBlcilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGEgc3BlY2lmaWMgZXZlbnQgYW5kIGNhbGxzIGFueSBsaXN0ZW5lcnMgb2YgdGhhdCBldmVudCB0eXBlLlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUgRXZlbnQgdHlwZSB0byBmaXJlXG4gICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBBZGRpdGlvbmFsIGRhdGEgdG8gZmlyZSB3aXRoIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtFdmVudEhhbmRsZXJ9ICAgICAgdGhpc1xuICAgKi9cbiAgZmlyZSh0eXBlLCBkYXRhKSB7XG4gICAgY29uc3Qgc3VidHlwZXMgPSB0eXBlLnNwbGl0KFwiOlwiKVxuXG4gICAgbGV0IGZpcmVEYXRhID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHRhcmdldDogdGhpc1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oZmlyZURhdGEsIGRhdGEpXG5cbiAgICByZWN1cnNpdmVGaXJlKHRoaXMuX2xpc3RlbmVycywgc3VidHlwZXMsIDAsIGZpcmVEYXRhKVxuXG4gICAgLy8gVG8gZW5zdXJlIHRoYXQgbm8gZXJyb3IgZXZlbnRzIGFyZSBkcm9wcGVkLCBwcmludCB0aGVtIHRvIHRoZVxuICAgIC8vIGNvbnNvbGUgaWYgdGhleSBoYXZlIG5vIGxpc3RlbmVycy5cbiAgICAvLyBpZiAoIW51bUZpcmVzICYmIGVuZHNXaXRoKHR5cGUsIFwiZXJyb3JcIikpIHtcbiAgICAvLyAgIGNvbnNvbGUuZXJyb3IoKGRhdGEgJiYgZGF0YS5lcnJvcikgfHwgZGF0YSB8fCBcIkVtcHR5IGVycm9yIGV2ZW50XCIpXG4gICAgLy8gfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50UGFyZW50KSB7XG4gICAgICBmaXJlRGF0YSA9IHt9XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGZpcmVEYXRhW2tleV0gPSBkYXRhW2tleV1cbiAgICAgIH0pXG4gICAgICB0aGlzLl9ldmVudFBhcmVudC5maXJlKHR5cGUsIGZpcmVEYXRhKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGV2ZW50IGhhbmRlciBmaXJlcyBhIHNwZWNpZmljIGV2ZW50IHR5cGVcbiAgICogQHBhcmFtICB7c3RyaW5nfSB0eXBlIEV2ZW50IHR5cGVcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGxpc3RlbnModHlwZSkge1xuICAgIGNvbnN0IHN1YnR5cGVzID0gdHlwZS5zcGxpdChcIjpcIilcbiAgICBsZXQgY3Vyck1hcCA9IHRoaXMuX2xpc3RlbmVyc1xuICAgIGxldCBkYXRhID0gbnVsbFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VidHlwZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGRhdGEgPSBjdXJyTWFwLmdldChzdWJ0eXBlc1tpXSlcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY3Vyck1hcCA9IGRhdGFbMF1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGEgfHwgKHRoaXMuX2V2ZW50UGFyZW50ICYmIHRoaXMuX2V2ZW50UGFyZW50Lmxpc3RlbnModHlwZSkpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHBhcmVudCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSB7RXZlbnRIYW5kbGVyfSBwYXJlbnRcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAgICovXG4gIHNldEV2ZW50ZWRQYXJlbnQocGFyZW50LCBkYXRhKSB7XG4gICAgdGhpcy5fZXZlbnRQYXJlbnQgPSBwYXJlbnRcbiAgICB0aGlzLl9ldmVudFBhcmVudERhdGEgPSBkYXRhXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi91dGlsL2V2ZW50LWhhbmRsZXIuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 13 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\n/**\n @typedef EventObject\n @type {object}\n @property {string} type - the type of the event\n @property {string} target - the target object that fired the event\n /\n\n/**\n * This callback is displayed as a global member.\n * @callback EventCallback\n * @param {EventObject} Event object describing the event being fired\n */\n\n/**\n * Recursively fires hierarchical events from an handler's registered\n * event types. For example, if an event is registered as \"changed:color\",\n * both a \"changed:color\" and \"changed\" event is fired, so listeners who\n * only generically care if something changed on an object can be notified.\n * @param {Map} currMap map datastructure holding all hierarchical events and callbacks\n * @param {string[]} subtypes the \":\" separated list of the event\n * @param {number} currIdx the current index of subtypes being processed\n * @param {Object} fireData the event object to fire\n * @return {number} total number of listeners called\n * @private\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction recursiveFire(currMap, subtypes, currIdx, fireData) {\n var _this = this;\n\n if (currIdx >= subtypes.length) {\n return 0;\n }\n\n var cnt = 0;\n var data = null;\n data = currMap.get(subtypes[currIdx]);\n if (data) {\n cnt = recursiveFire(data[0], subtypes, currIdx + 1, fireData);\n data[1].forEach(function (listener) {\n return listener.call(_this, fireData);\n });\n cnt += data[1].length;\n }\n return cnt;\n}\n\n/**\n * Recursively deletes specific listeners from a handlers event\n * data structure. For instance, if the same callback is used for both\n * a \"changed\" and a \"changed:color\" event, and that callback is deleted\n * from the \"changed\" event, it is also deleted from the \"changed:color\" event\n * @param {Object} currNode Current node of the map data structure being processed\n * @param {function[]} listeners Array of listeners to delete\n * @private\n */\nfunction recursiveDelete(currNode, listeners) {\n var index = -1;\n var subnodes = currNode[0];\n var nodelisteners = currNode[1];\n if (nodelisteners.length) {\n listeners.forEach(function (listener) {\n if ((index = nodelisteners.indexOf(listener)) >= 0) {\n nodelisteners.splice(index, 1);\n }\n });\n }\n subnodes.forEach(function (node) {\n recursiveDelete(node, listeners);\n });\n}\n\n/**\n * Validates that an input is a string or an array of strings, and if the former\n * returns a 1-element string array\n * @param {string|string[]} intype\n * @return {string[]}\n * @private\n */\nfunction arrayify(intype) {\n var arrayToUse = intype;\n if (typeof intype === \"string\") {\n arrayToUse = [intype];\n } else if (!Array.isArray(intype)) {\n throw new Error(\"Input must be an array of strings\");\n }\n return arrayToUse;\n}\n\n/** Class for managing events and listeners. Can be used as a base class or a mixin (using @see {@link aggregation}) */\n\nvar EventHandler = function () {\n\n /**\n * Create a new event handler\n * @param {string|string[]} eventsToRegister initial events to register\n */\n function EventHandler(eventsToRegister) {\n _classCallCheck(this, EventHandler);\n\n this.initializer(eventsToRegister);\n }\n\n /**\n * Initializes an event handler object\n * @param {string|string[]} eventsToRegister events to initialize event handler with\n * @see {@link aggregation}\n */\n\n\n _createClass(EventHandler, [{\n key: \"initializer\",\n value: function initializer(eventsToRegister) {\n this._listeners = new Map();\n this.registerEvents(eventsToRegister);\n }\n\n /**\n * Registers new events for the event handler\n * @param {string|string[]} events new event(s) to register\n */\n\n }, {\n key: \"registerEvents\",\n value: function registerEvents(events) {\n var _this2 = this;\n\n if (!events) {\n return;\n }\n\n var eventsToUse = arrayify(events);\n if (typeof events === \"string\") {\n eventsToUse = [events];\n } else if (!Array.isArray(events)) {\n throw new Error(\"Events must be an array of strings\");\n }\n\n eventsToUse.forEach(function (event) {\n var subevents = event.split(\":\");\n var currMap = _this2._listeners;\n for (var i = 0; i < subevents.length; i += 1) {\n var data = currMap.get(subevents[i]);\n if (!data) {\n data = [new Map(), []];\n currMap.set(subevents[i], data);\n }\n currMap = data[0];\n }\n });\n }\n\n /**\n * Adds a new listener to a specific event or list of different events\n * @param {string|string[]} types event(s) this listener is listening to\n * @param {EventCallback} listener function to be called when events destribed by types is fired\n * @return {EventHandler} this\n */\n\n }, {\n key: \"on\",\n value: function on(types, listener) {\n var _this3 = this;\n\n var typesToUse = arrayify(types);\n typesToUse.forEach(function (type) {\n var subtypes = type.split(\":\");\n var currMap = _this3._listeners;\n var data = null;\n subtypes.forEach(function (subtype) {\n data = currMap.get(subtype);\n if (!data) {\n var keys = [];\n currMap.forEach(function (val, key) {\n return keys.push(key);\n });\n throw new Error(type + \" is not a valid event type. The registered event types at this level are [\" + keys + \"]\");\n }\n currMap = data[0];\n });\n if (data[1].indexOf(listener) < 0) {\n data[1].push(listener);\n }\n });\n\n return this;\n }\n\n /**\n * Removes a listener from specific events\n * @param {string|string[]} types event(s) the listener is being removed from\n * @param {EventCallback} listener callback function to be cleared from the specified event types\n * @return {EventHandler} this\n */\n\n }, {\n key: \"off\",\n value: function off(types, listener) {\n var _this4 = this;\n\n var typesToUse = arrayify(types);\n var listeners = listener;\n if (!Array.isArray(listeners)) {\n listeners = [listener];\n }\n typesToUse.forEach(function (type) {\n var subtypes = type.split(\":\");\n var currMap = _this4._listeners;\n var data = null;\n var i = 0;\n for (i = 0; i < subtypes.length; i += 1) {\n data = currMap.get(subtypes[i]);\n if (!data) {\n break;\n }\n currMap = data[0];\n }\n if (data) {\n recursiveDelete(data, listeners);\n }\n });\n return this;\n }\n\n /**\n * Sets up a lister callback to only be called once\n * @param {string|string[]} types event(s) the listener is listening to\n * @param {EventCallback} listener callback function to be called with event(s) are fired\n * @return {EventHandler} this\n */\n\n }, {\n key: \"once\",\n value: function once(types, listener) {\n var _this5 = this;\n\n var wrapper = function wrapper(data) {\n _this5.off(types, wrapper);\n listener.call(_this5, data);\n };\n this.on(types, wrapper);\n return this;\n }\n\n /**\n * Fires a specific event and calls any listeners of that event type.\n * @param {string} type Event type to fire\n * @param {Object} data Additional data to fire with the event\n * @return {EventHandler} this\n */\n\n }, {\n key: \"fire\",\n value: function fire(type, data) {\n var subtypes = type.split(\":\");\n\n var fireData = {\n type: type,\n target: this\n };\n\n Object.assign(fireData, data);\n\n recursiveFire(this._listeners, subtypes, 0, fireData);\n\n // To ensure that no error events are dropped, print them to the\n // console if they have no listeners.\n // if (!numFires && endsWith(type, \"error\")) {\n // console.error((data && data.error) || data || \"Empty error event\")\n // }\n\n if (this._eventParent) {\n fireData = {};\n Object.getOwnPropertyNames(data).forEach(function (key) {\n fireData[key] = data[key];\n });\n this._eventParent.fire(type, fireData);\n }\n\n return this;\n }\n\n /**\n * Returns whether or not this event hander fires a specific event type\n * @param {string} type Event type\n * @return {Boolean}\n */\n\n }, {\n key: \"listens\",\n value: function listens(type) {\n var subtypes = type.split(\":\");\n var currMap = this._listeners;\n var data = null;\n for (var i = 0; i < subtypes.length; i += 1) {\n data = currMap.get(subtypes[i]);\n if (!data) {\n break;\n }\n currMap = data[0];\n }\n return data || this._eventParent && this._eventParent.listens(type);\n }\n\n /**\n * Sets a parent event handler\n * @param {EventHandler} parent\n * @param {object} data\n */\n\n }, {\n key: \"setEventedParent\",\n value: function setEventedParent(parent, data) {\n this._eventParent = parent;\n this._eventParentData = data;\n\n return this;\n }\n }]);\n\n return EventHandler;\n}();\n\nexports.default = EventHandler;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL2V2ZW50LWhhbmRsZXIuanM/MWM0OSJdLCJuYW1lcyI6WyJyZWN1cnNpdmVGaXJlIiwiY3Vyck1hcCIsInN1YnR5cGVzIiwiY3VycklkeCIsImZpcmVEYXRhIiwibGVuZ3RoIiwiY250IiwiZGF0YSIsImdldCIsImZvckVhY2giLCJsaXN0ZW5lciIsImNhbGwiLCJyZWN1cnNpdmVEZWxldGUiLCJjdXJyTm9kZSIsImxpc3RlbmVycyIsImluZGV4Iiwic3Vibm9kZXMiLCJub2RlbGlzdGVuZXJzIiwiaW5kZXhPZiIsInNwbGljZSIsIm5vZGUiLCJhcnJheWlmeSIsImludHlwZSIsImFycmF5VG9Vc2UiLCJBcnJheSIsImlzQXJyYXkiLCJFcnJvciIsIkV2ZW50SGFuZGxlciIsImV2ZW50c1RvUmVnaXN0ZXIiLCJpbml0aWFsaXplciIsIl9saXN0ZW5lcnMiLCJNYXAiLCJyZWdpc3RlckV2ZW50cyIsImV2ZW50cyIsImV2ZW50c1RvVXNlIiwic3ViZXZlbnRzIiwiZXZlbnQiLCJzcGxpdCIsImkiLCJzZXQiLCJ0eXBlcyIsInR5cGVzVG9Vc2UiLCJ0eXBlIiwic3VidHlwZSIsImtleXMiLCJ2YWwiLCJrZXkiLCJwdXNoIiwid3JhcHBlciIsIm9mZiIsIm9uIiwidGFyZ2V0IiwiT2JqZWN0IiwiYXNzaWduIiwiX2V2ZW50UGFyZW50IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZpcmUiLCJsaXN0ZW5zIiwicGFyZW50IiwiX2V2ZW50UGFyZW50RGF0YSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUFhQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBU0EsYUFBVCxDQUF1QkMsT0FBdkIsRUFBZ0NDLFFBQWhDLEVBQTBDQyxPQUExQyxFQUFtREMsUUFBbkQsRUFBNkQ7QUFBQTs7QUFDM0QsTUFBSUQsV0FBV0QsU0FBU0csTUFBeEIsRUFBZ0M7QUFDOUIsV0FBTyxDQUFQO0FBQ0Q7O0FBRUQsTUFBSUMs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Ozs7a0JBN0xrQm9CLFkiLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG4vKipcbiAgQHR5cGVkZWYgRXZlbnRPYmplY3RcbiAgQHR5cGUge29iamVjdH1cbiAgQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgZXZlbnRcbiAgQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgZmlyZWQgdGhlIGV2ZW50XG4gL1xuXG4vKipcbiAqIFRoaXMgY2FsbGJhY2sgaXMgZGlzcGxheWVkIGFzIGEgZ2xvYmFsIG1lbWJlci5cbiAqIEBjYWxsYmFjayBFdmVudENhbGxiYWNrXG4gKiBAcGFyYW0ge0V2ZW50T2JqZWN0fSBFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgYmVpbmcgZmlyZWRcbiAqL1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZpcmVzIGhpZXJhcmNoaWNhbCBldmVudHMgZnJvbSBhbiBoYW5kbGVyJ3MgcmVnaXN0ZXJlZFxuICogZXZlbnQgdHlwZXMuIEZvciBleGFtcGxlLCBpZiBhbiBldmVudCBpcyByZWdpc3RlcmVkIGFzIFwiY2hhbmdlZDpjb2xvclwiLFxuICogYm90aCBhIFwiY2hhbmdlZDpjb2xvclwiIGFuZCBcImNoYW5nZWRcIiBldmVudCBpcyBmaXJlZCwgc28gbGlzdGVuZXJzIHdob1xuICogb25seSBnZW5lcmljYWxseSBjYXJlIGlmIHNvbWV0aGluZyBjaGFuZ2VkIG9uIGFuIG9iamVjdCBjYW4gYmUgbm90aWZpZWQuXG4gKiBAcGFyYW0gIHtNYXB9IGN1cnJNYXAgIG1hcCBkYXRhc3RydWN0dXJlIGhvbGRpbmcgYWxsIGhpZXJhcmNoaWNhbCBldmVudHMgYW5kIGNhbGxiYWNrc1xuICogQHBhcmFtICB7c3RyaW5nW119IHN1YnR5cGVzIHRoZSBcIjpcIiBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSAge251bWJlcn0gY3VycklkeCAgdGhlIGN1cnJlbnQgaW5kZXggb2Ygc3VidHlwZXMgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gIHtPYmplY3R9IGZpcmVEYXRhIHRoZSBldmVudCBvYmplY3QgdG8gZmlyZVxuICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgbGlzdGVuZXJzIGNhbGxlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjdXJzaXZlRmlyZShjdXJyTWFwLCBzdWJ0eXBlcywgY3VycklkeCwgZmlyZURhdGEpIHtcbiAgaWYgKGN1cnJJZHggPj0gc3VidHlwZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIGxldCBjbnQgPSAwXG4gIGxldCBkYXRhID0gbnVsbFxuICBkYXRhID0gY3Vyck1hcC5nZXQoc3VidHlwZXNbY3VycklkeF0pXG4gIGlmIChkYXRhKSB7XG4gICAgY250ID0gcmVjdXJzaXZlRmlyZShkYXRhWzBdLCBzdWJ0eXBlcywgY3VycklkeCArIDEsIGZpcmVEYXRhKVxuICAgIGRhdGFbMV0uZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lci5jYWxsKHRoaXMsIGZpcmVEYXRhKSlcbiAgICBjbnQgKz0gZGF0YVsxXS5sZW5ndGhcbiAgfVxuICByZXR1cm4gY250XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZGVsZXRlcyBzcGVjaWZpYyBsaXN0ZW5lcnMgZnJvbSBhIGhhbmRsZXJzIGV2ZW50XG4gKiBkYXRhIHN0cnVjdHVyZS4gRm9yIGluc3RhbmNlLCBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyB1c2VkIGZvciBib3RoXG4gKiBhIFwiY2hhbmdlZFwiIGFuZCBhIFwiY2hhbmdlZDpjb2xvclwiIGV2ZW50LCBhbmQgdGhhdCBjYWxsYmFjayBpcyBkZWxldGVkXG4gKiBmcm9tIHRoZSBcImNoYW5nZWRcIiBldmVudCwgaXQgaXMgYWxzbyBkZWxldGVkIGZyb20gdGhlIFwiY2hhbmdlZDpjb2xvclwiIGV2ZW50XG4gKiBAcGFyYW0gIHtPYmplY3R9IGN1cnJOb2RlICBDdXJyZW50IG5vZGUgb2YgdGhlIG1hcCBkYXRhIHN0cnVjdHVyZSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSAge2Z1bmN0aW9uW119IGxpc3RlbmVycyBBcnJheSBvZiBsaXN0ZW5lcnMgdG8gZGVsZXRlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVEZWxldGUoY3Vyck5vZGUsIGxpc3RlbmVycykge1xuICBsZXQgaW5kZXggPSAtMVxuICBjb25zdCBzdWJub2RlcyA9IGN1cnJOb2RlWzBdXG4gIGNvbnN0IG5vZGVsaXN0ZW5lcnMgPSBjdXJyTm9kZVsxXVxuICBpZiAobm9kZWxpc3RlbmVycy5sZW5ndGgpIHtcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICBpZiAoKGluZGV4ID0gbm9kZWxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSkgPj0gMCkge1xuICAgICAgICBub2RlbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHN1Ym5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICByZWN1cnNpdmVEZWxldGUobm9kZSwgbGlzdGVuZXJzKVxuICB9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGFuIGlucHV0IGlzIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MsIGFuZCBpZiB0aGUgZm9ybWVyXG4gKiByZXR1cm5zIGEgMS1lbGVtZW50IHN0cmluZyBhcnJheVxuICogQHBhcmFtICB7c3RyaW5nfHN0cmluZ1tdfSBpbnR5cGVcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXJyYXlpZnkoaW50eXBlKSB7XG4gIGxldCBhcnJheVRvVXNlID0gaW50eXBlXG4gIGlmICh0eXBlb2YgaW50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgYXJyYXlUb1VzZSA9IFtpbnR5cGVdXG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoaW50eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIklucHV0IG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc1wiKVxuICB9XG4gIHJldHVybiBhcnJheVRvVXNlXG59XG5cbi8qKiBDbGFzcyBmb3IgbWFuYWdpbmcgZXZlbnRzIGFuZCBsaXN0ZW5lcnMuIENhbiBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBvciBhIG1peGluICh1c2luZyBAc2VlIHtAbGluayBhZ2dyZWdhdGlvbn0pICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudEhhbmRsZXIge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gIHtzdHJpbmd8c3RyaW5nW119IGV2ZW50c1RvUmVnaXN0ZXIgaW5pdGlhbCBldmVudHMgdG8gcmVnaXN0ZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKGV2ZW50c1RvUmVnaXN0ZXIpIHtcbiAgICB0aGlzLmluaXRpYWxpemVyKGV2ZW50c1RvUmVnaXN0ZXIpXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYW4gZXZlbnQgaGFuZGxlciBvYmplY3RcbiAgICogQHBhcmFtICB7c3RyaW5nfHN0cmluZ1tdfSBldmVudHNUb1JlZ2lzdGVyIGV2ZW50cyB0byBpbml0aWFsaXplIGV2ZW50IGhhbmRsZXIgd2l0aFxuICAgKiBAc2VlICB7QGxpbmsgYWdncmVnYXRpb259XG4gICAqL1xuICBpbml0aWFsaXplcihldmVudHNUb1JlZ2lzdGVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50cyhldmVudHNUb1JlZ2lzdGVyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBuZXcgZXZlbnRzIGZvciB0aGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gIHtzdHJpbmd8c3RyaW5nW119IGV2ZW50cyBuZXcgZXZlbnQocykgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyRXZlbnRzKGV2ZW50cykge1xuICAgIGlmICghZXZlbnRzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgZXZlbnRzVG9Vc2UgPSBhcnJheWlmeShldmVudHMpXG4gICAgaWYgKHR5cGVvZiBldmVudHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGV2ZW50c1RvVXNlID0gW2V2ZW50c11cbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV2ZW50cyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NcIilcbiAgICB9XG5cbiAgICBldmVudHNUb1VzZS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHN1YmV2ZW50cyA9IGV2ZW50LnNwbGl0KFwiOlwiKVxuICAgICAgbGV0IGN1cnJNYXAgPSB0aGlzLl9saXN0ZW5lcnNcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3Vyck1hcC5nZXQoc3ViZXZlbnRzW2ldKVxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gW25ldyBNYXAoKSwgW11dXG4gICAgICAgICAgY3Vyck1hcC5zZXQoc3ViZXZlbnRzW2ldLCBkYXRhKVxuICAgICAgICB9XG4gICAgICAgIGN1cnJNYXAgPSBkYXRhWzBdXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGxpc3RlbmVyIHRvIGEgc3BlY2lmaWMgZXZlbnQgb3IgbGlzdCBvZiBkaWZmZXJlbnQgZXZlbnRzXG4gICAqIEBwYXJhbSAge3N0cmluZ3xzdHJpbmdbXX0gdHlwZXMgICAgZXZlbnQocykgdGhpcyBsaXN0ZW5lciBpcyBsaXN0ZW5pbmcgdG9cbiAgICogQHBhcmFtICB7RXZlbnRDYWxsYmFja30gbGlzdGVuZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZXZlbnRzIGRlc3RyaWJlZCBieSB0eXBlcyBpcyBmaXJlZFxuICAgKiBAcmV0dXJuIHtFdmVudEhhbmRsZXJ9ICAgICAgICAgIHRoaXNcbiAgICovXG4gIG9uKHR5cGVzLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IHR5cGVzVG9Vc2UgPSBhcnJheWlmeSh0eXBlcylcbiAgICB0eXBlc1RvVXNlLmZvckVhY2godHlwZSA9PiB7XG4gICAgICBjb25zdCBzdWJ0eXBlcyA9IHR5cGUuc3BsaXQoXCI6XCIpXG4gICAgICBsZXQgY3Vyck1hcCA9IHRoaXMuX2xpc3RlbmVyc1xuICAgICAgbGV0IGRhdGEgPSBudWxsXG4gICAgICBzdWJ0eXBlcy5mb3JFYWNoKHN1YnR5cGUgPT4ge1xuICAgICAgICBkYXRhID0gY3Vyck1hcC5nZXQoc3VidHlwZSlcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IFtdXG4gICAgICAgICAgY3Vyck1hcC5mb3JFYWNoKCh2YWwsIGtleSkgPT4ga2V5cy5wdXNoKGtleSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIGV2ZW50IHR5cGUuIFRoZSByZWdpc3RlcmVkIGV2ZW50IHR5cGVzIGF0IHRoaXMgbGV2ZWwgYXJlIFske2tleXN9XWApXG4gICAgICAgIH1cbiAgICAgICAgY3Vyck1hcCA9IGRhdGFbMF1cbiAgICAgIH0pXG4gICAgICBpZiAoZGF0YVsxXS5pbmRleE9mKGxpc3RlbmVyKSA8IDApIHtcbiAgICAgICAgZGF0YVsxXS5wdXNoKGxpc3RlbmVyKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHNwZWNpZmljIGV2ZW50c1xuICAgKiBAcGFyYW0gIHtzdHJpbmd8c3RyaW5nW119IHR5cGVzICAgIGV2ZW50KHMpIHRoZSBsaXN0ZW5lciBpcyBiZWluZyByZW1vdmVkIGZyb21cbiAgICogQHBhcmFtICB7RXZlbnRDYWxsYmFja30gbGlzdGVuZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2xlYXJlZCBmcm9tIHRoZSBzcGVjaWZpZWQgZXZlbnQgdHlwZXNcbiAgICogQHJldHVybiB7RXZlbnRIYW5kbGVyfSAgICAgICAgICB0aGlzXG4gICAqL1xuICBvZmYodHlwZXMsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgdHlwZXNUb1VzZSA9IGFycmF5aWZ5KHR5cGVzKVxuICAgIGxldCBsaXN0ZW5lcnMgPSBsaXN0ZW5lclxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgICBsaXN0ZW5lcnMgPSBbbGlzdGVuZXJdXG4gICAgfVxuICAgIHR5cGVzVG9Vc2UuZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGNvbnN0IHN1YnR5cGVzID0gdHlwZS5zcGxpdChcIjpcIilcbiAgICAgIGxldCBjdXJyTWFwID0gdGhpcy5fbGlzdGVuZXJzXG4gICAgICBsZXQgZGF0YSA9IG51bGxcbiAgICAgIGxldCBpID0gMFxuICAgICAgZm9yIChpID0gMDsgaSA8IHN1YnR5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGRhdGEgPSBjdXJyTWFwLmdldChzdWJ0eXBlc1tpXSlcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjdXJyTWFwID0gZGF0YVswXVxuICAgICAgfVxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgcmVjdXJzaXZlRGVsZXRlKGRhdGEsIGxpc3RlbmVycylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIGxpc3RlciBjYWxsYmFjayB0byBvbmx5IGJlIGNhbGxlZCBvbmNlXG4gICAqIEBwYXJhbSAge3N0cmluZ3xzdHJpbmdbXX0gdHlwZXMgICAgZXZlbnQocykgdGhlIGxpc3RlbmVyIGlzIGxpc3RlbmluZyB0b1xuICAgKiBAcGFyYW0gIHtFdmVudENhbGxiYWNrfSBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2l0aCBldmVudChzKSBhcmUgZmlyZWRcbiAgICogQHJldHVybiB7RXZlbnRIYW5kbGVyfSAgICAgICAgICB0aGlzXG4gICAqL1xuICBvbmNlKHR5cGVzLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IHdyYXBwZXIgPSAoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5vZmYodHlwZXMsIHdyYXBwZXIpXG4gICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGRhdGEpXG4gICAgfVxuICAgIHRoaXMub24odHlwZXMsIHdyYXBwZXIpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBhIHNwZWNpZmljIGV2ZW50IGFuZCBjYWxscyBhbnkgbGlzdGVuZXJzIG9mIHRoYXQgZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtICB7c3RyaW5nfSB0eXBlIEV2ZW50IHR5cGUgdG8gZmlyZVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgQWRkaXRpb25hbCBkYXRhIHRvIGZpcmUgd2l0aCB0aGUgZXZlbnRcbiAgICogQHJldHVybiB7RXZlbnRIYW5kbGVyfSAgICAgIHRoaXNcbiAgICovXG4gIGZpcmUodHlwZSwgZGF0YSkge1xuICAgIGNvbnN0IHN1YnR5cGVzID0gdHlwZS5zcGxpdChcIjpcIilcblxuICAgIGxldCBmaXJlRGF0YSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICB0YXJnZXQ6IHRoaXNcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKGZpcmVEYXRhLCBkYXRhKVxuXG4gICAgcmVjdXJzaXZlRmlyZSh0aGlzLl9saXN0ZW5lcnMsIHN1YnR5cGVzLCAwLCBmaXJlRGF0YSlcblxuICAgIC8vIFRvIGVuc3VyZSB0aGF0IG5vIGVycm9yIGV2ZW50cyBhcmUgZHJvcHBlZCwgcHJpbnQgdGhlbSB0byB0aGVcbiAgICAvLyBjb25zb2xlIGlmIHRoZXkgaGF2ZSBubyBsaXN0ZW5lcnMuXG4gICAgLy8gaWYgKCFudW1GaXJlcyAmJiBlbmRzV2l0aCh0eXBlLCBcImVycm9yXCIpKSB7XG4gICAgLy8gICBjb25zb2xlLmVycm9yKChkYXRhICYmIGRhdGEuZXJyb3IpIHx8IGRhdGEgfHwgXCJFbXB0eSBlcnJvciBldmVudFwiKVxuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLl9ldmVudFBhcmVudCkge1xuICAgICAgZmlyZURhdGEgPSB7fVxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBmaXJlRGF0YVtrZXldID0gZGF0YVtrZXldXG4gICAgICB9KVxuICAgICAgdGhpcy5fZXZlbnRQYXJlbnQuZmlyZSh0eXBlLCBmaXJlRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBldmVudCBoYW5kZXIgZmlyZXMgYSBzcGVjaWZpYyBldmVudCB0eXBlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdHlwZSBFdmVudCB0eXBlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBsaXN0ZW5zKHR5cGUpIHtcbiAgICBjb25zdCBzdWJ0eXBlcyA9IHR5cGUuc3BsaXQoXCI6XCIpXG4gICAgbGV0IGN1cnJNYXAgPSB0aGlzLl9saXN0ZW5lcnNcbiAgICBsZXQgZGF0YSA9IG51bGxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnR5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBkYXRhID0gY3Vyck1hcC5nZXQoc3VidHlwZXNbaV0pXG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGN1cnJNYXAgPSBkYXRhWzBdXG4gICAgfVxuICAgIHJldHVybiBkYXRhIHx8ICh0aGlzLl9ldmVudFBhcmVudCAmJiB0aGlzLl9ldmVudFBhcmVudC5saXN0ZW5zKHR5cGUpKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBwYXJlbnQgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0ge0V2ZW50SGFuZGxlcn0gcGFyZW50XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqL1xuICBzZXRFdmVudGVkUGFyZW50KHBhcmVudCwgZGF0YSkge1xuICAgIHRoaXMuX2V2ZW50UGFyZW50ID0gcGFyZW50XG4gICAgdGhpcy5fZXZlbnRQYXJlbnREYXRhID0gZGF0YVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vdXRpbC9ldmVudC1oYW5kbGVyLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.EventConstants = undefined;\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _canvasUtils = __webpack_require__(26);\n\nvar CanvasUtils = _interopRequireWildcard(_canvasUtils);\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _baseShape = __webpack_require__(6);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _basicStyle = __webpack_require__(8);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _utils = __webpack_require__(27);\n\nvar _camera2d = __webpack_require__(28);\n\nvar _camera2d2 = _interopRequireDefault(_camera2d);\n\nvar _eventHandler = __webpack_require__(12);\n\nvar _eventHandler2 = _interopRequireDefault(_eventHandler);\n\nvar _ResizeSensor = __webpack_require__(29);\n\nvar _ResizeSensor2 = _interopRequireDefault(_ResizeSensor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar mouseevents = [\"mousedown\", \"mouseup\", \"mousemove\", \"click\", \"dblclick\", \"mouseover\", \"mouseout\", \"touchstart\", \"touchend\", \"touchmove\"];\nvar marginProps = [\"top\", \"bottom\", \"left\", \"right\"];\n\nvar EventConstants = exports.EventConstants = {\n MOUSEDOWN: \"mousedown\",\n MOUSEUP: \"mouseup\",\n MOUSEMOVE: \"mousemove\",\n CLICK: \"click\",\n DBLCLICK: \"dblclick\",\n MOUSEOVER: \"mouseover\",\n MOUSEOUT: \"mouseout\",\n SHAPE_ADD: \"shape:add\",\n SHAPE_DELETE: \"shape:delete\",\n TOUCHSTART: \"touchstart\",\n TOUCHEND: \"touchend\",\n TOUCHMOVE: \"touchmove\"\n};\n\nvar DrawStyleState = function (_BasicStyle) {\n _inherits(DrawStyleState, _BasicStyle);\n\n function DrawStyleState() {\n var _ref;\n\n _classCallCheck(this, DrawStyleState);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var _this = _possibleConstructorReturn(this, (_ref = DrawStyleState.__proto__ || Object.getPrototypeOf(DrawStyleState)).call.apply(_ref, [this].concat(args)));\n\n _this._defaults = {\n packedFillColor: _this.packedFillColor,\n packedStrokeColor: _this.packedStrokeColor,\n strokeWidth: _this.strokeWidth,\n lineJoin: _this.lineJoin,\n lineCap: _this.lineCap,\n dashPattern: _this.dashPattern,\n dashOffset: _this.dashOffset\n };\n return _this;\n }\n\n _createClass(DrawStyleState, [{\n key: \"setFillStyle\",\n value: function setFillStyle(ctx, fillStyle) {\n if (fillStyle.packedFillColor !== this.packedFillColor) {\n this.packedFillColor = fillStyle.packedFillColor;\n ctx.fillStyle = this.fillColor;\n }\n }\n }, {\n key: \"setStrokeStyle\",\n value: function setStrokeStyle(ctx, strokeStyle) {\n if (strokeStyle.packedStrokeColor !== this.packedStrokeColor) {\n this.packedStrokeColor = strokeStyle.packedStrokeColor;\n ctx.strokeStyle = this.strokeColor;\n }\n if (strokeStyle.strokeWidth !== this._strokeWidth) {\n this.strokeWidth = strokeStyle.strokeWidth;\n ctx.lineWidth = this._strokeWidth;\n }\n if (strokeStyle.lineJoin !== this._lineJoin) {\n this.lineJoin = strokeStyle.lineJoin;\n ctx.lineJoin = this._lineJoin;\n }\n if (strokeStyle.lineCap !== this._lineCap) {\n this.lineCap = strokeStyle.lineCap;\n ctx.lineCap = this._lineCap;\n }\n\n var dashPattern = strokeStyle._dashPattern;\n var diff = false;\n if (dashPattern.length === this._dashPattern.length) {\n for (var i = 0; i < dashPattern.length; i += 1) {\n if (dashPattern[i] !== this._dashPattern[i]) {\n diff = true;\n break;\n }\n }\n } else {\n diff = true;\n }\n\n if (diff) {\n this.dashPattern = dashPattern;\n ctx.setLineDash(this._dashPattern);\n }\n\n if (strokeStyle.dashOffset !== this._dashOffset) {\n this.dashOffset = strokeStyle.dashOffset;\n ctx.lineDashOffset = this._dashOffset;\n }\n }\n }, {\n key: \"applyDefaults\",\n value: function applyDefaults(ctx) {\n var _this2 = this;\n\n Object.getOwnPropertyNames(this._defaults).forEach(function (prop) {\n _this2[prop] = _this2._defaults[prop];\n });\n this.setFillCtx(ctx);\n this.setStrokeCtx(ctx);\n }\n }]);\n\n return DrawStyleState;\n}(_basicStyle2.default);\n\nfunction addClass(element, className) {\n if (element && (\" \" + element.className + \" \").indexOf(\" \" + className + \" \") < 0) {\n element.className += (element.className ? \" \" : \"\") + className;\n }\n}\n\nfunction createCanvas(parent) {\n var canvasContainer = document.createElement(\"div\");\n addClass(canvasContainer, \"mapd-draw-canvas-container\");\n\n var canvas = document.createElement(\"canvas\");\n var canvasContext = canvas.getContext(\"2d\");\n var ratio = CanvasUtils.makeCanvasAutoHighDPI(canvasContext);\n // const ratio = 1\n\n // add class?\n addClass(canvas, \"mapd-draw-canvas\");\n canvas.style.position = \"absolute\";\n canvas.style.pointerEvents = \"none\";\n\n canvasContainer.appendChild(canvas);\n\n // canvas.setAttribute(\"width\", ratio * parent.offsetX)\n // canvas.setAttribute(\"height\", ratio * parent.offsetY)\n // parent.insertBefore(canvas, parent.firstChild)\n parent.appendChild(canvasContainer);\n\n return {\n canvasContainer: canvasContainer,\n canvas: canvas,\n canvasContext: canvasContext,\n ratio: ratio\n };\n}\n\nfunction addShapesToMap(newShapes, existingObjectsMap, currIds, reorderCb, redrawCb) {\n newShapes.forEach(function (shape) {\n existingObjectsMap.set(shape, {\n shapeObj: shape,\n shapeId: currIds.shapeId,\n shapeIdx: -1\n });\n shape.on([\"changed:order\", \"changed:visibility\", \"changed:style\"], reorderCb);\n shape.on([\"changed:geom\", \"changed:visibility\", \"changed:xform\"], redrawCb);\n currIds.shapeId += 1;\n });\n}\n\nfunction deleteShapesFromMap(shapes, existingObjectsMap, reorderCb, redrawCb) {\n var idxs = [];\n shapes.forEach(function (shape) {\n var shapeInfo = existingObjectsMap.get(shape);\n if (shapeInfo) {\n idxs.push(shapeInfo.shapeIdx);\n }\n existingObjectsMap.delete(shape);\n shape.off([\"changed\"], [reorderCb, redrawCb]);\n });\n return idxs;\n}\n\nvar DrawEngine = function (_EventHander) {\n _inherits(DrawEngine, _EventHander);\n\n function DrawEngine(parent, opts) {\n _classCallCheck(this, DrawEngine);\n\n var _this3 = _possibleConstructorReturn(this, (DrawEngine.__proto__ || Object.getPrototypeOf(DrawEngine)).call(this));\n\n _this3._init(parent, opts);\n return _this3;\n }\n\n _createClass(DrawEngine, [{\n key: \"destroy\",\n value: function destroy() {\n var _this4 = this;\n\n this._destroyCanvas();\n\n if (this._objects) {\n this._objects.forEach(function (shapeInfo, shape) {\n shape.off(\"changed\", [_this4._reorderCb, _this4._redrawCb]);\n });\n this._objects.clear();\n this._sortedObjs = [];\n this._reorderedObjIdxs.clear();\n }\n }\n }, {\n key: \"_resize\",\n value: function _resize(opts) {\n var width = 0;\n if (this._parent.offsetWidth) {\n width = Math.max(width, this._parent.offsetWidth - this._margins.left - this._margins.right);\n }\n\n var height = 0;\n if (this._parent.offsetHeight) {\n height = Math.max(height, this._parent.offsetHeight - this._margins.top - this._margins.bottom);\n }\n\n this._drawCanvas.width = width * this._pixelRatio;\n this._drawCanvas.height = height * this._pixelRatio;\n\n this._drawCanvas.style.left = this._margins.left + \"px\";\n this._drawCanvas.style.top = this._margins.top + \"px\";\n this._drawCanvas.style.width = width + \"px\";\n this._drawCanvas.style.height = height + \"px\";\n\n if (this._camera) {\n // const currViewport = this._camera.viewport\n // const currSpace = this._camera.projectionBounds\n // const viewportExtents = [0, 0]\n // AABox2d.getExtents(viewportExtents, currViewport)\n // const spaceCenter = [0, 0]\n // const spaceExtents = [0, 0]\n // AABox2d.getCenter(spaceCenter, currSpace)\n // AABox2d.getExtents(spaceExtents, currSpace)\n // const ratio = spaceExtents\n // Vec2d.div(ratio, spaceExtents, viewportExtents)\n // AABox2d.set(currViewport, 0, 0, width, height)\n // AABox2d.getExtents(viewportExtents, currViewport)\n // Vec2d.multiply(spaceExtents, ratio, viewportExtents)\n // AABox2d.initCenterExtents(currSpace, spaceCenter, spaceExtents)\n // this._camera.viewport = currViewport\n // this._camera.projectionBounds = currSpace\n // // this._camera.viewport = [0, 0, width, height]\n // // this._camera.projectionBounds = [0, 0, width, height]\n } else {\n var projDims = opts && opts.projectionDimensions ? opts.projectionDimensions : [width, height];\n this._camera = new _camera2d2.default([0, 0, width, height], projDims, opts.flipY ? Boolean(opts.flipY) : false);\n this._camera.setPosition(opts && opts.cameraPosition ? opts.cameraPosition : [width / 2.0, height / 2.0]);\n this._camera.on(\"changed\", this._rerenderCb);\n }\n // this._camera = new Camera2d([0, 0, this.width, this.height], [0, 0, this.width, this.height])\n // this._camera.on(\"changed\", this._rerenderCb)\n\n this._rerenderCb();\n }\n }, {\n key: \"_mousedownCB\",\n value: function _mousedownCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mousedown\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_touchstartCB\",\n value: function _touchstartCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n this.fire(\"touchstart\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mouseupCB\",\n value: function _mouseupCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mouseup\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_touchendCB\",\n value: function _touchendCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"touchend\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mousemoveCB\",\n value: function _mousemoveCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mousemove\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_touchmoveCB\",\n value: function _touchmoveCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"touchmove\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_clickCB\",\n value: function _clickCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"click\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_dblclickCB\",\n value: function _dblclickCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"dblclick\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mouseoverCB\",\n value: function _mouseoverCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mouseover\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mouseoutCB\",\n value: function _mouseoutCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mouseout\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_enableEvents\",\n value: function _enableEvents() {\n this.registerEvents(mouseevents);\n var callbacks = mouseevents.map(function (event) {\n return \"_\" + event + \"CB\";\n });\n // bindAll(callbacks, this)\n for (var i = 0; i < mouseevents.length; i += 1) {\n document.addEventListener(mouseevents[i], this[callbacks[i]], true);\n }\n }\n }, {\n key: \"_disableEvents\",\n value: function _disableEvents() {\n var callbacks = mouseevents.map(function (event) {\n return \"_\" + event + \"CB\";\n });\n for (var i = 0; i < mouseevents.length; i += 1) {\n document.removeEventListener(mouseevents[i], this[callbacks[i]], true);\n }\n }\n }, {\n key: \"_initCanvas\",\n value: function _initCanvas(parent, opts) {\n var _this5 = this;\n\n var forceEvents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n this._margins = opts && opts.margins ? Object.assign({}, opts.margins) : {};\n marginProps.forEach(function (prop) {\n if (typeof _this5._margins[prop] !== \"number\") {\n _this5._margins[prop] = 0;\n }\n });\n\n var _createCanvas = createCanvas(parent),\n canvasContainer = _createCanvas.canvasContainer,\n canvas = _createCanvas.canvas,\n canvasContext = _createCanvas.canvasContext,\n ratio = _createCanvas.ratio;\n\n this._container = canvasContainer;\n this._drawCanvas = canvas;\n this._drawCtx = canvasContext;\n this._pixelRatio = ratio;\n this._parent = parent;\n\n (0, _utils.bindAll)([\"_resize\"], this);\n this._resize(opts);\n this._resizeSensor = new _ResizeSensor2.default(parent, this._resize);\n\n if (forceEvents || forceEvents === null && opts && opts.enableEvents) {\n this._enableEvents();\n }\n }\n }, {\n key: \"_destroyCanvas\",\n value: function _destroyCanvas() {\n if (this._drawCanvas) {\n this._disableEvents();\n }\n\n if (this._parent) {\n this._parent.removeChild(this._drawCanvas);\n\n if (this._resizeSensor) {\n this._resizeSensor.detach(this._parent, this._resize);\n }\n }\n\n this._drawCanvas = null;\n this._drawCtx = null;\n this._parent = null;\n }\n }, {\n key: \"_init\",\n value: function _init(parent, opts) {\n var forceEvents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n this.registerEvents([EventConstants.SHAPE_ADD, EventConstants.SHAPE_DELETE]);\n\n (0, _utils.bindAll)([\"_reorderCb\", \"_rerenderCb\"], this);\n (0, _utils.bindAll)([\"_mousedownCB\", \"_mouseupCB\", \"_mousemoveCB\", \"_clickCB\", \"_dblclickCB\", \"_mouseoverCB\", \"_mouseoutCB\", \"_touchstartCB\", \"_touchendCB\", \"_touchmoveCB\"], this);\n\n this._renderFrameCb = this.renderAll.bind(this);\n this._renderRequestId = 0;\n this._ids = {\n shapeId: 1\n };\n\n this._objects = new Map();\n this._sortedObjs = [];\n this._reorderedObjIdxs = new Set();\n\n this._initCanvas(parent, opts, forceEvents);\n\n this._styleState = new DrawStyleState({\n fillColor: \"red\"\n });\n }\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this._parent;\n }\n }, {\n key: \"getCanvasContainer\",\n value: function getCanvasContainer() {\n return this._container;\n }\n }, {\n key: \"getCanvas\",\n value: function getCanvas() {\n return this._drawCanvas;\n }\n }, {\n key: \"project\",\n value: function project(out, screenPt) {\n var screenToWorldMatrix = this._camera.screenToWorldMatrix;\n return Point2d.transformMat2d(out, screenPt, screenToWorldMatrix);\n }\n }, {\n key: \"unproject\",\n value: function unproject(out, worldPt) {\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n return Point2d.transformMat2d(out, worldPt, worldToScreenMatrix);\n }\n }, {\n key: \"hasShape\",\n value: function hasShape(shape) {\n return this._objects.has(shape);\n }\n }, {\n key: \"addShape\",\n value: function addShape(shape) {\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n\n addShapesToMap(shapes, this._objects, this._ids, this._reorderCb, this._rerenderCb);\n\n // fire add event\n this.fire(\"shape:add\", {\n shape: shapes\n });\n\n var proxyEvent = {\n target: shapes\n };\n this._reorderCb(proxyEvent);\n\n return this;\n }\n }, {\n key: \"deleteShape\",\n value: function deleteShape(shape) {\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n\n var idxs = deleteShapesFromMap(shapes, this._objects, this._reorderCb, this._rerenderCb);\n var index = -1;\n for (var i = 0; i < shapes.length; i += 1) {\n if ((index = this._sortedObjs.indexOf(shapes[i])) >= 0) {\n this._sortedObjs.splice(index, 1);\n }\n this._reorderedObjIdxs.add(idxs[i]);\n }\n this._rerenderCb();\n\n this.fire(\"shape:delete\", {\n shape: shapes\n });\n\n return this;\n }\n }, {\n key: \"deleteAllShapes\",\n value: function deleteAllShapes() {\n this.deleteShape(this.sortedShapes.slice());\n return this;\n }\n }, {\n key: \"moveShapeToTop\",\n value: function moveShapeToTop(shape) {\n if (this._objects.has(shape)) {\n var shapes = this.sortedShapes;\n var zindex = shapes[shapes.length - 1].zIndex;\n shape.zIndex = zindex + 1;\n }\n }\n }, {\n key: \"moveShapeToBack\",\n value: function moveShapeToBack(shape) {\n if (this._objects.has(shape)) {\n var shapes = this.sortedShapes;\n var zindex = shapes[0].zIndex;\n shape.zIndex = zindex;\n }\n }\n }, {\n key: \"getShapesAsJSON\",\n value: function getShapesAsJSON() {\n var shapes = this.sortedShapes;\n return shapes.map(function (shape) {\n return shape.toJSON();\n });\n }\n }, {\n key: \"_rerenderCb\",\n value: function _rerenderCb() {\n if (this._renderRequestId) {\n window.cancelAnimationFrame(this._renderRequestId);\n }\n this._renderRequestId = window.requestAnimationFrame(this._renderFrameCb);\n }\n }, {\n key: \"_reorderCb\",\n value: function _reorderCb(event) {\n var _this6 = this;\n\n var changedShapes = event.target;\n if (!Array.isArray(changedShapes)) {\n changedShapes = [event.target];\n }\n changedShapes.forEach(function (changedShape) {\n console.assert(changedShape, \"A changed event doesn't have an object\");\n var shapeInfo = _this6._objects.get(changedShape);\n console.assert(shapeInfo, \"A changed event target isn't in the list of shapes \" + changedShape);\n if (shapeInfo.shapeIdx < 0) {\n shapeInfo.shapeIdx = _this6._sortedObjs.push(changedShape) - 1;\n }\n _this6._reorderedObjIdxs.add(shapeInfo.shapeIdx);\n });\n this._rerenderCb();\n }\n }, {\n key: \"_renderShapes\",\n value: function _renderShapes(ctx, drawShapes, camera) {\n var _this7 = this;\n\n var worldToScreenMat = camera.worldToScreenMatrix;\n drawShapes.forEach(function (shape) {\n if (shape.visible) {\n shape.render(ctx, worldToScreenMat, _this7._styleState);\n }\n });\n }\n }, {\n key: \"renderAll\",\n value: function renderAll() {\n var ctx = this._drawCtx;\n // ctx.clearRect(0, 0, this.width, this.height)\n ctx.clearRect(0, 0, this._drawCanvas.offsetWidth, this._drawCanvas.offsetHeight);\n\n if (!this._objects.size) {\n return;\n }\n\n ctx.save();\n var drawShapes = this.sortedShapes;\n this._styleState.applyDefaults(ctx);\n this._renderShapes(ctx, drawShapes, this._camera);\n ctx.restore();\n }\n }, {\n key: \"sortedShapes\",\n get: function get() {\n if (this._reorderedObjIdxs.size) {\n console.assert(this._sortedObjs.length === this._objects.size, \"Size mismatch when rendering objets. Something got out of sync - sorted objs length: \" + this._sortedObjs.length + \", objects length: \" + this._objects.size);\n\n // if (this._reorderedObjIdxs.length / this._sortedObjs.length > 0.7) {\n // // might as well just resort the whole thing over\n // this._sortedObjs.sort(shapeInfoCompare)\n // } else {\n // }\n\n this._sortedObjs.sort(_baseShape2.default.shapeCompare);\n this._reorderedObjIdxs.clear();\n }\n return this._sortedObjs;\n }\n }, {\n key: \"margins\",\n get: function get() {\n var _this8 = this;\n\n var rtn = {};\n marginProps.forEach(function (prop) {\n rtn[prop] = _this8._margins[prop];\n });\n return rtn;\n },\n set: function set(margins) {\n var _this9 = this;\n\n marginProps.forEach(function (prop) {\n if (typeof margins[prop] === \"number\" && margins[prop] !== _this9._margins[prop]) {\n _this9._margins[prop] = margins.prop;\n }\n });\n\n this._resize();\n }\n }, {\n key: \"viewport\",\n get: function get() {\n return this._camera.viewport;\n },\n set: function set(viewport) {\n this._camera.viewport = viewport;\n }\n }, {\n key: \"projectionDimensions\",\n get: function get() {\n return this._camera.projectionDimensions;\n },\n set: function set(projectionDimensions) {\n this._camera.projectionDimensions = projectionDimensions;\n return this;\n }\n }, {\n key: \"cameraPosition\",\n get: function get() {\n return this._camera.getPosition();\n },\n set: function set(pos) {\n this._camera.setPosition(pos);\n return this;\n }\n }]);\n\n return DrawEngine;\n}(_eventHandler2.default);\n\nexports.default = DrawEngine;\n\n\nDrawEngine.EventConstants = EventConstants;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9lbmdpbmUvZHJhdy1lbmdpbmUuanM/ZmYwMiJdLCJuYW1lcyI6WyJDYW52YXNVdGlscyIsIlBvaW50MmQiLCJtb3VzZWV2ZW50cyIsIm1hcmdpblByb3BzIiwiRXZlbnRDb25zdGFudHMiLCJNT1VTRURPV04iLCJNT1VTRVVQIiwiTU9VU0VNT1ZFIiwiQ0xJQ0siLCJEQkxDTElDSyIsIk1PVVNFT1ZFUiIsIk1PVVNFT1VUIiwiU0hBUEVfQUREIiwiU0hBUEVfREVMRVRFIiwiVE9VQ0hTVEFSVCIsIlRPVUNIRU5EIiwiVE9VQ0hNT1ZFIiwiRHJhd1N0eWxlU3RhdGUiLCJhcmdzIiwiX2RlZmF1bHRzIiwicGFja2VkRmlsbENvbG9yIiwicGFja2VkU3Ryb2tlQ29sb3IiLCJzdHJva2VXaWR0aCIsImxpbmVKb2luIiwibGluZUNhcCIsImRhc2hQYXR0ZXJuIiwiZGFzaE9mZnNldCIsImN0eCIsImZpbGxTdHlsZSIsImZpbGxDb2xvciIsInN0cm9rZVN0eWxlIiwic3Ryb2tlQ29sb3IiLCJfc3Ryb2tlV2lkdGgiLCJsaW5lV2lkdGgiLCJfbGluZUpvaW4iLCJfbGluZUNhcCIsIl9kYXNoUGF0dGVybiIsImRpZmYiLCJsZW5ndGgiLCJpIiwic2V0TGluZURhc2giLCJfZGFzaE9mZnNldCIsImxpbmVEYXNoT2Zmc2V0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJwcm9wIiwic2V0RmlsbEN0eCIsInNldFN0cm9rZUN0eCIsIkJhc2ljU3R5bGUiLCJhZGRDbGFzcyIsImVsZW1lbnQiLCJjbGFzc05hbWUiLCJpbmRleE9mIiwiY3JlYXRlQ2FudmFzIiwicGFyZW50IiwiY2FudmFzQ29udGFpbmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2FudmFzIiwiY2FudmFzQ29udGV4dCIsImdldENvbnRleHQiLCJyYXRpbyIsIm1ha2VDYW52YXNBdXRvSGlnaERQSSIsInN0eWxlIiwicG9zaXRpb24iLCJwb2ludGVyRXZlbnRzIiwiYXBwZW5kQ2hpbGQiLCJhZGRTaGFwZXNUb01hcCIsIm5ld1NoYXBlcyIsImV4aXN0aW5nT2JqZWN0c01hcCIsImN1cnJJZHMiLCJyZW9yZGVyQ2IiLCJyZWRyYXdDYiIsInNldCIsInNoYXBlIiwic2hhcGVPYmoiLCJzaGFwZUlkIiwic2hhcGVJZHgiLCJvbiIsImRlbGV0ZVNoYXBlc0Zyb21NYXAiLCJzaGFwZXMiLCJpZHhzIiwic2hhcGVJbmZvIiwiZ2V0IiwicHVzaCIsImRlbGV0ZSIsIm9mZiIsIkRyYXdFbmdpbmUiLCJvcHRzIiwiX2luaXQiLCJfZGVzdHJveUNhbnZhcyIsIl9vYmplY3RzIiwiX3Jlb3JkZXJDYiIsIl9yZWRyYXdDYiIsImNsZWFyIiwiX3NvcnRlZE9ianMiLCJfcmVvcmRlcmVkT2JqSWR4cyIsIndpZHRoIiwiX3BhcmVudCIsIm9mZnNldFdpZHRoIiwiTWF0aCIsIm1heCIsIl9tYXJnaW5zIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0IiwidG9wIiwiYm90dG9tIiwiX2RyYXdDYW52YXMiLCJfcGl4ZWxSYXRpbyIsIl9jYW1lcmEiLCJwcm9qRGltcyIsInByb2plY3Rpb25EaW1lbnNpb25zIiwiQ2FtZXJhMmQiLCJmbGlwWSIsIkJvb2xlYW4iLCJzZXRQb3NpdGlvbiIsImNhbWVyYVBvc2l0aW9uIiwiX3JlcmVuZGVyQ2IiLCJldmVudCIsInRhcmdldCIsImZpcmUiLCJvcmlnaW5hbEV2ZW50IiwicmVnaXN0ZXJFdmVudHMiLCJjYWxsYmFja3MiLCJtYXAiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZvcmNlRXZlbnRzIiwibWFyZ2lucyIsImFzc2lnbiIsIl9jb250YWluZXIiLCJfZHJhd0N0eCIsIl9yZXNpemUiLCJfcmVzaXplU2Vuc29yIiwiUmVzaXplU2Vuc29yIiwiZW5hYmxlRXZlbnRzIiwiX2VuYWJsZUV2ZW50cyIsIl9kaXNhYmxlRXZlbnRzIiwicmVtb3ZlQ2hpbGQiLCJkZXRhY2giLCJfcmVuZGVyRnJhbWVDYiIsInJlbmRlckFsbCIsImJpbmQiLCJfcmVuZGVyUmVxdWVzdElkIiwiX2lkcyIsIk1hcCIsIlNldCIsIl9pbml0Q2FudmFzIiwiX3N0eWxlU3RhdGUiLCJvdXQiLCJzY3JlZW5QdCIsInNjcmVlblRvV29ybGRNYXRyaXgiLCJ0cmFuc2Zvcm1NYXQyZCIsIndvcmxkUHQiLCJ3b3JsZFRvU2NyZWVuTWF0cml4IiwiaGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJveHlFdmVudCIsImluZGV4Iiwic3BsaWNlIiwiYWRkIiwiZGVsZXRlU2hhcGUiLCJzb3J0ZWRTaGFwZXMiLCJzbGljZSIsInppbmRleCIsInpJbmRleCIsInRvSlNPTiIsIndpbmRvdyIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2hhbmdlZFNoYXBlcyIsImNvbnNvbGUiLCJhc3NlcnQiLCJjaGFuZ2VkU2hhcGUiLCJkcmF3U2hhcGVzIiwiY2FtZXJhIiwid29ybGRUb1NjcmVlbk1hdCIsInZpc2libGUiLCJyZW5kZXIiLCJjbGVhclJlY3QiLCJzaXplIiwic2F2ZSIsImFwcGx5RGVmYXVsdHMiLCJfcmVuZGVyU2hhcGVzIiwicmVzdG9yZSIsInNvcnQiLCJCYXNlU2hhcGUiLCJzaGFwZUNvbXBhcmUiLCJydG4iLCJ2aWV3cG9ydCIsImdldFBvc2l0aW9uIiwicG9zIiwiRXZlbnRIYW5kZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7QUFFQTs7SUFBWUEsVzs7QUFDWjs7SUFBWUMsTzs7QUFDWjs7OztBQUNBOzs7O0FBQ0E7O0FBR0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1DLGNBQWMsQ0FBQyxXQUFELEVBQWMsU0FBZCxFQUF5QixXQUF6QixFQUFzQyxPQUF0QyxFQUErQyxVQUEvQyxFQUEyRCxXQUEzRCxFQUF3RSxVQUF4RSxFQUFvRixZQUFwRixFQUFrRyxVQUFsRyxFQUE4RyxXQUE5RyxDQUFwQjtBQUNBLElBQU1DLGNB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QUFDekIsYUFBTyxLQUFLakYsT0FBTCxDQUFhRSxvQkFBcEI7QUFDRCxLO3NCQUV3QkEsb0IsRUFBc0I7QUFDN0MsV0FBS0YsT0FBTCxDQUFhRSxvQkFBYixHQUFvQ0Esb0JBQXBDO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7Ozt3QkFFb0I7QUFDbkIsYUFBTyxLQUFLRixPQUFMLENBQWFrRixXQUFiLEVBQVA7QUFDRCxLO3NCQUVrQkMsRyxFQUFLO0FBQ3RCLFdBQUtuRixPQUFMLENBQWFNLFdBQWIsQ0FBeUI2RSxHQUF6QjtBQUNBLGFBQU8sSUFBUDtBQUNEOzs7O0VBdFVxQ0Msc0I7O2tCQUFuQjVHLFU7OztBQThjckJBLFdBQVdwRixjQUFYLEdBQTRCQSxjQUE1QiIsImZpbGUiOiIxMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIENhbnZhc1V0aWxzIGZyb20gXCIuLi91dGlsL2NhbnZhcy11dGlsc1wiXG5pbXBvcnQgKiBhcyBQb2ludDJkIGZyb20gXCIuLi9jb3JlL3BvaW50MmRcIlxuaW1wb3J0IEJhc2VTaGFwZSBmcm9tIFwiLi4vc2hhcGVzL2Jhc2Utc2hhcGVcIlxuaW1wb3J0IEJhc2ljU3R5bGUgZnJvbSBcIi4uL3N0eWxlL2Jhc2ljLXN0eWxlXCJcbmltcG9ydCB7XG4gIGJpbmRBbGxcbn0gZnJvbSBcIi4uL3V0aWwvdXRpbHNcIlxuaW1wb3J0IENhbWVyYTJkIGZyb20gXCIuLi92aWV3L2NhbWVyYTJkXCJcbmltcG9ydCBFdmVudEhhbmRlciBmcm9tIFwiLi4vdXRpbC9ldmVudC1oYW5kbGVyXCJcbmltcG9ydCBSZXNpemVTZW5zb3IgZnJvbSBcImNzcy1lbGVtZW50LXF1ZXJpZXMvc3JjL1Jlc2l6ZVNlbnNvclwiXG5cbmNvbnN0IG1vdXNlZXZlbnRzID0gW1wibW91c2Vkb3duXCIsIFwibW91c2V1cFwiLCBcIm1vdXNlbW92ZVwiLCBcImNsaWNrXCIsIFwiZGJsY2xpY2tcIiwgXCJtb3VzZW92ZXJcIiwgXCJtb3VzZW91dFwiLCBcInRvdWNoc3RhcnRcIiwgXCJ0b3VjaGVuZFwiLCBcInRvdWNobW92ZVwiXVxuY29uc3QgbWFyZ2luUHJvcHMgPSBbXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl1cblxuZXhwb3J0IGNvbnN0IEV2ZW50Q29uc3RhbnRzID0ge1xuICBNT1VTRURPV046IFwibW91c2Vkb3duXCIsXG4gIE1PVVNFVVA6IFwibW91c2V1cFwiLFxuICBNT1VTRU1PVkU6IFwibW91c2Vtb3ZlXCIsXG4gIENMSUNLOiBcImNsaWNrXCIsXG4gIERCTENMSUNLOiBcImRibGNsaWNrXCIsXG4gIE1PVVNFT1ZFUjogXCJtb3VzZW92ZXJcIixcbiAgTU9VU0VPVVQ6IFwibW91c2VvdXRcIixcbiAgU0hBUEVfQUREOiBcInNoYXBlOmFkZFwiLFxuICBTSEFQRV9ERUxFVEU6IFwic2hhcGU6ZGVsZXRlXCIsXG4gIFRPVUNIU1RBUlQ6IFwidG91Y2hzdGFydFwiLFxuICBUT1VDSEVORDogXCJ0b3VjaGVuZFwiLFxuICBUT1VDSE1PVkU6IFwidG91Y2htb3ZlXCJcbn1cblxuY2xhc3MgRHJhd1N0eWxlU3RhdGUgZXh0ZW5kcyBCYXNpY1N0eWxlIHtcbiAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgdGhpcy5fZGVmYXVsdHMgPSB7XG4gICAgICBwYWNrZWRGaWxsQ29sb3I6IHRoaXMucGFja2VkRmlsbENvbG9yLFxuICAgICAgcGFja2VkU3Ryb2tlQ29sb3I6IHRoaXMucGFja2VkU3Ryb2tlQ29sb3IsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdHJva2VXaWR0aCxcbiAgICAgIGxpbmVKb2luOiB0aGlzLmxpbmVKb2luLFxuICAgICAgbGluZUNhcDogdGhpcy5saW5lQ2FwLFxuICAgICAgZGFzaFBhdHRlcm46IHRoaXMuZGFzaFBhdHRlcm4sXG4gICAgICBkYXNoT2Zmc2V0OiB0aGlzLmRhc2hPZmZzZXRcbiAgICB9XG4gIH1cblxuICBzZXRGaWxsU3R5bGUoY3R4LCBmaWxsU3R5bGUpIHtcbiAgICBpZiAoZmlsbFN0eWxlLnBhY2tlZEZpbGxDb2xvciAhPT0gdGhpcy5wYWNrZWRGaWxsQ29sb3IpIHtcbiAgICAgIHRoaXMucGFja2VkRmlsbENvbG9yID0gZmlsbFN0eWxlLnBhY2tlZEZpbGxDb2xvclxuICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuZmlsbENvbG9yXG4gICAgfVxuICB9XG5cbiAgc2V0U3Ryb2tlU3R5bGUoY3R4LCBzdHJva2VTdHlsZSkge1xuICAgIGlmIChzdHJva2VTdHlsZS5wYWNrZWRTdHJva2VDb2xvciAhPT0gdGhpcy5wYWNrZWRTdHJva2VDb2xvcikge1xuICAgICAgdGhpcy5wYWNrZWRTdHJva2VDb2xvciA9IHN0cm9rZVN0eWxlLnBhY2tlZFN0cm9rZUNvbG9yXG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZUNvbG9yXG4gICAgfVxuICAgIGlmIChzdHJva2VTdHlsZS5zdHJva2VXaWR0aCAhPT0gdGhpcy5fc3Ryb2tlV2lkdGgpIHtcbiAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBzdHJva2VTdHlsZS5zdHJva2VXaWR0aFxuICAgICAgY3R4LmxpbmVXaWR0aCA9IHRoaXMuX3N0cm9rZVdpZHRoXG4gICAgfVxuICAgIGlmIChzdHJva2VTdHlsZS5saW5lSm9pbiAhPT0gdGhpcy5fbGluZUpvaW4pIHtcbiAgICAgIHRoaXMubGluZUpvaW4gPSBzdHJva2VTdHlsZS5saW5lSm9pblxuICAgICAgY3R4LmxpbmVKb2luID0gdGhpcy5fbGluZUpvaW5cbiAgICB9XG4gICAgaWYgKHN0cm9rZVN0eWxlLmxpbmVDYXAgIT09IHRoaXMuX2xpbmVDYXApIHtcbiAgICAgIHRoaXMubGluZUNhcCA9IHN0cm9rZVN0eWxlLmxpbmVDYXBcbiAgICAgIGN0eC5saW5lQ2FwID0gdGhpcy5fbGluZUNhcFxuICAgIH1cblxuICAgIGNvbnN0IGRhc2hQYXR0ZXJuID0gc3Ryb2tlU3R5bGUuX2Rhc2hQYXR0ZXJuXG4gICAgbGV0IGRpZmYgPSBmYWxzZVxuICAgIGlmIChkYXNoUGF0dGVybi5sZW5ndGggPT09IHRoaXMuX2Rhc2hQYXR0ZXJuLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXNoUGF0dGVybi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoZGFzaFBhdHRlcm5baV0gIT09IHRoaXMuX2Rhc2hQYXR0ZXJuW2ldKSB7XG4gICAgICAgICAgZGlmZiA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZmYgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGRpZmYpIHtcbiAgICAgIHRoaXMuZGFzaFBhdHRlcm4gPSBkYXNoUGF0dGVyblxuICAgICAgY3R4LnNldExpbmVEYXNoKHRoaXMuX2Rhc2hQYXR0ZXJuKVxuICAgIH1cblxuICAgIGlmIChzdHJva2VTdHlsZS5kYXNoT2Zmc2V0ICE9PSB0aGlzLl9kYXNoT2Zmc2V0KSB7XG4gICAgICB0aGlzLmRhc2hPZmZzZXQgPSBzdHJva2VTdHlsZS5kYXNoT2Zmc2V0XG4gICAgICBjdHgubGluZURhc2hPZmZzZXQgPSB0aGlzLl9kYXNoT2Zmc2V0XG4gICAgfVxuICB9XG5cbiAgYXBwbHlEZWZhdWx0cyhjdHgpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kZWZhdWx0cykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgIHRoaXNbcHJvcF0gPSB0aGlzLl9kZWZhdWx0c1twcm9wXVxuICAgIH0pXG4gICAgdGhpcy5zZXRGaWxsQ3R4KGN0eClcbiAgICB0aGlzLnNldFN0cm9rZUN0eChjdHgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChlbGVtZW50ICYmIChgICR7ZWxlbWVudC5jbGFzc05hbWV9IGApLmluZGV4T2YoYCAke2NsYXNzTmFtZX0gYCkgPCAwKSB7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgKz0gKGVsZW1lbnQuY2xhc3NOYW1lID8gXCIgXCIgOiBcIlwiKSArIGNsYXNzTmFtZVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyhwYXJlbnQpIHtcbiAgY29uc3QgY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICBhZGRDbGFzcyhjYW52YXNDb250YWluZXIsIFwibWFwZC1kcmF3LWNhbnZhcy1jb250YWluZXJcIilcblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpXG4gIGNvbnN0IGNhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpXG4gIGNvbnN0IHJhdGlvID0gQ2FudmFzVXRpbHMubWFrZUNhbnZhc0F1dG9IaWdoRFBJKGNhbnZhc0NvbnRleHQpXG4gIC8vIGNvbnN0IHJhdGlvID0gMVxuXG4gIC8vIGFkZCBjbGFzcz9cbiAgYWRkQ2xhc3MoY2FudmFzLCBcIm1hcGQtZHJhdy1jYW52YXNcIilcbiAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiXG4gIGNhbnZhcy5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCJcblxuICBjYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzKVxuXG4gIC8vIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCByYXRpbyAqIHBhcmVudC5vZmZzZXRYKVxuICAvLyBjYW52YXMuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIHJhdGlvICogcGFyZW50Lm9mZnNldFkpXG4gIC8vIHBhcmVudC5pbnNlcnRCZWZvcmUoY2FudmFzLCBwYXJlbnQuZmlyc3RDaGlsZClcbiAgcGFyZW50LmFwcGVuZENoaWxkKGNhbnZhc0NvbnRhaW5lcilcblxuICByZXR1cm4ge1xuICAgIGNhbnZhc0NvbnRhaW5lcixcbiAgICBjYW52YXMsXG4gICAgY2FudmFzQ29udGV4dCxcbiAgICByYXRpb1xuICB9XG59XG5cblxuZnVuY3Rpb24gYWRkU2hhcGVzVG9NYXAobmV3U2hhcGVzLCBleGlzdGluZ09iamVjdHNNYXAsIGN1cnJJZHMsIHJlb3JkZXJDYiwgcmVkcmF3Q2IpIHtcbiAgbmV3U2hhcGVzLmZvckVhY2goc2hhcGUgPT4ge1xuICAgIGV4aXN0aW5nT2JqZWN0c01hcC5zZXQoc2hhcGUsIHtcbiAgICAgIHNoYXBlT2JqOiBzaGFwZSxcbiAgICAgIHNoYXBlSWQ6IGN1cnJJZHMuc2hhcGVJZCxcbiAgICAgIHNoYXBlSWR4OiAtMVxuICAgIH0pXG4gICAgc2hhcGUub24oW1wiY2hhbmdlZDpvcmRlclwiLCBcImNoYW5nZWQ6dmlzaWJpbGl0eVwiLCBcImNoYW5nZWQ6c3R5bGVcIl0sIHJlb3JkZXJDYilcbiAgICBzaGFwZS5vbihbXCJjaGFuZ2VkOmdlb21cIiwgXCJjaGFuZ2VkOnZpc2liaWxpdHlcIiwgXCJjaGFuZ2VkOnhmb3JtXCJdLCByZWRyYXdDYilcbiAgICBjdXJySWRzLnNoYXBlSWQgKz0gMVxuICB9KVxufVxuXG5mdW5jdGlvbiBkZWxldGVTaGFwZXNGcm9tTWFwKHNoYXBlcywgZXhpc3RpbmdPYmplY3RzTWFwLCByZW9yZGVyQ2IsIHJlZHJhd0NiKSB7XG4gIGNvbnN0IGlkeHMgPSBbXVxuICBzaGFwZXMuZm9yRWFjaChzaGFwZSA9PiB7XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gZXhpc3RpbmdPYmplY3RzTWFwLmdldChzaGFwZSlcbiAgICBpZiAoc2hhcGVJbmZvKSB7XG4gICAgICBpZHhzLnB1c2goc2hhcGVJbmZvLnNoYXBlSWR4KVxuICAgIH1cbiAgICBleGlzdGluZ09iamVjdHNNYXAuZGVsZXRlKHNoYXBlKVxuICAgIHNoYXBlLm9mZihbXCJjaGFuZ2VkXCJdLCBbcmVvcmRlckNiLCByZWRyYXdDYl0pXG4gIH0pXG4gIHJldHVybiBpZHhzXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdFbmdpbmUgZXh0ZW5kcyBFdmVudEhhbmRlciB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudCwgb3B0cykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9pbml0KHBhcmVudCwgb3B0cylcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveUNhbnZhcygpXG5cbiAgICBpZiAodGhpcy5fb2JqZWN0cykge1xuICAgICAgdGhpcy5fb2JqZWN0cy5mb3JFYWNoKChzaGFwZUluZm8sIHNoYXBlKSA9PiB7XG4gICAgICAgIHNoYXBlLm9mZihcImNoYW5nZWRcIiwgW3RoaXMuX3Jlb3JkZXJDYiwgdGhpcy5fcmVkcmF3Q2JdKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX29iamVjdHMuY2xlYXIoKVxuICAgICAgdGhpcy5fc29ydGVkT2JqcyA9IFtdXG4gICAgICB0aGlzLl9yZW9yZGVyZWRPYmpJZHhzLmNsZWFyKClcbiAgICB9XG4gIH1cblxuICBfcmVzaXplKG9wdHMpIHtcbiAgICBsZXQgd2lkdGggPSAwXG4gICAgaWYgKHRoaXMuX3BhcmVudC5vZmZzZXRXaWR0aCkge1xuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgdGhpcy5fcGFyZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fbWFyZ2lucy5sZWZ0IC0gdGhpcy5fbWFyZ2lucy5yaWdodClcbiAgICB9XG5cbiAgICBsZXQgaGVpZ2h0ID0gMFxuICAgIGlmICh0aGlzLl9wYXJlbnQub2Zmc2V0SGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRoaXMuX3BhcmVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl9tYXJnaW5zLnRvcCAtIHRoaXMuX21hcmdpbnMuYm90dG9tKVxuICAgIH1cblxuICAgIHRoaXMuX2RyYXdDYW52YXMud2lkdGggPSB3aWR0aCAqIHRoaXMuX3BpeGVsUmF0aW9cbiAgICB0aGlzLl9kcmF3Q2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHRoaXMuX3BpeGVsUmF0aW9cblxuICAgIHRoaXMuX2RyYXdDYW52YXMuc3R5bGUubGVmdCA9IGAke3RoaXMuX21hcmdpbnMubGVmdH1weGBcbiAgICB0aGlzLl9kcmF3Q2FudmFzLnN0eWxlLnRvcCA9IGAke3RoaXMuX21hcmdpbnMudG9wfXB4YFxuICAgIHRoaXMuX2RyYXdDYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGBcbiAgICB0aGlzLl9kcmF3Q2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGBcblxuICAgIGlmICh0aGlzLl9jYW1lcmEpIHtcbiAgICAgIC8vIGNvbnN0IGN1cnJWaWV3cG9ydCA9IHRoaXMuX2NhbWVyYS52aWV3cG9ydFxuICAgICAgLy8gY29uc3QgY3VyclNwYWNlID0gdGhpcy5fY2FtZXJhLnByb2plY3Rpb25Cb3VuZHNcbiAgICAgIC8vIGNvbnN0IHZpZXdwb3J0RXh0ZW50cyA9IFswLCAwXVxuICAgICAgLy8gQUFCb3gyZC5nZXRFeHRlbnRzKHZpZXdwb3J0RXh0ZW50cywgY3VyclZpZXdwb3J0KVxuICAgICAgLy8gY29uc3Qgc3BhY2VDZW50ZXIgPSBbMCwgMF1cbiAgICAgIC8vIGNvbnN0IHNwYWNlRXh0ZW50cyA9IFswLCAwXVxuICAgICAgLy8gQUFCb3gyZC5nZXRDZW50ZXIoc3BhY2VDZW50ZXIsIGN1cnJTcGFjZSlcbiAgICAgIC8vIEFBQm94MmQuZ2V0RXh0ZW50cyhzcGFjZUV4dGVudHMsIGN1cnJTcGFjZSlcbiAgICAgIC8vIGNvbnN0IHJhdGlvID0gc3BhY2VFeHRlbnRzXG4gICAgICAvLyBWZWMyZC5kaXYocmF0aW8sIHNwYWNlRXh0ZW50cywgdmlld3BvcnRFeHRlbnRzKVxuICAgICAgLy8gQUFCb3gyZC5zZXQoY3VyclZpZXdwb3J0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KVxuICAgICAgLy8gQUFCb3gyZC5nZXRFeHRlbnRzKHZpZXdwb3J0RXh0ZW50cywgY3VyclZpZXdwb3J0KVxuICAgICAgLy8gVmVjMmQubXVsdGlwbHkoc3BhY2VFeHRlbnRzLCByYXRpbywgdmlld3BvcnRFeHRlbnRzKVxuICAgICAgLy8gQUFCb3gyZC5pbml0Q2VudGVyRXh0ZW50cyhjdXJyU3BhY2UsIHNwYWNlQ2VudGVyLCBzcGFjZUV4dGVudHMpXG4gICAgICAvLyB0aGlzLl9jYW1lcmEudmlld3BvcnQgPSBjdXJyVmlld3BvcnRcbiAgICAgIC8vIHRoaXMuX2NhbWVyYS5wcm9qZWN0aW9uQm91bmRzID0gY3VyclNwYWNlXG4gICAgICAvLyAgIC8vIHRoaXMuX2NhbWVyYS52aWV3cG9ydCA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XVxuICAgICAgLy8gICAvLyB0aGlzLl9jYW1lcmEucHJvamVjdGlvbkJvdW5kcyA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcm9qRGltcyA9IChvcHRzICYmIG9wdHMucHJvamVjdGlvbkRpbWVuc2lvbnMgPyBvcHRzLnByb2plY3Rpb25EaW1lbnNpb25zIDogW3dpZHRoLCBoZWlnaHRdKVxuICAgICAgdGhpcy5fY2FtZXJhID0gbmV3IENhbWVyYTJkKFswLCAwLCB3aWR0aCwgaGVpZ2h0XSwgcHJvakRpbXMsIChvcHRzLmZsaXBZID8gQm9vbGVhbihvcHRzLmZsaXBZKSA6IGZhbHNlKSlcbiAgICAgIHRoaXMuX2NhbWVyYS5zZXRQb3NpdGlvbigob3B0cyAmJiBvcHRzLmNhbWVyYVBvc2l0aW9uID8gb3B0cy5jYW1lcmFQb3NpdGlvbiA6IFt3aWR0aCAvIDIuMCwgaGVpZ2h0IC8gMi4wXSkpXG4gICAgICB0aGlzLl9jYW1lcmEub24oXCJjaGFuZ2VkXCIsIHRoaXMuX3JlcmVuZGVyQ2IpXG4gICAgfVxuICAgIC8vIHRoaXMuX2NhbWVyYSA9IG5ldyBDYW1lcmEyZChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdLCBbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKVxuICAgIC8vIHRoaXMuX2NhbWVyYS5vbihcImNoYW5nZWRcIiwgdGhpcy5fcmVyZW5kZXJDYilcblxuICAgIHRoaXMuX3JlcmVuZGVyQ2IoKVxuICB9XG5cbiAgX21vdXNlZG93bkNCKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoXCJtb3VzZWRvd25cIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX3RvdWNoc3RhcnRDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZmlyZShcInRvdWNoc3RhcnRcIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX21vdXNldXBDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5maXJlKFwibW91c2V1cFwiLCB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBfdG91Y2hlbmRDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5maXJlKFwidG91Y2hlbmRcIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX21vdXNlbW92ZUNCKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoXCJtb3VzZW1vdmVcIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX3RvdWNobW92ZUNCKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoXCJ0b3VjaG1vdmVcIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX2NsaWNrQ0IoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmlyZShcImNsaWNrXCIsIHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIF9kYmxjbGlja0NCKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoXCJkYmxjbGlja1wiLCB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBfbW91c2VvdmVyQ0IoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmlyZShcIm1vdXNlb3ZlclwiLCB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBfbW91c2VvdXRDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5maXJlKFwibW91c2VvdXRcIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX2VuYWJsZUV2ZW50cygpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRzKG1vdXNlZXZlbnRzKVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IG1vdXNlZXZlbnRzLm1hcChldmVudCA9PiBgXyR7ZXZlbnR9Q0JgKVxuICAgIC8vIGJpbmRBbGwoY2FsbGJhY2tzLCB0aGlzKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW91c2VldmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIobW91c2VldmVudHNbaV0sIHRoaXNbY2FsbGJhY2tzW2ldXSwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBfZGlzYWJsZUV2ZW50cygpIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBtb3VzZWV2ZW50cy5tYXAoZXZlbnQgPT4gYF8ke2V2ZW50fUNCYClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vdXNlZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG1vdXNlZXZlbnRzW2ldLCB0aGlzW2NhbGxiYWNrc1tpXV0sIHRydWUpXG4gICAgfVxuICB9XG5cbiAgX2luaXRDYW52YXMocGFyZW50LCBvcHRzLCBmb3JjZUV2ZW50cyA9IG51bGwpIHtcbiAgICB0aGlzLl9tYXJnaW5zID0gKG9wdHMgJiYgb3B0cy5tYXJnaW5zID8gT2JqZWN0LmFzc2lnbih7fSwgb3B0cy5tYXJnaW5zKSA6IHt9KVxuICAgIG1hcmdpblByb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnNbcHJvcF0gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdGhpcy5fbWFyZ2luc1twcm9wXSA9IDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzQ29udGFpbmVyLFxuICAgICAgY2FudmFzLFxuICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgIHJhdGlvXG4gICAgfSA9IGNyZWF0ZUNhbnZhcyhwYXJlbnQpXG5cbiAgICB0aGlzLl9jb250YWluZXIgPSBjYW52YXNDb250YWluZXJcbiAgICB0aGlzLl9kcmF3Q2FudmFzID0gY2FudmFzXG4gICAgdGhpcy5fZHJhd0N0eCA9IGNhbnZhc0NvbnRleHRcbiAgICB0aGlzLl9waXhlbFJhdGlvID0gcmF0aW9cbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRcblxuICAgIGJpbmRBbGwoW1wiX3Jlc2l6ZVwiXSwgdGhpcylcbiAgICB0aGlzLl9yZXNpemUob3B0cylcbiAgICB0aGlzLl9yZXNpemVTZW5zb3IgPSBuZXcgUmVzaXplU2Vuc29yKHBhcmVudCwgdGhpcy5fcmVzaXplKVxuXG4gICAgaWYgKGZvcmNlRXZlbnRzIHx8IChmb3JjZUV2ZW50cyA9PT0gbnVsbCAmJiBvcHRzICYmIG9wdHMuZW5hYmxlRXZlbnRzKSkge1xuICAgICAgdGhpcy5fZW5hYmxlRXZlbnRzKClcbiAgICB9XG4gIH1cblxuICBfZGVzdHJveUNhbnZhcygpIHtcbiAgICBpZiAodGhpcy5fZHJhd0NhbnZhcykge1xuICAgICAgdGhpcy5fZGlzYWJsZUV2ZW50cygpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgdGhpcy5fcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX2RyYXdDYW52YXMpXG5cbiAgICAgIGlmICh0aGlzLl9yZXNpemVTZW5zb3IpIHtcbiAgICAgICAgdGhpcy5fcmVzaXplU2Vuc29yLmRldGFjaCh0aGlzLl9wYXJlbnQsIHRoaXMuX3Jlc2l6ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9kcmF3Q2FudmFzID0gbnVsbFxuICAgIHRoaXMuX2RyYXdDdHggPSBudWxsXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbFxuICB9XG5cbiAgX2luaXQocGFyZW50LCBvcHRzLCBmb3JjZUV2ZW50cyA9IG51bGwpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRzKFtFdmVudENvbnN0YW50cy5TSEFQRV9BREQsIEV2ZW50Q29uc3RhbnRzLlNIQVBFX0RFTEVURV0pXG5cbiAgICBiaW5kQWxsKFtcIl9yZW9yZGVyQ2JcIiwgXCJfcmVyZW5kZXJDYlwiXSwgdGhpcylcbiAgICBiaW5kQWxsKFtcIl9tb3VzZWRvd25DQlwiLCBcIl9tb3VzZXVwQ0JcIiwgXCJfbW91c2Vtb3ZlQ0JcIiwgXCJfY2xpY2tDQlwiLCBcIl9kYmxjbGlja0NCXCIsIFwiX21vdXNlb3ZlckNCXCIsIFwiX21vdXNlb3V0Q0JcIiwgXCJfdG91Y2hzdGFydENCXCIsIFwiX3RvdWNoZW5kQ0JcIiwgXCJfdG91Y2htb3ZlQ0JcIl0sIHRoaXMpXG5cbiAgICB0aGlzLl9yZW5kZXJGcmFtZUNiID0gdGhpcy5yZW5kZXJBbGwuYmluZCh0aGlzKVxuICAgIHRoaXMuX3JlbmRlclJlcXVlc3RJZCA9IDBcbiAgICB0aGlzLl9pZHMgPSB7XG4gICAgICBzaGFwZUlkOiAxXG4gICAgfVxuXG4gICAgdGhpcy5fb2JqZWN0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX3NvcnRlZE9ianMgPSBbXVxuICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMgPSBuZXcgU2V0KClcblxuICAgIHRoaXMuX2luaXRDYW52YXMocGFyZW50LCBvcHRzLCBmb3JjZUV2ZW50cylcblxuICAgIHRoaXMuX3N0eWxlU3RhdGUgPSBuZXcgRHJhd1N0eWxlU3RhdGUoe1xuICAgICAgZmlsbENvbG9yOiBcInJlZFwiXG4gICAgfSlcbiAgfVxuXG4gIGdldENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50XG4gIH1cblxuICBnZXRDYW52YXNDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lclxuICB9XG5cbiAgZ2V0Q2FudmFzKCkge1xuICAgIHJldHVybiB0aGlzLl9kcmF3Q2FudmFzXG4gIH1cblxuICBnZXQgc29ydGVkU2hhcGVzKCkge1xuICAgIGlmICh0aGlzLl9yZW9yZGVyZWRPYmpJZHhzLnNpemUpIHtcbiAgICAgIGNvbnNvbGUuYXNzZXJ0KHRoaXMuX3NvcnRlZE9ianMubGVuZ3RoID09PSB0aGlzLl9vYmplY3RzLnNpemUsXG4gICAgICAgICAgYFNpemUgbWlzbWF0Y2ggd2hlbiByZW5kZXJpbmcgb2JqZXRzLiBTb21ldGhpbmcgZ290IG91dCBvZiBzeW5jIC0gc29ydGVkIG9ianMgbGVuZ3RoOiAke3RoaXMuX3NvcnRlZE9ianMubGVuZ3RofSwgb2JqZWN0cyBsZW5ndGg6ICR7dGhpcy5fb2JqZWN0cy5zaXplfWApXG5cbiAgICAgIC8vIGlmICh0aGlzLl9yZW9yZGVyZWRPYmpJZHhzLmxlbmd0aCAvIHRoaXMuX3NvcnRlZE9ianMubGVuZ3RoID4gMC43KSB7XG4gICAgICAvLyAgIC8vIG1pZ2h0IGFzIHdlbGwganVzdCByZXNvcnQgdGhlIHdob2xlIHRoaW5nIG92ZXJcbiAgICAgIC8vICAgdGhpcy5fc29ydGVkT2Jqcy5zb3J0KHNoYXBlSW5mb0NvbXBhcmUpXG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gfVxuXG4gICAgICB0aGlzLl9zb3J0ZWRPYmpzLnNvcnQoQmFzZVNoYXBlLnNoYXBlQ29tcGFyZSlcbiAgICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuY2xlYXIoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc29ydGVkT2Jqc1xuICB9XG5cbiAgZ2V0IG1hcmdpbnMoKSB7XG4gICAgY29uc3QgcnRuID0ge31cbiAgICBtYXJnaW5Qcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgcnRuW3Byb3BdID0gdGhpcy5fbWFyZ2luc1twcm9wXVxuICAgIH0pXG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgc2V0IG1hcmdpbnMobWFyZ2lucykge1xuICAgIG1hcmdpblByb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICBpZiAodHlwZW9mIG1hcmdpbnNbcHJvcF0gPT09IFwibnVtYmVyXCIgJiYgbWFyZ2luc1twcm9wXSAhPT0gdGhpcy5fbWFyZ2luc1twcm9wXSkge1xuICAgICAgICB0aGlzLl9tYXJnaW5zW3Byb3BdID0gbWFyZ2lucy5wcm9wXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuX3Jlc2l6ZSgpXG4gIH1cblxuICBnZXQgdmlld3BvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbWVyYS52aWV3cG9ydFxuICB9XG5cbiAgc2V0IHZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgdGhpcy5fY2FtZXJhLnZpZXdwb3J0ID0gdmlld3BvcnRcbiAgfVxuXG4gIGdldCBwcm9qZWN0aW9uRGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FtZXJhLnByb2plY3Rpb25EaW1lbnNpb25zXG4gIH1cblxuICBzZXQgcHJvamVjdGlvbkRpbWVuc2lvbnMocHJvamVjdGlvbkRpbWVuc2lvbnMpIHtcbiAgICB0aGlzLl9jYW1lcmEucHJvamVjdGlvbkRpbWVuc2lvbnMgPSBwcm9qZWN0aW9uRGltZW5zaW9uc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgY2FtZXJhUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbWVyYS5nZXRQb3NpdGlvbigpXG4gIH1cblxuICBzZXQgY2FtZXJhUG9zaXRpb24ocG9zKSB7XG4gICAgdGhpcy5fY2FtZXJhLnNldFBvc2l0aW9uKHBvcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJvamVjdChvdXQsIHNjcmVlblB0KSB7XG4gICAgY29uc3Qgc2NyZWVuVG9Xb3JsZE1hdHJpeCA9IHRoaXMuX2NhbWVyYS5zY3JlZW5Ub1dvcmxkTWF0cml4XG4gICAgcmV0dXJuIFBvaW50MmQudHJhbnNmb3JtTWF0MmQob3V0LCBzY3JlZW5QdCwgc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgfVxuXG4gIHVucHJvamVjdChvdXQsIHdvcmxkUHQpIHtcbiAgICBjb25zdCB3b3JsZFRvU2NyZWVuTWF0cml4ID0gdGhpcy5fY2FtZXJhLndvcmxkVG9TY3JlZW5NYXRyaXhcbiAgICByZXR1cm4gUG9pbnQyZC50cmFuc2Zvcm1NYXQyZChvdXQsIHdvcmxkUHQsIHdvcmxkVG9TY3JlZW5NYXRyaXgpXG4gIH1cblxuICBoYXNTaGFwZShzaGFwZSkge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzLmhhcyhzaGFwZSlcbiAgfVxuXG4gIGFkZFNoYXBlKHNoYXBlKSB7XG4gICAgbGV0IHNoYXBlcyA9IHNoYXBlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXBlcykpIHtcbiAgICAgIHNoYXBlcyA9IFtzaGFwZV1cbiAgICB9XG5cbiAgICBhZGRTaGFwZXNUb01hcChzaGFwZXMsIHRoaXMuX29iamVjdHMsIHRoaXMuX2lkcywgdGhpcy5fcmVvcmRlckNiLCB0aGlzLl9yZXJlbmRlckNiKVxuXG4gICAgLy8gZmlyZSBhZGQgZXZlbnRcbiAgICB0aGlzLmZpcmUoXCJzaGFwZTphZGRcIiwge1xuICAgICAgc2hhcGU6IHNoYXBlc1xuICAgIH0pXG5cbiAgICBjb25zdCBwcm94eUV2ZW50ID0ge1xuICAgICAgdGFyZ2V0OiBzaGFwZXNcbiAgICB9XG4gICAgdGhpcy5fcmVvcmRlckNiKHByb3h5RXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZGVsZXRlU2hhcGUoc2hhcGUpIHtcbiAgICBsZXQgc2hhcGVzID0gc2hhcGVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcGVzKSkge1xuICAgICAgc2hhcGVzID0gW3NoYXBlXVxuICAgIH1cblxuICAgIGNvbnN0IGlkeHMgPSBkZWxldGVTaGFwZXNGcm9tTWFwKHNoYXBlcywgdGhpcy5fb2JqZWN0cywgdGhpcy5fcmVvcmRlckNiLCB0aGlzLl9yZXJlbmRlckNiKVxuICAgIGxldCBpbmRleCA9IC0xXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICgoaW5kZXggPSB0aGlzLl9zb3J0ZWRPYmpzLmluZGV4T2Yoc2hhcGVzW2ldKSkgPj0gMCkge1xuICAgICAgICB0aGlzLl9zb3J0ZWRPYmpzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuYWRkKGlkeHNbaV0pXG4gICAgfVxuICAgIHRoaXMuX3JlcmVuZGVyQ2IoKVxuXG4gICAgdGhpcy5maXJlKFwic2hhcGU6ZGVsZXRlXCIsIHtcbiAgICAgIHNoYXBlOiBzaGFwZXNcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGRlbGV0ZUFsbFNoYXBlcygpIHtcbiAgICB0aGlzLmRlbGV0ZVNoYXBlKHRoaXMuc29ydGVkU2hhcGVzLnNsaWNlKCkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIG1vdmVTaGFwZVRvVG9wKHNoYXBlKSB7XG4gICAgaWYgKHRoaXMuX29iamVjdHMuaGFzKHNoYXBlKSkge1xuICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICAgIGNvbnN0IHppbmRleCA9IHNoYXBlc1tzaGFwZXMubGVuZ3RoIC0gMV0uekluZGV4XG4gICAgICBzaGFwZS56SW5kZXggPSB6aW5kZXggKyAxXG4gICAgfVxuICB9XG5cbiAgbW92ZVNoYXBlVG9CYWNrKHNoYXBlKSB7XG4gICAgaWYgKHRoaXMuX29iamVjdHMuaGFzKHNoYXBlKSkge1xuICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICAgIGNvbnN0IHppbmRleCA9IHNoYXBlc1swXS56SW5kZXhcbiAgICAgIHNoYXBlLnpJbmRleCA9IHppbmRleFxuICAgIH1cbiAgfVxuXG4gIGdldFNoYXBlc0FzSlNPTigpIHtcbiAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnNvcnRlZFNoYXBlc1xuICAgIHJldHVybiBzaGFwZXMubWFwKHNoYXBlID0+IHNoYXBlLnRvSlNPTigpKVxuICB9XG5cbiAgX3JlcmVuZGVyQ2IoKSB7XG4gICAgaWYgKHRoaXMuX3JlbmRlclJlcXVlc3RJZCkge1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlbmRlclJlcXVlc3RJZClcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyUmVxdWVzdElkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNiKVxuICB9XG5cbiAgX3Jlb3JkZXJDYihldmVudCkge1xuICAgIGxldCBjaGFuZ2VkU2hhcGVzID0gZXZlbnQudGFyZ2V0XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNoYW5nZWRTaGFwZXMpKSB7XG4gICAgICBjaGFuZ2VkU2hhcGVzID0gW2V2ZW50LnRhcmdldF1cbiAgICB9XG4gICAgY2hhbmdlZFNoYXBlcy5mb3JFYWNoKGNoYW5nZWRTaGFwZSA9PiB7XG4gICAgICBjb25zb2xlLmFzc2VydChjaGFuZ2VkU2hhcGUsIFwiQSBjaGFuZ2VkIGV2ZW50IGRvZXNuJ3QgaGF2ZSBhbiBvYmplY3RcIilcbiAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KGNoYW5nZWRTaGFwZSlcbiAgICAgIGNvbnNvbGUuYXNzZXJ0KHNoYXBlSW5mbywgYEEgY2hhbmdlZCBldmVudCB0YXJnZXQgaXNuJ3QgaW4gdGhlIGxpc3Qgb2Ygc2hhcGVzICR7Y2hhbmdlZFNoYXBlfWApXG4gICAgICBpZiAoc2hhcGVJbmZvLnNoYXBlSWR4IDwgMCkge1xuICAgICAgICBzaGFwZUluZm8uc2hhcGVJZHggPSB0aGlzLl9zb3J0ZWRPYmpzLnB1c2goY2hhbmdlZFNoYXBlKSAtIDFcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuYWRkKHNoYXBlSW5mby5zaGFwZUlkeClcbiAgICB9KVxuICAgIHRoaXMuX3JlcmVuZGVyQ2IoKVxuICB9XG5cbiAgX3JlbmRlclNoYXBlcyhjdHgsIGRyYXdTaGFwZXMsIGNhbWVyYSkge1xuICAgIGNvbnN0IHdvcmxkVG9TY3JlZW5NYXQgPSBjYW1lcmEud29ybGRUb1NjcmVlbk1hdHJpeFxuICAgIGRyYXdTaGFwZXMuZm9yRWFjaChzaGFwZSA9PiB7XG4gICAgICBpZiAoc2hhcGUudmlzaWJsZSkge1xuICAgICAgICBzaGFwZS5yZW5kZXIoY3R4LCB3b3JsZFRvU2NyZWVuTWF0LCB0aGlzLl9zdHlsZVN0YXRlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZW5kZXJBbGwoKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5fZHJhd0N0eFxuICAgIC8vIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpXG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl9kcmF3Q2FudmFzLm9mZnNldFdpZHRoLCB0aGlzLl9kcmF3Q2FudmFzLm9mZnNldEhlaWdodClcblxuICAgIGlmICghdGhpcy5fb2JqZWN0cy5zaXplKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjdHguc2F2ZSgpXG4gICAgY29uc3QgZHJhd1NoYXBlcyA9IHRoaXMuc29ydGVkU2hhcGVzXG4gICAgdGhpcy5fc3R5bGVTdGF0ZS5hcHBseURlZmF1bHRzKGN0eClcbiAgICB0aGlzLl9yZW5kZXJTaGFwZXMoY3R4LCBkcmF3U2hhcGVzLCB0aGlzLl9jYW1lcmEpXG4gICAgY3R4LnJlc3RvcmUoKVxuICB9XG59XG5cbkRyYXdFbmdpbmUuRXZlbnRDb25zdGFudHMgPSBFdmVudENvbnN0YW50c1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vZW5naW5lL2RyYXctZW5naW5lLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 14 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.EventConstants = undefined;\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _canvasUtils = __webpack_require__(30);\n\nvar CanvasUtils = _interopRequireWildcard(_canvasUtils);\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _baseShape = __webpack_require__(7);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _basicStyle = __webpack_require__(9);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _utils = __webpack_require__(31);\n\nvar _camera2d = __webpack_require__(32);\n\nvar _camera2d2 = _interopRequireDefault(_camera2d);\n\nvar _eventHandler = __webpack_require__(13);\n\nvar _eventHandler2 = _interopRequireDefault(_eventHandler);\n\nvar _ResizeSensor = __webpack_require__(33);\n\nvar _ResizeSensor2 = _interopRequireDefault(_ResizeSensor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar mouseevents = [\"mousedown\", \"mouseup\", \"mousemove\", \"click\", \"dblclick\", \"mouseover\", \"mouseout\"];\nvar marginProps = [\"top\", \"bottom\", \"left\", \"right\"];\n\nvar EventConstants = exports.EventConstants = {\n MOUSEDOWN: \"mousedown\",\n MOUSEUP: \"mouseup\",\n MOUSEMOVE: \"mousemove\",\n CLICK: \"click\",\n DBLCLICK: \"dblclick\",\n MOUSEOVER: \"mouseover\",\n MOUSEOUT: \"mouseout\",\n SHAPE_ADD: \"shape:add\",\n SHAPE_DELETE: \"shape:delete\"\n};\n\nvar DrawStyleState = function (_BasicStyle) {\n _inherits(DrawStyleState, _BasicStyle);\n\n function DrawStyleState() {\n var _ref;\n\n _classCallCheck(this, DrawStyleState);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var _this = _possibleConstructorReturn(this, (_ref = DrawStyleState.__proto__ || Object.getPrototypeOf(DrawStyleState)).call.apply(_ref, [this].concat(args)));\n\n _this._defaults = {\n packedFillColor: _this.packedFillColor,\n packedStrokeColor: _this.packedStrokeColor,\n strokeWidth: _this.strokeWidth,\n lineJoin: _this.lineJoin,\n lineCap: _this.lineCap,\n dashPattern: _this.dashPattern,\n dashOffset: _this.dashOffset\n };\n return _this;\n }\n\n _createClass(DrawStyleState, [{\n key: \"setFillStyle\",\n value: function setFillStyle(ctx, fillStyle) {\n if (fillStyle.packedFillColor !== this.packedFillColor) {\n this.packedFillColor = fillStyle.packedFillColor;\n ctx.fillStyle = this.fillColor;\n }\n }\n }, {\n key: \"setStrokeStyle\",\n value: function setStrokeStyle(ctx, strokeStyle) {\n if (strokeStyle.packedStrokeColor !== this.packedStrokeColor) {\n this.packedStrokeColor = strokeStyle.packedStrokeColor;\n ctx.strokeStyle = this.strokeColor;\n }\n if (strokeStyle.strokeWidth !== this._strokeWidth) {\n this.strokeWidth = strokeStyle.strokeWidth;\n ctx.lineWidth = this._strokeWidth;\n }\n if (strokeStyle.lineJoin !== this._lineJoin) {\n this.lineJoin = strokeStyle.lineJoin;\n ctx.lineJoin = this._lineJoin;\n }\n if (strokeStyle.lineCap !== this._lineCap) {\n this.lineCap = strokeStyle.lineCap;\n ctx.lineCap = this._lineCap;\n }\n\n var dashPattern = strokeStyle._dashPattern;\n var diff = false;\n if (dashPattern.length === this._dashPattern.length) {\n for (var i = 0; i < dashPattern.length; i += 1) {\n if (dashPattern[i] !== this._dashPattern[i]) {\n diff = true;\n break;\n }\n }\n } else {\n diff = true;\n }\n\n if (diff) {\n this.dashPattern = dashPattern;\n ctx.setLineDash(this._dashPattern);\n }\n\n if (strokeStyle.dashOffset !== this._dashOffset) {\n this.dashOffset = strokeStyle.dashOffset;\n ctx.lineDashOffset = this._dashOffset;\n }\n }\n }, {\n key: \"applyDefaults\",\n value: function applyDefaults(ctx) {\n var _this2 = this;\n\n Object.getOwnPropertyNames(this._defaults).forEach(function (prop) {\n _this2[prop] = _this2._defaults[prop];\n });\n this.setFillCtx(ctx);\n this.setStrokeCtx(ctx);\n }\n }]);\n\n return DrawStyleState;\n}(_basicStyle2.default);\n\nfunction addClass(element, className) {\n if (element && (\" \" + element.className + \" \").indexOf(\" \" + className + \" \") < 0) {\n element.className += (element.className ? \" \" : \"\") + className;\n }\n}\n\nfunction createCanvas(parent) {\n var canvasContainer = document.createElement(\"div\");\n addClass(canvasContainer, \"mapd-draw-canvas-container\");\n\n var canvas = document.createElement(\"canvas\");\n var canvasContext = canvas.getContext(\"2d\");\n var ratio = CanvasUtils.makeCanvasAutoHighDPI(canvasContext);\n // const ratio = 1\n\n // add class?\n addClass(canvas, \"mapd-draw-canvas\");\n canvas.style.position = \"absolute\";\n canvas.style.pointerEvents = \"none\";\n\n canvasContainer.appendChild(canvas);\n\n // canvas.setAttribute(\"width\", ratio * parent.offsetX)\n // canvas.setAttribute(\"height\", ratio * parent.offsetY)\n // parent.insertBefore(canvas, parent.firstChild)\n parent.appendChild(canvasContainer);\n\n return {\n canvasContainer: canvasContainer,\n canvas: canvas,\n canvasContext: canvasContext,\n ratio: ratio\n };\n}\n\nfunction addShapesToMap(newShapes, existingObjectsMap, currIds, reorderCb, redrawCb) {\n newShapes.forEach(function (shape) {\n existingObjectsMap.set(shape, {\n shapeObj: shape,\n shapeId: currIds.shapeId,\n shapeIdx: -1\n });\n shape.on([\"changed:order\", \"changed:visibility\", \"changed:style\"], reorderCb);\n shape.on([\"changed:geom\", \"changed:visibility\", \"changed:xform\"], redrawCb);\n currIds.shapeId += 1;\n });\n}\n\nfunction deleteShapesFromMap(shapes, existingObjectsMap, reorderCb, redrawCb) {\n var idxs = [];\n shapes.forEach(function (shape) {\n var shapeInfo = existingObjectsMap.get(shape);\n if (shapeInfo) {\n idxs.push(shapeInfo.shapeIdx);\n }\n existingObjectsMap.delete(shape);\n shape.off([\"changed\"], [reorderCb, redrawCb]);\n });\n return idxs;\n}\n\nvar DrawEngine = function (_EventHander) {\n _inherits(DrawEngine, _EventHander);\n\n function DrawEngine(parent, opts) {\n _classCallCheck(this, DrawEngine);\n\n var _this3 = _possibleConstructorReturn(this, (DrawEngine.__proto__ || Object.getPrototypeOf(DrawEngine)).call(this));\n\n _this3._init(parent, opts);\n return _this3;\n }\n\n _createClass(DrawEngine, [{\n key: \"destroy\",\n value: function destroy() {\n var _this4 = this;\n\n this._destroyCanvas();\n\n if (this._objects) {\n this._objects.forEach(function (shapeInfo, shape) {\n shape.off(\"changed\", [_this4._reorderCb, _this4._redrawCb]);\n });\n this._objects.clear();\n this._sortedObjs = [];\n this._reorderedObjIdxs.clear();\n }\n }\n }, {\n key: \"_resize\",\n value: function _resize(opts) {\n var width = 0;\n if (this._parent.offsetWidth) {\n width = Math.max(width, this._parent.offsetWidth - this._margins.left - this._margins.right);\n }\n\n var height = 0;\n if (this._parent.offsetHeight) {\n height = Math.max(height, this._parent.offsetHeight - this._margins.top - this._margins.bottom);\n }\n\n this._drawCanvas.width = width * this._pixelRatio;\n this._drawCanvas.height = height * this._pixelRatio;\n\n this._drawCanvas.style.left = this._margins.left + \"px\";\n this._drawCanvas.style.top = this._margins.top + \"px\";\n this._drawCanvas.style.width = width + \"px\";\n this._drawCanvas.style.height = height + \"px\";\n\n if (this._camera) {\n // const currViewport = this._camera.viewport\n // const currSpace = this._camera.projectionBounds\n // const viewportExtents = [0, 0]\n // AABox2d.getExtents(viewportExtents, currViewport)\n // const spaceCenter = [0, 0]\n // const spaceExtents = [0, 0]\n // AABox2d.getCenter(spaceCenter, currSpace)\n // AABox2d.getExtents(spaceExtents, currSpace)\n // const ratio = spaceExtents\n // Vec2d.div(ratio, spaceExtents, viewportExtents)\n // AABox2d.set(currViewport, 0, 0, width, height)\n // AABox2d.getExtents(viewportExtents, currViewport)\n // Vec2d.multiply(spaceExtents, ratio, viewportExtents)\n // AABox2d.initCenterExtents(currSpace, spaceCenter, spaceExtents)\n // this._camera.viewport = currViewport\n // this._camera.projectionBounds = currSpace\n // // this._camera.viewport = [0, 0, width, height]\n // // this._camera.projectionBounds = [0, 0, width, height]\n } else {\n var projDims = opts && opts.projectionDimensions ? opts.projectionDimensions : [width, height];\n this._camera = new _camera2d2.default([0, 0, width, height], projDims, opts.flipY ? Boolean(opts.flipY) : false);\n this._camera.setPosition(opts && opts.cameraPosition ? opts.cameraPosition : [width / 2.0, height / 2.0]);\n this._camera.on(\"changed\", this._rerenderCb);\n }\n // this._camera = new Camera2d([0, 0, this.width, this.height], [0, 0, this.width, this.height])\n // this._camera.on(\"changed\", this._rerenderCb)\n\n this._rerenderCb();\n }\n }, {\n key: \"_mousedownCB\",\n value: function _mousedownCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mousedown\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mouseupCB\",\n value: function _mouseupCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mouseup\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mousemoveCB\",\n value: function _mousemoveCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mousemove\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_clickCB\",\n value: function _clickCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"click\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_dblclickCB\",\n value: function _dblclickCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"dblclick\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mouseoverCB\",\n value: function _mouseoverCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mouseover\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_mouseoutCB\",\n value: function _mouseoutCB(event) {\n if (event.target !== this._parent) {\n return;\n }\n\n this.fire(\"mouseout\", {\n originalEvent: event\n });\n }\n }, {\n key: \"_enableEvents\",\n value: function _enableEvents() {\n this.registerEvents(mouseevents);\n var callbacks = mouseevents.map(function (event) {\n return \"_\" + event + \"CB\";\n });\n // bindAll(callbacks, this)\n for (var i = 0; i < mouseevents.length; i += 1) {\n document.addEventListener(mouseevents[i], this[callbacks[i]], true);\n }\n }\n }, {\n key: \"_disableEvents\",\n value: function _disableEvents() {\n var callbacks = mouseevents.map(function (event) {\n return \"_\" + event + \"CB\";\n });\n for (var i = 0; i < mouseevents.length; i += 1) {\n document.removeEventListener(mouseevents[i], this[callbacks[i]], true);\n }\n }\n }, {\n key: \"_initCanvas\",\n value: function _initCanvas(parent, opts) {\n var _this5 = this;\n\n var forceEvents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n this._margins = opts && opts.margins ? Object.assign({}, opts.margins) : {};\n marginProps.forEach(function (prop) {\n if (typeof _this5._margins[prop] !== \"number\") {\n _this5._margins[prop] = 0;\n }\n });\n\n var _createCanvas = createCanvas(parent),\n canvasContainer = _createCanvas.canvasContainer,\n canvas = _createCanvas.canvas,\n canvasContext = _createCanvas.canvasContext,\n ratio = _createCanvas.ratio;\n\n this._container = canvasContainer;\n this._drawCanvas = canvas;\n this._drawCtx = canvasContext;\n this._pixelRatio = ratio;\n this._parent = parent;\n\n (0, _utils.bindAll)([\"_resize\"], this);\n this._resize(opts);\n this._resizeSensor = new _ResizeSensor2.default(parent, this._resize);\n\n if (forceEvents || forceEvents === null && opts && opts.enableEvents) {\n this._enableEvents();\n }\n }\n }, {\n key: \"_destroyCanvas\",\n value: function _destroyCanvas() {\n if (this._drawCanvas) {\n this._disableEvents();\n }\n\n if (this._parent) {\n this._parent.removeChild(this._drawCanvas);\n\n if (this._resizeSensor) {\n this._resizeSensor.detach(this._parent, this._resize);\n }\n }\n\n this._drawCanvas = null;\n this._drawCtx = null;\n this._parent = null;\n }\n }, {\n key: \"_init\",\n value: function _init(parent, opts) {\n var forceEvents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n this.registerEvents([EventConstants.SHAPE_ADD, EventConstants.SHAPE_DELETE]);\n\n (0, _utils.bindAll)([\"_reorderCb\", \"_rerenderCb\"], this);\n (0, _utils.bindAll)([\"_mousedownCB\", \"_mouseupCB\", \"_mousemoveCB\", \"_clickCB\", \"_dblclickCB\", \"_mouseoverCB\", \"_mouseoutCB\"], this);\n\n this._renderFrameCb = this.renderAll.bind(this);\n this._renderRequestId = 0;\n this._ids = {\n shapeId: 1\n };\n\n this._objects = new Map();\n this._sortedObjs = [];\n this._reorderedObjIdxs = new Set();\n\n this._initCanvas(parent, opts, forceEvents);\n\n this._styleState = new DrawStyleState({\n fillColor: \"red\"\n });\n }\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this._parent;\n }\n }, {\n key: \"getCanvasContainer\",\n value: function getCanvasContainer() {\n return this._container;\n }\n }, {\n key: \"getCanvas\",\n value: function getCanvas() {\n return this._drawCanvas;\n }\n }, {\n key: \"project\",\n value: function project(out, screenPt) {\n var screenToWorldMatrix = this._camera.screenToWorldMatrix;\n return Point2d.transformMat2d(out, screenPt, screenToWorldMatrix);\n }\n }, {\n key: \"unproject\",\n value: function unproject(out, worldPt) {\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n return Point2d.transformMat2d(out, worldPt, worldToScreenMatrix);\n }\n }, {\n key: \"hasShape\",\n value: function hasShape(shape) {\n return this._objects.has(shape);\n }\n }, {\n key: \"addShape\",\n value: function addShape(shape) {\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n\n addShapesToMap(shapes, this._objects, this._ids, this._reorderCb, this._rerenderCb);\n\n // fire add event\n this.fire(\"shape:add\", {\n shape: shapes\n });\n\n var proxyEvent = {\n target: shapes\n };\n this._reorderCb(proxyEvent);\n\n return this;\n }\n }, {\n key: \"deleteShape\",\n value: function deleteShape(shape) {\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n\n var idxs = deleteShapesFromMap(shapes, this._objects, this._reorderCb, this._rerenderCb);\n var index = -1;\n for (var i = 0; i < shapes.length; i += 1) {\n if ((index = this._sortedObjs.indexOf(shapes[i])) >= 0) {\n this._sortedObjs.splice(index, 1);\n }\n this._reorderedObjIdxs.add(idxs[i]);\n }\n this._rerenderCb();\n\n this.fire(\"shape:delete\", {\n shape: shapes\n });\n\n return this;\n }\n }, {\n key: \"deleteAllShapes\",\n value: function deleteAllShapes() {\n this.deleteShape(this.sortedShapes.slice());\n return this;\n }\n }, {\n key: \"moveShapeToTop\",\n value: function moveShapeToTop(shape) {\n if (this._objects.has(shape)) {\n var shapes = this.sortedShapes;\n var zindex = shapes[shapes.length - 1].zIndex;\n shape.zIndex = zindex + 1;\n }\n }\n }, {\n key: \"moveShapeToBack\",\n value: function moveShapeToBack(shape) {\n if (this._objects.has(shape)) {\n var shapes = this.sortedShapes;\n var zindex = shapes[0].zIndex;\n shape.zIndex = zindex;\n }\n }\n }, {\n key: \"getShapesAsJSON\",\n value: function getShapesAsJSON() {\n var shapes = this.sortedShapes;\n return shapes.map(function (shape) {\n return shape.toJSON();\n });\n }\n }, {\n key: \"_rerenderCb\",\n value: function _rerenderCb() {\n if (this._renderRequestId) {\n window.cancelAnimationFrame(this._renderRequestId);\n }\n this._renderRequestId = window.requestAnimationFrame(this._renderFrameCb);\n }\n }, {\n key: \"_reorderCb\",\n value: function _reorderCb(event) {\n var _this6 = this;\n\n var changedShapes = event.target;\n if (!Array.isArray(changedShapes)) {\n changedShapes = [event.target];\n }\n changedShapes.forEach(function (changedShape) {\n console.assert(changedShape, \"A changed event doesn't have an object\");\n var shapeInfo = _this6._objects.get(changedShape);\n console.assert(shapeInfo, \"A changed event target isn't in the list of shapes \" + changedShape);\n if (shapeInfo.shapeIdx < 0) {\n shapeInfo.shapeIdx = _this6._sortedObjs.push(changedShape) - 1;\n }\n _this6._reorderedObjIdxs.add(shapeInfo.shapeIdx);\n });\n this._rerenderCb();\n }\n }, {\n key: \"_renderShapes\",\n value: function _renderShapes(ctx, drawShapes, camera) {\n var _this7 = this;\n\n var worldToScreenMat = camera.worldToScreenMatrix;\n drawShapes.forEach(function (shape) {\n if (shape.visible) {\n shape.render(ctx, worldToScreenMat, _this7._styleState);\n }\n });\n }\n }, {\n key: \"renderAll\",\n value: function renderAll() {\n var ctx = this._drawCtx;\n // ctx.clearRect(0, 0, this.width, this.height)\n ctx.clearRect(0, 0, this._drawCanvas.offsetWidth, this._drawCanvas.offsetHeight);\n\n if (!this._objects.size) {\n return;\n }\n\n ctx.save();\n var drawShapes = this.sortedShapes;\n this._styleState.applyDefaults(ctx);\n this._renderShapes(ctx, drawShapes, this._camera);\n ctx.restore();\n }\n }, {\n key: \"sortedShapes\",\n get: function get() {\n if (this._reorderedObjIdxs.size) {\n console.assert(this._sortedObjs.length === this._objects.size, \"Size mismatch when rendering objets. Something got out of sync - sorted objs length: \" + this._sortedObjs.length + \", objects length: \" + this._objects.size);\n\n // if (this._reorderedObjIdxs.length / this._sortedObjs.length > 0.7) {\n // // might as well just resort the whole thing over\n // this._sortedObjs.sort(shapeInfoCompare)\n // } else {\n // }\n\n this._sortedObjs.sort(_baseShape2.default.shapeCompare);\n this._reorderedObjIdxs.clear();\n }\n return this._sortedObjs;\n }\n }, {\n key: \"margins\",\n get: function get() {\n var _this8 = this;\n\n var rtn = {};\n marginProps.forEach(function (prop) {\n rtn[prop] = _this8._margins[prop];\n });\n return rtn;\n },\n set: function set(margins) {\n var _this9 = this;\n\n marginProps.forEach(function (prop) {\n if (typeof margins[prop] === \"number\" && margins[prop] !== _this9._margins[prop]) {\n _this9._margins[prop] = margins.prop;\n }\n });\n\n this._resize();\n }\n }, {\n key: \"viewport\",\n get: function get() {\n return this._camera.viewport;\n },\n set: function set(viewport) {\n this._camera.viewport = viewport;\n }\n }, {\n key: \"projectionDimensions\",\n get: function get() {\n return this._camera.projectionDimensions;\n },\n set: function set(projectionDimensions) {\n this._camera.projectionDimensions = projectionDimensions;\n return this;\n }\n }, {\n key: \"cameraPosition\",\n get: function get() {\n return this._camera.getPosition();\n },\n set: function set(pos) {\n this._camera.setPosition(pos);\n return this;\n }\n }]);\n\n return DrawEngine;\n}(_eventHandler2.default);\n\nexports.default = DrawEngine;\n\n\nDrawEngine.EventConstants = EventConstants;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9lbmdpbmUvZHJhdy1lbmdpbmUuanM/ZmYwMiJdLCJuYW1lcyI6WyJDYW52YXNVdGlscyIsIlBvaW50MmQiLCJtb3VzZWV2ZW50cyIsIm1hcmdpblByb3BzIiwiRXZlbnRDb25zdGFudHMiLCJNT1VTRURPV04iLCJNT1VTRVVQIiwiTU9VU0VNT1ZFIiwiQ0xJQ0siLCJEQkxDTElDSyIsIk1PVVNFT1ZFUiIsIk1PVVNFT1VUIiwiU0hBUEVfQUREIiwiU0hBUEVfREVMRVRFIiwiRHJhd1N0eWxlU3RhdGUiLCJhcmdzIiwiX2RlZmF1bHRzIiwicGFja2VkRmlsbENvbG9yIiwicGFja2VkU3Ryb2tlQ29sb3IiLCJzdHJva2VXaWR0aCIsImxpbmVKb2luIiwibGluZUNhcCIsImRhc2hQYXR0ZXJuIiwiZGFzaE9mZnNldCIsImN0eCIsImZpbGxTdHlsZSIsImZpbGxDb2xvciIsInN0cm9rZVN0eWxlIiwic3Ryb2tlQ29sb3IiLCJfc3Ryb2tlV2lkdGgiLCJsaW5lV2lkdGgiLCJfbGluZUpvaW4iLCJfbGluZUNhcCIsIl9kYXNoUGF0dGVybiIsImRpZmYiLCJsZW5ndGgiLCJpIiwic2V0TGluZURhc2giLCJfZGFzaE9mZnNldCIsImxpbmVEYXNoT2Zmc2V0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJwcm9wIiwic2V0RmlsbEN0eCIsInNldFN0cm9rZUN0eCIsImFkZENsYXNzIiwiZWxlbWVudCIsImNsYXNzTmFtZSIsImluZGV4T2YiLCJjcmVhdGVDYW52YXMiLCJwYXJlbnQiLCJjYW52YXNDb250YWluZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjYW52YXMiLCJjYW52YXNDb250ZXh0IiwiZ2V0Q29udGV4dCIsInJhdGlvIiwibWFrZUNhbnZhc0F1dG9IaWdoRFBJIiwic3R5bGUiLCJwb3NpdGlvbiIsInBvaW50ZXJFdmVudHMiLCJhcHBlbmRDaGlsZCIsImFkZFNoYXBlc1RvTWFwIiwibmV3U2hhcGVzIiwiZXhpc3RpbmdPYmplY3RzTWFwIiwiY3VycklkcyIsInJlb3JkZXJDYiIsInJlZHJhd0NiIiwic2V0Iiwic2hhcGUiLCJzaGFwZU9iaiIsInNoYXBlSWQiLCJzaGFwZUlkeCIsIm9uIiwiZGVsZXRlU2hhcGVzRnJvbU1hcCIsInNoYXBlcyIsImlkeHMiLCJzaGFwZUluZm8iLCJnZXQiLCJwdXNoIiwiZGVsZXRlIiwib2ZmIiwiRHJhd0VuZ2luZSIsIm9wdHMiLCJfaW5pdCIsIl9kZXN0cm95Q2FudmFzIiwiX29iamVjdHMiLCJfcmVvcmRlckNiIiwiX3JlZHJhd0NiIiwiY2xlYXIiLCJfc29ydGVkT2JqcyIsIl9yZW9yZGVyZWRPYmpJZHhzIiwid2lkdGgiLCJfcGFyZW50Iiwib2Zmc2V0V2lkdGgiLCJNYXRoIiwibWF4IiwiX21hcmdpbnMiLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ0b3AiLCJib3R0b20iLCJfZHJhd0NhbnZhcyIsIl9waXhlbFJhdGlvIiwiX2NhbWVyYSIsInByb2pEaW1zIiwicHJvamVjdGlvbkRpbWVuc2lvbnMiLCJmbGlwWSIsIkJvb2xlYW4iLCJzZXRQb3NpdGlvbiIsImNhbWVyYVBvc2l0aW9uIiwiX3JlcmVuZGVyQ2IiLCJldmVudCIsInRhcmdldCIsImZpcmUiLCJvcmlnaW5hbEV2ZW50IiwicmVnaXN0ZXJFdmVudHMiLCJjYWxsYmFja3MiLCJtYXAiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZvcmNlRXZlbnRzIiwibWFyZ2lucyIsImFzc2lnbiIsIl9jb250YWluZXIiLCJfZHJhd0N0eCIsIl9yZXNpemUiLCJfcmVzaXplU2Vuc29yIiwiZW5hYmxlRXZlbnRzIiwiX2VuYWJsZUV2ZW50cyIsIl9kaXNhYmxlRXZlbnRzIiwicmVtb3ZlQ2hpbGQiLCJkZXRhY2giLCJfcmVuZGVyRnJhbWVDYiIsInJlbmRlckFsbCIsImJpbmQiLCJfcmVuZGVyUmVxdWVzdElkIiwiX2lkcyIsIk1hcCIsIlNldCIsIl9pbml0Q2FudmFzIiwiX3N0eWxlU3RhdGUiLCJvdXQiLCJzY3JlZW5QdCIsInNjcmVlblRvV29ybGRNYXRyaXgiLCJ0cmFuc2Zvcm1NYXQyZCIsIndvcmxkUHQiLCJ3b3JsZFRvU2NyZWVuTWF0cml4IiwiaGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJveHlFdmVudCIsImluZGV4Iiwic3BsaWNlIiwiYWRkIiwiZGVsZXRlU2hhcGUiLCJzb3J0ZWRTaGFwZXMiLCJzbGljZSIsInppbmRleCIsInpJbmRleCIsInRvSlNPTiIsIndpbmRvdyIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2hhbmdlZFNoYXBlcyIsImNvbnNvbGUiLCJhc3NlcnQiLCJjaGFuZ2VkU2hhcGUiLCJkcmF3U2hhcGVzIiwiY2FtZXJhIiwid29ybGRUb1NjcmVlbk1hdCIsInZpc2libGUiLCJyZW5kZXIiLCJjbGVhclJlY3QiLCJzaXplIiwic2F2ZSIsImFwcGx5RGVmYXVsdHMiLCJfcmVuZGVyU2hhcGVzIiwicmVzdG9yZSIsInNvcnQiLCJzaGFwZUNvbXBhcmUiLCJydG4iLCJ2aWV3cG9ydCIsImdldFBvc2l0aW9uIiwicG9zIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0FBRUE7O0lBQVlBLFc7O0FBQ1o7O0lBQVlDLE87O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOztBQUdBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQyxjQUFjLENBQUMsV0FBRCxFQUFjLFNBQWQsRUFBeUIsV0FBekIsRUFBc0MsT0FBdEMsRUFBK0MsVUFBL0MsRUFBMkQsV0FBM0QsRUFBd0UsVUFBeEUsQ0FBcEI7QUFDQSxJQUFNQyxjQUFjLENBQUMsS0FBRCxFQUFRLFFBQVIsRUFBa0IsTUFBbEIsRUFBMEIsT0FBMUIsQ0FBcEI7O0FBRU8sSUFBTUMsMENBQWlCO0FBQzVCQyxhQUFXLFdBRGlCO0FBRTVCQyxXQUFTLFNBRm1CO0FBRzVCQyxhQUFXLFdBSGlCO0FBSTVCQyxTQUFPLE9BSnFCO0FBSzVCQyxZQUFVLFVBTGtCO0FBTTVCQyxhQUFXLFdBTmlCO0FBTzVCQyxZQUFVLFVBUGtCO0FBUTVCQyxhQUFXLFdBUmlCO0FBUzVCQyxnQkFBYztBQVRjLENBQXZCOztJQVlEQyxjOzs7QUFDSiw0QkFBcUI7QUFBQTs7QUFBQTs7QUFBQSxzQ0FBTkMsSUFBTTtBQUFOQSxVQUFNO0FBQUE7O0FBQUEsMkpBQ1ZBLElBRFU7O0FBRW5CLFVBQUtDLFNBQUwsR0FBaUI7QUFDZkMsdUJBQWlCLE1BQUtBLGVBRFA7QUFFZkMseUJBQW1CLE1BQUtBLGlCQUZUO0FBR2ZDLG1CQUFhLE1BQUtBLFdBSEg7QUFJZkMsZ0JBQVUsTUFBS0EsUUFKQTtBQUtmQyxlQUFTLE1BQUtBLE9BTEM7QUFNZkMsbUJBQWEsTUFBS0EsV0FOSDtBQU9mQyxrQkFBWSxNQUFLQTtBQVBGLEtBQWpCO0FBRm1CO0FBV3BCOzs7O2lDQUVZQyxHLEVBQUtDLFMsRUFBVztBQUMzQixVQUFJQSxVQUFVUixlQUFWLEtBQThCLEtBQUtBLGVBQXZDLEVBQXdEO0FBQ3RELGFBQUtBLGVBQUwsR0FBdUJRLFVBQVVSLGVBQWpDO0FBQ0FPLFlBQUlDLFNBQUosR0FBZ0IsS0FBS0MsU0FBckI7QUFDRDtBQUNGOzs7bUNBRWNGLEcsRUFBS0csVyxFQUFhO0FBQy9CLFVBQUlBLFlBQVlULGlCQUFaLEtBQWtDLEtBQUtBLGlCQUEzQyxFQUE4RDtBQUM1RCxhQUFLQSxpQkFBTCxHQUF5QlMsWUFBWVQsaUJBQXJDO0FBQ0FNLFlBQUlHLFdBQUosR0FBa0IsS0FBS0MsV0FBdkI7QUFDRDtBQUNELFVBQUlELFlBQVlSLFdBQVosS0FBNEIsS0FBS1UsWUFBckMsRUFBbUQ7QUFDakQsYUFBS1YsV0FBTCxHQUFtQlEsWUFBWVIsV0FBL0I7QUFDQUssWUFBSU0sU0FBSixHQUFnQixLQUFLRCxZQUFyQjtBQUNEO0FBQ0QsVUFBSUYsWUFBWVAsUUFBWixLQUF5QixLQUFLVyxTQUFsQyxFQUE2QztBQUMzQyxhQUFLWCxRQUFMLEdBQWdCTyxZQUFZUCxRQUE1QjtBQUNBSSxZQUFJSixRQUFKLEdBQWUsS0FBS1csU0FBcEI7QUFDRDtBQUNELFVBQUlKLFlBQVlOLE9BQVosS0FBd0IsS0FBS1csUUFBakMsRUFBMkM7QUFDekMsYUFBS1gsT0FBTCxHQUFlTSxZQUFZTixPQUEzQjtBQUNBRyxZQUFJSCxPQUFKLEdBQWMsS0FBS1csUUFBbkI7QUFDRDs7QUFFRCxVQUFNVixjQUFjSyxZQUFZTSxZQUFoQztBQUNBLFVBQUlDLE9BQU8sS0FBWDtBQUNBLFVBQUlaLFlBQVlhLE1BQVosS0FBdUIsS0FBS0YsWUFBTCxDQUFrQkUsTUFBN0MsRUFBcUQ7QUFDbkQsYUFBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlkLFlBQVlhLE1BQWhDLEVBQXdDQyxLQUFLLENBQTdDLEVBQWdEO0FBQzlDLGNBQUlkLFlBQVljLENBQVosTUFBbUIsS0FBS0gsWUFBTCxDQUFrQkcsQ0FBbEIsQ0FBdkIsRUFBNkM7QUFDM0NGLG1CQUFPLElBQVA7QUFDQTtBQUNEO0FBQ0Y7QUFDRixPQVBELE1BT087QUFDTEEsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQsVUFBSUEsSUFBSixFQUFVO0FBQ1IsYUFBS1osV0FBTCxHQUFtQkEsV0FBbkI7QUFDQUUsWUFBSWEsV0FBSixDQUFnQixLQUFLSixZQUFyQjtBQUNEOztBQUVELFVBQUlOLFlBQVlKLFVBQVosS0FBMkIsS0FBS2UsV0FBcEMsRUFBaUQ7QUFDL0MsYUFBS2YsVUFBTCxHQUFrQkksWUFBWUosVUFBOUI7QUFDQUMsWUFBSWUsY0FBSixHQUFxQixLQUFLRCxXQUExQjtBQUNEO0FBQ0Y7OztrQ0FFYWQsRyxFQUFLO0FBQUE7O0FBQ2pCZ0IsYUFBT0MsbUJBQVAsQ0FBMkIsS0FBS3pCLFNBQWhDLEVBQTJDMEIsT0FBM0MsQ0FBbUQsZ0JBQVE7QUFDekQsZUFBS0MsSUFBTCxJQUFhLE9BQUszQixTQUFMLENBQWUyQixJQUFmLENBQWI7QUFDRCxPQUZEO0FBR0EsV0FBS0MsVUFBTCxDQUFnQnBCLEdBQWhCO0FBQ0EsV0FBS3FCLFlBQUwsQ0FBa0JyQixHQUFsQjtBQUNEOzs7Ozs7QUFHSCxTQUFTc0IsUUFBVCxDQUFrQkMsT0FBbEIsRUFBMkJDLFNBQTNCLEVBQXNDO0FBQ3BDLE1BQUlELFdBQVcsT0FBS0EsUUFBUUMsU0FBYixRQUEyQkMsT0FBM0IsT0FBdUNELFNBQXZDLFVBQXVELENBQXRFLEVBQXlFO0FBQ3ZFRCxZQUFRQyxTQUFSLElBQXFCLENBQUNELFFBQVFDLFNBQVIsR0FBb0IsR0FBcEIsR0FBMEIsRUFBM0IsSUFBaUNBLFNBQXREO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTRSxZQUFULENBQXNCQyxNQUF0QixFQUE4QjtBQUM1QixNQUFNQyxrQkFBa0JDLFNBQVNDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBeEI7QUFDQVIsV0FBU00sZUFBVCxFQUEwQiw0QkFBMUI7O0FBRUEsTUFBTUcsU0FBU0YsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFmO0FBQ0EsTUFBTUUsZ0JBQWdCRCxPQUFPRSxVQUFQLENBQWtCLElBQWxCLENBQXRCO0FBQ0EsTUFBTUMsUUFBUTFELFlBQVkyRCxxQkFBWixDQUFrQ0gsYUFBbEMsQ0FBZDtBQUNFOztBQUVGO0FBQ0FWLFdBQVNTLE1BQVQsRUFBaUIsa0JBQWpCO0FBQ0FBLFNBQU9LLEtBQVAsQ0FBYUMsUUFBYixHQUF3QixVQUF4QjtBQUNBTixTQUFPSyxLQUFQLENBQWFFLGFBQWIsR0FBNkIsTUFBN0I7O0FBRUFWLGtCQUFnQlcsV0FBaEIsQ0FBNEJSLE1BQTVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBSixTQUFPWSxXQUFQLENBQW1CWCxlQUFuQjs7QUFFQSxTQUFPO0FBQ0xBLG9DQURLO0FBRUxHLGtCQUZLO0FBR0xDLGdDQUhLO0FBSUxFO0FBSkssR0FBUDtBQU1EOztBQUdELFNBQVNNLGNBQVQsQ0FBd0JDLFNBQXhCLEVBQW1DQyxrQkFBbkMsRUFBdURDLE9BQXZELEVBQWdFQyxTQUFoRSxFQUEyRUMsUUFBM0UsRUFBcUY7QUFDbkZKLFlBQVV2QixPQUFWLENBQWtCLGlCQUFTO0FBQ3pCd0IsdUJBQW1CSSxHQUFuQixDQUF1QkMsS0FBdkIsRUFBOEI7QUFDNUJDLGdCQUFVRCxLQURrQjtBQUU1QkUsZUFBU04sUUFBUU0sT0FGVztBQUc1QkMsZ0JBQVUsQ0FBQztBQUhpQixLQUE5QjtBQUtBSCxVQUFNSSxFQUFOLENBQVMsQ0FBQyxlQUFELEVBQWtCLG9CQUFsQixFQUF3QyxlQUF4QyxDQUFULEVBQW1FUCxTQUFuRTtBQUNBRyxVQUFNSSxFQUFOLENBQVMsQ0FBQyxjQUFELEVBQWlCLG9CQUFqQixFQUF1QyxlQUF2QyxDQUFULEVBQWtFTixRQUFsRTtBQUNBRixZQUFRTSxPQUFSLElBQW1CLENBQW5CO0FBQ0QsR0FURDtBQVVEOztBQUVELFNBQVNHLG1CQUFULENBQTZCQyxNQUE3QixFQUFxQ1gsa0JBQXJDLEVBQXlERSxTQUF6RCxFQUFvRUMsUUFBcEUsRUFBOEU7QUFDNUUsTUFBTVMsT0FBTyxFQUFiO0FBQ0FELFNBQU9uQyxPQUFQLENBQWUsaUJBQVM7QUFDdEIsUUFBTXFDLFlBQVliLG1CQUFtQmMsR0FBbkIsQ0FBdUJULEtBQXZCLENBQWxCO0FBQ0EsUUFBSVEsU0FBSixFQUFlO0FBQ2JELFdBQUtHLElBQUwsQ0FBVUYsVUFBVUwsUUFBcEI7QUFDRDtBQUNEUix1QkFBbUJnQixNQUFuQixDQUEwQlgsS0FBMUI7QUFDQUEsVUFBTVksR0FBTixDQUFVLENBQUMsU0FBRCxDQUFWLEVBQXVCLENBQUNmLFNBQUQsRUFBWUMsUUFBWixDQUF2QjtBQUNELEdBUEQ7QUFRQSxTQUFPUyxJQUFQO0FBQ0Q7O0lBRW9CTSxVOzs7QUFDbkIsc0JBQVlqQyxNQUFaLEVBQW9Ca0MsSUFBcEIsRUFBMEI7QUFBQTs7QUFBQTs7QUFFeEIsV0FBS0MsS0FBTCxDQUFXbkMsTUFBWCxFQUFtQmtDLElBQW5CO0FBRndCO0FBR3pCOzs7OzhCQUVTO0FBQUE7O0FBQ1IsV0FBS0UsY0FBTDs7QUFFQSxVQUFJLEtBQUtDLFFBQVQsRUFBbUI7QUFDakIsYUFBS0EsUUFBTCxDQUFjOUMsT0FBZCxDQUFzQixVQUFDcUMsU0FBRCxFQUFZUixLQUFaLEVBQXNCO0FBQzFDQSxnQkFBTVksR0FBTixDQUFVLFNBQVYsRUFBcUIsQ0FBQyxPQUFLTSxVQUFOLEVBQWtCLE9BQUtDLFNBQXZCLENBQXJCO0FBQ0QsU0FGRDtBQUdBLGFBQUtGLFFBQUwsQ0FBY0csS0FBZDtBQUNBLGFBQUtDLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSxhQUFLQyxpQkFBTCxDQUF1QkYsS0FBdkI7QUFDRDtBQUNGOzs7NEJBRU9OLEksRUFBTTtBQUNaLFVBQUlTLFFBQVEsQ0FBWjtBQUNBLFVBQUksS0FBS0MsT0FBTCxDQUFhQyxXQUFqQixFQUE4QjtBQUM1QkYsZ0JBQVFHLEtBQUtDLEdBQUwsQ0FBU0osS0FBVCxFQUFnQixLQUFLQyxPQUFMLENBQWFDLFdBQWIsR0FBMkIsS0FBS0csUUFBTCxDQUFjQyxJQUF6QyxHQUFnRCxLQUFLRCxRQUFMLENBQWNFLEtBQTlFLENBQVI7QUFDRDs7QUFFRCxVQUFJQyxTQUFTLENBQWI7QUFDQSxVQUFJLEtBQUtQLE9BQUwsQ0FBYVEsWUFBakIsRUFBK0I7QUFDN0JELGlCQUFTTCxLQUFLQyxHQUFMLENBQVNJLE1BQVQsRUFBaUIsS0FBS1AsT0FBTCxDQUFhUSxZQUFiLEdBQTRCLEtBQUtKLFFBQUwsQ0FBY0ssR0FBMUMsR0FBZ0QsS0FBS0wsUUFBTCxDQUFjTSxNQUEvRSxDQUFUO0FBQ0Q7O0FBRUQsV0FBS0MsV0FBTCxDQUFpQlosS0FBakIsR0FBeUJBLFFBQVEsS0FBS2EsV0FBdEM7QUFDQSxXQUFLRCxXQUFMLENBQWlCSixNQUFqQixHQUEwQkEsU0FBUyxLQUFLSyxXQUF4Qzs7QUFFQSxXQUFLRCxXQUFMLENBQWlCOUMsS0FBakIsQ0FBdUJ3QyxJQUF2QixHQUFpQyxLQUFLRCxRQUFMLENBQWNDLElBQS9DO0FBQ0EsV0FBS00sV0FBTCxDQUFpQjlDLEtBQWpCLENBQXVCNEMsR0FBdkIsR0FBZ0MsS0FBS0wsUUFBTCxDQUFjSyxHQUE5QztBQUNBLFdBQUtFLFdBQUwsQ0FBaUI5QyxLQUFqQixDQUF1QmtDLEtBQXZCLEdBQWtDQSxLQUFsQztBQUNBLFdBQUtZLFdBQUwsQ0FBaUI5QyxLQUFqQixDQUF1QjBDLE1BQXZCLEdBQW1DQSxNQUFuQzs7QUFFQSxVQUFJLEtBQUtNLE9BQVQsRUFBa0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0QsT0FuQkQsTUFtQk87QUFDTCxZQUFNQyxXQUFZeEIsUUFBUUEsS0FBS3lCLG9CQUFiLEdBQW9DekIsS0FBS3lCLG9CQUF6QyxHQUFnRSxDQUFDaEIsS0FBRCxFQUFRUSxNQUFSLENBQWxGO0FBQ0EsYUFBS00sT0FBTCxHQUFlLHVCQUFhLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBT2QsS0FBUCxFQUFjUSxNQUFkLENBQWIsRUFBb0NPLFFBQXBDLEVBQStDeEIsS0FBSzBCLEtBQUwsR0FBYUMsUUFBUTNCLEtBQUswQixLQUFiLENBQWIsR0FBbUMsS0FBbEYsQ0FBZjtBQUNBLGFBQUtILE9BQUwsQ0FBYUssV0FBYixDQUEwQjVCLFFBQVFBLEtBQUs2QixjQUFiLEdBQThCN0IsS0FBSzZCLGNBQW5DLEdBQW9ELENBQUNwQixRQUFRLEdBQVQsRUFBY1EsU0FBUyxHQUF2QixDQUE5RTtBQUNBLGFBQUtNLE9BQUwsQ0FBYWpDLEVBQWIsQ0FBZ0IsU0FBaEIsRUFBMkIsS0FBS3dDLFdBQWhDO0FBQ0Q7QUFDRDtBQUNBOztBQUVBLFdBQUtBLFdBQUw7QUFDRDs7O2lDQUVZQyxLLEVBQU87QUFDbEIsVUFBSUEsTUFBTUMsTUFBTixLQUFpQixLQUFLdEIsT0FBMUIsRUFBbUM7QUFDakM7QUFDRDs7QUFFRCxXQUFLdUIsSUFBTCxDQUFVLFdBQVYsRUFBdUI7QUFDckJDLHVCQUFlSDtBQURNLE9BQXZCO0FBR0Q7OzsrQkFFVUEsSyxFQUFPO0FBQ2hCLFVBQUlBLE1BQU1DLE1BQU4sS0FBaUIsS0FBS3RCLE9BQTFCLEVBQW1DO0FBQ2pDO0FBQ0Q7O0FBRUQsV0FBS3VCLElBQUwsQ0FBVSxTQUFWLEVBQXFCO0FBQ25CQyx1QkFBZUg7QUFESSxPQUFyQjtBQUdEOzs7aUNBRVlBLEssRUFBTztBQUNsQixVQUFJQSxNQUFNQyxNQUFOLEtBQWlCLEtBQUt0QixPQUExQixFQUFtQztBQUNqQztBQUNEOztBQUVELFdBQUt1QixJQUFMLENBQVUsV0FBVixFQUF1QjtBQUNyQkMsdUJBQWVIO0FBRE0sT0FBdkI7QUFHRDs7OzZCQUVRQSxLLEVBQU87QUFDZCxVQUFJQSxNQUFNQyxNQUFOLEtBQWlCLEtBQUt0QixPQUExQixFQUFtQztBQUNqQztBQUNEOztBQUVELFdBQUt1QixJQUFMLENBQVUsT0FBVixFQUFtQjtBQUNqQkMsdUJBQWVIO0FBREUsT0FBbkI7QUFHRDs7O2dDQUVXQSxLLEVBQU87QUFDakIsVUFBSUEsTUFBTUMsTUFBTixLQUFpQixLQUFLdEIsT0FBMUIsRUFBbUM7QUFDakM7QUFDRDs7QUFFRCxXQUFLdUIsSUFBTCxDQUFVLFVBQVYsRUFBc0I7QUFDcEJDLHVCQUFlSDtBQURLLE9BQXRCO0FBR0Q7OztpQ0FFWUEsSyxFQUFPO0FBQ2xCLFVBQUlBLE1BQU1DLE1BQU4sS0FBaUIsS0FBS3RCLE9BQTFCLEVBQW1DO0FBQ2pDO0FBQ0Q7O0FBRUQsV0FBS3VCLElBQUwsQ0FBVSxXQUFWLEVBQXVCO0FBQ3JCQyx1QkFBZUg7QUFETSxPQUF2QjtBQUdEOzs7Z0NBRVdBLEssRUFBTztBQUNqQixVQUFJQSxNQUFNQyxNQUFOLEtBQWlCLEtBQUt0QixPQUExQixFQUFtQztBQUNqQztBQUNEOztBQUVELFdBQUt1QixJQUFMLENBQVUsVUFBVixFQUFzQjtBQUNwQkMsdUJBQWVIO0FBREssT0FBdEI7QUFHRDs7O29DQUVlO0FBQ2QsV0FBS0ksY0FBTCxDQUFvQnRILFdBQXBCO0FBQ0EsVUFBTXVILFlBQVl2SCxZQUFZd0gsR0FBWixDQUFnQjtBQUFBLHFCQUFhTixLQUFiO0FBQUEsT0FBaEIsQ0FBbEI7QUFDQTtBQUNBLFdBQUssSUFBSWhGLElBQUksQ0FBYixFQUFnQkEsSUFBSWxDLFlBQVlpQyxNQUFoQyxFQUF3Q0MsS0FBSyxDQUE3QyxFQUFnRDtBQUM5Q2lCLGlCQUFTc0UsZ0JBQVQsQ0FBMEJ6SCxZQUFZa0MsQ0FBWixDQUExQixFQUEwQyxLQUFLcUYsVUFBVXJGLENBQVYsQ0FBTCxDQUExQyxFQUE4RCxJQUE5RDtBQUNEO0FBQ0Y7OztxQ0FFZ0I7QUFDZixVQUFNcUYsWUFBWXZILFlBQVl3SCxHQUFaLENBQWdCO0FBQUEscUJBQWFOLEtBQWI7QUFBQSxPQUFoQixDQUFsQjtBQUNBLFdBQUssSUFBSWhGLElBQUksQ0FBYixFQUFnQkEsSUFBSWxDLFlBQVlpQyxNQUFoQyxFQUF3Q0MsS0FBSyxDQUE3QyxFQUFnRDtBQUM5Q2lCLGlCQUFTdUUsbUJBQVQsQ0FBNkIxSCxZQUFZa0MsQ0FBWixDQUE3QixFQUE2QyxLQUFLcUYsVUFBVXJGLENBQVYsQ0FBTCxDQUE3QyxFQUFpRSxJQUFqRTtBQUNEO0FBQ0Y7OztnQ0FFV2UsTSxFQUFRa0MsSSxFQUEwQjtBQUFBOztBQUFBLFVBQXBCd0MsV0FBb0IsdUVBQU4sSUFBTTs7QUFDNUMsV0FBSzFCLFFBQUwsR0FBaUJkLFFBQVFBLEtBQUt5QyxPQUFiLEdBQXVCdEYsT0FBT3VGLE1BQVAsQ0FBYyxFQUFkLEVBQWtCMUMsS0FBS3lDLE9BQXZCLENBQXZCLEdBQXlELEVBQTFFO0FBQ0EzSCxrQkFBWXVDLE9BQVosQ0FBb0IsZ0JBQVE7QUFDMUIsWUFBSSxPQUFPLE9BQUt5RCxRQUFMLENBQWN4RCxJQUFkLENBQVAsS0FBK0IsUUFBbkMsRUFBNkM7QUFDM0MsaUJBQUt3RCxRQUFMLENBQWN4RCxJQUFkLElBQXNCLENBQXRCO0FBQ0Q7QUFDRixPQUpEOztBQUY0QywwQkFheENPLGFBQWFDLE1BQWIsQ0Fid0M7QUFBQSxVQVMxQ0MsZUFUMEMsaUJBUzFDQSxlQVQwQztBQUFBLFVBVTFDRyxNQVYwQyxpQkFVMUNBLE1BVjBDO0FBQUEsVUFXMUNDLGFBWDBDLGlCQVcxQ0EsYUFYMEM7QUFBQSxVQVkxQ0UsS0FaMEMsaUJBWTFDQSxLQVowQzs7QUFlNUMsV0FBS3NFLFVBQUwsR0FBa0I1RSxlQUFsQjtBQUNBLFdBQUtzRCxXQUFMLEdBQW1CbkQsTUFBbkI7QUFDQSxXQUFLMEUsUUFBTCxHQUFnQnpFLGFBQWhCO0FBQ0EsV0FBS21ELFdBQUwsR0FBbUJqRCxLQUFuQjtBQUNBLFdBQUtxQyxPQUFMLEdBQWU1QyxNQUFmOztBQUVBLDBCQUFRLENBQUMsU0FBRCxDQUFSLEVBQXFCLElBQXJCO0FBQ0EsV0FBSytFLE9BQUwsQ0FBYTdDLElBQWI7QUFDQSxXQUFLOEMsYUFBTCxHQUFxQiwyQkFBaUJoRixNQUFqQixFQUF5QixLQUFLK0UsT0FBOUIsQ0FBckI7O0FBRUEsVUFBSUwsZUFBZ0JBLGdCQUFnQixJQUFoQixJQUF3QnhDLElBQXhCLElBQWdDQSxLQUFLK0MsWUFBekQsRUFBd0U7QUFDdEUsYUFBS0MsYUFBTDtBQUNEO0FBQ0Y7OztxQ0FFZ0I7QUFDZixVQUFJLEtBQUszQixXQUFULEVBQXNCO0FBQ3BCLGFBQUs0QixjQUFMO0FBQ0Q7O0FBRUQsVUFBSSxLQUFLdkMsT0FBVCxFQUFrQjtBQUNoQixhQUFLQSxPQUFMLENBQWF3QyxXQUFiLENBQXlCLEtBQUs3QixXQUE5Qjs7QUFFQSxZQUFJLEtBQUt5QixhQUFULEVBQXdCO0FBQ3RCLGVBQUtBLGFBQUwsQ0FBbUJLLE1BQW5CLENBQTBCLEtBQUt6QyxPQUEvQixFQUF3QyxLQUFLbUMsT0FBN0M7QUFDRDtBQUNGOztBQUVELFdBQUt4QixXQUFMLEdBQW1CLElBQW5CO0FBQ0EsV0FBS3VCLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxXQUFLbEMsT0FBTCxHQUFlLElBQWY7QUFDRDs7OzBCQUVLNUMsTSxFQUFRa0MsSSxFQUEwQjtBQUFBLFVBQXBCd0MsV0FBb0IsdUVBQU4sSUFBTTs7QUFDdEMsV0FBS0wsY0FBTCxDQUFvQixDQUFDcEgsZUFBZVEsU0FBaEIsRUFBMkJSLGVBQWVTLFlBQTFDLENBQXBCOztBQUVBLDBCQUFRLENBQUMsWUFBRCxFQUFlLGFBQWYsQ0FBUixFQUF1QyxJQUF2QztBQUNBLDBCQUFRLENBQUMsY0FBRCxFQUFpQixZQUFqQixFQUErQixjQUEvQixFQUErQyxVQUEvQyxFQUEyRCxhQUEzRCxFQUEwRSxjQUExRSxFQUEwRixhQUExRixDQUFSLEVBQWtILElBQWxIOztBQUVBLFdBQUs0SCxjQUFMLEdBQXNCLEtBQUtDLFNBQUwsQ0FBZUMsSUFBZixDQUFvQixJQUFwQixDQUF0QjtBQUNBLFdBQUtDLGdCQUFMLEdBQXdCLENBQXhCO0FBQ0EsV0FBS0MsSUFBTCxHQUFZO0FBQ1ZwRSxpQkFBUztBQURDLE9BQVo7O0FBSUEsV0FBS2UsUUFBTCxHQUFnQixJQUFJc0QsR0FBSixFQUFoQjtBQUNBLFdBQUtsRCxXQUFMLEdBQW1CLEVBQW5CO0FBQ0EsV0FBS0MsaUJBQUwsR0FBeUIsSUFBSWtELEdBQUosRUFBekI7O0FBRUEsV0FBS0MsV0FBTCxDQUFpQjdGLE1BQWpCLEVBQXlCa0MsSUFBekIsRUFBK0J3QyxXQUEvQjs7QUFFQSxXQUFLb0IsV0FBTCxHQUFtQixJQUFJbkksY0FBSixDQUFtQjtBQUNwQ1ksbUJBQVc7QUFEeUIsT0FBbkIsQ0FBbkI7QUFHRDs7O21DQUVjO0FBQ2IsYUFBTyxLQUFLcUUsT0FBWjtBQUNEOzs7eUNBRW9CO0FBQ25CLGFBQU8sS0FBS2lDLFVBQVo7QUFDRDs7O2dDQUVXO0FBQ1YsYUFBTyxLQUFLdEIsV0FBWjtBQUNEOzs7NEJBK0RPd0MsRyxFQUFLQyxRLEVBQVU7QUFDckIsVUFBTUMsc0JBQXNCLEtBQUt4QyxPQUFMLENBQWF3QyxtQkFBekM7QUFDQSxhQUFPbkosUUFBUW9KLGNBQVIsQ0FBdUJILEdBQXZCLEVBQTRCQyxRQUE1QixFQUFzQ0MsbUJBQXRDLENBQVA7QUFDRDs7OzhCQUVTRixHLEVBQUtJLE8sRUFBUztBQUN0QixVQUFNQyxzQkFBc0IsS0FBSzNDLE9BQUwsQ0FBYTJDLG1CQUF6QztBQUNBLGFBQU90SixRQUFRb0osY0FBUixDQUF1QkgsR0FBdkIsRUFBNEJJLE9BQTVCLEVBQXFDQyxtQkFBckMsQ0FBUDtBQUNEOzs7NkJBRVFoRixLLEVBQU87QUFDZCxhQUFPLEtBQUtpQixRQUFMLENBQWNnRSxHQUFkLENBQWtCakYsS0FBbEIsQ0FBUDtBQUNEOzs7NkJBRVFBLEssRUFBTztBQUNkLFVBQUlNLFNBQVNOLEtBQWI7QUFDQSxVQUFJLENBQUNrRixNQUFNQyxPQUFOLENBQWM3RSxNQUFkLENBQUwsRUFBNEI7QUFDMUJBLGlCQUFTLENBQUNOLEtBQUQsQ0FBVDtBQUNEOztBQUVEUCxxQkFBZWEsTUFBZixFQUF1QixLQUFLVyxRQUE1QixFQUFzQyxLQUFLcUQsSUFBM0MsRUFBaUQsS0FBS3BELFVBQXRELEVBQWtFLEtBQUswQixXQUF2RTs7QUFFQTtBQUNBLFdBQUtHLElBQUwsQ0FBVSxXQUFWLEVBQXVCO0FBQ3JCL0MsZUFBT007QUFEYyxPQUF2Qjs7QUFJQSxVQUFNOEUsYUFBYTtBQUNqQnRDLGdCQUFReEM7QUFEUyxPQUFuQjtBQUdBLFdBQUtZLFVBQUwsQ0FBZ0JrRSxVQUFoQjs7QUFFQSxhQUFPLElBQVA7QUFDRDs7O2dDQUVXcEYsSyxFQUFPO0FBQ2pCLFVBQUlNLFNBQVNOLEtBQWI7QUFDQSxVQUFJLENBQUNrRixNQUFNQyxPQUFOLENBQWM3RSxNQUFkLENBQUwsRUFBNEI7QUFDMUJBLGlCQUFTLENBQUNOLEtBQUQsQ0FBVDtBQUNEOztBQUVELFVBQU1PLE9BQU9GLG9CQUFvQkMsTUFBcEIsRUFBNEIsS0FBS1csUUFBakMsRUFBMkMsS0FBS0MsVUFBaEQsRUFBNEQsS0FBSzBCLFdBQWpFLENBQWI7QUFDQSxVQUFJeUMsUUFBUSxDQUFDLENBQWI7QUFDQSxXQUFLLElBQUl4SCxJQUFJLENBQWIsRUFBZ0JBLElBQUl5QyxPQUFPMUMsTUFBM0IsRUFBbUNDLEtBQUssQ0FBeEMsRUFBMkM7QUFDekMsWUFBSSxDQUFDd0gsUUFBUSxLQUFLaEUsV0FBTCxDQUFpQjNDLE9BQWpCLENBQXlCNEIsT0FBT3pDLENBQVAsQ0FBekIsQ0FBVCxLQUFpRCxDQUFyRCxFQUF3RDtBQUN0RCxlQUFLd0QsV0FBTCxDQUFpQmlFLE1BQWpCLENBQXdCRCxLQUF4QixFQUErQixDQUEvQjtBQUNEO0FBQ0QsYUFBSy9ELGlCQUFMLENBQXVCaUUsR0FBdkIsQ0FBMkJoRixLQUFLMUMsQ0FBTCxDQUEzQjtBQUNEO0FBQ0QsV0FBSytFLFdBQUw7O0FBRUEsV0FBS0csSUFBTCxDQUFVLGNBQVYsRUFBMEI7QUFDeEIvQyxlQUFPTTtBQURpQixPQUExQjs7QUFJQSxhQUFPLElBQVA7QUFDRDs7O3NDQUVpQjtBQUNoQixXQUFLa0YsV0FBTCxDQUFpQixLQUFLQyxZQUFMLENBQWtCQyxLQUFsQixFQUFqQjtBQUNBLGFBQU8sSUFBUDtBQUNEOzs7bUNBRWMxRixLLEVBQU87QUFDcEIsVUFBSSxLQUFLaUIsUUFBTCxDQUFjZ0UsR0FBZCxDQUFrQmpGLEtBQWxCLENBQUosRUFBOEI7QUFDNUIsWUFBTU0sU0FBUyxLQUFLbUYsWUFBcEI7QUFDQSxZQUFNRSxTQUFTckYsT0FBT0EsT0FBTzFDLE1BQVAsR0FBZ0IsQ0FBdkIsRUFBMEJnSSxNQUF6QztBQUNBNUYsY0FBTTRGLE1BQU4sR0FBZUQsU0FBUyxDQUF4QjtBQUNEO0FBQ0Y7OztvQ0FFZTNGLEssRUFBTztBQUNyQixVQUFJLEtBQUtpQixRQUFMLENBQWNnRSxHQUFkLENBQWtCakYsS0FBbEIsQ0FBSixFQUE4QjtBQUM1QixZQUFNTSxTQUFTLEtBQUttRixZQUFwQjtBQUNBLFlBQU1FLFNBQVNyRixPQUFPLENBQVAsRUFBVXNGLE1BQXpCO0FBQ0E1RixjQUFNNEYsTUFBTixHQUFlRCxNQUFmO0FBQ0Q7QUFDRjs7O3NDQUVpQjtBQUNoQixVQUFNckYsU0FBUyxLQUFLbUYsWUFBcEI7QUFDQSxhQUFPbkYsT0FBTzZDLEdBQVAsQ0FBVztBQUFBLGVBQVNuRCxNQUFNNkYsTUFBTixFQUFUO0FBQUEsT0FBWCxDQUFQO0FBQ0Q7OztrQ0FFYTtBQUNaLFVBQUksS0FBS3hCLGdCQUFULEVBQTJCO0FBQ3pCeUIsZUFBT0Msb0JBQVAsQ0FBNEIsS0FBSzFCLGdCQUFqQztBQUNEO0FBQ0QsV0FBS0EsZ0JBQUwsR0FBd0J5QixPQUFPRSxxQkFBUCxDQUE2QixLQUFLOUIsY0FBbEMsQ0FBeEI7QUFDRDs7OytCQUVVckIsSyxFQUFPO0FBQUE7O0FBQ2hCLFVBQUlvRCxnQkFBZ0JwRCxNQUFNQyxNQUExQjtBQUNBLFVBQUksQ0FBQ29DLE1BQU1DLE9BQU4sQ0FBY2MsYUFBZCxDQUFMLEVBQW1DO0FBQ2pDQSx3QkFBZ0IsQ0FBQ3BELE1BQU1DLE1BQVAsQ0FBaEI7QUFDRDtBQUNEbUQsb0JBQWM5SCxPQUFkLENBQXNCLHdCQUFnQjtBQUNwQytILGdCQUFRQyxNQUFSLENBQWVDLFlBQWYsRUFBNkIsd0NBQTdCO0FBQ0EsWUFBTTVGLFlBQVksT0FBS1MsUUFBTCxDQUFjUixHQUFkLENBQWtCMkYsWUFBbEIsQ0FBbEI7QUFDQUYsZ0JBQVFDLE1BQVIsQ0FBZTNGLFNBQWYsMERBQWdGNEYsWUFBaEY7QUFDQSxZQUFJNUYsVUFBVUwsUUFBVixHQUFxQixDQUF6QixFQUE0QjtBQUMxQkssb0JBQVVMLFFBQVYsR0FBcUIsT0FBS2tCLFdBQUwsQ0FBaUJYLElBQWpCLENBQXNCMEYsWUFBdEIsSUFBc0MsQ0FBM0Q7QUFDRDtBQUNELGVBQUs5RSxpQkFBTCxDQUF1QmlFLEdBQXZCLENBQTJCL0UsVUFBVUwsUUFBckM7QUFDRCxPQVJEO0FBU0EsV0FBS3lDLFdBQUw7QUFDRDs7O2tDQUVhM0YsRyxFQUFLb0osVSxFQUFZQyxNLEVBQVE7QUFBQTs7QUFDckMsVUFBTUMsbUJBQW1CRCxPQUFPdEIsbUJBQWhDO0FBQ0FxQixpQkFBV2xJLE9BQVgsQ0FBbUIsaUJBQVM7QUFDMUIsWUFBSTZCLE1BQU13RyxPQUFWLEVBQW1CO0FBQ2pCeEcsZ0JBQU15RyxNQUFOLENBQWF4SixHQUFiLEVBQWtCc0osZ0JBQWxCLEVBQW9DLE9BQUs3QixXQUF6QztBQUNEO0FBQ0YsT0FKRDtBQUtEOzs7Z0NBRVc7QUFDVixVQUFNekgsTUFBTSxLQUFLeUcsUUFBakI7QUFDRTtBQUNGekcsVUFBSXlKLFNBQUosQ0FBYyxDQUFkLEVBQWlCLENBQWpCLEVBQW9CLEtBQUt2RSxXQUFMLENBQWlCVixXQUFyQyxFQUFrRCxLQUFLVSxXQUFMLENBQWlCSCxZQUFuRTs7QUFFQSxVQUFJLENBQUMsS0FBS2YsUUFBTCxDQUFjMEYsSUFBbkIsRUFBeUI7QUFDdkI7QUFDRDs7QUFFRDFKLFVBQUkySixJQUFKO0FBQ0EsVUFBTVAsYUFBYSxLQUFLWixZQUF4QjtBQUNBLFdBQUtmLFdBQUwsQ0FBaUJtQyxhQUFqQixDQUErQjVKLEdBQS9CO0FBQ0EsV0FBSzZKLGFBQUwsQ0FBbUI3SixHQUFuQixFQUF3Qm9KLFVBQXhCLEVBQW9DLEtBQUtoRSxPQUF6QztBQUNBcEYsVUFBSThKLE9BQUo7QUFDRDs7O3dCQWhNa0I7QUFDakIsVUFBSSxLQUFLekYsaUJBQUwsQ0FBdUJxRixJQUEzQixFQUFpQztBQUMvQlQsZ0JBQVFDLE1BQVIsQ0FBZSxLQUFLOUUsV0FBTCxDQUFpQnpELE1BQWpCLEtBQTRCLEtBQUtxRCxRQUFMLENBQWMwRixJQUF6RCw0RkFDMEYsS0FBS3RGLFdBQUwsQ0FBaUJ6RCxNQUQzRywwQkFDc0ksS0FBS3FELFFBQUwsQ0FBYzBGLElBRHBKOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBS3RGLFdBQUwsQ0FBaUIyRixJQUFqQixDQUFzQixvQkFBVUMsWUFBaEM7QUFDQSxhQUFLM0YsaUJBQUwsQ0FBdUJGLEtBQXZCO0FBQ0Q7QUFDRCxhQUFPLEtBQUtDLFdBQVo7QUFDRDs7O3dCQUVhO0FBQUE7O0FBQ1osVUFBTTZGLE1BQU0sRUFBWjtBQUNBdEwsa0JBQVl1QyxPQUFaLENBQW9CLGdCQUFRO0FBQzFCK0ksWUFBSTlJLElBQUosSUFBWSxPQUFLd0QsUUFBTCxDQUFjeEQsSUFBZCxDQUFaO0FBQ0QsT0FGRDtBQUdBLGFBQU84SSxHQUFQO0FBQ0QsSztzQkFFVzNELE8sRUFBUztBQUFBOztBQUNuQjNILGtCQUFZdUMsT0FBWixDQUFvQixnQkFBUTtBQUMxQixZQUFJLE9BQU9vRixRQUFRbkYsSUFBUixDQUFQLEtBQXlCLFFBQXpCLElBQXFDbUYsUUFBUW5GLElBQVIsTUFBa0IsT0FBS3dELFFBQUwsQ0FBY3hELElBQWQsQ0FBM0QsRUFBZ0Y7QUFDOUUsaUJBQUt3RCxRQUFMLENBQWN4RCxJQUFkLElBQXNCbUYsUUFBUW5GLElBQTlCO0FBQ0Q7QUFDRixPQUpEOztBQU1BLFdBQUt1RixPQUFMO0FBQ0Q7Ozt3QkFFYztBQUNiLGFBQU8sS0FBS3RCLE9BQUwsQ0FBYThFLFFBQXBCO0FBQ0QsSztzQkFFWUEsUSxFQUFVO0FBQ3JCLFdBQUs5RSxPQUFMLENBQWE4RSxRQUFiLEdBQXdCQSxRQUF4QjtBQUNEOzs7d0JBRTBCO0FBQ3pCLGFBQU8sS0FBSzlFLE9BQUwsQ0FBYUUsb0JBQXBCO0FBQ0QsSztzQkFFd0JBLG9CLEVBQXNCO0FBQzdDLFdBQUtGLE9BQUwsQ0FBYUUsb0JBQWIsR0FBb0NBLG9CQUFwQztBQUNBLGFBQU8sSUFBUDtBQUNEOzs7d0JBRW9CO0FBQ25CLGFBQU8sS0FBS0YsT0FBTCxDQUFhK0UsV0FBYixFQUFQO0FBQ0QsSztzQkFFa0JDLEcsRUFBSztBQUN0QixXQUFLaEYsT0FBTCxDQUFhSyxXQUFiLENBQXlCMkUsR0FBekI7QUFDQSxhQUFPLElBQVA7QUFDRDs7Ozs7O2tCQXpTa0J4RyxVOzs7QUFpYnJCQSxXQUFXaEYsY0FBWCxHQUE0QkEsY0FBNUIiLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBDYW52YXNVdGlscyBmcm9tIFwiLi4vdXRpbC9jYW52YXMtdXRpbHNcIlxuaW1wb3J0ICogYXMgUG9pbnQyZCBmcm9tIFwiLi4vY29yZS9wb2ludDJkXCJcbmltcG9ydCBCYXNlU2hhcGUgZnJvbSBcIi4uL3NoYXBlcy9iYXNlLXNoYXBlXCJcbmltcG9ydCBCYXNpY1N0eWxlIGZyb20gXCIuLi9zdHlsZS9iYXNpYy1zdHlsZVwiXG5pbXBvcnQge1xuICBiaW5kQWxsXG59IGZyb20gXCIuLi91dGlsL3V0aWxzXCJcbmltcG9ydCBDYW1lcmEyZCBmcm9tIFwiLi4vdmlldy9jYW1lcmEyZFwiXG5pbXBvcnQgRXZlbnRIYW5kZXIgZnJvbSBcIi4uL3V0aWwvZXZlbnQtaGFuZGxlclwiXG5pbXBvcnQgUmVzaXplU2Vuc29yIGZyb20gXCJjc3MtZWxlbWVudC1xdWVyaWVzL3NyYy9SZXNpemVTZW5zb3JcIlxuXG5jb25zdCBtb3VzZWV2ZW50cyA9IFtcIm1vdXNlZG93blwiLCBcIm1vdXNldXBcIiwgXCJtb3VzZW1vdmVcIiwgXCJjbGlja1wiLCBcImRibGNsaWNrXCIsIFwibW91c2VvdmVyXCIsIFwibW91c2VvdXRcIl1cbmNvbnN0IG1hcmdpblByb3BzID0gW1widG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdXG5cbmV4cG9ydCBjb25zdCBFdmVudENvbnN0YW50cyA9IHtcbiAgTU9VU0VET1dOOiBcIm1vdXNlZG93blwiLFxuICBNT1VTRVVQOiBcIm1vdXNldXBcIixcbiAgTU9VU0VNT1ZFOiBcIm1vdXNlbW92ZVwiLFxuICBDTElDSzogXCJjbGlja1wiLFxuICBEQkxDTElDSzogXCJkYmxjbGlja1wiLFxuICBNT1VTRU9WRVI6IFwibW91c2VvdmVyXCIsXG4gIE1PVVNFT1VUOiBcIm1vdXNlb3V0XCIsXG4gIFNIQVBFX0FERDogXCJzaGFwZTphZGRcIixcbiAgU0hBUEVfREVMRVRFOiBcInNoYXBlOmRlbGV0ZVwiXG59XG5cbmNsYXNzIERyYXdTdHlsZVN0YXRlIGV4dGVuZHMgQmFzaWNTdHlsZSB7XG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICBzdXBlciguLi5hcmdzKVxuICAgIHRoaXMuX2RlZmF1bHRzID0ge1xuICAgICAgcGFja2VkRmlsbENvbG9yOiB0aGlzLnBhY2tlZEZpbGxDb2xvcixcbiAgICAgIHBhY2tlZFN0cm9rZUNvbG9yOiB0aGlzLnBhY2tlZFN0cm9rZUNvbG9yLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3Ryb2tlV2lkdGgsXG4gICAgICBsaW5lSm9pbjogdGhpcy5saW5lSm9pbixcbiAgICAgIGxpbmVDYXA6IHRoaXMubGluZUNhcCxcbiAgICAgIGRhc2hQYXR0ZXJuOiB0aGlzLmRhc2hQYXR0ZXJuLFxuICAgICAgZGFzaE9mZnNldDogdGhpcy5kYXNoT2Zmc2V0XG4gICAgfVxuICB9XG5cbiAgc2V0RmlsbFN0eWxlKGN0eCwgZmlsbFN0eWxlKSB7XG4gICAgaWYgKGZpbGxTdHlsZS5wYWNrZWRGaWxsQ29sb3IgIT09IHRoaXMucGFja2VkRmlsbENvbG9yKSB7XG4gICAgICB0aGlzLnBhY2tlZEZpbGxDb2xvciA9IGZpbGxTdHlsZS5wYWNrZWRGaWxsQ29sb3JcbiAgICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLmZpbGxDb2xvclxuICAgIH1cbiAgfVxuXG4gIHNldFN0cm9rZVN0eWxlKGN0eCwgc3Ryb2tlU3R5bGUpIHtcbiAgICBpZiAoc3Ryb2tlU3R5bGUucGFja2VkU3Ryb2tlQ29sb3IgIT09IHRoaXMucGFja2VkU3Ryb2tlQ29sb3IpIHtcbiAgICAgIHRoaXMucGFja2VkU3Ryb2tlQ29sb3IgPSBzdHJva2VTdHlsZS5wYWNrZWRTdHJva2VDb2xvclxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2VDb2xvclxuICAgIH1cbiAgICBpZiAoc3Ryb2tlU3R5bGUuc3Ryb2tlV2lkdGggIT09IHRoaXMuX3N0cm9rZVdpZHRoKSB7XG4gICAgICB0aGlzLnN0cm9rZVdpZHRoID0gc3Ryb2tlU3R5bGUuc3Ryb2tlV2lkdGhcbiAgICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLl9zdHJva2VXaWR0aFxuICAgIH1cbiAgICBpZiAoc3Ryb2tlU3R5bGUubGluZUpvaW4gIT09IHRoaXMuX2xpbmVKb2luKSB7XG4gICAgICB0aGlzLmxpbmVKb2luID0gc3Ryb2tlU3R5bGUubGluZUpvaW5cbiAgICAgIGN0eC5saW5lSm9pbiA9IHRoaXMuX2xpbmVKb2luXG4gICAgfVxuICAgIGlmIChzdHJva2VTdHlsZS5saW5lQ2FwICE9PSB0aGlzLl9saW5lQ2FwKSB7XG4gICAgICB0aGlzLmxpbmVDYXAgPSBzdHJva2VTdHlsZS5saW5lQ2FwXG4gICAgICBjdHgubGluZUNhcCA9IHRoaXMuX2xpbmVDYXBcbiAgICB9XG5cbiAgICBjb25zdCBkYXNoUGF0dGVybiA9IHN0cm9rZVN0eWxlLl9kYXNoUGF0dGVyblxuICAgIGxldCBkaWZmID0gZmFsc2VcbiAgICBpZiAoZGFzaFBhdHRlcm4ubGVuZ3RoID09PSB0aGlzLl9kYXNoUGF0dGVybi5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGFzaFBhdHRlcm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGRhc2hQYXR0ZXJuW2ldICE9PSB0aGlzLl9kYXNoUGF0dGVybltpXSkge1xuICAgICAgICAgIGRpZmYgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChkaWZmKSB7XG4gICAgICB0aGlzLmRhc2hQYXR0ZXJuID0gZGFzaFBhdHRlcm5cbiAgICAgIGN0eC5zZXRMaW5lRGFzaCh0aGlzLl9kYXNoUGF0dGVybilcbiAgICB9XG5cbiAgICBpZiAoc3Ryb2tlU3R5bGUuZGFzaE9mZnNldCAhPT0gdGhpcy5fZGFzaE9mZnNldCkge1xuICAgICAgdGhpcy5kYXNoT2Zmc2V0ID0gc3Ryb2tlU3R5bGUuZGFzaE9mZnNldFxuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gdGhpcy5fZGFzaE9mZnNldFxuICAgIH1cbiAgfVxuXG4gIGFwcGx5RGVmYXVsdHMoY3R4KSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGVmYXVsdHMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICB0aGlzW3Byb3BdID0gdGhpcy5fZGVmYXVsdHNbcHJvcF1cbiAgICB9KVxuICAgIHRoaXMuc2V0RmlsbEN0eChjdHgpXG4gICAgdGhpcy5zZXRTdHJva2VDdHgoY3R4KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudCAmJiAoYCAke2VsZW1lbnQuY2xhc3NOYW1lfSBgKS5pbmRleE9mKGAgJHtjbGFzc05hbWV9IGApIDwgMCkge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZSA/IFwiIFwiIDogXCJcIikgKyBjbGFzc05hbWVcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYW52YXMocGFyZW50KSB7XG4gIGNvbnN0IGNhbnZhc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgYWRkQ2xhc3MoY2FudmFzQ29udGFpbmVyLCBcIm1hcGQtZHJhdy1jYW52YXMtY29udGFpbmVyXCIpXG5cbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKVxuICBjb25zdCBjYW52YXNDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKVxuICBjb25zdCByYXRpbyA9IENhbnZhc1V0aWxzLm1ha2VDYW52YXNBdXRvSGlnaERQSShjYW52YXNDb250ZXh0KVxuICAgIC8vIGNvbnN0IHJhdGlvID0gMVxuXG4gIC8vIGFkZCBjbGFzcz9cbiAgYWRkQ2xhc3MoY2FudmFzLCBcIm1hcGQtZHJhdy1jYW52YXNcIilcbiAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiXG4gIGNhbnZhcy5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCJcblxuICBjYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzKVxuXG4gIC8vIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCByYXRpbyAqIHBhcmVudC5vZmZzZXRYKVxuICAvLyBjYW52YXMuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIHJhdGlvICogcGFyZW50Lm9mZnNldFkpXG4gIC8vIHBhcmVudC5pbnNlcnRCZWZvcmUoY2FudmFzLCBwYXJlbnQuZmlyc3RDaGlsZClcbiAgcGFyZW50LmFwcGVuZENoaWxkKGNhbnZhc0NvbnRhaW5lcilcblxuICByZXR1cm4ge1xuICAgIGNhbnZhc0NvbnRhaW5lcixcbiAgICBjYW52YXMsXG4gICAgY2FudmFzQ29udGV4dCxcbiAgICByYXRpb1xuICB9XG59XG5cblxuZnVuY3Rpb24gYWRkU2hhcGVzVG9NYXAobmV3U2hhcGVzLCBleGlzdGluZ09iamVjdHNNYXAsIGN1cnJJZHMsIHJlb3JkZXJDYiwgcmVkcmF3Q2IpIHtcbiAgbmV3U2hhcGVzLmZvckVhY2goc2hhcGUgPT4ge1xuICAgIGV4aXN0aW5nT2JqZWN0c01hcC5zZXQoc2hhcGUsIHtcbiAgICAgIHNoYXBlT2JqOiBzaGFwZSxcbiAgICAgIHNoYXBlSWQ6IGN1cnJJZHMuc2hhcGVJZCxcbiAgICAgIHNoYXBlSWR4OiAtMVxuICAgIH0pXG4gICAgc2hhcGUub24oW1wiY2hhbmdlZDpvcmRlclwiLCBcImNoYW5nZWQ6dmlzaWJpbGl0eVwiLCBcImNoYW5nZWQ6c3R5bGVcIl0sIHJlb3JkZXJDYilcbiAgICBzaGFwZS5vbihbXCJjaGFuZ2VkOmdlb21cIiwgXCJjaGFuZ2VkOnZpc2liaWxpdHlcIiwgXCJjaGFuZ2VkOnhmb3JtXCJdLCByZWRyYXdDYilcbiAgICBjdXJySWRzLnNoYXBlSWQgKz0gMVxuICB9KVxufVxuXG5mdW5jdGlvbiBkZWxldGVTaGFwZXNGcm9tTWFwKHNoYXBlcywgZXhpc3RpbmdPYmplY3RzTWFwLCByZW9yZGVyQ2IsIHJlZHJhd0NiKSB7XG4gIGNvbnN0IGlkeHMgPSBbXVxuICBzaGFwZXMuZm9yRWFjaChzaGFwZSA9PiB7XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gZXhpc3RpbmdPYmplY3RzTWFwLmdldChzaGFwZSlcbiAgICBpZiAoc2hhcGVJbmZvKSB7XG4gICAgICBpZHhzLnB1c2goc2hhcGVJbmZvLnNoYXBlSWR4KVxuICAgIH1cbiAgICBleGlzdGluZ09iamVjdHNNYXAuZGVsZXRlKHNoYXBlKVxuICAgIHNoYXBlLm9mZihbXCJjaGFuZ2VkXCJdLCBbcmVvcmRlckNiLCByZWRyYXdDYl0pXG4gIH0pXG4gIHJldHVybiBpZHhzXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdFbmdpbmUgZXh0ZW5kcyBFdmVudEhhbmRlciB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudCwgb3B0cykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9pbml0KHBhcmVudCwgb3B0cylcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveUNhbnZhcygpXG5cbiAgICBpZiAodGhpcy5fb2JqZWN0cykge1xuICAgICAgdGhpcy5fb2JqZWN0cy5mb3JFYWNoKChzaGFwZUluZm8sIHNoYXBlKSA9PiB7XG4gICAgICAgIHNoYXBlLm9mZihcImNoYW5nZWRcIiwgW3RoaXMuX3Jlb3JkZXJDYiwgdGhpcy5fcmVkcmF3Q2JdKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX29iamVjdHMuY2xlYXIoKVxuICAgICAgdGhpcy5fc29ydGVkT2JqcyA9IFtdXG4gICAgICB0aGlzLl9yZW9yZGVyZWRPYmpJZHhzLmNsZWFyKClcbiAgICB9XG4gIH1cblxuICBfcmVzaXplKG9wdHMpIHtcbiAgICBsZXQgd2lkdGggPSAwXG4gICAgaWYgKHRoaXMuX3BhcmVudC5vZmZzZXRXaWR0aCkge1xuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgdGhpcy5fcGFyZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fbWFyZ2lucy5sZWZ0IC0gdGhpcy5fbWFyZ2lucy5yaWdodClcbiAgICB9XG5cbiAgICBsZXQgaGVpZ2h0ID0gMFxuICAgIGlmICh0aGlzLl9wYXJlbnQub2Zmc2V0SGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRoaXMuX3BhcmVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl9tYXJnaW5zLnRvcCAtIHRoaXMuX21hcmdpbnMuYm90dG9tKVxuICAgIH1cblxuICAgIHRoaXMuX2RyYXdDYW52YXMud2lkdGggPSB3aWR0aCAqIHRoaXMuX3BpeGVsUmF0aW9cbiAgICB0aGlzLl9kcmF3Q2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHRoaXMuX3BpeGVsUmF0aW9cblxuICAgIHRoaXMuX2RyYXdDYW52YXMuc3R5bGUubGVmdCA9IGAke3RoaXMuX21hcmdpbnMubGVmdH1weGBcbiAgICB0aGlzLl9kcmF3Q2FudmFzLnN0eWxlLnRvcCA9IGAke3RoaXMuX21hcmdpbnMudG9wfXB4YFxuICAgIHRoaXMuX2RyYXdDYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGBcbiAgICB0aGlzLl9kcmF3Q2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGBcblxuICAgIGlmICh0aGlzLl9jYW1lcmEpIHtcbiAgICAgIC8vIGNvbnN0IGN1cnJWaWV3cG9ydCA9IHRoaXMuX2NhbWVyYS52aWV3cG9ydFxuICAgICAgLy8gY29uc3QgY3VyclNwYWNlID0gdGhpcy5fY2FtZXJhLnByb2plY3Rpb25Cb3VuZHNcbiAgICAgIC8vIGNvbnN0IHZpZXdwb3J0RXh0ZW50cyA9IFswLCAwXVxuICAgICAgLy8gQUFCb3gyZC5nZXRFeHRlbnRzKHZpZXdwb3J0RXh0ZW50cywgY3VyclZpZXdwb3J0KVxuICAgICAgLy8gY29uc3Qgc3BhY2VDZW50ZXIgPSBbMCwgMF1cbiAgICAgIC8vIGNvbnN0IHNwYWNlRXh0ZW50cyA9IFswLCAwXVxuICAgICAgLy8gQUFCb3gyZC5nZXRDZW50ZXIoc3BhY2VDZW50ZXIsIGN1cnJTcGFjZSlcbiAgICAgIC8vIEFBQm94MmQuZ2V0RXh0ZW50cyhzcGFjZUV4dGVudHMsIGN1cnJTcGFjZSlcbiAgICAgIC8vIGNvbnN0IHJhdGlvID0gc3BhY2VFeHRlbnRzXG4gICAgICAvLyBWZWMyZC5kaXYocmF0aW8sIHNwYWNlRXh0ZW50cywgdmlld3BvcnRFeHRlbnRzKVxuICAgICAgLy8gQUFCb3gyZC5zZXQoY3VyclZpZXdwb3J0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KVxuICAgICAgLy8gQUFCb3gyZC5nZXRFeHRlbnRzKHZpZXdwb3J0RXh0ZW50cywgY3VyclZpZXdwb3J0KVxuICAgICAgLy8gVmVjMmQubXVsdGlwbHkoc3BhY2VFeHRlbnRzLCByYXRpbywgdmlld3BvcnRFeHRlbnRzKVxuICAgICAgLy8gQUFCb3gyZC5pbml0Q2VudGVyRXh0ZW50cyhjdXJyU3BhY2UsIHNwYWNlQ2VudGVyLCBzcGFjZUV4dGVudHMpXG4gICAgICAvLyB0aGlzLl9jYW1lcmEudmlld3BvcnQgPSBjdXJyVmlld3BvcnRcbiAgICAgIC8vIHRoaXMuX2NhbWVyYS5wcm9qZWN0aW9uQm91bmRzID0gY3VyclNwYWNlXG4gICAgICAvLyAgIC8vIHRoaXMuX2NhbWVyYS52aWV3cG9ydCA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XVxuICAgICAgLy8gICAvLyB0aGlzLl9jYW1lcmEucHJvamVjdGlvbkJvdW5kcyA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcm9qRGltcyA9IChvcHRzICYmIG9wdHMucHJvamVjdGlvbkRpbWVuc2lvbnMgPyBvcHRzLnByb2plY3Rpb25EaW1lbnNpb25zIDogW3dpZHRoLCBoZWlnaHRdKVxuICAgICAgdGhpcy5fY2FtZXJhID0gbmV3IENhbWVyYTJkKFswLCAwLCB3aWR0aCwgaGVpZ2h0XSwgcHJvakRpbXMsIChvcHRzLmZsaXBZID8gQm9vbGVhbihvcHRzLmZsaXBZKSA6IGZhbHNlKSlcbiAgICAgIHRoaXMuX2NhbWVyYS5zZXRQb3NpdGlvbigob3B0cyAmJiBvcHRzLmNhbWVyYVBvc2l0aW9uID8gb3B0cy5jYW1lcmFQb3NpdGlvbiA6IFt3aWR0aCAvIDIuMCwgaGVpZ2h0IC8gMi4wXSkpXG4gICAgICB0aGlzLl9jYW1lcmEub24oXCJjaGFuZ2VkXCIsIHRoaXMuX3JlcmVuZGVyQ2IpXG4gICAgfVxuICAgIC8vIHRoaXMuX2NhbWVyYSA9IG5ldyBDYW1lcmEyZChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdLCBbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKVxuICAgIC8vIHRoaXMuX2NhbWVyYS5vbihcImNoYW5nZWRcIiwgdGhpcy5fcmVyZW5kZXJDYilcblxuICAgIHRoaXMuX3JlcmVuZGVyQ2IoKVxuICB9XG5cbiAgX21vdXNlZG93bkNCKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoXCJtb3VzZWRvd25cIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX21vdXNldXBDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5maXJlKFwibW91c2V1cFwiLCB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBfbW91c2Vtb3ZlQ0IoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmlyZShcIm1vdXNlbW92ZVwiLCB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBfY2xpY2tDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5maXJlKFwiY2xpY2tcIiwge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgX2RibGNsaWNrQ0IoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmlyZShcImRibGNsaWNrXCIsIHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIF9tb3VzZW92ZXJDQihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5maXJlKFwibW91c2VvdmVyXCIsIHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIF9tb3VzZW91dENCKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoXCJtb3VzZW91dFwiLCB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBfZW5hYmxlRXZlbnRzKCkge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudHMobW91c2VldmVudHMpXG4gICAgY29uc3QgY2FsbGJhY2tzID0gbW91c2VldmVudHMubWFwKGV2ZW50ID0+IGBfJHtldmVudH1DQmApXG4gICAgLy8gYmluZEFsbChjYWxsYmFja3MsIHRoaXMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb3VzZWV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtb3VzZWV2ZW50c1tpXSwgdGhpc1tjYWxsYmFja3NbaV1dLCB0cnVlKVxuICAgIH1cbiAgfVxuXG4gIF9kaXNhYmxlRXZlbnRzKCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IG1vdXNlZXZlbnRzLm1hcChldmVudCA9PiBgXyR7ZXZlbnR9Q0JgKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW91c2VldmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobW91c2VldmVudHNbaV0sIHRoaXNbY2FsbGJhY2tzW2ldXSwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBfaW5pdENhbnZhcyhwYXJlbnQsIG9wdHMsIGZvcmNlRXZlbnRzID0gbnVsbCkge1xuICAgIHRoaXMuX21hcmdpbnMgPSAob3B0cyAmJiBvcHRzLm1hcmdpbnMgPyBPYmplY3QuYXNzaWduKHt9LCBvcHRzLm1hcmdpbnMpIDoge30pXG4gICAgbWFyZ2luUHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2luc1twcm9wXSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICB0aGlzLl9tYXJnaW5zW3Byb3BdID0gMFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB7XG4gICAgICBjYW52YXNDb250YWluZXIsXG4gICAgICBjYW52YXMsXG4gICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgcmF0aW9cbiAgICB9ID0gY3JlYXRlQ2FudmFzKHBhcmVudClcblxuICAgIHRoaXMuX2NvbnRhaW5lciA9IGNhbnZhc0NvbnRhaW5lclxuICAgIHRoaXMuX2RyYXdDYW52YXMgPSBjYW52YXNcbiAgICB0aGlzLl9kcmF3Q3R4ID0gY2FudmFzQ29udGV4dFxuICAgIHRoaXMuX3BpeGVsUmF0aW8gPSByYXRpb1xuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudFxuXG4gICAgYmluZEFsbChbXCJfcmVzaXplXCJdLCB0aGlzKVxuICAgIHRoaXMuX3Jlc2l6ZShvcHRzKVxuICAgIHRoaXMuX3Jlc2l6ZVNlbnNvciA9IG5ldyBSZXNpemVTZW5zb3IocGFyZW50LCB0aGlzLl9yZXNpemUpXG5cbiAgICBpZiAoZm9yY2VFdmVudHMgfHwgKGZvcmNlRXZlbnRzID09PSBudWxsICYmIG9wdHMgJiYgb3B0cy5lbmFibGVFdmVudHMpKSB7XG4gICAgICB0aGlzLl9lbmFibGVFdmVudHMoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95Q2FudmFzKCkge1xuICAgIGlmICh0aGlzLl9kcmF3Q2FudmFzKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlRXZlbnRzKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fZHJhd0NhbnZhcylcblxuICAgICAgaWYgKHRoaXMuX3Jlc2l6ZVNlbnNvcikge1xuICAgICAgICB0aGlzLl9yZXNpemVTZW5zb3IuZGV0YWNoKHRoaXMuX3BhcmVudCwgdGhpcy5fcmVzaXplKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2RyYXdDYW52YXMgPSBudWxsXG4gICAgdGhpcy5fZHJhd0N0eCA9IG51bGxcbiAgICB0aGlzLl9wYXJlbnQgPSBudWxsXG4gIH1cblxuICBfaW5pdChwYXJlbnQsIG9wdHMsIGZvcmNlRXZlbnRzID0gbnVsbCkge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudHMoW0V2ZW50Q29uc3RhbnRzLlNIQVBFX0FERCwgRXZlbnRDb25zdGFudHMuU0hBUEVfREVMRVRFXSlcblxuICAgIGJpbmRBbGwoW1wiX3Jlb3JkZXJDYlwiLCBcIl9yZXJlbmRlckNiXCJdLCB0aGlzKVxuICAgIGJpbmRBbGwoW1wiX21vdXNlZG93bkNCXCIsIFwiX21vdXNldXBDQlwiLCBcIl9tb3VzZW1vdmVDQlwiLCBcIl9jbGlja0NCXCIsIFwiX2RibGNsaWNrQ0JcIiwgXCJfbW91c2VvdmVyQ0JcIiwgXCJfbW91c2VvdXRDQlwiXSwgdGhpcylcblxuICAgIHRoaXMuX3JlbmRlckZyYW1lQ2IgPSB0aGlzLnJlbmRlckFsbC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fcmVuZGVyUmVxdWVzdElkID0gMFxuICAgIHRoaXMuX2lkcyA9IHtcbiAgICAgIHNoYXBlSWQ6IDFcbiAgICB9XG5cbiAgICB0aGlzLl9vYmplY3RzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fc29ydGVkT2JqcyA9IFtdXG4gICAgdGhpcy5fcmVvcmRlcmVkT2JqSWR4cyA9IG5ldyBTZXQoKVxuXG4gICAgdGhpcy5faW5pdENhbnZhcyhwYXJlbnQsIG9wdHMsIGZvcmNlRXZlbnRzKVxuXG4gICAgdGhpcy5fc3R5bGVTdGF0ZSA9IG5ldyBEcmF3U3R5bGVTdGF0ZSh7XG4gICAgICBmaWxsQ29sb3I6IFwicmVkXCJcbiAgICB9KVxuICB9XG5cbiAgZ2V0Q29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRcbiAgfVxuXG4gIGdldENhbnZhc0NvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyXG4gIH1cblxuICBnZXRDYW52YXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RyYXdDYW52YXNcbiAgfVxuXG4gIGdldCBzb3J0ZWRTaGFwZXMoKSB7XG4gICAgaWYgKHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuc2l6ZSkge1xuICAgICAgY29uc29sZS5hc3NlcnQodGhpcy5fc29ydGVkT2Jqcy5sZW5ndGggPT09IHRoaXMuX29iamVjdHMuc2l6ZSxcbiAgICAgICAgYFNpemUgbWlzbWF0Y2ggd2hlbiByZW5kZXJpbmcgb2JqZXRzLiBTb21ldGhpbmcgZ290IG91dCBvZiBzeW5jIC0gc29ydGVkIG9ianMgbGVuZ3RoOiAke3RoaXMuX3NvcnRlZE9ianMubGVuZ3RofSwgb2JqZWN0cyBsZW5ndGg6ICR7dGhpcy5fb2JqZWN0cy5zaXplfWApXG5cbiAgICAgIC8vIGlmICh0aGlzLl9yZW9yZGVyZWRPYmpJZHhzLmxlbmd0aCAvIHRoaXMuX3NvcnRlZE9ianMubGVuZ3RoID4gMC43KSB7XG4gICAgICAvLyAgIC8vIG1pZ2h0IGFzIHdlbGwganVzdCByZXNvcnQgdGhlIHdob2xlIHRoaW5nIG92ZXJcbiAgICAgIC8vICAgdGhpcy5fc29ydGVkT2Jqcy5zb3J0KHNoYXBlSW5mb0NvbXBhcmUpXG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gfVxuXG4gICAgICB0aGlzLl9zb3J0ZWRPYmpzLnNvcnQoQmFzZVNoYXBlLnNoYXBlQ29tcGFyZSlcbiAgICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuY2xlYXIoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc29ydGVkT2Jqc1xuICB9XG5cbiAgZ2V0IG1hcmdpbnMoKSB7XG4gICAgY29uc3QgcnRuID0ge31cbiAgICBtYXJnaW5Qcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgcnRuW3Byb3BdID0gdGhpcy5fbWFyZ2luc1twcm9wXVxuICAgIH0pXG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgc2V0IG1hcmdpbnMobWFyZ2lucykge1xuICAgIG1hcmdpblByb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICBpZiAodHlwZW9mIG1hcmdpbnNbcHJvcF0gPT09IFwibnVtYmVyXCIgJiYgbWFyZ2luc1twcm9wXSAhPT0gdGhpcy5fbWFyZ2luc1twcm9wXSkge1xuICAgICAgICB0aGlzLl9tYXJnaW5zW3Byb3BdID0gbWFyZ2lucy5wcm9wXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuX3Jlc2l6ZSgpXG4gIH1cblxuICBnZXQgdmlld3BvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbWVyYS52aWV3cG9ydFxuICB9XG5cbiAgc2V0IHZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgdGhpcy5fY2FtZXJhLnZpZXdwb3J0ID0gdmlld3BvcnRcbiAgfVxuXG4gIGdldCBwcm9qZWN0aW9uRGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FtZXJhLnByb2plY3Rpb25EaW1lbnNpb25zXG4gIH1cblxuICBzZXQgcHJvamVjdGlvbkRpbWVuc2lvbnMocHJvamVjdGlvbkRpbWVuc2lvbnMpIHtcbiAgICB0aGlzLl9jYW1lcmEucHJvamVjdGlvbkRpbWVuc2lvbnMgPSBwcm9qZWN0aW9uRGltZW5zaW9uc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgY2FtZXJhUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbWVyYS5nZXRQb3NpdGlvbigpXG4gIH1cblxuICBzZXQgY2FtZXJhUG9zaXRpb24ocG9zKSB7XG4gICAgdGhpcy5fY2FtZXJhLnNldFBvc2l0aW9uKHBvcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJvamVjdChvdXQsIHNjcmVlblB0KSB7XG4gICAgY29uc3Qgc2NyZWVuVG9Xb3JsZE1hdHJpeCA9IHRoaXMuX2NhbWVyYS5zY3JlZW5Ub1dvcmxkTWF0cml4XG4gICAgcmV0dXJuIFBvaW50MmQudHJhbnNmb3JtTWF0MmQob3V0LCBzY3JlZW5QdCwgc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgfVxuXG4gIHVucHJvamVjdChvdXQsIHdvcmxkUHQpIHtcbiAgICBjb25zdCB3b3JsZFRvU2NyZWVuTWF0cml4ID0gdGhpcy5fY2FtZXJhLndvcmxkVG9TY3JlZW5NYXRyaXhcbiAgICByZXR1cm4gUG9pbnQyZC50cmFuc2Zvcm1NYXQyZChvdXQsIHdvcmxkUHQsIHdvcmxkVG9TY3JlZW5NYXRyaXgpXG4gIH1cblxuICBoYXNTaGFwZShzaGFwZSkge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzLmhhcyhzaGFwZSlcbiAgfVxuXG4gIGFkZFNoYXBlKHNoYXBlKSB7XG4gICAgbGV0IHNoYXBlcyA9IHNoYXBlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXBlcykpIHtcbiAgICAgIHNoYXBlcyA9IFtzaGFwZV1cbiAgICB9XG5cbiAgICBhZGRTaGFwZXNUb01hcChzaGFwZXMsIHRoaXMuX29iamVjdHMsIHRoaXMuX2lkcywgdGhpcy5fcmVvcmRlckNiLCB0aGlzLl9yZXJlbmRlckNiKVxuXG4gICAgLy8gZmlyZSBhZGQgZXZlbnRcbiAgICB0aGlzLmZpcmUoXCJzaGFwZTphZGRcIiwge1xuICAgICAgc2hhcGU6IHNoYXBlc1xuICAgIH0pXG5cbiAgICBjb25zdCBwcm94eUV2ZW50ID0ge1xuICAgICAgdGFyZ2V0OiBzaGFwZXNcbiAgICB9XG4gICAgdGhpcy5fcmVvcmRlckNiKHByb3h5RXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZGVsZXRlU2hhcGUoc2hhcGUpIHtcbiAgICBsZXQgc2hhcGVzID0gc2hhcGVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcGVzKSkge1xuICAgICAgc2hhcGVzID0gW3NoYXBlXVxuICAgIH1cblxuICAgIGNvbnN0IGlkeHMgPSBkZWxldGVTaGFwZXNGcm9tTWFwKHNoYXBlcywgdGhpcy5fb2JqZWN0cywgdGhpcy5fcmVvcmRlckNiLCB0aGlzLl9yZXJlbmRlckNiKVxuICAgIGxldCBpbmRleCA9IC0xXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICgoaW5kZXggPSB0aGlzLl9zb3J0ZWRPYmpzLmluZGV4T2Yoc2hhcGVzW2ldKSkgPj0gMCkge1xuICAgICAgICB0aGlzLl9zb3J0ZWRPYmpzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuYWRkKGlkeHNbaV0pXG4gICAgfVxuICAgIHRoaXMuX3JlcmVuZGVyQ2IoKVxuXG4gICAgdGhpcy5maXJlKFwic2hhcGU6ZGVsZXRlXCIsIHtcbiAgICAgIHNoYXBlOiBzaGFwZXNcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGRlbGV0ZUFsbFNoYXBlcygpIHtcbiAgICB0aGlzLmRlbGV0ZVNoYXBlKHRoaXMuc29ydGVkU2hhcGVzLnNsaWNlKCkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIG1vdmVTaGFwZVRvVG9wKHNoYXBlKSB7XG4gICAgaWYgKHRoaXMuX29iamVjdHMuaGFzKHNoYXBlKSkge1xuICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICAgIGNvbnN0IHppbmRleCA9IHNoYXBlc1tzaGFwZXMubGVuZ3RoIC0gMV0uekluZGV4XG4gICAgICBzaGFwZS56SW5kZXggPSB6aW5kZXggKyAxXG4gICAgfVxuICB9XG5cbiAgbW92ZVNoYXBlVG9CYWNrKHNoYXBlKSB7XG4gICAgaWYgKHRoaXMuX29iamVjdHMuaGFzKHNoYXBlKSkge1xuICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICAgIGNvbnN0IHppbmRleCA9IHNoYXBlc1swXS56SW5kZXhcbiAgICAgIHNoYXBlLnpJbmRleCA9IHppbmRleFxuICAgIH1cbiAgfVxuXG4gIGdldFNoYXBlc0FzSlNPTigpIHtcbiAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnNvcnRlZFNoYXBlc1xuICAgIHJldHVybiBzaGFwZXMubWFwKHNoYXBlID0+IHNoYXBlLnRvSlNPTigpKVxuICB9XG5cbiAgX3JlcmVuZGVyQ2IoKSB7XG4gICAgaWYgKHRoaXMuX3JlbmRlclJlcXVlc3RJZCkge1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlbmRlclJlcXVlc3RJZClcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyUmVxdWVzdElkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNiKVxuICB9XG5cbiAgX3Jlb3JkZXJDYihldmVudCkge1xuICAgIGxldCBjaGFuZ2VkU2hhcGVzID0gZXZlbnQudGFyZ2V0XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNoYW5nZWRTaGFwZXMpKSB7XG4gICAgICBjaGFuZ2VkU2hhcGVzID0gW2V2ZW50LnRhcmdldF1cbiAgICB9XG4gICAgY2hhbmdlZFNoYXBlcy5mb3JFYWNoKGNoYW5nZWRTaGFwZSA9PiB7XG4gICAgICBjb25zb2xlLmFzc2VydChjaGFuZ2VkU2hhcGUsIFwiQSBjaGFuZ2VkIGV2ZW50IGRvZXNuJ3QgaGF2ZSBhbiBvYmplY3RcIilcbiAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KGNoYW5nZWRTaGFwZSlcbiAgICAgIGNvbnNvbGUuYXNzZXJ0KHNoYXBlSW5mbywgYEEgY2hhbmdlZCBldmVudCB0YXJnZXQgaXNuJ3QgaW4gdGhlIGxpc3Qgb2Ygc2hhcGVzICR7Y2hhbmdlZFNoYXBlfWApXG4gICAgICBpZiAoc2hhcGVJbmZvLnNoYXBlSWR4IDwgMCkge1xuICAgICAgICBzaGFwZUluZm8uc2hhcGVJZHggPSB0aGlzLl9zb3J0ZWRPYmpzLnB1c2goY2hhbmdlZFNoYXBlKSAtIDFcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlb3JkZXJlZE9iaklkeHMuYWRkKHNoYXBlSW5mby5zaGFwZUlkeClcbiAgICB9KVxuICAgIHRoaXMuX3JlcmVuZGVyQ2IoKVxuICB9XG5cbiAgX3JlbmRlclNoYXBlcyhjdHgsIGRyYXdTaGFwZXMsIGNhbWVyYSkge1xuICAgIGNvbnN0IHdvcmxkVG9TY3JlZW5NYXQgPSBjYW1lcmEud29ybGRUb1NjcmVlbk1hdHJpeFxuICAgIGRyYXdTaGFwZXMuZm9yRWFjaChzaGFwZSA9PiB7XG4gICAgICBpZiAoc2hhcGUudmlzaWJsZSkge1xuICAgICAgICBzaGFwZS5yZW5kZXIoY3R4LCB3b3JsZFRvU2NyZWVuTWF0LCB0aGlzLl9zdHlsZVN0YXRlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZW5kZXJBbGwoKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5fZHJhd0N0eFxuICAgICAgLy8gY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodClcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX2RyYXdDYW52YXMub2Zmc2V0V2lkdGgsIHRoaXMuX2RyYXdDYW52YXMub2Zmc2V0SGVpZ2h0KVxuXG4gICAgaWYgKCF0aGlzLl9vYmplY3RzLnNpemUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGN0eC5zYXZlKClcbiAgICBjb25zdCBkcmF3U2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICB0aGlzLl9zdHlsZVN0YXRlLmFwcGx5RGVmYXVsdHMoY3R4KVxuICAgIHRoaXMuX3JlbmRlclNoYXBlcyhjdHgsIGRyYXdTaGFwZXMsIHRoaXMuX2NhbWVyYSlcbiAgICBjdHgucmVzdG9yZSgpXG4gIH1cbn1cblxuRHJhd0VuZ2luZS5FdmVudENvbnN0YW50cyA9IEV2ZW50Q29uc3RhbnRzXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9lbmdpbmUvZHJhdy1lbmdpbmUuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("/* eslint-disable */\n// Copyright 2001 softSurfer, 2012 Dan Sunday\n// This code may be freely used and modified for any purpose\n// providing that this copyright notice is included with it.\n// SoftSurfer makes no warranty for this code, and cannot be held\n// liable for any real or imagined damage resulting from its use.\n// Users of this code must verify correctness for their application.\n\n// from http://geomalgorithms.com/a12-_hull-3.html\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleHull_2D = simpleHull_2D;\nvar X = 0;\nvar Y = 1;\n\n/**\n * Test if a point is Left|On|Right of an infinite line.\n * @param {Point2d} P0 [description]\n * @param {Point2d} P1 [description]\n * @param {Point2d} P2 [description]\n * @return {Boolean} Returns > 0 if P2 is left of the line thru P0 & P1,\n * Returns < 0 if P2 is to the right\n * Returns 0 if P2 is on the line\n */\nfunction isLeft(P0, P1, P2) {\n return (P1[X] - P0[X]) * (P2[Y] - P0[Y]) - (P2[X] - P0[X]) * (P1[Y] - P0[Y]);\n}\n\n/**\n * Melkman's 2D simple polyline O(n) convex hull algorithm\n * @param {Point2d[]} verts [description]\n * @return {number[]} [description]\n */\nfunction simpleHull_2D(verts) {\n // initialize a deque D[] from bottom to top so that the\n // 1st three vertices of P[] are a ccw triangle\n var H = [];\n var n = verts.length;\n\n if (n < 3) {\n for (var i = 0; i < n; i += 1) {\n H[i] = i;\n }\n return H;\n }\n\n var D = new Array(2 * n + 1);\n D.fill(-1);\n var bot = n - 2;\n var top = bot + 3; // initial bottom and top deque indices\n\n D[bot] = D[top] = 2; // 3rd vertex is at both bot and top\n if (isLeft(verts[0], verts[1], verts[2]) > 0) {\n D[bot + 1] = 0;\n D[bot + 2] = 1; // ccw vertices are: 2,0,1,2\n } else {\n D[bot + 1] = 1;\n D[bot + 2] = 0; // ccw vertices are: 2,1,0,2\n }\n\n // compute the hull on the deque D[]\n for (var _i = 3; _i < n; _i += 1) {\n // process the rest of vertices\n // test if next vertex is outside the deque hull\n if (isLeft(verts[D[bot]], verts[D[bot + 1]], verts[_i]) <= 0 || isLeft(verts[D[top - 1]], verts[D[top]], verts[_i]) <= 0) {\n\n // incrementally add an exterior vertex to the deque hull\n // get the rightmost tangent at the deque bot\n while (D[bot] >= 0 && D[bot + 1] >= 0 && isLeft(verts[D[bot]], verts[D[bot + 1]], verts[_i]) <= 0) {\n bot += 1; // remove bot of deque\n }\n bot -= 1;\n D[bot] = _i; // insert verts[i] at bot of deque\n\n // get the leftmost tangent at the deque top\n while (D[top] >= 0 && D[top + 1] >= 0 && isLeft(verts[D[top - 1]], verts[D[top]], verts[_i]) <= 0) {\n top -= 1; // pop top of deque\n }\n top += 1;\n D[top] = _i; // push verts[i] onto top of deque\n }\n }\n\n // transcribe deque D[] to the output hull array H[]\n var h = 0;\n for (h = 0; h <= top - bot - 1; h += 1) {\n H[h] = D[bot + h];\n }\n\n if (D[bot + h] !== H[0]) {\n H[h] = D[bot + h];\n }\n\n return H;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9tYXRoL2NvbnZleC1odWxsLmpzPzBkYTkiXSwibmFtZXMiOlsic2ltcGxlSHVsbF8yRCIsIlgiLCJZIiwiaXNMZWZ0IiwiUDAiLCJQMSIsIlAyIiwidmVydHMiLCJIIiwibiIsImxlbmd0aCIsImkiLCJEIiwiQXJyYXkiLCJmaWxsIiwiYm90IiwidG9wIiwiaCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7Ozs7O1FBd0JnQkEsYSxHQUFBQSxhO0FBdEJoQixJQUFNQyxJQUFJLENBQVY7QUFDQSxJQUFNQyxJQUFJLENBQVY7O0FBR0E7Ozs7Ozs7OztBQVNBLFNBQVNDLE1BQVQsQ0FBZ0JDLEVBQWhCLEVBQW9CQyxFQUFwQixFQUF3QkMsRUFBeEIsRUFBNEI7QUFDMUIsU0FBTyxDQUFDRCxHQUFHSixDQUFILElBQVFHLEdBQUdILENBQUgsQ0FBVCxLQUFtQkssR0FBR0osQ0FBSCxJQUFRRSxHQUFHRixDQUFILENBQTNCLElBQW9DLENBQUNJLEdBQUdMLENBQUgsSUFBUUcsR0FBR0gsQ0FBSCxDQUFULEtBQW1CSSxHQUFHSCxDQUFILElBQVFFLEdBQUdGLENBQUgsQ0FBM0IsQ0FBM0M7QUFDRDs7QUFFRDs7Ozs7QUFLTyxTQUFTRixhQUFULENBQXVCTyxLQUF2QixFQUE4QjtBQUNuQztBQUNBO0FBQ0EsTUFBTUMsSUFBSSxFQUFWO0FBQ0EsTUFBTUMsSUFBSUYsTUFBTUcsTUFBaEI7O0FBRUEsTUFBSUQsSUFBSSxDQUFSLEVBQVc7QUFDVCxTQUFLLElBQUlFLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsQ0FBcEIsRUFBdUJFLEtBQUssQ0FBNUIsRUFBK0I7QUFDN0JILFFBQUVHLENBQUYsSUFBT0EsQ0FBUDtBQUNEO0FBQ0QsV0FBT0gsQ0FBUDtBQUNEOztBQUVELE1BQU1JLElBQUksSUFBSUMsS0FBSixDQUFVLElBQUlKLENBQUosR0FBUSxDQUFsQixDQUFWO0FBQ0FHLElBQUVFLElBQUYsQ0FBTyxDQUFDLENBQVI7QUFDQSxNQUFJQyxNQUFNTixJQUFJLENBQWQ7QUFDQSxNQUFJTyxNQUFNRCxNQUFNLENBQWhCLENBaEJtQyxDQWdCakI7O0FBRWxCSCxJQUFFRyxHQUFGLElBQVNILEVBQUVJLEdBQUYsSUFBUyxDQUFsQixDQWxCbUMsQ0FrQmY7QUFDcEIsTUFBSWIsT0FBT0ksTUFBTSxDQUFOLENBQVAsRUFBaUJBLE1BQU0sQ0FBTixDQUFqQixFQUEyQkEsTUFBTSxDQUFOLENBQTNCLElBQXVDLENBQTNDLEVBQThDO0FBQzVDSyxNQUFFRyxNQUFNLENBQVIsSUFBYSxDQUFiO0FBQ0FILE1BQUVHLE1BQU0sQ0FBUixJQUFhLENBQWIsQ0FGNEMsQ0FFN0I7QUFDaEIsR0FIRCxNQUdPO0FBQ0xILE1BQUVHLE1BQU0sQ0FBUixJQUFhLENBQWI7QUFDQUgsTUFBRUcsTUFBTSxDQUFSLElBQWEsQ0FBYixDQUZLLENBRVU7QUFDaEI7O0FBRUQ7QUFDQSxPQUFLLElBQUlKLEtBQUksQ0FBYixFQUFnQkEsS0FBSUYsQ0FBcEIsRUFBdUJFLE1BQUssQ0FBNUIsRUFBK0I7QUFBRTtBQUMvQjtBQUNBLFFBQUtSLE9BQU9JLE1BQU1LLEVBQUVHLEdBQUYsQ0FBTixDQUFQLEVBQXNCUixNQUFNSyxFQUFFRyxNQUFNLENBQVIsQ0FBTixDQUF0QixFQUF5Q1IsTUFBTUksRUFBTixDQUF6QyxLQUFzRCxDQUF2RCxJQUNEUixPQUFPSSxNQUFNSyxFQUFFSSxNQUFNLENBQVIsQ0FBTixDQUFQLEVBQTBCVCxNQUFNSyxFQUFFSSxHQUFGLENBQU4sQ0FBMUIsRUFBeUNULE1BQU1JLEVBQU4sQ0FBekMsS0FBc0QsQ0FEekQsRUFDNkQ7O0FBRTNEO0FBQ0E7QUFDQSxhQUFPQyxFQUFFRyxHQUFGLEtBQVUsQ0FBVixJQUFlSCxFQUFFRyxNQUFNLENBQVIsS0FBYyxDQUE3QixJQUFrQ1osT0FBT0ksTUFBTUssRUFBRUcsR0FBRixDQUFOLENBQVAsRUFBc0JSLE1BQU1LLEVBQUVHLE1BQU0sQ0FBUixDQUFOLENBQXRCLEVBQXlDUixNQUFNSSxFQUFOLENBQXpDLEtBQXNELENBQS9GLEVBQWtHO0FBQ2hHSSxlQUFPLENBQVAsQ0FEZ0csQ0FDdkY7QUFDVjtBQUNEQSxhQUFPLENBQVA7QUFDQUgsUUFBRUcsR0FBRixJQUFTSixFQUFULENBUjJELENBUWhEOztBQUVYO0FBQ0EsYUFBT0MsRUFBRUksR0FBRixLQUFVLENBQVYsSUFBZUosRUFBRUksTUFBTSxDQUFSLEtBQWMsQ0FBN0IsSUFBa0NiLE9BQU9JLE1BQU1LLEVBQUVJLE1BQU0sQ0FBUixDQUFOLENBQVAsRUFBMEJULE1BQU1LLEVBQUVJLEdBQUYsQ0FBTixDQUExQixFQUF5Q1QsTUFBTUksRUFBTixDQUF6QyxLQUFzRCxDQUEvRixFQUFrRztBQUNoR0ssZUFBTyxDQUFQLENBRGdHLENBQ3ZGO0FBQ1Y7QUFDREEsYUFBTyxDQUFQO0FBQ0FKLFFBQUVJLEdBQUYsSUFBU0wsRUFBVCxDQWYyRCxDQWVoRDtBQUNaO0FBQ0Y7O0FBRUQ7QUFDQSxNQUFJTSxJQUFJLENBQVI7QUFDQSxPQUFLQSxJQUFJLENBQVQsRUFBWUEsS0FBTUQsTUFBTUQsR0FBTixHQUFZLENBQTlCLEVBQWtDRSxLQUFLLENBQXZDLEVBQTBDO0FBQ3hDVCxNQUFFUyxDQUFGLElBQU9MLEVBQUVHLE1BQU1FLENBQVIsQ0FBUDtBQUNEOztBQUVELE1BQUlMLEVBQUVHLE1BQU1FLENBQVIsTUFBZVQsRUFBRSxDQUFGLENBQW5CLEVBQXlCO0FBQ3ZCQSxNQUFFUyxDQUFGLElBQU9MLEVBQUVHLE1BQU1FLENBQVIsQ0FBUDtBQUNEOztBQUVELFNBQU9ULENBQVA7QUFDRCIsImZpbGUiOiIxNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBDb3B5cmlnaHQgMjAwMSBzb2Z0U3VyZmVyLCAyMDEyIERhbiBTdW5kYXlcbi8vIFRoaXMgY29kZSBtYXkgYmUgZnJlZWx5IHVzZWQgYW5kIG1vZGlmaWVkIGZvciBhbnkgcHVycG9zZVxuLy8gcHJvdmlkaW5nIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGlzIGluY2x1ZGVkIHdpdGggaXQuXG4vLyBTb2Z0U3VyZmVyIG1ha2VzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGNvZGUsIGFuZCBjYW5ub3QgYmUgaGVsZFxuLy8gbGlhYmxlIGZvciBhbnkgcmVhbCBvciBpbWFnaW5lZCBkYW1hZ2UgcmVzdWx0aW5nIGZyb20gaXRzIHVzZS5cbi8vIFVzZXJzIG9mIHRoaXMgY29kZSBtdXN0IHZlcmlmeSBjb3JyZWN0bmVzcyBmb3IgdGhlaXIgYXBwbGljYXRpb24uXG5cbi8vIGZyb20gaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMTItX2h1bGwtMy5odG1sXG5cblwidXNlIHN0cmljdFwiXG5cbmNvbnN0IFggPSAwXG5jb25zdCBZID0gMVxuXG5cbi8qKlxuICogVGVzdCBpZiBhIHBvaW50IGlzIExlZnR8T258UmlnaHQgb2YgYW4gaW5maW5pdGUgbGluZS5cbiAqIEBwYXJhbSAge1BvaW50MmR9ICBQMCBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtQb2ludDJkfSAgUDEgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7UG9pbnQyZH0gIFAyIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICBSZXR1cm5zID4gMCBpZiBQMiBpcyBsZWZ0IG9mIHRoZSBsaW5lIHRocnUgUDAgJiBQMSxcbiAqICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIDwgMCBpZiBQMiBpcyB0byB0aGUgcmlnaHRcbiAqICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIDAgaWYgUDIgaXMgb24gdGhlIGxpbmVcbiAqL1xuZnVuY3Rpb24gaXNMZWZ0KFAwLCBQMSwgUDIpIHtcbiAgcmV0dXJuIChQMVtYXSAtIFAwW1hdKSAqIChQMltZXSAtIFAwW1ldKSAtIChQMltYXSAtIFAwW1hdKSAqIChQMVtZXSAtIFAwW1ldKVxufVxuXG4vKipcbiAqIE1lbGttYW4ncyAyRCBzaW1wbGUgcG9seWxpbmUgTyhuKSBjb252ZXggaHVsbCBhbGdvcml0aG1cbiAqIEBwYXJhbSAge1BvaW50MmRbXX0gdmVydHMgW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7bnVtYmVyW119ICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbXBsZUh1bGxfMkQodmVydHMpIHtcbiAgLy8gaW5pdGlhbGl6ZSBhIGRlcXVlIERbXSBmcm9tIGJvdHRvbSB0byB0b3Agc28gdGhhdCB0aGVcbiAgLy8gMXN0IHRocmVlIHZlcnRpY2VzIG9mIFBbXSBhcmUgYSBjY3cgdHJpYW5nbGVcbiAgY29uc3QgSCA9IFtdXG4gIGNvbnN0IG4gPSB2ZXJ0cy5sZW5ndGhcblxuICBpZiAobiA8IDMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkgKz0gMSkge1xuICAgICAgSFtpXSA9IGlcbiAgICB9XG4gICAgcmV0dXJuIEhcbiAgfVxuXG4gIGNvbnN0IEQgPSBuZXcgQXJyYXkoMiAqIG4gKyAxKVxuICBELmZpbGwoLTEpXG4gIGxldCBib3QgPSBuIC0gMlxuICBsZXQgdG9wID0gYm90ICsgMyAvLyBpbml0aWFsIGJvdHRvbSBhbmQgdG9wIGRlcXVlIGluZGljZXNcblxuICBEW2JvdF0gPSBEW3RvcF0gPSAyIC8vIDNyZCB2ZXJ0ZXggaXMgYXQgYm90aCBib3QgYW5kIHRvcFxuICBpZiAoaXNMZWZ0KHZlcnRzWzBdLCB2ZXJ0c1sxXSwgdmVydHNbMl0pID4gMCkge1xuICAgIERbYm90ICsgMV0gPSAwXG4gICAgRFtib3QgKyAyXSA9IDEgLy8gY2N3IHZlcnRpY2VzIGFyZTogMiwwLDEsMlxuICB9IGVsc2Uge1xuICAgIERbYm90ICsgMV0gPSAxXG4gICAgRFtib3QgKyAyXSA9IDAgLy8gY2N3IHZlcnRpY2VzIGFyZTogMiwxLDAsMlxuICB9XG5cbiAgLy8gY29tcHV0ZSB0aGUgaHVsbCBvbiB0aGUgZGVxdWUgRFtdXG4gIGZvciAobGV0IGkgPSAzOyBpIDwgbjsgaSArPSAxKSB7IC8vIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdmVydGljZXNcbiAgICAvLyB0ZXN0IGlmIG5leHQgdmVydGV4IGlzIG91dHNpZGUgdGhlIGRlcXVlIGh1bGxcbiAgICBpZiAoKGlzTGVmdCh2ZXJ0c1tEW2JvdF1dLCB2ZXJ0c1tEW2JvdCArIDFdXSwgdmVydHNbaV0pIDw9IDApIHx8XG4gICAgICAoaXNMZWZ0KHZlcnRzW0RbdG9wIC0gMV1dLCB2ZXJ0c1tEW3RvcF1dLCB2ZXJ0c1tpXSkgPD0gMCkpIHtcblxuICAgICAgLy8gaW5jcmVtZW50YWxseSBhZGQgYW4gZXh0ZXJpb3IgdmVydGV4IHRvIHRoZSBkZXF1ZSBodWxsXG4gICAgICAvLyBnZXQgdGhlIHJpZ2h0bW9zdCB0YW5nZW50IGF0IHRoZSBkZXF1ZSBib3RcbiAgICAgIHdoaWxlIChEW2JvdF0gPj0gMCAmJiBEW2JvdCArIDFdID49IDAgJiYgaXNMZWZ0KHZlcnRzW0RbYm90XV0sIHZlcnRzW0RbYm90ICsgMV1dLCB2ZXJ0c1tpXSkgPD0gMCkge1xuICAgICAgICBib3QgKz0gMSAvLyByZW1vdmUgYm90IG9mIGRlcXVlXG4gICAgICB9XG4gICAgICBib3QgLT0gMVxuICAgICAgRFtib3RdID0gaSAvLyBpbnNlcnQgdmVydHNbaV0gYXQgYm90IG9mIGRlcXVlXG5cbiAgICAgIC8vIGdldCB0aGUgbGVmdG1vc3QgdGFuZ2VudCBhdCB0aGUgZGVxdWUgdG9wXG4gICAgICB3aGlsZSAoRFt0b3BdID49IDAgJiYgRFt0b3AgKyAxXSA+PSAwICYmIGlzTGVmdCh2ZXJ0c1tEW3RvcCAtIDFdXSwgdmVydHNbRFt0b3BdXSwgdmVydHNbaV0pIDw9IDApIHtcbiAgICAgICAgdG9wIC09IDEgLy8gcG9wIHRvcCBvZiBkZXF1ZVxuICAgICAgfVxuICAgICAgdG9wICs9IDFcbiAgICAgIERbdG9wXSA9IGkgLy8gcHVzaCB2ZXJ0c1tpXSBvbnRvIHRvcCBvZiBkZXF1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIHRyYW5zY3JpYmUgZGVxdWUgRFtdIHRvIHRoZSBvdXRwdXQgaHVsbCBhcnJheSBIW11cbiAgbGV0IGggPSAwXG4gIGZvciAoaCA9IDA7IGggPD0gKHRvcCAtIGJvdCAtIDEpOyBoICs9IDEpIHtcbiAgICBIW2hdID0gRFtib3QgKyBoXVxuICB9XG5cbiAgaWYgKERbYm90ICsgaF0gIT09IEhbMF0pIHtcbiAgICBIW2hdID0gRFtib3QgKyBoXVxuICB9XG5cbiAgcmV0dXJuIEhcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21hdGgvY29udmV4LWh1bGwuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 15 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* eslint-disable */\n// Copyright 2001 softSurfer, 2012 Dan Sunday\n// This code may be freely used and modified for any purpose\n// providing that this copyright notice is included with it.\n// SoftSurfer makes no warranty for this code, and cannot be held\n// liable for any real or imagined damage resulting from its use.\n// Users of this code must verify correctness for their application.\n\n// from http://geomalgorithms.com/a12-_hull-3.html\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleHull_2D = simpleHull_2D;\nvar X = 0;\nvar Y = 1;\n\n/**\n * Test if a point is Left|On|Right of an infinite line.\n * @param {Point2d} P0 [description]\n * @param {Point2d} P1 [description]\n * @param {Point2d} P2 [description]\n * @return {Boolean} Returns > 0 if P2 is left of the line thru P0 & P1,\n * Returns < 0 if P2 is to the right\n * Returns 0 if P2 is on the line\n */\nfunction isLeft(P0, P1, P2) {\n return (P1[X] - P0[X]) * (P2[Y] - P0[Y]) - (P2[X] - P0[X]) * (P1[Y] - P0[Y]);\n}\n\n/**\n * Melkman's 2D simple polyline O(n) convex hull algorithm\n * @param {Point2d[]} verts [description]\n * @return {number[]} [description]\n */\nfunction simpleHull_2D(verts) {\n // initialize a deque D[] from bottom to top so that the\n // 1st three vertices of P[] are a ccw triangle\n var H = [];\n var n = verts.length;\n\n if (n < 3) {\n for (var i = 0; i < n; i += 1) {\n H[i] = i;\n }\n return H;\n }\n\n var D = new Array(2 * n + 1);\n D.fill(-1);\n var bot = n - 2;\n var top = bot + 3; // initial bottom and top deque indices\n\n D[bot] = D[top] = 2; // 3rd vertex is at both bot and top\n if (isLeft(verts[0], verts[1], verts[2]) > 0) {\n D[bot + 1] = 0;\n D[bot + 2] = 1; // ccw vertices are: 2,0,1,2\n } else {\n D[bot + 1] = 1;\n D[bot + 2] = 0; // ccw vertices are: 2,1,0,2\n }\n\n // compute the hull on the deque D[]\n for (var _i = 3; _i < n; _i += 1) {\n // process the rest of vertices\n // test if next vertex is outside the deque hull\n if (isLeft(verts[D[bot]], verts[D[bot + 1]], verts[_i]) <= 0 || isLeft(verts[D[top - 1]], verts[D[top]], verts[_i]) <= 0) {\n\n // incrementally add an exterior vertex to the deque hull\n // get the rightmost tangent at the deque bot\n while (D[bot] >= 0 && D[bot + 1] >= 0 && isLeft(verts[D[bot]], verts[D[bot + 1]], verts[_i]) <= 0) {\n bot += 1; // remove bot of deque\n }\n bot -= 1;\n D[bot] = _i; // insert verts[i] at bot of deque\n\n // get the leftmost tangent at the deque top\n while (D[top] >= 0 && D[top + 1] >= 0 && isLeft(verts[D[top - 1]], verts[D[top]], verts[_i]) <= 0) {\n top -= 1; // pop top of deque\n }\n top += 1;\n D[top] = _i; // push verts[i] onto top of deque\n }\n }\n\n // transcribe deque D[] to the output hull array H[]\n var h = 0;\n for (h = 0; h <= top - bot - 1; h += 1) {\n H[h] = D[bot + h];\n }\n\n if (D[bot + h] !== H[0]) {\n H[h] = D[bot + h];\n }\n\n return H;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9tYXRoL2NvbnZleC1odWxsLmpzPzBkYTkiXSwibmFtZXMiOlsic2ltcGxlSHVsbF8yRCIsIlgiLCJZIiwiaXNMZWZ0IiwiUDAiLCJQMSIsIlAyIiwidmVydHMiLCJIIiwibiIsImxlbmd0aCIsImkiLCJEIiwiQXJyYXkiLCJmaWxsIiwiYm90IiwidG9wIiwiaCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7Ozs7O1FBd0JnQkEsYSxHQUFBQSxhO0FBdEJoQixJQUFNQyxJQUFJLENBQVY7QUFDQSxJQUFNQyxJQUFJLENBQVY7O0FBR0E7Ozs7Ozs7OztBQVNBLFNBQVNDLE1BQVQsQ0FBZ0JDLEVBQWhCLEVBQW9CQyxFQUFwQixFQUF3QkMsRUFBeEIsRUFBNEI7QUFDMUIsU0FBTyxDQUFDRCxHQUFHSixDQUFILElBQVFHLEdBQUdILENBQUgsQ0FBVCxLQUFtQkssR0FBR0osQ0FBSCxJQUFRRSxHQUFHRixDQUFILENBQTNCLElBQW9DLENBQUNJLEdBQUdMLENBQUgsSUFBUUcsR0FBR0gsQ0FBSCxDQUFULEtBQW1CSSxHQUFHSCxDQUFILElBQVFFLEdBQUdGLENBQUgsQ0FBM0IsQ0FBM0M7QUFDRDs7QUFFRDs7Ozs7QUFLTyxTQUFTRixhQUFULENBQXVCTyxLQUF2QixFQUE4QjtBQUNuQztBQUNBO0FBQ0EsTUFBTUMsSUFBSSxFQUFWO0FBQ0EsTUFBTUMsSUFBSUYsTUFBTUcsTUFBaEI7O0FBRUEsTUFBSUQsSUFBSSxDQUFSLEVBQVc7QUFDVCxTQUFLLElBQUlFLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsQ0FBcEIsRUFBdUJFLEtBQUssQ0FBNUIsRUFBK0I7QUFDN0JILFFBQUVHLENBQUYsSUFBT0EsQ0FBUDtBQUNEO0FBQ0QsV0FBT0gsQ0FBUDtBQUNEOztBQUVELE1BQU1JLElBQUksSUFBSUMsS0FBSixDQUFVLElBQUlKLENBQUosR0FBUSxDQUFsQixDQUFWO0FBQ0FHLElBQUVFLElBQUYsQ0FBTyxDQUFDLENBQVI7QUFDQSxNQUFJQyxNQUFNTixJQUFJLENBQWQ7QUFDQSxNQUFJTyxNQUFNRCxNQUFNLENBQWhCLENBaEJtQyxDQWdCakI7O0FBRWxCSCxJQUFFRyxHQUFGLElBQVNILEVBQUVJLEdBQUYsSUFBUyxDQUFsQixDQWxCbUMsQ0FrQmY7QUFDcEIsTUFBSWIsT0FBT0ksTUFBTSxDQUFOLENBQVAsRUFBaUJBLE1BQU0sQ0FBTixDQUFqQixFQUEyQkEsTUFBTSxDQUFOLENBQTNCLElBQXVDLENBQTNDLEVBQThDO0FBQzVDSyxNQUFFRyxNQUFNLENBQVIsSUFBYSxDQUFiO0FBQ0FILE1BQUVHLE1BQU0sQ0FBUixJQUFhLENBQWIsQ0FGNEMsQ0FFN0I7QUFDaEIsR0FIRCxNQUdPO0FBQ0xILE1BQUVHLE1BQU0sQ0FBUixJQUFhLENBQWI7QUFDQUgsTUFBRUcsTUFBTSxDQUFSLElBQWEsQ0FBYixDQUZLLENBRVU7QUFDaEI7O0FBRUQ7QUFDQSxPQUFLLElBQUlKLEtBQUksQ0FBYixFQUFnQkEsS0FBSUYsQ0FBcEIsRUFBdUJFLE1BQUssQ0FBNUIsRUFBK0I7QUFBRTtBQUMvQjtBQUNBLFFBQUtSLE9BQU9JLE1BQU1LLEVBQUVHLEdBQUYsQ0FBTixDQUFQLEVBQXNCUixNQUFNSyxFQUFFRyxNQUFNLENBQVIsQ0FBTixDQUF0QixFQUF5Q1IsTUFBTUksRUFBTixDQUF6QyxLQUFzRCxDQUF2RCxJQUNEUixPQUFPSSxNQUFNSyxFQUFFSSxNQUFNLENBQVIsQ0FBTixDQUFQLEVBQTBCVCxNQUFNSyxFQUFFSSxHQUFGLENBQU4sQ0FBMUIsRUFBeUNULE1BQU1JLEVBQU4sQ0FBekMsS0FBc0QsQ0FEekQsRUFDNkQ7O0FBRTNEO0FBQ0E7QUFDQSxhQUFPQyxFQUFFRyxHQUFGLEtBQVUsQ0FBVixJQUFlSCxFQUFFRyxNQUFNLENBQVIsS0FBYyxDQUE3QixJQUFrQ1osT0FBT0ksTUFBTUssRUFBRUcsR0FBRixDQUFOLENBQVAsRUFBc0JSLE1BQU1LLEVBQUVHLE1BQU0sQ0FBUixDQUFOLENBQXRCLEVBQXlDUixNQUFNSSxFQUFOLENBQXpDLEtBQXNELENBQS9GLEVBQWtHO0FBQ2hHSSxlQUFPLENBQVAsQ0FEZ0csQ0FDdkY7QUFDVjtBQUNEQSxhQUFPLENBQVA7QUFDQUgsUUFBRUcsR0FBRixJQUFTSixFQUFULENBUjJELENBUWhEOztBQUVYO0FBQ0EsYUFBT0MsRUFBRUksR0FBRixLQUFVLENBQVYsSUFBZUosRUFBRUksTUFBTSxDQUFSLEtBQWMsQ0FBN0IsSUFBa0NiLE9BQU9JLE1BQU1LLEVBQUVJLE1BQU0sQ0FBUixDQUFOLENBQVAsRUFBMEJULE1BQU1LLEVBQUVJLEdBQUYsQ0FBTixDQUExQixFQUF5Q1QsTUFBTUksRUFBTixDQUF6QyxLQUFzRCxDQUEvRixFQUFrRztBQUNoR0ssZUFBTyxDQUFQLENBRGdHLENBQ3ZGO0FBQ1Y7QUFDREEsYUFBTyxDQUFQO0FBQ0FKLFFBQUVJLEdBQUYsSUFBU0wsRUFBVCxDQWYyRCxDQWVoRDtBQUNaO0FBQ0Y7O0FBRUQ7QUFDQSxNQUFJTSxJQUFJLENBQVI7QUFDQSxPQUFLQSxJQUFJLENBQVQsRUFBWUEsS0FBTUQsTUFBTUQsR0FBTixHQUFZLENBQTlCLEVBQWtDRSxLQUFLLENBQXZDLEVBQTBDO0FBQ3hDVCxNQUFFUyxDQUFGLElBQU9MLEVBQUVHLE1BQU1FLENBQVIsQ0FBUDtBQUNEOztBQUVELE1BQUlMLEVBQUVHLE1BQU1FLENBQVIsTUFBZVQsRUFBRSxDQUFGLENBQW5CLEVBQXlCO0FBQ3ZCQSxNQUFFUyxDQUFGLElBQU9MLEVBQUVHLE1BQU1FLENBQVIsQ0FBUDtBQUNEOztBQUVELFNBQU9ULENBQVA7QUFDRCIsImZpbGUiOiIxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBDb3B5cmlnaHQgMjAwMSBzb2Z0U3VyZmVyLCAyMDEyIERhbiBTdW5kYXlcbi8vIFRoaXMgY29kZSBtYXkgYmUgZnJlZWx5IHVzZWQgYW5kIG1vZGlmaWVkIGZvciBhbnkgcHVycG9zZVxuLy8gcHJvdmlkaW5nIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGlzIGluY2x1ZGVkIHdpdGggaXQuXG4vLyBTb2Z0U3VyZmVyIG1ha2VzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGNvZGUsIGFuZCBjYW5ub3QgYmUgaGVsZFxuLy8gbGlhYmxlIGZvciBhbnkgcmVhbCBvciBpbWFnaW5lZCBkYW1hZ2UgcmVzdWx0aW5nIGZyb20gaXRzIHVzZS5cbi8vIFVzZXJzIG9mIHRoaXMgY29kZSBtdXN0IHZlcmlmeSBjb3JyZWN0bmVzcyBmb3IgdGhlaXIgYXBwbGljYXRpb24uXG5cbi8vIGZyb20gaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMTItX2h1bGwtMy5odG1sXG5cblwidXNlIHN0cmljdFwiXG5cbmNvbnN0IFggPSAwXG5jb25zdCBZID0gMVxuXG5cbi8qKlxuICogVGVzdCBpZiBhIHBvaW50IGlzIExlZnR8T258UmlnaHQgb2YgYW4gaW5maW5pdGUgbGluZS5cbiAqIEBwYXJhbSAge1BvaW50MmR9ICBQMCBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtQb2ludDJkfSAgUDEgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7UG9pbnQyZH0gIFAyIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICBSZXR1cm5zID4gMCBpZiBQMiBpcyBsZWZ0IG9mIHRoZSBsaW5lIHRocnUgUDAgJiBQMSxcbiAqICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIDwgMCBpZiBQMiBpcyB0byB0aGUgcmlnaHRcbiAqICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIDAgaWYgUDIgaXMgb24gdGhlIGxpbmVcbiAqL1xuZnVuY3Rpb24gaXNMZWZ0KFAwLCBQMSwgUDIpIHtcbiAgcmV0dXJuIChQMVtYXSAtIFAwW1hdKSAqIChQMltZXSAtIFAwW1ldKSAtIChQMltYXSAtIFAwW1hdKSAqIChQMVtZXSAtIFAwW1ldKVxufVxuXG4vKipcbiAqIE1lbGttYW4ncyAyRCBzaW1wbGUgcG9seWxpbmUgTyhuKSBjb252ZXggaHVsbCBhbGdvcml0aG1cbiAqIEBwYXJhbSAge1BvaW50MmRbXX0gdmVydHMgW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7bnVtYmVyW119ICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbXBsZUh1bGxfMkQodmVydHMpIHtcbiAgLy8gaW5pdGlhbGl6ZSBhIGRlcXVlIERbXSBmcm9tIGJvdHRvbSB0byB0b3Agc28gdGhhdCB0aGVcbiAgLy8gMXN0IHRocmVlIHZlcnRpY2VzIG9mIFBbXSBhcmUgYSBjY3cgdHJpYW5nbGVcbiAgY29uc3QgSCA9IFtdXG4gIGNvbnN0IG4gPSB2ZXJ0cy5sZW5ndGhcblxuICBpZiAobiA8IDMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkgKz0gMSkge1xuICAgICAgSFtpXSA9IGlcbiAgICB9XG4gICAgcmV0dXJuIEhcbiAgfVxuXG4gIGNvbnN0IEQgPSBuZXcgQXJyYXkoMiAqIG4gKyAxKVxuICBELmZpbGwoLTEpXG4gIGxldCBib3QgPSBuIC0gMlxuICBsZXQgdG9wID0gYm90ICsgMyAvLyBpbml0aWFsIGJvdHRvbSBhbmQgdG9wIGRlcXVlIGluZGljZXNcblxuICBEW2JvdF0gPSBEW3RvcF0gPSAyIC8vIDNyZCB2ZXJ0ZXggaXMgYXQgYm90aCBib3QgYW5kIHRvcFxuICBpZiAoaXNMZWZ0KHZlcnRzWzBdLCB2ZXJ0c1sxXSwgdmVydHNbMl0pID4gMCkge1xuICAgIERbYm90ICsgMV0gPSAwXG4gICAgRFtib3QgKyAyXSA9IDEgLy8gY2N3IHZlcnRpY2VzIGFyZTogMiwwLDEsMlxuICB9IGVsc2Uge1xuICAgIERbYm90ICsgMV0gPSAxXG4gICAgRFtib3QgKyAyXSA9IDAgLy8gY2N3IHZlcnRpY2VzIGFyZTogMiwxLDAsMlxuICB9XG5cbiAgLy8gY29tcHV0ZSB0aGUgaHVsbCBvbiB0aGUgZGVxdWUgRFtdXG4gIGZvciAobGV0IGkgPSAzOyBpIDwgbjsgaSArPSAxKSB7IC8vIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdmVydGljZXNcbiAgICAvLyB0ZXN0IGlmIG5leHQgdmVydGV4IGlzIG91dHNpZGUgdGhlIGRlcXVlIGh1bGxcbiAgICBpZiAoKGlzTGVmdCh2ZXJ0c1tEW2JvdF1dLCB2ZXJ0c1tEW2JvdCArIDFdXSwgdmVydHNbaV0pIDw9IDApIHx8XG4gICAgICAoaXNMZWZ0KHZlcnRzW0RbdG9wIC0gMV1dLCB2ZXJ0c1tEW3RvcF1dLCB2ZXJ0c1tpXSkgPD0gMCkpIHtcblxuICAgICAgLy8gaW5jcmVtZW50YWxseSBhZGQgYW4gZXh0ZXJpb3IgdmVydGV4IHRvIHRoZSBkZXF1ZSBodWxsXG4gICAgICAvLyBnZXQgdGhlIHJpZ2h0bW9zdCB0YW5nZW50IGF0IHRoZSBkZXF1ZSBib3RcbiAgICAgIHdoaWxlIChEW2JvdF0gPj0gMCAmJiBEW2JvdCArIDFdID49IDAgJiYgaXNMZWZ0KHZlcnRzW0RbYm90XV0sIHZlcnRzW0RbYm90ICsgMV1dLCB2ZXJ0c1tpXSkgPD0gMCkge1xuICAgICAgICBib3QgKz0gMSAvLyByZW1vdmUgYm90IG9mIGRlcXVlXG4gICAgICB9XG4gICAgICBib3QgLT0gMVxuICAgICAgRFtib3RdID0gaSAvLyBpbnNlcnQgdmVydHNbaV0gYXQgYm90IG9mIGRlcXVlXG5cbiAgICAgIC8vIGdldCB0aGUgbGVmdG1vc3QgdGFuZ2VudCBhdCB0aGUgZGVxdWUgdG9wXG4gICAgICB3aGlsZSAoRFt0b3BdID49IDAgJiYgRFt0b3AgKyAxXSA+PSAwICYmIGlzTGVmdCh2ZXJ0c1tEW3RvcCAtIDFdXSwgdmVydHNbRFt0b3BdXSwgdmVydHNbaV0pIDw9IDApIHtcbiAgICAgICAgdG9wIC09IDEgLy8gcG9wIHRvcCBvZiBkZXF1ZVxuICAgICAgfVxuICAgICAgdG9wICs9IDFcbiAgICAgIERbdG9wXSA9IGkgLy8gcHVzaCB2ZXJ0c1tpXSBvbnRvIHRvcCBvZiBkZXF1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIHRyYW5zY3JpYmUgZGVxdWUgRFtdIHRvIHRoZSBvdXRwdXQgaHVsbCBhcnJheSBIW11cbiAgbGV0IGggPSAwXG4gIGZvciAoaCA9IDA7IGggPD0gKHRvcCAtIGJvdCAtIDEpOyBoICs9IDEpIHtcbiAgICBIW2hdID0gRFtib3QgKyBoXVxuICB9XG5cbiAgaWYgKERbYm90ICsgaF0gIT09IEhbMF0pIHtcbiAgICBIW2hdID0gRFtib3QgKyBoXVxuICB9XG5cbiAgcmV0dXJuIEhcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL21hdGgvY29udmV4LWh1bGwuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _baseShape = __webpack_require__(6);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} RectOptions\n * @property {number} [width=0] Width of the rect in world space coords\n * @property {number} [height=0] Height of the rect in world space coords\n */\n\n/**\n * @class Class for defining a rectangle shape\n * @extends {BaseShape}\n */\nvar Rect = function (_BaseShape) {\n _inherits(Rect, _BaseShape);\n\n /**\n * Creates a new rectangle shape\n * @param {RectOptions} [opts]\n * @return {Rect}\n */\n function Rect(opts) {\n _classCallCheck(this, Rect);\n\n var _this = _possibleConstructorReturn(this, (Rect.__proto__ || Object.getPrototypeOf(Rect)).call(this, opts));\n\n _this._width = 0;\n _this._height = 0;\n if (typeof opts.width !== \"undefined\") {\n _this.width = opts.width;\n }\n if (typeof opts.height !== \"undefined\") {\n _this.height = opts.height;\n }\n return _this;\n }\n\n /**\n * Gets the untransformed width/height of the rect\n * @return {Vec2d} Width/height of the rect\n */\n\n\n _createClass(Rect, [{\n key: \"getDimensions\",\n value: function getDimensions() {\n return [this._width, this._height];\n }\n\n /**\n * Sets the width of the rectangle\n * @param {number} width Width of the rect in world-space coordinates\n * @return {Rect} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If width is not a valid number\n */\n\n }, {\n key: \"_updateAABox\",\n\n\n /**\n * Called when the bounding box requires updating\n * @private\n * @override\n */\n value: function _updateAABox() {\n if (this._geomDirty || this._boundsOutOfDate) {\n AABox2d.initCenterExtents(this._aabox, [0, 0], [this._width / 2, this._height / 2]);\n AABox2d.transformMat2d(this._aabox, this._aabox, this.globalXform);\n this._geomDirty = this._boundsOutOfDate = false;\n }\n }\n\n /**\n * Draws the rect using a 2d rendering context. Called by the BaseShape\n * class\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @override\n */\n\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n ctx.rect(0 - this.width / 2, 0 - this.height / 2, this.width, this.height);\n }\n\n /**\n * Called to convert the shape to a serializable JSON object\n * @return {object}\n * @override\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"Rect\",\n width: this.width,\n height: this.height\n }, _get(Rect.prototype.__proto__ || Object.getPrototypeOf(Rect.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"width\",\n set: function set(width) {\n if (typeof width !== \"number\") {\n throw new Error(\"Width must be a number\");\n }\n\n if (width !== this._width) {\n var prev = this._width;\n this._width = width;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"width\",\n prevVal: prev,\n currVal: this._width\n });\n }\n return this;\n }\n\n /**\n * Gets the current untransformed width of the rect\n * @return {number} Width in world-space units\n */\n ,\n get: function get() {\n return this._width;\n }\n\n /**\n * Sets the height of the rectangle\n * @param {number} height Height of the rect in world-space units\n * @return {Rect} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If height is not a valid number\n */\n\n }, {\n key: \"height\",\n set: function set(height) {\n if (typeof height !== \"number\") {\n throw new Error(\"Height must be a number\");\n }\n\n if (height !== this._height) {\n var prev = this._height;\n this._height = height;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"height\",\n prevVal: prev,\n currVal: this._height\n });\n }\n return this;\n }\n\n /**\n * Gets the current untransformed height of the rect\n * @return {number} Height in world-space units\n */\n ,\n get: function get() {\n return this._height;\n }\n }]);\n\n return Rect;\n}(_baseShape2.default);\n\nexports.default = Rect;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcmVjdC5qcz80ZDJiIl0sIm5hbWVzIjpbIkFBQm94MmQiLCJSZWN0Iiwib3B0cyIsIl93aWR0aCIsIl9oZWlnaHQiLCJ3aWR0aCIsImhlaWdodCIsIl9nZW9tRGlydHkiLCJfYm91bmRzT3V0T2ZEYXRlIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJ0cmFuc2Zvcm1NYXQyZCIsImdsb2JhbFhmb3JtIiwiY3R4IiwicmVjdCIsIk9iamVjdCIsImFzc2lnbiIsInR5cGUiLCJFcnJvciIsInByZXYiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIiwiQmFzZVNoYXBlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBOztJQUFZQSxPOztBQUNaOzs7Ozs7Ozs7Ozs7OztBQUVBOzs7Ozs7QUFNQTs7OztJQUlxQkMsSTs7O0FBQ25COzs7OztBQUtBLGdCQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQUEsNEdBQ1ZBLElBRFU7O0FBRWhCLFVBQUtDLE1BQUwsR0FBYyxDQUFkO0FBQ0EsVUFBS0MsT0FBTCxHQUFlLENBQWY7QUFDQSxRQUFJLE9BQU9GLEtBQUtHLEtBQVosS0FBc0IsV0FBMUIsRUFBdUM7QUFDckMsWUFBS0EsS0FBTCxHQUFhSCxLQUFLRyxLQUFsQjtBQUNEO0FBQ0QsUUFBSSxPQUFPSCxLQUFLSSxNQUFaLEtBQXVCLFdBQTNCLEVBQXdDO0FBQ3RDLFlBQUtBLE1BQUwsR0FBY0osS0FBS0ksTUFBbkI7QUFDRDtBQVRlO0FBVWpCOztBQUVEOzs7Ozs7OztvQ0FJZ0I7QUFDZCxhQUFPLENBQUMsS0FBS0gsTUFBTixFQUFjLEtBQUtDLE9BQW5CLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7O0FBb0VBOzs7OzttQ0FLZTtBQUNiLFVBQUksS0FBS0csVUFBTCxJQUFtQixLQUFLQyxnQkFBNUIsRUFBOEM7QUFDNUNSLGdCQUFRUyxpQkFBUixDQUEwQixLQUFLQyxNQUEvQixFQUF1QyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQXZDLEVBQStDLENBQUMsS0FBS1AsTUFBTCxHQUFjLENBQWYsRUFBa0IsS0FBS0MsT0FBTCxHQUFlLENBQWpDLENBQS9DO0FBQ0FKLGdCQUFRVyxjQUFSLENBQXVCLEtBQUtELE1BQTVCLEVBQW9DLEtBQUtBLE1BQXpDLEVBQWlELEtBQUtFLFdBQXREO0FBQ0EsYUFBS0wsVUFBTCxHQUFrQixLQUFLQyxnQkFBTCxHQUF3QixLQUExQztBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7OzswQkFNTUssRyxFQUFLO0FBQ1RBLFVBQUlDLElBQUosQ0FBUyxJQUFJLEtBQUtULEtBQUwsR0FBYSxDQUExQixFQUE2QixJQUFJLEtBQUtDLE1BQUwsR0FBYyxDQUEvQyxFQUFrRCxLQUFLRCxLQUF2RCxFQUE4RCxLQUFLQyxNQUFuRTtBQUNEOztBQUVEOzs7Ozs7Ozs2QkFLUztBQUNQLGFBQU9TLE9BQU9DLE1BQVAsQ0FBYztBQUNuQkMsY0FBTSxNQURhO0FBRW5CWixlQUFPLEtBQUtBLEtBRk87QUFHbkJDLGdCQUFRLEtBQUtBO0FBSE0sT0FBZCxxR0FBUDtBQUtEOzs7c0JBL0ZTRCxLLEVBQU87QUFDZixVQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsY0FBTSxJQUFJYSxLQUFKLENBQVUsd0JBQVYsQ0FBTjtBQUNEOztBQUVELFVBQUliLFVBQVUsS0FBS0YsTUFBbkIsRUFBMkI7QUFDekIsWUFBTWdCLE9BQU8sS0FBS2hCLE1BQWxCO0FBQ0EsYUFBS0EsTUFBTCxHQUFjRSxLQUFkO0FBQ0EsYUFBS0UsVUFBTCxHQUFrQixJQUFsQixDQUh5QixDQUdGOztBQUV2QixhQUFLYSxJQUFMLENBQVUsY0FBVixFQUEwQjtBQUN4QkMsZ0JBQU0sT0FEa0I7QUFFeEJDLG1CQUFTSCxJQUZlO0FBR3hCSSxtQkFBUyxLQUFLcEI7QUFIVSxTQUExQjtBQUtEO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlZO0FBQ1YsYUFBTyxLQUFLQSxNQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7c0JBT1dHLE0sRUFBUTtBQUNqQixVQUFJLE9BQU9BLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDOUIsY0FBTSxJQUFJWSxLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEOztBQUVELFVBQUlaLFdBQVcsS0FBS0YsT0FBcEIsRUFBNkI7QUFDM0IsWUFBTWUsT0FBTyxLQUFLZixPQUFsQjtBQUNBLGFBQUtBLE9BQUwsR0FBZUUsTUFBZjtBQUNBLGFBQUtDLFVBQUwsR0FBa0IsSUFBbEIsQ0FIMkIsQ0FHSjs7QUFFdkIsYUFBS2EsSUFBTCxDQUFVLGNBQVYsRUFBMEI7QUFDeEJDLGdCQUFNLFFBRGtCO0FBRXhCQyxtQkFBU0gsSUFGZTtBQUd4QkksbUJBQVMsS0FBS25CO0FBSFUsU0FBMUI7QUFLRDtBQUNELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozt3QkFJYTtBQUNYLGFBQU8sS0FBS0EsT0FBWjtBQUNEOzs7O0VBNUYrQm9CLG1COztrQkFBYnZCLEkiLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuLi9jb3JlL2FhYm94MmRcIlxuaW1wb3J0IEJhc2VTaGFwZSBmcm9tIFwiLi9iYXNlLXNoYXBlLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt3aWR0aD0wXSBXaWR0aCBvZiB0aGUgcmVjdCBpbiB3b3JsZCBzcGFjZSBjb29yZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaGVpZ2h0PTBdIEhlaWdodCBvZiB0aGUgcmVjdCBpbiB3b3JsZCBzcGFjZSBjb29yZHNcbiAqL1xuXG4vKipcbiAqIEBjbGFzcyBDbGFzcyBmb3IgZGVmaW5pbmcgYSByZWN0YW5nbGUgc2hhcGVcbiAqIEBleHRlbmRzIHtCYXNlU2hhcGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY3QgZXh0ZW5kcyBCYXNlU2hhcGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyByZWN0YW5nbGUgc2hhcGVcbiAgICogQHBhcmFtICB7UmVjdE9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJuIHtSZWN0fVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpcy5fd2lkdGggPSAwXG4gICAgdGhpcy5faGVpZ2h0ID0gMFxuICAgIGlmICh0eXBlb2Ygb3B0cy53aWR0aCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLmhlaWdodCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bnRyYW5zZm9ybWVkIHdpZHRoL2hlaWdodCBvZiB0aGUgcmVjdFxuICAgKiBAcmV0dXJuIHtWZWMyZH0gV2lkdGgvaGVpZ2h0IG9mIHRoZSByZWN0XG4gICAqL1xuICBnZXREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBbdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodF1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlXG4gICAqIEBwYXJhbSAge251bWJlcn0gd2lkdGggV2lkdGggb2YgdGhlIHJlY3QgaW4gd29ybGQtc3BhY2UgY29vcmRpbmF0ZXNcbiAgICogQHJldHVybiB7UmVjdH0gICAgICAgdGhpc1xuICAgKiBAZmlyZXMge1NoYXBlI2dlb21DaGFuZ2VkfVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgd2lkdGggaXMgbm90IGEgdmFsaWQgbnVtYmVyXG4gICAqL1xuICBzZXQgd2lkdGgod2lkdGgpIHtcbiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXaWR0aCBtdXN0IGJlIGEgbnVtYmVyXCIpXG4gICAgfVxuXG4gICAgaWYgKHdpZHRoICE9PSB0aGlzLl93aWR0aCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3dpZHRoXG4gICAgICB0aGlzLl93aWR0aCA9IHdpZHRoXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlIC8vIGRpcnR5IG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgZmlyaW5nIGV2ZW50XG5cbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbVwiLCB7XG4gICAgICAgIGF0dHI6IFwid2lkdGhcIixcbiAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgY3VyclZhbDogdGhpcy5fd2lkdGhcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB1bnRyYW5zZm9ybWVkIHdpZHRoIG9mIHRoZSByZWN0XG4gICAqIEByZXR1cm4ge251bWJlcn0gV2lkdGggaW4gd29ybGQtc3BhY2UgdW5pdHNcbiAgICovXG4gIGdldCB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgdGhlIHJlY3QgaW4gd29ybGQtc3BhY2UgdW5pdHNcbiAgICogQHJldHVybiB7UmVjdH0gICAgICAgdGhpc1xuICAgKiBAZmlyZXMge1NoYXBlI2dlb21DaGFuZ2VkfVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaGVpZ2h0IGlzIG5vdCBhIHZhbGlkIG51bWJlclxuICAgKi9cbiAgc2V0IGhlaWdodChoZWlnaHQpIHtcbiAgICBpZiAodHlwZW9mIGhlaWdodCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVpZ2h0IG11c3QgYmUgYSBudW1iZXJcIilcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0ICE9PSB0aGlzLl9oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHByZXYgPSB0aGlzLl9oZWlnaHRcbiAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodFxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gdHJ1ZSAvLyBkaXJ0eSBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIGZpcmluZyBldmVudFxuXG4gICAgICB0aGlzLmZpcmUoXCJjaGFuZ2VkOmdlb21cIiwge1xuICAgICAgICBhdHRyOiBcImhlaWdodFwiLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiB0aGlzLl9oZWlnaHRcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB1bnRyYW5zZm9ybWVkIGhlaWdodCBvZiB0aGUgcmVjdFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhlaWdodCBpbiB3b3JsZC1zcGFjZSB1bml0c1xuICAgKi9cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJvdW5kaW5nIGJveCByZXF1aXJlcyB1cGRhdGluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF91cGRhdGVBQUJveCgpIHtcbiAgICBpZiAodGhpcy5fZ2VvbURpcnR5IHx8IHRoaXMuX2JvdW5kc091dE9mRGF0ZSkge1xuICAgICAgQUFCb3gyZC5pbml0Q2VudGVyRXh0ZW50cyh0aGlzLl9hYWJveCwgWzAsIDBdLCBbdGhpcy5fd2lkdGggLyAyLCB0aGlzLl9oZWlnaHQgLyAyXSlcbiAgICAgIEFBQm94MmQudHJhbnNmb3JtTWF0MmQodGhpcy5fYWFib3gsIHRoaXMuX2FhYm94LCB0aGlzLmdsb2JhbFhmb3JtKVxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIHJlY3QgdXNpbmcgYSAyZCByZW5kZXJpbmcgY29udGV4dC4gQ2FsbGVkIGJ5IHRoZSBCYXNlU2hhcGVcbiAgICogY2xhc3NcbiAgICogQHBhcmFtICB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJkfSBjdHggMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBfZHJhdyhjdHgpIHtcbiAgICBjdHgucmVjdCgwIC0gdGhpcy53aWR0aCAvIDIsIDAgLSB0aGlzLmhlaWdodCAvIDIsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB0byBjb252ZXJ0IHRoZSBzaGFwZSB0byBhIHNlcmlhbGl6YWJsZSBKU09OIG9iamVjdFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgIHR5cGU6IFwiUmVjdFwiLFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfSwgc3VwZXIudG9KU09OKCkpXG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NoYXBlcy9yZWN0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 16 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _baseShape = __webpack_require__(7);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} RectOptions\n * @property {number} [width=0] Width of the rect in world space coords\n * @property {number} [height=0] Height of the rect in world space coords\n */\n\n/**\n * @class Class for defining a rectangle shape\n * @extends {BaseShape}\n */\nvar Rect = function (_BaseShape) {\n _inherits(Rect, _BaseShape);\n\n /**\n * Creates a new rectangle shape\n * @param {RectOptions} [opts]\n * @return {Rect}\n */\n function Rect(opts) {\n _classCallCheck(this, Rect);\n\n var _this = _possibleConstructorReturn(this, (Rect.__proto__ || Object.getPrototypeOf(Rect)).call(this, opts));\n\n _this._width = 0;\n _this._height = 0;\n if (typeof opts.width !== \"undefined\") {\n _this.width = opts.width;\n }\n if (typeof opts.height !== \"undefined\") {\n _this.height = opts.height;\n }\n return _this;\n }\n\n /**\n * Gets the untransformed width/height of the rect\n * @return {Vec2d} Width/height of the rect\n */\n\n\n _createClass(Rect, [{\n key: \"getDimensions\",\n value: function getDimensions() {\n return [this._width, this._height];\n }\n\n /**\n * Sets the width of the rectangle\n * @param {number} width Width of the rect in world-space coordinates\n * @return {Rect} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If width is not a valid number\n */\n\n }, {\n key: \"_updateAABox\",\n\n\n /**\n * Called when the bounding box requires updating\n * @private\n * @override\n */\n value: function _updateAABox() {\n if (this._geomDirty || this._boundsOutOfDate) {\n AABox2d.initCenterExtents(this._aabox, [0, 0], [this._width / 2, this._height / 2]);\n AABox2d.transformMat2d(this._aabox, this._aabox, this.globalXform);\n this._geomDirty = this._boundsOutOfDate = false;\n }\n }\n\n /**\n * Draws the rect using a 2d rendering context. Called by the BaseShape\n * class\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @override\n */\n\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n ctx.rect(0 - this.width / 2, 0 - this.height / 2, this.width, this.height);\n }\n\n /**\n * Called to convert the shape to a serializable JSON object\n * @return {object}\n * @override\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"Rect\",\n width: this.width,\n height: this.height\n }, _get(Rect.prototype.__proto__ || Object.getPrototypeOf(Rect.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"width\",\n set: function set(width) {\n if (typeof width !== \"number\") {\n throw new Error(\"Width must be a number\");\n }\n\n if (width !== this._width) {\n var prev = this._width;\n this._width = width;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"width\",\n prevVal: prev,\n currVal: this._width\n });\n }\n return this;\n }\n\n /**\n * Gets the current untransformed width of the rect\n * @return {number} Width in world-space units\n */\n ,\n get: function get() {\n return this._width;\n }\n\n /**\n * Sets the height of the rectangle\n * @param {number} height Height of the rect in world-space units\n * @return {Rect} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If height is not a valid number\n */\n\n }, {\n key: \"height\",\n set: function set(height) {\n if (typeof height !== \"number\") {\n throw new Error(\"Height must be a number\");\n }\n\n if (height !== this._height) {\n var prev = this._height;\n this._height = height;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"height\",\n prevVal: prev,\n currVal: this._height\n });\n }\n return this;\n }\n\n /**\n * Gets the current untransformed height of the rect\n * @return {number} Height in world-space units\n */\n ,\n get: function get() {\n return this._height;\n }\n }]);\n\n return Rect;\n}(_baseShape2.default);\n\nexports.default = Rect;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcmVjdC5qcz80ZDJiIl0sIm5hbWVzIjpbIkFBQm94MmQiLCJSZWN0Iiwib3B0cyIsIl93aWR0aCIsIl9oZWlnaHQiLCJ3aWR0aCIsImhlaWdodCIsIl9nZW9tRGlydHkiLCJfYm91bmRzT3V0T2ZEYXRlIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJ0cmFuc2Zvcm1NYXQyZCIsImdsb2JhbFhmb3JtIiwiY3R4IiwicmVjdCIsIk9iamVjdCIsImFzc2lnbiIsInR5cGUiLCJFcnJvciIsInByZXYiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBOztJQUFZQSxPOztBQUNaOzs7Ozs7Ozs7Ozs7OztBQUVBOzs7Ozs7QUFNQTs7OztJQUlxQkMsSTs7O0FBQ25COzs7OztBQUtBLGdCQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQUEsNEdBQ1ZBLElBRFU7O0FBRWhCLFVBQUtDLE1BQUwsR0FBYyxDQUFkO0FBQ0EsVUFBS0MsT0FBTCxHQUFlLENBQWY7QUFDQSxRQUFJLE9BQU9GLEtBQUtHLEtBQVosS0FBc0IsV0FBMUIsRUFBdUM7QUFDckMsWUFBS0EsS0FBTCxHQUFhSCxLQUFLRyxLQUFsQjtBQUNEO0FBQ0QsUUFBSSxPQUFPSCxLQUFLSSxNQUFaLEtBQXVCLFdBQTNCLEVBQXdDO0FBQ3RDLFlBQUtBLE1BQUwsR0FBY0osS0FBS0ksTUFBbkI7QUFDRDtBQVRlO0FBVWpCOztBQUVEOzs7Ozs7OztvQ0FJZ0I7QUFDZCxhQUFPLENBQUMsS0FBS0gsTUFBTixFQUFjLEtBQUtDLE9BQW5CLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7O0FBb0VBOzs7OzttQ0FLZTtBQUNiLFVBQUksS0FBS0csVUFBTCxJQUFtQixLQUFLQyxnQkFBNUIsRUFBOEM7QUFDNUNSLGdCQUFRUyxpQkFBUixDQUEwQixLQUFLQyxNQUEvQixFQUF1QyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQXZDLEVBQStDLENBQUMsS0FBS1AsTUFBTCxHQUFjLENBQWYsRUFBa0IsS0FBS0MsT0FBTCxHQUFlLENBQWpDLENBQS9DO0FBQ0FKLGdCQUFRVyxjQUFSLENBQXVCLEtBQUtELE1BQTVCLEVBQW9DLEtBQUtBLE1BQXpDLEVBQWlELEtBQUtFLFdBQXREO0FBQ0EsYUFBS0wsVUFBTCxHQUFrQixLQUFLQyxnQkFBTCxHQUF3QixLQUExQztBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7OzswQkFNTUssRyxFQUFLO0FBQ1RBLFVBQUlDLElBQUosQ0FBUyxJQUFJLEtBQUtULEtBQUwsR0FBYSxDQUExQixFQUE2QixJQUFJLEtBQUtDLE1BQUwsR0FBYyxDQUEvQyxFQUFrRCxLQUFLRCxLQUF2RCxFQUE4RCxLQUFLQyxNQUFuRTtBQUNEOztBQUVEOzs7Ozs7Ozs2QkFLUztBQUNQLGFBQU9TLE9BQU9DLE1BQVAsQ0FBYztBQUNuQkMsY0FBTSxNQURhO0FBRW5CWixlQUFPLEtBQUtBLEtBRk87QUFHbkJDLGdCQUFRLEtBQUtBO0FBSE0sT0FBZCxxR0FBUDtBQUtEOzs7c0JBL0ZTRCxLLEVBQU87QUFDZixVQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsY0FBTSxJQUFJYSxLQUFKLENBQVUsd0JBQVYsQ0FBTjtBQUNEOztBQUVELFVBQUliLFVBQVUsS0FBS0YsTUFBbkIsRUFBMkI7QUFDekIsWUFBTWdCLE9BQU8sS0FBS2hCLE1BQWxCO0FBQ0EsYUFBS0EsTUFBTCxHQUFjRSxLQUFkO0FBQ0EsYUFBS0UsVUFBTCxHQUFrQixJQUFsQixDQUh5QixDQUdGOztBQUV2QixhQUFLYSxJQUFMLENBQVUsY0FBVixFQUEwQjtBQUN4QkMsZ0JBQU0sT0FEa0I7QUFFeEJDLG1CQUFTSCxJQUZlO0FBR3hCSSxtQkFBUyxLQUFLcEI7QUFIVSxTQUExQjtBQUtEO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlZO0FBQ1YsYUFBTyxLQUFLQSxNQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7c0JBT1dHLE0sRUFBUTtBQUNqQixVQUFJLE9BQU9BLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDOUIsY0FBTSxJQUFJWSxLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEOztBQUVELFVBQUlaLFdBQVcsS0FBS0YsT0FBcEIsRUFBNkI7QUFDM0IsWUFBTWUsT0FBTyxLQUFLZixPQUFsQjtBQUNBLGFBQUtBLE9BQUwsR0FBZUUsTUFBZjtBQUNBLGFBQUtDLFVBQUwsR0FBa0IsSUFBbEIsQ0FIMkIsQ0FHSjs7QUFFdkIsYUFBS2EsSUFBTCxDQUFVLGNBQVYsRUFBMEI7QUFDeEJDLGdCQUFNLFFBRGtCO0FBRXhCQyxtQkFBU0gsSUFGZTtBQUd4QkksbUJBQVMsS0FBS25CO0FBSFUsU0FBMUI7QUFLRDtBQUNELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozt3QkFJYTtBQUNYLGFBQU8sS0FBS0EsT0FBWjtBQUNEOzs7Ozs7a0JBNUZrQkgsSSIsImZpbGUiOiIxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIEFBQm94MmQgZnJvbSBcIi4uL2NvcmUvYWFib3gyZFwiXG5pbXBvcnQgQmFzZVNoYXBlIGZyb20gXCIuL2Jhc2Utc2hhcGUuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3dpZHRoPTBdIFdpZHRoIG9mIHRoZSByZWN0IGluIHdvcmxkIHNwYWNlIGNvb3Jkc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtoZWlnaHQ9MF0gSGVpZ2h0IG9mIHRoZSByZWN0IGluIHdvcmxkIHNwYWNlIGNvb3Jkc1xuICovXG5cbi8qKlxuICogQGNsYXNzIENsYXNzIGZvciBkZWZpbmluZyBhIHJlY3RhbmdsZSBzaGFwZVxuICogQGV4dGVuZHMge0Jhc2VTaGFwZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjdCBleHRlbmRzIEJhc2VTaGFwZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHJlY3RhbmdsZSBzaGFwZVxuICAgKiBAcGFyYW0gIHtSZWN0T3B0aW9uc30gW29wdHNdXG4gICAqIEByZXR1cm4ge1JlY3R9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl93aWR0aCA9IDBcbiAgICB0aGlzLl9oZWlnaHQgPSAwXG4gICAgaWYgKHR5cGVvZiBvcHRzLndpZHRoICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMuaGVpZ2h0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVudHJhbnNmb3JtZWQgd2lkdGgvaGVpZ2h0IG9mIHRoZSByZWN0XG4gICAqIEByZXR1cm4ge1ZlYzJkfSBXaWR0aC9oZWlnaHQgb2YgdGhlIHJlY3RcbiAgICovXG4gIGdldERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIFt0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0XVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGVcbiAgICogQHBhcmFtICB7bnVtYmVyfSB3aWR0aCBXaWR0aCBvZiB0aGUgcmVjdCBpbiB3b3JsZC1zcGFjZSBjb29yZGluYXRlc1xuICAgKiBAcmV0dXJuIHtSZWN0fSAgICAgICB0aGlzXG4gICAqIEBmaXJlcyB7U2hhcGUjZ2VvbUNoYW5nZWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB3aWR0aCBpcyBub3QgYSB2YWxpZCBudW1iZXJcbiAgICovXG4gIHNldCB3aWR0aCh3aWR0aCkge1xuICAgIGlmICh0eXBlb2Ygd2lkdGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldpZHRoIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICB9XG5cbiAgICBpZiAod2lkdGggIT09IHRoaXMuX3dpZHRoKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5fd2lkdGhcbiAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGhcbiAgICAgIHRoaXMuX2dlb21EaXJ0eSA9IHRydWUgLy8gZGlydHkgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBmaXJpbmcgZXZlbnRcblxuICAgICAgdGhpcy5maXJlKFwiY2hhbmdlZDpnZW9tXCIsIHtcbiAgICAgICAgYXR0cjogXCJ3aWR0aFwiLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiB0aGlzLl93aWR0aFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVudHJhbnNmb3JtZWQgd2lkdGggb2YgdGhlIHJlY3RcbiAgICogQHJldHVybiB7bnVtYmVyfSBXaWR0aCBpbiB3b3JsZC1zcGFjZSB1bml0c1xuICAgKi9cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLl93aWR0aFxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlXG4gICAqIEBwYXJhbSAge251bWJlcn0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgcmVjdCBpbiB3b3JsZC1zcGFjZSB1bml0c1xuICAgKiBAcmV0dXJuIHtSZWN0fSAgICAgICB0aGlzXG4gICAqIEBmaXJlcyB7U2hhcGUjZ2VvbUNoYW5nZWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBoZWlnaHQgaXMgbm90IGEgdmFsaWQgbnVtYmVyXG4gICAqL1xuICBzZXQgaGVpZ2h0KGhlaWdodCkge1xuICAgIGlmICh0eXBlb2YgaGVpZ2h0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZWlnaHQgbXVzdCBiZSBhIG51bWJlclwiKVxuICAgIH1cblxuICAgIGlmIChoZWlnaHQgIT09IHRoaXMuX2hlaWdodCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX2hlaWdodFxuICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0XG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlIC8vIGRpcnR5IG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgZmlyaW5nIGV2ZW50XG5cbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbVwiLCB7XG4gICAgICAgIGF0dHI6IFwiaGVpZ2h0XCIsXG4gICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgIGN1cnJWYWw6IHRoaXMuX2hlaWdodFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVudHJhbnNmb3JtZWQgaGVpZ2h0IG9mIHRoZSByZWN0XG4gICAqIEByZXR1cm4ge251bWJlcn0gSGVpZ2h0IGluIHdvcmxkLXNwYWNlIHVuaXRzXG4gICAqL1xuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgYm91bmRpbmcgYm94IHJlcXVpcmVzIHVwZGF0aW5nXG4gICAqIEBwcml2YXRlXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgX3VwZGF0ZUFBQm94KCkge1xuICAgIGlmICh0aGlzLl9nZW9tRGlydHkgfHwgdGhpcy5fYm91bmRzT3V0T2ZEYXRlKSB7XG4gICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKHRoaXMuX2FhYm94LCBbMCwgMF0sIFt0aGlzLl93aWR0aCAvIDIsIHRoaXMuX2hlaWdodCAvIDJdKVxuICAgICAgQUFCb3gyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl9hYWJveCwgdGhpcy5fYWFib3gsIHRoaXMuZ2xvYmFsWGZvcm0pXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgcmVjdCB1c2luZyBhIDJkIHJlbmRlcmluZyBjb250ZXh0LiBDYWxsZWQgYnkgdGhlIEJhc2VTaGFwZVxuICAgKiBjbGFzc1xuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MmR9IGN0eCAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF9kcmF3KGN0eCkge1xuICAgIGN0eC5yZWN0KDAgLSB0aGlzLndpZHRoIC8gMiwgMCAtIHRoaXMuaGVpZ2h0IC8gMiwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgdGhlIHNoYXBlIHRvIGEgc2VyaWFsaXphYmxlIEpTT04gb2JqZWN0XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgdHlwZTogXCJSZWN0XCIsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHRcbiAgICB9LCBzdXBlci50b0pTT04oKSlcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2hhcGVzL3JlY3QuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.createEventedColorRGBAClass = createEventedColorRGBAClass;\n\nvar _math = __webpack_require__(5);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Color keywords as defined by the CSS color modules\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/color_value}\n * @type {Map}\n */\nvar colorKeywords = new Map([[\"aliceblue\", \"#F0F8FF\"], [\"antiquewhite\", \"#FAEBD7\"], [\"aqua\", \"#00FFFF\"], [\"aquamarine\", \"#7FFFD4\"], [\"azure\", \"#F0FFFF\"], [\"beige\", \"#F5F5DC\"], [\"bisque\", \"#FFE4C4\"], [\"black\", \"#000000\"], [\"blanchedalmond\", \"#FFEBCD\"], [\"blue\", \"#0000FF\"], [\"blueviolet\", \"#8A2BE2\"], [\"brown\", \"#A52A2A\"], [\"burlywood\", \"#DEB887\"], [\"cadetblue\", \"#5F9EA0\"], [\"chartreuse\", \"#7FFF00\"], [\"chocolate\", \"#D2691E\"], [\"coral\", \"#FF7F50\"], [\"cornflowerblue\", \"#6495ED\"], [\"cornsilk\", \"#FFF8DC\"], [\"crimson\", \"#DC143C\"], [\"cyan\", \"#00FFFF\"], [\"darkblue\", \"#00008B\"], [\"darkcyan\", \"#008B8B\"], [\"darkgoldenrod\", \"#B8860B\"], [\"darkgray\", \"#A9A9A9\"], [\"darkgreen\", \"#006400\"], [\"darkkhaki\", \"#BDB76B\"], [\"darkmagenta\", \"#8B008B\"], [\"darkolivegreen\", \"#556B2F\"], [\"darkorange\", \"#FF8C00\"], [\"darkorchid\", \"#9932CC\"], [\"darkred\", \"#8B0000\"], [\"darksalmon\", \"#E9967A\"], [\"darkseagreen\", \"#8FBC8F\"], [\"darkslateblue\", \"#483D8B\"], [\"darkslategray\", \"#2F4F4F\"], [\"darkturquoise\", \"#00CED1\"], [\"darkviolet\", \"#9400D3\"], [\"deeppink\", \"#FF1493\"], [\"deepskyblue\", \"#00BFFF\"], [\"dimgray\", \"#696969\"], [\"dodgerblue\", \"#1E90FF\"], [\"firebrick\", \"#B22222\"], [\"floralwhite\", \"#FFFAF0\"], [\"forestgreen\", \"#228B22\"], [\"fuchsia\", \"#FF00FF\"], [\"gainsboro\", \"#DCDCDC\"], [\"ghostwhite\", \"#F8F8FF\"], [\"gold\", \"#FFD700\"], [\"goldenrod\", \"#DAA520\"], [\"gray\", \"#808080\"], [\"green\", \"#008000\"], [\"greenyellow\", \"#ADFF2F\"], [\"honeydew\", \"#F0FFF0\"], [\"hotpink\", \"#FF69B4\"], [\"indianred\", \"#CD5C5C\"], [\"indigo\", \"#4B0082\"], [\"ivory\", \"#FFFFF0\"], [\"khaki\", \"#F0E68C\"], [\"lavender\", \"#E6E6FA\"], [\"lavenderblush\", \"#FFF0F5\"], [\"lawngreen\", \"#7CFC00\"], [\"lemonchiffon\", \"#FFFACD\"], [\"lightblue\", \"#ADD8E6\"], [\"lightcoral\", \"#F08080\"], [\"lightcyan\", \"#E0FFFF\"], [\"lightgoldenrodyellow\", \"#FAFAD2\"], [\"lightgray\", \"#D3D3D3\"], [\"lightgreen\", \"#90EE90\"], [\"lightpink\", \"#FFB6C1\"], [\"lightsalmon\", \"#FFA07A\"], [\"lightseagreen\", \"#20B2AA\"], [\"lightskyblue\", \"#87CEFA\"], [\"lightslategray\", \"#778899\"], [\"lightsteelblue\", \"#B0C4DE\"], [\"lightyellow\", \"#FFFFE0\"], [\"lime\", \"#00FF00\"], [\"limegreen\", \"#32CD32\"], [\"linen\", \"#FAF0E6\"], [\"magenta\", \"#FF00FF\"], [\"maroon\", \"#800000\"], [\"mediumaquamarine\", \"#66CDAA\"], [\"mediumblue\", \"#0000CD\"], [\"mediumorchid\", \"#BA55D3\"], [\"mediumpurple\", \"#9370DB\"], [\"mediumseagreen\", \"#3CB371\"], [\"mediumslateblue\", \"#7B68EE\"], [\"mediumspringgreen\", \"#00FA9A\"], [\"mediumturquoise\", \"#48D1CC\"], [\"mediumvioletred\", \"#C71585\"], [\"midnightblue\", \"#191970\"], [\"mintcream\", \"#F5FFFA\"], [\"mistyrose\", \"#FFE4E1\"], [\"moccasin\", \"#FFE4B5\"], [\"navajowhite\", \"#FFDEAD\"], [\"navy\", \"#000080\"], [\"oldlace\", \"#FDF5E6\"], [\"olive\", \"#808000\"], [\"olivedrab\", \"#6B8E23\"], [\"orange\", \"#FFA500\"], [\"orangered\", \"#FF4500\"], [\"orchid\", \"#DA70D6\"], [\"palegoldenrod\", \"#EEE8AA\"], [\"palegreen\", \"#98FB98\"], [\"paleturquoise\", \"#AFEEEE\"], [\"palevioletred\", \"#DB7093\"], [\"papayawhip\", \"#FFEFD5\"], [\"peachpuff\", \"#FFDAB9\"], [\"peru\", \"#CD853F\"], [\"pink\", \"#FFC0CB\"], [\"plum\", \"#DDA0DD\"], [\"powderblue\", \"#B0E0E6\"], [\"purple\", \"#800080\"], [\"rebeccapurple\", \"#663399\"], [\"red\", \"#FF0000\"], [\"rosybrown\", \"#BC8F8F\"], [\"royalblue\", \"#4169E1\"], [\"saddlebrown\", \"#8B4513\"], [\"salmon\", \"#FA8072\"], [\"sandybrown\", \"#F4A460\"], [\"seagreen\", \"#2E8B57\"], [\"seashell\", \"#FFF5EE\"], [\"sienna\", \"#A0522D\"], [\"silver\", \"#C0C0C0\"], [\"skyblue\", \"#87CEEB\"], [\"slateblue\", \"#6A5ACD\"], [\"slategray\", \"#708090\"], [\"snow\", \"#FFFAFA\"], [\"springgreen\", \"#00FF7F\"], [\"steelblue\", \"#4682B4\"], [\"tan\", \"#D2B48C\"], [\"teal\", \"#008080\"], [\"thistle\", \"#D8BFD8\"], [\"tomato\", \"#FF6347\"], [\"turquoise\", \"#40E0D0\"], [\"violet\", \"#EE82EE\"], [\"wheat\", \"#F5DEB3\"], [\"white\", \"#FFFFFF\"], [\"whitesmoke\", \"#F5F5F5\"], [\"yellow\", \"#FFFF00\"], [\"yellowgreen\", \"#9ACD32\"]]);\n\n/**\n * rgb regex to handle \"rgb([0-255],[0-255],[0-255])\" color strings\n * @type {RegExp}\n */\nvar rgbRegex = /^rgb\\s*\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)\\s*$/i;\n\n/**\n * rgba regex to handle \"rgba([0-255],[0-255],[0-255],[0.0-1.0])\" color strings\n * @type {RegExp}\n */\nvar rgbaRegex = /^rgba\\s*\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*([0,1](?:\\.\\d*)?)\\s*\\)\\s*$/i;\n\n/**\n * hex regex to handle \"#[00-FF][00-FF][00-FF]\" color strings.\n * @type {RegExp}\n */\nvar hexRegex = /^#([0-9,a-f,A-F]{2})([0-9,a-f,A-F]{2})([0-9,a-f,A-F]{2})\\s*$/i;\n\n/**\n * Extracts an opacity from an rgba color packed into a 32-bit integer\n * @param {number} packedRgbaColor\n * @return {number} opacity extracted in range of [0,1]\n */\nfunction getOpacity(packedRgbaColor) {\n return (packedRgbaColor & 0xFF) / 255.0;\n}\n\n/**\n * packs an opacity value [0,1] into an 8-bit integer to be packed\n * into a 32-bit int\n * @param {number} opacity [0,1]\n * @return {number} [0,255]\n */\nfunction packOpacity(opacity) {\n return _math2.default.floor(_math2.default.clamp01(opacity) * 255);\n}\n\n/**\n * Given a color packed into a 32-bit integer, returns a css-style \"rgba()\" string\n * @param {number} packedRgbaColor\n * @return {string} int the form \"rgba([0,255],[0,255],[0,255],[0,1])\"\n */\nfunction getRGBAString(packedRgbaColor) {\n return \"rgba(\" + (packedRgbaColor >>> 24) + \", \" + ((packedRgbaColor & 0xFF0000) >> 16) + \", \" + ((packedRgbaColor & 0xFF00) >> 8) + \", \" + getOpacity(packedRgbaColor) + \")\";\n}\n\n/**\n * Given an rgba() color string, extracts a numeric color packed into a 32-bit int\n * @param {string} color\n * @return {number}\n */\nfunction getPackedColorRGBAFromString(color) {\n if (typeof color !== \"string\") {\n throw new Error(color + \" is not a valid color string\");\n }\n\n var packedColor = 0;\n\n var match = null;\n if (match = color.match(rgbRegex)) {\n packedColor = 255; // (fully opaque)\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 10), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 10), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 10), 0, 255) << 24;\n } else if (match = color.match(rgbaRegex)) {\n packedColor = packOpacity(Number.parseFloat(match[4], 10));\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 10), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 10), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 10), 0, 255) << 24;\n } else if (match = color.match(hexRegex)) {\n packedColor = 255; // (fully opaque)\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 16), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 16), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 16), 0, 255) << 24;\n } else if (colorKeywords.has(color)) {\n match = colorKeywords.get(color).match(hexRegex);\n packedColor = 255; // (fully opaque)\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 16), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 16), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 16), 0, 255) << 24;\n } else {\n throw new Error(color + \" is not a valid color string\");\n }\n\n return packedColor;\n}\n\n/** @class manages colors in the RGBA color space. Can also be used as a mixin */\n\nvar ColorRGBA = function () {\n /**\n * Creates a new color in the RGBA color space\n * @param {string} initColorStr color string in the form \"rgb()\", \"rgba()\", \"#......\", or a color keyword (i.e. \"red\")\n * @param {...object} args Additional arguments that may be passed to other initializers/constructors\n * if this class is used as a base class or mixin\n * @return {ColorRGBA}\n */\n function ColorRGBA(initColorStr) {\n _classCallCheck(this, ColorRGBA);\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n this.initializer.apply(this, [initColorStr].concat(args));\n }\n\n /**\n * initializes a color in the RGBA color space using a color string\n * @param {string} initColorStr initializer string in the form \"rgb()\", \"rgba()\", \"#......\", or color keyword\n */\n\n\n _createClass(ColorRGBA, [{\n key: \"initializer\",\n value: function initializer(initColorStr) {\n this._color = 0;\n if (initColorStr) {\n this.value = initColorStr;\n }\n }\n\n /**\n * sets all the channels of the RGBA color given a color string\n * @param {string} color color string in the form \"rgb()\", \"rgba()\", \"#......\", or color keyword\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"isTransparent\",\n\n\n /**\n * Returns true if the current opacity of the rgba color < 1\n * @return {Boolean}\n */\n value: function isTransparent() {\n return getOpacity(this._color) < 1.0;\n }\n }, {\n key: \"value\",\n set: function set(color) {\n this._color = getPackedColorRGBAFromString(color);\n return this;\n }\n\n /**\n * Gets the rgba color as a color string \"rgba()\"\n * @return {string} rgba color as a string\n */\n ,\n get: function get() {\n return getRGBAString(this._color);\n }\n\n /**\n * Sets the value of the RGBA color packed as a 32-bit int\n * @param {number} packedColor\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"packedValue\",\n set: function set(packedColor) {\n this._color = 0;\n this._color |= packedColor;\n return this;\n }\n\n /**\n * Gets the current value of the RGBA color as a packed 32-bit int\n * @return {number}\n */\n ,\n get: function get() {\n return this._color;\n }\n\n /**\n * sets the opacity of the RGBA color (modifies alpha channel only)\n * @param {number} opacity [0,1]\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"opacity\",\n set: function set(opacity) {\n if (typeof opacity !== \"number\") {\n throw new Error(\"Opacity must be a number between 0-1\");\n }\n\n var currOpacity = this._color & 0xFF;\n var newOpacity = packOpacity(opacity);\n if (newOpacity !== currOpacity) {\n this._color &= 0xFFFFFF00;\n this._color |= newOpacity;\n }\n return this;\n }\n\n /**\n * Gets the current opacity (alpha channel) of the RGBA color\n * @return {number} [0,1]\n */\n ,\n get: function get() {\n return getOpacity(this._color);\n }\n }]);\n\n return ColorRGBA;\n}();\n\n/**\n * Creates a new color RGBA class that fires events whenever the color\n * is changed externally\n * @param {string} eventName Event type to fire when color is modified\n * @param {string} colorName Name of the color attribute. This string is used in the event object fired\n * @return {function} New class constructor function\n */\n\n\nexports.default = ColorRGBA;\nfunction createEventedColorRGBAClass(eventName, colorName) {\n\n /**\n * @class New rgba color class that fires events when modified\n * @extends {ColorRGBA}\n */\n return function (_ColorRGBA) {\n _inherits(EventedColorRGBA, _ColorRGBA);\n\n function EventedColorRGBA() {\n _classCallCheck(this, EventedColorRGBA);\n\n return _possibleConstructorReturn(this, (EventedColorRGBA.__proto__ || Object.getPrototypeOf(EventedColorRGBA)).apply(this, arguments));\n }\n\n _createClass(EventedColorRGBA, [{\n key: \"initializer\",\n\n /**\n * Color modification event\n * @event EventedColor#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n /**\n * Initializes the evented color\n * @param {string} initColorStr initial color as string\n * @param {EventHandler} eventHandler Event handler instance used to manage the color\n * modification events\n * @protected\n */\n value: function initializer(initColorStr, eventHandler) {\n this._eventHandler = eventHandler;\n _get(EventedColorRGBA.prototype.__proto__ || Object.getPrototypeOf(EventedColorRGBA.prototype), \"initializer\", this).call(this, initColorStr);\n }\n\n /**\n * Validates modification of the rgba color, and if modified, fires\n * modification events\n * @param {number} newPackedColor Color defined by a 32-bit int\n * @private\n */\n\n }, {\n key: \"_checkPackedColorChanged\",\n value: function _checkPackedColorChanged(newPackedColor) {\n if (newPackedColor !== this._color) {\n var prev = this._color;\n var prevOpacity = getOpacity(prev);\n var opacity = getOpacity(newPackedColor);\n this._color = newPackedColor;\n\n this._eventHandler.fire(eventName, {\n attr: colorName,\n prevVal: getRGBAString(prev),\n currVal: getRGBAString(this._color)\n });\n\n if (opacity !== prevOpacity) {\n this._eventHandler.fire(eventName, {\n attr: \"opacity\",\n prevVal: prevOpacity,\n currVal: opacity\n });\n }\n }\n }\n\n /**\n * sets all the channels of the RGBA color from a color string\n * @param {string} color color string in the form \"rgb()\", \"rgba()\", \"#......\", or color keyword\n * @fires EventedColor#changed\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"value\",\n set: function set(color) {\n var tmpcolor = getPackedColorRGBAFromString(color);\n this._checkPackedColorChanged(tmpcolor);\n return this;\n }\n\n /**\n * Gets the rgba color as a color string \"rgba()\"\n * @return {string} rgba color as a string\n */\n ,\n get: function get() {\n return getRGBAString(this._color);\n }\n\n /**\n * Sets the value of the RGBA color packed as a 32-bit int\n * @param {number} packedColor\n * @fires EventedColor#changed\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"packedValue\",\n set: function set(packedColor) {\n var tmpcolor = 0;\n tmpcolor |= packedColor;\n this._checkPackedColorChanged(tmpcolor);\n return this;\n }\n\n /**\n * Gets the current value of the RGBA color as a packed 32-bit int\n * @return {number}\n */\n ,\n get: function get() {\n return this._color;\n }\n\n /**\n * sets the opacity of the RGBA color (modifies alpha channel only)\n * @param {number} opacity [0,1]\n * @fires EventedColor#changed\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"opacity\",\n set: function set(opacity) {\n if (typeof opacity !== \"number\") {\n throw new Error(\"Opacity must be a number between 0-1\");\n }\n\n var currOpacity = this._color & 0xFF;\n var newOpacity = packOpacity(opacity);\n if (newOpacity !== currOpacity) {\n this._color &= 0xFFFFFF00;\n this._color |= newOpacity;\n\n this._eventHandler.fire(eventName, {\n attr: \"opacity\",\n prevVal: currOpacity / 255.0,\n currVal: newOpacity / 255.0\n });\n }\n return this;\n }\n\n /**\n * Gets the current opacity (alpha channel) of the RGBA color\n * @return {number} [0,1]\n */\n ,\n get: function get() {\n return getOpacity(this._color);\n }\n }]);\n\n return EventedColorRGBA;\n }(ColorRGBA);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9jb2xvci1yZ2JhLmpzPzdlYmEiXSwibmFtZXMiOlsiY3JlYXRlRXZlbnRlZENvbG9yUkdCQUNsYXNzIiwiY29sb3JLZXl3b3JkcyIsIk1hcCIsInJnYlJlZ2V4IiwicmdiYVJlZ2V4IiwiaGV4UmVnZXgiLCJnZXRPcGFjaXR5IiwicGFja2VkUmdiYUNvbG9yIiwicGFja09wYWNpdHkiLCJvcGFjaXR5IiwiTWF0aCIsImZsb29yIiwiY2xhbXAwMSIsImdldFJHQkFTdHJpbmciLCJnZXRQYWNrZWRDb2xvclJHQkFGcm9tU3RyaW5nIiwiY29sb3IiLCJFcnJvciIsInBhY2tlZENvbG9yIiwibWF0Y2giLCJjbGFtcCIsIk51bWJlciIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsImhhcyIsImdldCIsIkNvbG9yUkdCQSIsImluaXRDb2xvclN0ciIsImFyZ3MiLCJpbml0aWFsaXplciIsIl9jb2xvciIsInZhbHVlIiwiY3Vyck9wYWNpdHkiLCJuZXdPcGFjaXR5IiwiZXZlbnROYW1lIiwiY29sb3JOYW1lIiwiZXZlbnRIYW5kbGVyIiwiX2V2ZW50SGFuZGxlciIsIm5ld1BhY2tlZENvbG9yIiwicHJldiIsInByZXZPcGFjaXR5IiwiZmlyZSIsImF0dHIiLCJwcmV2VmFsIiwiY3VyclZhbCIsInRtcGNvbG9yIiwiX2NoZWNrUGFja2VkQ29sb3JDaGFuZ2VkIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOzs7Ozs7Ozs7O1FBc1ZnQkEsMkIsR0FBQUEsMkI7O0FBcFZoQjs7Ozs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0EsSUFBTUMsZ0JBQWdCLElBQUlDLEdBQUosQ0FBUSxDQUFDLENBQUMsV0FBRCxFQUFjLFNBQWQsQ0FBRCxFQUNDLENBQUMsY0FBRCxFQUFpQixTQUFqQixDQURELEVBRUMsQ0FBQyxNQUFELEVBQVMsU0FBVCxDQUZELEVBR0MsQ0FBQyxZQUFELEVBQWUsU0FBZixDQUhELEVBSUMsQ0FBQyxPQUFELEVBQVUsU0FBVixDQUpE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OztBQXZFRjtBQUFBO0FBQUEsd0JBNkVrQlosV0E3RWxCLEVBNkUrQjtBQUMzQixZQUFJMkIsV0FBVyxDQUFmO0FBQ0FBLG9CQUFZM0IsV0FBWjtBQUNBLGFBQUs0Qix3QkFBTCxDQUE4QkQsUUFBOUI7QUFDQSxlQUFPLElBQVA7QUFDRDs7QUFFRDs7OztBQXBGRjtBQUFBLDBCQXdGb0I7QUFDaEIsZUFBTyxLQUFLZixNQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUE1RkY7QUFBQTtBQUFBLHdCQWtHY3BCLE9BbEdkLEVBa0d1QjtBQUNuQixZQUFJLE9BQU9BLE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0IsZ0JBQU0sSUFBSU8sS0FBSixDQUFVLHNDQUFWLENBQU47QUFDRDs7QUFFRCxZQUFNZSxjQUFjLEtBQUtGLE1BQUwsR0FBYyxJQUFsQztBQUNBLFlBQU1HLGFBQWF4QixZQUFZQyxPQUFaLENBQW5CO0FBQ0EsWUFBSXVCLGVBQWVELFdBQW5CLEVBQWdDO0FBQzlCLGVBQUtGLE1BQUwsSUFBZSxVQUFmO0FBQ0EsZUFBS0EsTUFBTCxJQUFlRyxVQUFmOztBQUVBLGVBQUtJLGFBQUwsQ0FBbUJJLElBQW5CLENBQXdCUCxTQUF4QixFQUFtQztBQUNqQ1Esa0JBQU0sU0FEMkI7QUFFakNDLHFCQUFTWCxjQUFjLEtBRlU7QUFHakNZLHFCQUFTWCxhQUFhO0FBSFcsV0FBbkM7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7O0FBdEhGO0FBQUEsMEJBMEhnQjtBQUNaLGVBQU8xQixXQUFXLEtBQUt1QixNQUFoQixDQUFQO0FBQ0Q7QUE1SEg7O0FBQUE7QUFBQSxJQUFzQ0osU0FBdEM7QUE4SEQiLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1tYWdpYy1udW1iZXJzICovXG5cInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcblxuLyoqXG4gKiBDb2xvciBrZXl3b3JkcyBhcyBkZWZpbmVkIGJ5IHRoZSBDU1MgY29sb3IgbW9kdWxlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2NvbG9yX3ZhbHVlfVxuICogQHR5cGUge01hcH1cbiAqL1xuY29uc3QgY29sb3JLZXl3b3JkcyA9IG5ldyBNYXAoW1tcImFsaWNlYmx1ZVwiLCBcIiNGMEY4RkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYW50aXF1ZXdoaXRlXCIsIFwiI0ZBRUJEN1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJhcXVhXCIsIFwiIzAwRkZGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJhcXVhbWFyaW5lXCIsIFwiIzdGRkZENFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJhenVyZVwiLCBcIiNGMEZGRkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYmVpZ2VcIiwgXCIjRjVGNURDXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImJpc3F1ZVwiLCBcIiNGRkU0QzRcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYmxhY2tcIiwgXCIjMDAwMDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImJsYW5jaGVkYWxtb25kXCIsIFwiI0ZGRUJDRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJibHVlXCIsIFwiIzAwMDBGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJibHVldmlvbGV0XCIsIFwiIzhBMkJFMlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJicm93blwiLCBcIiNBNTJBMkFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYnVybHl3b29kXCIsIFwiI0RFQjg4N1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJjYWRldGJsdWVcIiwgXCIjNUY5RUEwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImNoYXJ0cmV1c2VcIiwgXCIjN0ZGRjAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImNob2NvbGF0ZVwiLCBcIiNEMjY5MUVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiY29yYWxcIiwgXCIjRkY3RjUwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImNvcm5mbG93ZXJibHVlXCIsIFwiIzY0OTVFRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJjb3Juc2lsa1wiLCBcIiNGRkY4RENcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiY3JpbXNvblwiLCBcIiNEQzE0M0NcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiY3lhblwiLCBcIiMwMEZGRkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya2JsdWVcIiwgXCIjMDAwMDhCXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRhcmtjeWFuXCIsIFwiIzAwOEI4QlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrZ29sZGVucm9kXCIsIFwiI0I4ODYwQlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrZ3JheVwiLCBcIiNBOUE5QTlcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya2dyZWVuXCIsIFwiIzAwNjQwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJra2hha2lcIiwgXCIjQkRCNzZCXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRhcmttYWdlbnRhXCIsIFwiIzhCMDA4QlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrb2xpdmVncmVlblwiLCBcIiM1NTZCMkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya29yYW5nZVwiLCBcIiNGRjhDMDBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya29yY2hpZFwiLCBcIiM5OTMyQ0NcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya3JlZFwiLCBcIiM4QjAwMDBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya3NhbG1vblwiLCBcIiNFOTk2N0FcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya3NlYWdyZWVuXCIsIFwiIzhGQkM4RlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrc2xhdGVibHVlXCIsIFwiIzQ4M0Q4QlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrc2xhdGVncmF5XCIsIFwiIzJGNEY0RlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrdHVycXVvaXNlXCIsIFwiIzAwQ0VEMVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrdmlvbGV0XCIsIFwiIzk0MDBEM1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkZWVwcGlua1wiLCBcIiNGRjE0OTNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGVlcHNreWJsdWVcIiwgXCIjMDBCRkZGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRpbWdyYXlcIiwgXCIjNjk2OTY5XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRvZGdlcmJsdWVcIiwgXCIjMUU5MEZGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImZpcmVicmlja1wiLCBcIiNCMjIyMjJcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZmxvcmFsd2hpdGVcIiwgXCIjRkZGQUYwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImZvcmVzdGdyZWVuXCIsIFwiIzIyOEIyMlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJmdWNoc2lhXCIsIFwiI0ZGMDBGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJnYWluc2Jvcm9cIiwgXCIjRENEQ0RDXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdob3N0d2hpdGVcIiwgXCIjRjhGOEZGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdvbGRcIiwgXCIjRkZENzAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdvbGRlbnJvZFwiLCBcIiNEQUE1MjBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZ3JheVwiLCBcIiM4MDgwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZ3JlZW5cIiwgXCIjMDA4MDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdyZWVueWVsbG93XCIsIFwiI0FERkYyRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJob25leWRld1wiLCBcIiNGMEZGRjBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiaG90cGlua1wiLCBcIiNGRjY5QjRcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiaW5kaWFucmVkXCIsIFwiI0NENUM1Q1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJpbmRpZ29cIiwgXCIjNEIwMDgyXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIml2b3J5XCIsIFwiI0ZGRkZGMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJraGFraVwiLCBcIiNGMEU2OENcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGF2ZW5kZXJcIiwgXCIjRTZFNkZBXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxhdmVuZGVyYmx1c2hcIiwgXCIjRkZGMEY1XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxhd25ncmVlblwiLCBcIiM3Q0ZDMDBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGVtb25jaGlmZm9uXCIsIFwiI0ZGRkFDRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaWdodGJsdWVcIiwgXCIjQUREOEU2XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0Y29yYWxcIiwgXCIjRjA4MDgwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0Y3lhblwiLCBcIiNFMEZGRkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIiwgXCIjRkFGQUQyXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0Z3JheVwiLCBcIiNEM0QzRDNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRncmVlblwiLCBcIiM5MEVFOTBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRwaW5rXCIsIFwiI0ZGQjZDMVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaWdodHNhbG1vblwiLCBcIiNGRkEwN0FcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRzZWFncmVlblwiLCBcIiMyMEIyQUFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRza3libHVlXCIsIFwiIzg3Q0VGQVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaWdodHNsYXRlZ3JheVwiLCBcIiM3Nzg4OTlcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRzdGVlbGJsdWVcIiwgXCIjQjBDNERFXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0eWVsbG93XCIsIFwiI0ZGRkZFMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaW1lXCIsIFwiIzAwRkYwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaW1lZ3JlZW5cIiwgXCIjMzJDRDMyXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpbmVuXCIsIFwiI0ZBRjBFNlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtYWdlbnRhXCIsIFwiI0ZGMDBGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtYXJvb25cIiwgXCIjODAwMDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1lZGl1bWFxdWFtYXJpbmVcIiwgXCIjNjZDREFBXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1lZGl1bWJsdWVcIiwgXCIjMDAwMENEXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1lZGl1bW9yY2hpZFwiLCBcIiNCQTU1RDNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWVkaXVtcHVycGxlXCIsIFwiIzkzNzBEQlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtZWRpdW1zZWFncmVlblwiLCBcIiMzQ0IzNzFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWVkaXVtc2xhdGVibHVlXCIsIFwiIzdCNjhFRVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtZWRpdW1zcHJpbmdncmVlblwiLCBcIiMwMEZBOUFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWVkaXVtdHVycXVvaXNlXCIsIFwiIzQ4RDFDQ1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtZWRpdW12aW9sZXRyZWRcIiwgXCIjQzcxNTg1XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1pZG5pZ2h0Ymx1ZVwiLCBcIiMxOTE5NzBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWludGNyZWFtXCIsIFwiI0Y1RkZGQVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtaXN0eXJvc2VcIiwgXCIjRkZFNEUxXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1vY2Nhc2luXCIsIFwiI0ZGRTRCNVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJuYXZham93aGl0ZVwiLCBcIiNGRkRFQURcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibmF2eVwiLCBcIiMwMDAwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib2xkbGFjZVwiLCBcIiNGREY1RTZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib2xpdmVcIiwgXCIjODA4MDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm9saXZlZHJhYlwiLCBcIiM2QjhFMjNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib3JhbmdlXCIsIFwiI0ZGQTUwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJvcmFuZ2VyZWRcIiwgXCIjRkY0NTAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm9yY2hpZFwiLCBcIiNEQTcwRDZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicGFsZWdvbGRlbnJvZFwiLCBcIiNFRUU4QUFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicGFsZWdyZWVuXCIsIFwiIzk4RkI5OFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwYWxldHVycXVvaXNlXCIsIFwiI0FGRUVFRVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwYWxldmlvbGV0cmVkXCIsIFwiI0RCNzA5M1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwYXBheWF3aGlwXCIsIFwiI0ZGRUZENVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwZWFjaHB1ZmZcIiwgXCIjRkZEQUI5XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBlcnVcIiwgXCIjQ0Q4NTNGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBpbmtcIiwgXCIjRkZDMENCXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBsdW1cIiwgXCIjRERBMEREXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBvd2RlcmJsdWVcIiwgXCIjQjBFMEU2XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInB1cnBsZVwiLCBcIiM4MDAwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicmViZWNjYXB1cnBsZVwiLCBcIiM2NjMzOTlcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicmVkXCIsIFwiI0ZGMDAwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJyb3N5YnJvd25cIiwgXCIjQkM4RjhGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInJveWFsYmx1ZVwiLCBcIiM0MTY5RTFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2FkZGxlYnJvd25cIiwgXCIjOEI0NTEzXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNhbG1vblwiLCBcIiNGQTgwNzJcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2FuZHlicm93blwiLCBcIiNGNEE0NjBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2VhZ3JlZW5cIiwgXCIjMkU4QjU3XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNlYXNoZWxsXCIsIFwiI0ZGRjVFRVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJzaWVubmFcIiwgXCIjQTA1MjJEXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNpbHZlclwiLCBcIiNDMEMwQzBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2t5Ymx1ZVwiLCBcIiM4N0NFRUJcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2xhdGVibHVlXCIsIFwiIzZBNUFDRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJzbGF0ZWdyYXlcIiwgXCIjNzA4MDkwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNub3dcIiwgXCIjRkZGQUZBXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNwcmluZ2dyZWVuXCIsIFwiIzAwRkY3RlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJzdGVlbGJsdWVcIiwgXCIjNDY4MkI0XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInRhblwiLCBcIiNEMkI0OENcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1widGVhbFwiLCBcIiMwMDgwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1widGhpc3RsZVwiLCBcIiNEOEJGRDhcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1widG9tYXRvXCIsIFwiI0ZGNjM0N1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJ0dXJxdW9pc2VcIiwgXCIjNDBFMEQwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInZpb2xldFwiLCBcIiNFRTgyRUVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wid2hlYXRcIiwgXCIjRjVERUIzXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIndoaXRlXCIsIFwiI0ZGRkZGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJ3aGl0ZXNtb2tlXCIsIFwiI0Y1RjVGNVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJ5ZWxsb3dcIiwgXCIjRkZGRjAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInllbGxvd2dyZWVuXCIsIFwiIzlBQ0QzMlwiXV0pXG5cbi8qKlxuICogcmdiIHJlZ2V4IHRvIGhhbmRsZSBcInJnYihbMC0yNTVdLFswLTI1NV0sWzAtMjU1XSlcIiBjb2xvciBzdHJpbmdzXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCByZ2JSZWdleCA9IC9ecmdiXFxzKlxcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqXFwpXFxzKiQvaVxuXG4vKipcbiAqIHJnYmEgcmVnZXggdG8gaGFuZGxlIFwicmdiYShbMC0yNTVdLFswLTI1NV0sWzAtMjU1XSxbMC4wLTEuMF0pXCIgY29sb3Igc3RyaW5nc1xuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgcmdiYVJlZ2V4ID0gL15yZ2JhXFxzKlxcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooWzAsMV0oPzpcXC5cXGQqKT8pXFxzKlxcKVxccyokL2lcblxuLyoqXG4gKiBoZXggcmVnZXggdG8gaGFuZGxlIFwiI1swMC1GRl1bMDAtRkZdWzAwLUZGXVwiIGNvbG9yIHN0cmluZ3MuXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCBoZXhSZWdleCA9IC9eIyhbMC05LGEtZixBLUZdezJ9KShbMC05LGEtZixBLUZdezJ9KShbMC05LGEtZixBLUZdezJ9KVxccyokL2lcblxuLyoqXG4gKiBFeHRyYWN0cyBhbiBvcGFjaXR5IGZyb20gYW4gcmdiYSBjb2xvciBwYWNrZWQgaW50byBhIDMyLWJpdCBpbnRlZ2VyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHBhY2tlZFJnYmFDb2xvclxuICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICAgICAgICAgb3BhY2l0eSBleHRyYWN0ZWQgaW4gcmFuZ2Ugb2YgWzAsMV1cbiAqL1xuZnVuY3Rpb24gZ2V0T3BhY2l0eShwYWNrZWRSZ2JhQ29sb3IpIHtcbiAgcmV0dXJuIChwYWNrZWRSZ2JhQ29sb3IgJiAweEZGKSAvIDI1NS4wXG59XG5cbi8qKlxuICogcGFja3MgYW4gb3BhY2l0eSB2YWx1ZSBbMCwxXSBpbnRvIGFuIDgtYml0IGludGVnZXIgdG8gYmUgcGFja2VkXG4gKiBpbnRvIGEgMzItYml0IGludFxuICogQHBhcmFtICB7bnVtYmVyfSBvcGFjaXR5IFswLDFdXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgWzAsMjU1XVxuICovXG5mdW5jdGlvbiBwYWNrT3BhY2l0eShvcGFjaXR5KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGguY2xhbXAwMShvcGFjaXR5KSAqIDI1NSlcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbG9yIHBhY2tlZCBpbnRvIGEgMzItYml0IGludGVnZXIsIHJldHVybnMgYSBjc3Mtc3R5bGUgXCJyZ2JhKClcIiBzdHJpbmdcbiAqIEBwYXJhbSAge251bWJlcn0gcGFja2VkUmdiYUNvbG9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICBpbnQgdGhlIGZvcm0gXCJyZ2JhKFswLDI1NV0sWzAsMjU1XSxbMCwyNTVdLFswLDFdKVwiXG4gKi9cbmZ1bmN0aW9uIGdldFJHQkFTdHJpbmcocGFja2VkUmdiYUNvbG9yKSB7XG4gIHJldHVybiBgcmdiYSgkeyhwYWNrZWRSZ2JhQ29sb3IpID4+PiAyNH0sICR7KHBhY2tlZFJnYmFDb2xvciAmIDB4RkYwMDAwKSA+PiAxNn0sICR7KHBhY2tlZFJnYmFDb2xvciAmIDB4RkYwMCkgPj4gOH0sICR7Z2V0T3BhY2l0eShwYWNrZWRSZ2JhQ29sb3IpfSlgXG59XG5cbi8qKlxuICogR2l2ZW4gYW4gcmdiYSgpIGNvbG9yIHN0cmluZywgZXh0cmFjdHMgYSBudW1lcmljIGNvbG9yIHBhY2tlZCBpbnRvIGEgMzItYml0IGludFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2xvclxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRQYWNrZWRDb2xvclJHQkFGcm9tU3RyaW5nKGNvbG9yKSB7XG4gIGlmICh0eXBlb2YgY29sb3IgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29sb3J9IGlzIG5vdCBhIHZhbGlkIGNvbG9yIHN0cmluZ2ApXG4gIH1cblxuICBsZXQgcGFja2VkQ29sb3IgPSAwXG5cbiAgbGV0IG1hdGNoID0gbnVsbFxuICBpZiAoKG1hdGNoID0gY29sb3IubWF0Y2gocmdiUmVnZXgpKSkge1xuICAgIHBhY2tlZENvbG9yID0gMjU1IC8vIChmdWxseSBvcGFxdWUpXG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbM10sIDEwKSwgMCwgMjU1KSA8PCA4XG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKSwgMCwgMjU1KSA8PCAxNlxuICAgIHBhY2tlZENvbG9yIHw9IE1hdGguY2xhbXAoTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCksIDAsIDI1NSkgPDwgMjRcbiAgfSBlbHNlIGlmICgobWF0Y2ggPSBjb2xvci5tYXRjaChyZ2JhUmVnZXgpKSkge1xuICAgIHBhY2tlZENvbG9yID0gcGFja09wYWNpdHkoTnVtYmVyLnBhcnNlRmxvYXQobWF0Y2hbNF0sIDEwKSlcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFszXSwgMTApLCAwLCAyNTUpIDw8IDhcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFsyXSwgMTApLCAwLCAyNTUpIDw8IDE2XG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKSwgMCwgMjU1KSA8PCAyNFxuICB9IGVsc2UgaWYgKChtYXRjaCA9IGNvbG9yLm1hdGNoKGhleFJlZ2V4KSkpIHtcbiAgICBwYWNrZWRDb2xvciA9IDI1NSAvLyAoZnVsbHkgb3BhcXVlKVxuICAgIHBhY2tlZENvbG9yIHw9IE1hdGguY2xhbXAoTnVtYmVyLnBhcnNlSW50KG1hdGNoWzNdLCAxNiksIDAsIDI1NSkgPDwgOFxuICAgIHBhY2tlZENvbG9yIHw9IE1hdGguY2xhbXAoTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxNiksIDAsIDI1NSkgPDwgMTZcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTYpLCAwLCAyNTUpIDw8IDI0XG4gIH0gZWxzZSBpZiAoY29sb3JLZXl3b3Jkcy5oYXMoY29sb3IpKSB7XG4gICAgbWF0Y2ggPSBjb2xvcktleXdvcmRzLmdldChjb2xvcikubWF0Y2goaGV4UmVnZXgpXG4gICAgcGFja2VkQ29sb3IgPSAyNTUgLy8gKGZ1bGx5IG9wYXF1ZSlcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFszXSwgMTYpLCAwLCAyNTUpIDw8IDhcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFsyXSwgMTYpLCAwLCAyNTUpIDw8IDE2XG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDE2KSwgMCwgMjU1KSA8PCAyNFxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtjb2xvcn0gaXMgbm90IGEgdmFsaWQgY29sb3Igc3RyaW5nYClcbiAgfVxuXG4gIHJldHVybiBwYWNrZWRDb2xvclxufVxuXG4vKiogQGNsYXNzIG1hbmFnZXMgY29sb3JzIGluIHRoZSBSR0JBIGNvbG9yIHNwYWNlLiBDYW4gYWxzbyBiZSB1c2VkIGFzIGEgbWl4aW4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yUkdCQSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbG9yIGluIHRoZSBSR0JBIGNvbG9yIHNwYWNlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgaW5pdENvbG9yU3RyIGNvbG9yIHN0cmluZyBpbiB0aGUgZm9ybSBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBhIGNvbG9yIGtleXdvcmQgKGkuZS4gXCJyZWRcIilcbiAgICogQHBhcmFtICB7Li4ub2JqZWN0fSBhcmdzICAgICAgICAgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGluaXRpYWxpemVycy9jb25zdHJ1Y3RvcnNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBvciBtaXhpblxuICAgKiBAcmV0dXJuIHtDb2xvclJHQkF9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpbml0Q29sb3JTdHIsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLmluaXRpYWxpemVyKGluaXRDb2xvclN0ciwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplcyBhIGNvbG9yIGluIHRoZSBSR0JBIGNvbG9yIHNwYWNlIHVzaW5nIGEgY29sb3Igc3RyaW5nXG4gICAqIEBwYXJhbSAge3N0cmluZ30gaW5pdENvbG9yU3RyIGluaXRpYWxpemVyIHN0cmluZyBpbiB0aGUgZm9ybSBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBjb2xvciBrZXl3b3JkXG4gICAqL1xuICBpbml0aWFsaXplcihpbml0Q29sb3JTdHIpIHtcbiAgICB0aGlzLl9jb2xvciA9IDBcbiAgICBpZiAoaW5pdENvbG9yU3RyKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5pdENvbG9yU3RyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldHMgYWxsIHRoZSBjaGFubmVscyBvZiB0aGUgUkdCQSBjb2xvciBnaXZlbiBhIGNvbG9yIHN0cmluZ1xuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvbG9yIGNvbG9yIHN0cmluZyBpbiB0aGUgZm9ybSBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBjb2xvciBrZXl3b3JkXG4gICAqIEByZXR1cm4ge0NvbG9yUkdCQX1cbiAgICovXG4gIHNldCB2YWx1ZShjb2xvcikge1xuICAgIHRoaXMuX2NvbG9yID0gZ2V0UGFja2VkQ29sb3JSR0JBRnJvbVN0cmluZyhjb2xvcilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJnYmEgY29sb3IgYXMgYSBjb2xvciBzdHJpbmcgXCJyZ2JhKClcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJnYmEgY29sb3IgYXMgYSBzdHJpbmdcbiAgICovXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gZ2V0UkdCQVN0cmluZyh0aGlzLl9jb2xvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgUkdCQSBjb2xvciBwYWNrZWQgYXMgYSAzMi1iaXQgaW50XG4gICAqIEBwYXJhbSAge251bWJlcn0gcGFja2VkQ29sb3JcbiAgICogQHJldHVybiB7Q29sb3JSR0JBfVxuICAgKi9cbiAgc2V0IHBhY2tlZFZhbHVlKHBhY2tlZENvbG9yKSB7XG4gICAgdGhpcy5fY29sb3IgPSAwXG4gICAgdGhpcy5fY29sb3IgfD0gcGFja2VkQ29sb3JcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFJHQkEgY29sb3IgYXMgYSBwYWNrZWQgMzItYml0IGludFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFja2VkVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yXG4gIH1cblxuICAvKipcbiAgICogc2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgUkdCQSBjb2xvciAobW9kaWZpZXMgYWxwaGEgY2hhbm5lbCBvbmx5KVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IG9wYWNpdHkgWzAsMV1cbiAgICogQHJldHVybiB7Q29sb3JSR0JBfVxuICAgKi9cbiAgc2V0IG9wYWNpdHkob3BhY2l0eSkge1xuICAgIGlmICh0eXBlb2Ygb3BhY2l0eSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3BhY2l0eSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMC0xXCIpXG4gICAgfVxuXG4gICAgY29uc3QgY3Vyck9wYWNpdHkgPSB0aGlzLl9jb2xvciAmIDB4RkZcbiAgICBjb25zdCBuZXdPcGFjaXR5ID0gcGFja09wYWNpdHkob3BhY2l0eSlcbiAgICBpZiAobmV3T3BhY2l0eSAhPT0gY3Vyck9wYWNpdHkpIHtcbiAgICAgIHRoaXMuX2NvbG9yICY9IDB4RkZGRkZGMDBcbiAgICAgIHRoaXMuX2NvbG9yIHw9IG5ld09wYWNpdHlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IG9wYWNpdHkgKGFscGhhIGNoYW5uZWwpIG9mIHRoZSBSR0JBIGNvbG9yXG4gICAqIEByZXR1cm4ge251bWJlcn0gWzAsMV1cbiAgICovXG4gIGdldCBvcGFjaXR5KCkge1xuICAgIHJldHVybiBnZXRPcGFjaXR5KHRoaXMuX2NvbG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGFjaXR5IG9mIHRoZSByZ2JhIGNvbG9yIDwgMVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNUcmFuc3BhcmVudCgpIHtcbiAgICByZXR1cm4gZ2V0T3BhY2l0eSh0aGlzLl9jb2xvcikgPCAxLjBcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29sb3IgUkdCQSBjbGFzcyB0aGF0IGZpcmVzIGV2ZW50cyB3aGVuZXZlciB0aGUgY29sb3JcbiAqIGlzIGNoYW5nZWQgZXh0ZXJuYWxseVxuICogQHBhcmFtICB7c3RyaW5nfSBldmVudE5hbWUgRXZlbnQgdHlwZSB0byBmaXJlIHdoZW4gY29sb3IgaXMgbW9kaWZpZWRcbiAqIEBwYXJhbSAge3N0cmluZ30gY29sb3JOYW1lIE5hbWUgb2YgdGhlIGNvbG9yIGF0dHJpYnV0ZS4gVGhpcyBzdHJpbmcgaXMgdXNlZCBpbiB0aGUgZXZlbnQgb2JqZWN0IGZpcmVkXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gICAgICAgICBOZXcgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50ZWRDb2xvclJHQkFDbGFzcyhldmVudE5hbWUsIGNvbG9yTmFtZSkge1xuXG4gIC8qKlxuICAgKiBAY2xhc3MgTmV3IHJnYmEgY29sb3IgY2xhc3MgdGhhdCBmaXJlcyBldmVudHMgd2hlbiBtb2RpZmllZFxuICAgKiBAZXh0ZW5kcyB7Q29sb3JSR0JBfVxuICAgKi9cbiAgcmV0dXJuIGNsYXNzIEV2ZW50ZWRDb2xvclJHQkEgZXh0ZW5kcyBDb2xvclJHQkEge1xuICAgIC8qKlxuICAgICAqIENvbG9yIG1vZGlmaWNhdGlvbiBldmVudFxuICAgICAqIEBldmVudCBFdmVudGVkQ29sb3IjY2hhbmdlZFxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHIgTmFtZSBvZiB0aGUgYXR0cmlidXRlIG1vZGlmaWVkXG4gICAgICogQHByb3BlcnR5IHt9IHByZXZWYWwgUHJldmlvdXMgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBwcmlvciB0byBtb2RpZmljYXRpb25cbiAgICAgKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgZXZlbnRlZCBjb2xvclxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gaW5pdENvbG9yU3RyIGluaXRpYWwgY29sb3IgYXMgc3RyaW5nXG4gICAgICogQHBhcmFtICB7RXZlbnRIYW5kbGVyfSBldmVudEhhbmRsZXIgRXZlbnQgaGFuZGxlciBpbnN0YW5jZSB1c2VkIHRvIG1hbmFnZSB0aGUgY29sb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb24gZXZlbnRzXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGluaXRpYWxpemVyKGluaXRDb2xvclN0ciwgZXZlbnRIYW5kbGVyKSB7XG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXJcbiAgICAgIHN1cGVyLmluaXRpYWxpemVyKGluaXRDb2xvclN0cilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgbW9kaWZpY2F0aW9uIG9mIHRoZSByZ2JhIGNvbG9yLCBhbmQgaWYgbW9kaWZpZWQsIGZpcmVzXG4gICAgICogbW9kaWZpY2F0aW9uIGV2ZW50c1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gbmV3UGFja2VkQ29sb3IgQ29sb3IgZGVmaW5lZCBieSBhIDMyLWJpdCBpbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jaGVja1BhY2tlZENvbG9yQ2hhbmdlZChuZXdQYWNrZWRDb2xvcikge1xuICAgICAgaWYgKG5ld1BhY2tlZENvbG9yICE9PSB0aGlzLl9jb2xvcikge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fY29sb3JcbiAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBnZXRPcGFjaXR5KHByZXYpXG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSBnZXRPcGFjaXR5KG5ld1BhY2tlZENvbG9yKVxuICAgICAgICB0aGlzLl9jb2xvciA9IG5ld1BhY2tlZENvbG9yXG5cbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogY29sb3JOYW1lLFxuICAgICAgICAgIHByZXZWYWw6IGdldFJHQkFTdHJpbmcocHJldiksXG4gICAgICAgICAgY3VyclZhbDogZ2V0UkdCQVN0cmluZyh0aGlzLl9jb2xvcilcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAob3BhY2l0eSAhPT0gcHJldk9wYWNpdHkpIHtcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGF0dHI6IFwib3BhY2l0eVwiLFxuICAgICAgICAgICAgcHJldlZhbDogcHJldk9wYWNpdHksXG4gICAgICAgICAgICBjdXJyVmFsOiBvcGFjaXR5XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgYWxsIHRoZSBjaGFubmVscyBvZiB0aGUgUkdCQSBjb2xvciBmcm9tIGEgY29sb3Igc3RyaW5nXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBjb2xvciBjb2xvciBzdHJpbmcgaW4gdGhlIGZvcm0gXCJyZ2IoKVwiLCBcInJnYmEoKVwiLCBcIiMuLi4uLi5cIiwgb3IgY29sb3Iga2V5d29yZFxuICAgICAqIEBmaXJlcyAgRXZlbnRlZENvbG9yI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtDb2xvclJHQkF9XG4gICAgICovXG4gICAgc2V0IHZhbHVlKGNvbG9yKSB7XG4gICAgICBjb25zdCB0bXBjb2xvciA9IGdldFBhY2tlZENvbG9yUkdCQUZyb21TdHJpbmcoY29sb3IpXG4gICAgICB0aGlzLl9jaGVja1BhY2tlZENvbG9yQ2hhbmdlZCh0bXBjb2xvcilcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmdiYSBjb2xvciBhcyBhIGNvbG9yIHN0cmluZyBcInJnYmEoKVwiXG4gICAgICogQHJldHVybiB7c3RyaW5nfSByZ2JhIGNvbG9yIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgcmV0dXJuIGdldFJHQkFTdHJpbmcodGhpcy5fY29sb3IpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIFJHQkEgY29sb3IgcGFja2VkIGFzIGEgMzItYml0IGludFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gcGFja2VkQ29sb3JcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRDb2xvciNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7Q29sb3JSR0JBfVxuICAgICAqL1xuICAgIHNldCBwYWNrZWRWYWx1ZShwYWNrZWRDb2xvcikge1xuICAgICAgbGV0IHRtcGNvbG9yID0gMFxuICAgICAgdG1wY29sb3IgfD0gcGFja2VkQ29sb3JcbiAgICAgIHRoaXMuX2NoZWNrUGFja2VkQ29sb3JDaGFuZ2VkKHRtcGNvbG9yKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSR0JBIGNvbG9yIGFzIGEgcGFja2VkIDMyLWJpdCBpbnRcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHBhY2tlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgUkdCQSBjb2xvciAobW9kaWZpZXMgYWxwaGEgY2hhbm5lbCBvbmx5KVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gb3BhY2l0eSBbMCwxXVxuICAgICAqIEBmaXJlcyAgRXZlbnRlZENvbG9yI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtDb2xvclJHQkF9XG4gICAgICovXG4gICAgc2V0IG9wYWNpdHkob3BhY2l0eSkge1xuICAgICAgaWYgKHR5cGVvZiBvcGFjaXR5ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wYWNpdHkgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAtMVwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyT3BhY2l0eSA9IHRoaXMuX2NvbG9yICYgMHhGRlxuICAgICAgY29uc3QgbmV3T3BhY2l0eSA9IHBhY2tPcGFjaXR5KG9wYWNpdHkpXG4gICAgICBpZiAobmV3T3BhY2l0eSAhPT0gY3Vyck9wYWNpdHkpIHtcbiAgICAgICAgdGhpcy5fY29sb3IgJj0gMHhGRkZGRkYwMFxuICAgICAgICB0aGlzLl9jb2xvciB8PSBuZXdPcGFjaXR5XG5cbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJvcGFjaXR5XCIsXG4gICAgICAgICAgcHJldlZhbDogY3Vyck9wYWNpdHkgLyAyNTUuMCxcbiAgICAgICAgICBjdXJyVmFsOiBuZXdPcGFjaXR5IC8gMjU1LjBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBvcGFjaXR5IChhbHBoYSBjaGFubmVsKSBvZiB0aGUgUkdCQSBjb2xvclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gWzAsMV1cbiAgICAgKi9cbiAgICBnZXQgb3BhY2l0eSgpIHtcbiAgICAgIHJldHVybiBnZXRPcGFjaXR5KHRoaXMuX2NvbG9yKVxuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3R5bGUvY29sb3ItcmdiYS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 17 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.createEventedColorRGBAClass = createEventedColorRGBAClass;\n\nvar _math = __webpack_require__(6);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Color keywords as defined by the CSS color modules\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/color_value}\n * @type {Map}\n */\nvar colorKeywords = new Map([[\"aliceblue\", \"#F0F8FF\"], [\"antiquewhite\", \"#FAEBD7\"], [\"aqua\", \"#00FFFF\"], [\"aquamarine\", \"#7FFFD4\"], [\"azure\", \"#F0FFFF\"], [\"beige\", \"#F5F5DC\"], [\"bisque\", \"#FFE4C4\"], [\"black\", \"#000000\"], [\"blanchedalmond\", \"#FFEBCD\"], [\"blue\", \"#0000FF\"], [\"blueviolet\", \"#8A2BE2\"], [\"brown\", \"#A52A2A\"], [\"burlywood\", \"#DEB887\"], [\"cadetblue\", \"#5F9EA0\"], [\"chartreuse\", \"#7FFF00\"], [\"chocolate\", \"#D2691E\"], [\"coral\", \"#FF7F50\"], [\"cornflowerblue\", \"#6495ED\"], [\"cornsilk\", \"#FFF8DC\"], [\"crimson\", \"#DC143C\"], [\"cyan\", \"#00FFFF\"], [\"darkblue\", \"#00008B\"], [\"darkcyan\", \"#008B8B\"], [\"darkgoldenrod\", \"#B8860B\"], [\"darkgray\", \"#A9A9A9\"], [\"darkgreen\", \"#006400\"], [\"darkkhaki\", \"#BDB76B\"], [\"darkmagenta\", \"#8B008B\"], [\"darkolivegreen\", \"#556B2F\"], [\"darkorange\", \"#FF8C00\"], [\"darkorchid\", \"#9932CC\"], [\"darkred\", \"#8B0000\"], [\"darksalmon\", \"#E9967A\"], [\"darkseagreen\", \"#8FBC8F\"], [\"darkslateblue\", \"#483D8B\"], [\"darkslategray\", \"#2F4F4F\"], [\"darkturquoise\", \"#00CED1\"], [\"darkviolet\", \"#9400D3\"], [\"deeppink\", \"#FF1493\"], [\"deepskyblue\", \"#00BFFF\"], [\"dimgray\", \"#696969\"], [\"dodgerblue\", \"#1E90FF\"], [\"firebrick\", \"#B22222\"], [\"floralwhite\", \"#FFFAF0\"], [\"forestgreen\", \"#228B22\"], [\"fuchsia\", \"#FF00FF\"], [\"gainsboro\", \"#DCDCDC\"], [\"ghostwhite\", \"#F8F8FF\"], [\"gold\", \"#FFD700\"], [\"goldenrod\", \"#DAA520\"], [\"gray\", \"#808080\"], [\"green\", \"#008000\"], [\"greenyellow\", \"#ADFF2F\"], [\"honeydew\", \"#F0FFF0\"], [\"hotpink\", \"#FF69B4\"], [\"indianred\", \"#CD5C5C\"], [\"indigo\", \"#4B0082\"], [\"ivory\", \"#FFFFF0\"], [\"khaki\", \"#F0E68C\"], [\"lavender\", \"#E6E6FA\"], [\"lavenderblush\", \"#FFF0F5\"], [\"lawngreen\", \"#7CFC00\"], [\"lemonchiffon\", \"#FFFACD\"], [\"lightblue\", \"#ADD8E6\"], [\"lightcoral\", \"#F08080\"], [\"lightcyan\", \"#E0FFFF\"], [\"lightgoldenrodyellow\", \"#FAFAD2\"], [\"lightgray\", \"#D3D3D3\"], [\"lightgreen\", \"#90EE90\"], [\"lightpink\", \"#FFB6C1\"], [\"lightsalmon\", \"#FFA07A\"], [\"lightseagreen\", \"#20B2AA\"], [\"lightskyblue\", \"#87CEFA\"], [\"lightslategray\", \"#778899\"], [\"lightsteelblue\", \"#B0C4DE\"], [\"lightyellow\", \"#FFFFE0\"], [\"lime\", \"#00FF00\"], [\"limegreen\", \"#32CD32\"], [\"linen\", \"#FAF0E6\"], [\"magenta\", \"#FF00FF\"], [\"maroon\", \"#800000\"], [\"mediumaquamarine\", \"#66CDAA\"], [\"mediumblue\", \"#0000CD\"], [\"mediumorchid\", \"#BA55D3\"], [\"mediumpurple\", \"#9370DB\"], [\"mediumseagreen\", \"#3CB371\"], [\"mediumslateblue\", \"#7B68EE\"], [\"mediumspringgreen\", \"#00FA9A\"], [\"mediumturquoise\", \"#48D1CC\"], [\"mediumvioletred\", \"#C71585\"], [\"midnightblue\", \"#191970\"], [\"mintcream\", \"#F5FFFA\"], [\"mistyrose\", \"#FFE4E1\"], [\"moccasin\", \"#FFE4B5\"], [\"navajowhite\", \"#FFDEAD\"], [\"navy\", \"#000080\"], [\"oldlace\", \"#FDF5E6\"], [\"olive\", \"#808000\"], [\"olivedrab\", \"#6B8E23\"], [\"orange\", \"#FFA500\"], [\"orangered\", \"#FF4500\"], [\"orchid\", \"#DA70D6\"], [\"palegoldenrod\", \"#EEE8AA\"], [\"palegreen\", \"#98FB98\"], [\"paleturquoise\", \"#AFEEEE\"], [\"palevioletred\", \"#DB7093\"], [\"papayawhip\", \"#FFEFD5\"], [\"peachpuff\", \"#FFDAB9\"], [\"peru\", \"#CD853F\"], [\"pink\", \"#FFC0CB\"], [\"plum\", \"#DDA0DD\"], [\"powderblue\", \"#B0E0E6\"], [\"purple\", \"#800080\"], [\"rebeccapurple\", \"#663399\"], [\"red\", \"#FF0000\"], [\"rosybrown\", \"#BC8F8F\"], [\"royalblue\", \"#4169E1\"], [\"saddlebrown\", \"#8B4513\"], [\"salmon\", \"#FA8072\"], [\"sandybrown\", \"#F4A460\"], [\"seagreen\", \"#2E8B57\"], [\"seashell\", \"#FFF5EE\"], [\"sienna\", \"#A0522D\"], [\"silver\", \"#C0C0C0\"], [\"skyblue\", \"#87CEEB\"], [\"slateblue\", \"#6A5ACD\"], [\"slategray\", \"#708090\"], [\"snow\", \"#FFFAFA\"], [\"springgreen\", \"#00FF7F\"], [\"steelblue\", \"#4682B4\"], [\"tan\", \"#D2B48C\"], [\"teal\", \"#008080\"], [\"thistle\", \"#D8BFD8\"], [\"tomato\", \"#FF6347\"], [\"turquoise\", \"#40E0D0\"], [\"violet\", \"#EE82EE\"], [\"wheat\", \"#F5DEB3\"], [\"white\", \"#FFFFFF\"], [\"whitesmoke\", \"#F5F5F5\"], [\"yellow\", \"#FFFF00\"], [\"yellowgreen\", \"#9ACD32\"]]);\n\n/**\n * rgb regex to handle \"rgb([0-255],[0-255],[0-255])\" color strings\n * @type {RegExp}\n */\nvar rgbRegex = /^rgb\\s*\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)\\s*$/i;\n\n/**\n * rgba regex to handle \"rgba([0-255],[0-255],[0-255],[0.0-1.0])\" color strings\n * @type {RegExp}\n */\nvar rgbaRegex = /^rgba\\s*\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*([0,1](?:\\.\\d*)?)\\s*\\)\\s*$/i;\n\n/**\n * hex regex to handle \"#[00-FF][00-FF][00-FF]\" color strings.\n * @type {RegExp}\n */\nvar hexRegex = /^#([0-9,a-f,A-F]{2})([0-9,a-f,A-F]{2})([0-9,a-f,A-F]{2})\\s*$/i;\n\n/**\n * Extracts an opacity from an rgba color packed into a 32-bit integer\n * @param {number} packedRgbaColor\n * @return {number} opacity extracted in range of [0,1]\n */\nfunction getOpacity(packedRgbaColor) {\n return (packedRgbaColor & 0xFF) / 255.0;\n}\n\n/**\n * packs an opacity value [0,1] into an 8-bit integer to be packed\n * into a 32-bit int\n * @param {number} opacity [0,1]\n * @return {number} [0,255]\n */\nfunction packOpacity(opacity) {\n return _math2.default.floor(_math2.default.clamp01(opacity) * 255);\n}\n\n/**\n * Given a color packed into a 32-bit integer, returns a css-style \"rgba()\" string\n * @param {number} packedRgbaColor\n * @return {string} int the form \"rgba([0,255],[0,255],[0,255],[0,1])\"\n */\nfunction getRGBAString(packedRgbaColor) {\n return \"rgba(\" + (packedRgbaColor >>> 24) + \", \" + ((packedRgbaColor & 0xFF0000) >> 16) + \", \" + ((packedRgbaColor & 0xFF00) >> 8) + \", \" + getOpacity(packedRgbaColor) + \")\";\n}\n\n/**\n * Given an rgba() color string, extracts a numeric color packed into a 32-bit int\n * @param {string} color\n * @return {number}\n */\nfunction getPackedColorRGBAFromString(color) {\n if (typeof color !== \"string\") {\n throw new Error(color + \" is not a valid color string\");\n }\n\n var packedColor = 0;\n\n var match = null;\n if (match = color.match(rgbRegex)) {\n packedColor = 255; // (fully opaque)\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 10), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 10), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 10), 0, 255) << 24;\n } else if (match = color.match(rgbaRegex)) {\n packedColor = packOpacity(Number.parseFloat(match[4], 10));\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 10), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 10), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 10), 0, 255) << 24;\n } else if (match = color.match(hexRegex)) {\n packedColor = 255; // (fully opaque)\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 16), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 16), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 16), 0, 255) << 24;\n } else if (colorKeywords.has(color)) {\n match = colorKeywords.get(color).match(hexRegex);\n packedColor = 255; // (fully opaque)\n packedColor |= _math2.default.clamp(Number.parseInt(match[3], 16), 0, 255) << 8;\n packedColor |= _math2.default.clamp(Number.parseInt(match[2], 16), 0, 255) << 16;\n packedColor |= _math2.default.clamp(Number.parseInt(match[1], 16), 0, 255) << 24;\n } else {\n throw new Error(color + \" is not a valid color string\");\n }\n\n return packedColor;\n}\n\n/** @class manages colors in the RGBA color space. Can also be used as a mixin */\n\nvar ColorRGBA = function () {\n /**\n * Creates a new color in the RGBA color space\n * @param {string} initColorStr color string in the form \"rgb()\", \"rgba()\", \"#......\", or a color keyword (i.e. \"red\")\n * @param {...object} args Additional arguments that may be passed to other initializers/constructors\n * if this class is used as a base class or mixin\n * @return {ColorRGBA}\n */\n function ColorRGBA(initColorStr) {\n _classCallCheck(this, ColorRGBA);\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n this.initializer.apply(this, [initColorStr].concat(args));\n }\n\n /**\n * initializes a color in the RGBA color space using a color string\n * @param {string} initColorStr initializer string in the form \"rgb()\", \"rgba()\", \"#......\", or color keyword\n */\n\n\n _createClass(ColorRGBA, [{\n key: \"initializer\",\n value: function initializer(initColorStr) {\n this._color = 0;\n if (initColorStr) {\n this.value = initColorStr;\n }\n }\n\n /**\n * sets all the channels of the RGBA color given a color string\n * @param {string} color color string in the form \"rgb()\", \"rgba()\", \"#......\", or color keyword\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"isTransparent\",\n\n\n /**\n * Returns true if the current opacity of the rgba color < 1\n * @return {Boolean}\n */\n value: function isTransparent() {\n return getOpacity(this._color) < 1.0;\n }\n }, {\n key: \"value\",\n set: function set(color) {\n this._color = getPackedColorRGBAFromString(color);\n return this;\n }\n\n /**\n * Gets the rgba color as a color string \"rgba()\"\n * @return {string} rgba color as a string\n */\n ,\n get: function get() {\n return getRGBAString(this._color);\n }\n\n /**\n * Sets the value of the RGBA color packed as a 32-bit int\n * @param {number} packedColor\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"packedValue\",\n set: function set(packedColor) {\n this._color = 0;\n this._color |= packedColor;\n return this;\n }\n\n /**\n * Gets the current value of the RGBA color as a packed 32-bit int\n * @return {number}\n */\n ,\n get: function get() {\n return this._color;\n }\n\n /**\n * sets the opacity of the RGBA color (modifies alpha channel only)\n * @param {number} opacity [0,1]\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"opacity\",\n set: function set(opacity) {\n if (typeof opacity !== \"number\") {\n throw new Error(\"Opacity must be a number between 0-1\");\n }\n\n var currOpacity = this._color & 0xFF;\n var newOpacity = packOpacity(opacity);\n if (newOpacity !== currOpacity) {\n this._color &= 0xFFFFFF00;\n this._color |= newOpacity;\n }\n return this;\n }\n\n /**\n * Gets the current opacity (alpha channel) of the RGBA color\n * @return {number} [0,1]\n */\n ,\n get: function get() {\n return getOpacity(this._color);\n }\n }]);\n\n return ColorRGBA;\n}();\n\n/**\n * Creates a new color RGBA class that fires events whenever the color\n * is changed externally\n * @param {string} eventName Event type to fire when color is modified\n * @param {string} colorName Name of the color attribute. This string is used in the event object fired\n * @return {function} New class constructor function\n */\n\n\nexports.default = ColorRGBA;\nfunction createEventedColorRGBAClass(eventName, colorName) {\n\n /**\n * @class New rgba color class that fires events when modified\n * @extends {ColorRGBA}\n */\n return function (_ColorRGBA) {\n _inherits(EventedColorRGBA, _ColorRGBA);\n\n function EventedColorRGBA() {\n _classCallCheck(this, EventedColorRGBA);\n\n return _possibleConstructorReturn(this, (EventedColorRGBA.__proto__ || Object.getPrototypeOf(EventedColorRGBA)).apply(this, arguments));\n }\n\n _createClass(EventedColorRGBA, [{\n key: \"initializer\",\n\n /**\n * Color modification event\n * @event EventedColor#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n /**\n * Initializes the evented color\n * @param {string} initColorStr initial color as string\n * @param {EventHandler} eventHandler Event handler instance used to manage the color\n * modification events\n * @protected\n */\n value: function initializer(initColorStr, eventHandler) {\n this._eventHandler = eventHandler;\n _get(EventedColorRGBA.prototype.__proto__ || Object.getPrototypeOf(EventedColorRGBA.prototype), \"initializer\", this).call(this, initColorStr);\n }\n\n /**\n * Validates modification of the rgba color, and if modified, fires\n * modification events\n * @param {number} newPackedColor Color defined by a 32-bit int\n * @private\n */\n\n }, {\n key: \"_checkPackedColorChanged\",\n value: function _checkPackedColorChanged(newPackedColor) {\n if (newPackedColor !== this._color) {\n var prev = this._color;\n var prevOpacity = getOpacity(prev);\n var opacity = getOpacity(newPackedColor);\n this._color = newPackedColor;\n\n this._eventHandler.fire(eventName, {\n attr: colorName,\n prevVal: getRGBAString(prev),\n currVal: getRGBAString(this._color)\n });\n\n if (opacity !== prevOpacity) {\n this._eventHandler.fire(eventName, {\n attr: \"opacity\",\n prevVal: prevOpacity,\n currVal: opacity\n });\n }\n }\n }\n\n /**\n * sets all the channels of the RGBA color from a color string\n * @param {string} color color string in the form \"rgb()\", \"rgba()\", \"#......\", or color keyword\n * @fires EventedColor#changed\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"value\",\n set: function set(color) {\n var tmpcolor = getPackedColorRGBAFromString(color);\n this._checkPackedColorChanged(tmpcolor);\n return this;\n }\n\n /**\n * Gets the rgba color as a color string \"rgba()\"\n * @return {string} rgba color as a string\n */\n ,\n get: function get() {\n return getRGBAString(this._color);\n }\n\n /**\n * Sets the value of the RGBA color packed as a 32-bit int\n * @param {number} packedColor\n * @fires EventedColor#changed\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"packedValue\",\n set: function set(packedColor) {\n var tmpcolor = 0;\n tmpcolor |= packedColor;\n this._checkPackedColorChanged(tmpcolor);\n return this;\n }\n\n /**\n * Gets the current value of the RGBA color as a packed 32-bit int\n * @return {number}\n */\n ,\n get: function get() {\n return this._color;\n }\n\n /**\n * sets the opacity of the RGBA color (modifies alpha channel only)\n * @param {number} opacity [0,1]\n * @fires EventedColor#changed\n * @return {ColorRGBA}\n */\n\n }, {\n key: \"opacity\",\n set: function set(opacity) {\n if (typeof opacity !== \"number\") {\n throw new Error(\"Opacity must be a number between 0-1\");\n }\n\n var currOpacity = this._color & 0xFF;\n var newOpacity = packOpacity(opacity);\n if (newOpacity !== currOpacity) {\n this._color &= 0xFFFFFF00;\n this._color |= newOpacity;\n\n this._eventHandler.fire(eventName, {\n attr: \"opacity\",\n prevVal: currOpacity / 255.0,\n currVal: newOpacity / 255.0\n });\n }\n return this;\n }\n\n /**\n * Gets the current opacity (alpha channel) of the RGBA color\n * @return {number} [0,1]\n */\n ,\n get: function get() {\n return getOpacity(this._color);\n }\n }]);\n\n return EventedColorRGBA;\n }(ColorRGBA);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9jb2xvci1yZ2JhLmpzPzdlYmEiXSwibmFtZXMiOlsiY3JlYXRlRXZlbnRlZENvbG9yUkdCQUNsYXNzIiwiY29sb3JLZXl3b3JkcyIsIk1hcCIsInJnYlJlZ2V4IiwicmdiYVJlZ2V4IiwiaGV4UmVnZXgiLCJnZXRPcGFjaXR5IiwicGFja2VkUmdiYUNvbG9yIiwicGFja09wYWNpdHkiLCJvcGFjaXR5IiwiZmxvb3IiLCJjbGFtcDAxIiwiZ2V0UkdCQVN0cmluZyIsImdldFBhY2tlZENvbG9yUkdCQUZyb21TdHJpbmciLCJjb2xvciIsIkVycm9yIiwicGFja2VkQ29sb3IiLCJtYXRjaCIsImNsYW1wIiwiTnVtYmVyIiwicGFyc2VJbnQiLCJwYXJzZUZsb2F0IiwiaGFzIiwiZ2V0IiwiQ29sb3JSR0JBIiwiaW5pdENvbG9yU3RyIiwiYXJncyIsImluaXRpYWxpemVyIiwiX2NvbG9yIiwidmFsdWUiLCJjdXJyT3BhY2l0eSIsIm5ld09wYWNpdHkiLCJldmVudE5hbWUiLCJjb2xvck5hbWUiLCJldmVudEhhbmRsZXIiLCJfZXZlbnRIYW5kbGVyIiwibmV3UGFja2VkQ29sb3IiLCJwcmV2IiwicHJldk9wYWNpdHkiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIiwidG1wY29sb3IiLCJfY2hlY2tQYWNrZWRDb2xvckNoYW5nZWQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Ozs7Ozs7Ozs7UUFzVmdCQSwyQixHQUFBQSwyQjs7QUFwVmhCOzs7Ozs7Ozs7Ozs7QUFFQTs7Ozs7QUFLQSxJQUFNQyxnQkFBZ0IsSUFBSUMsR0FBSixDQUFRLENBQUMsQ0FBQyxXQUFELEVBQWMsU0FBZCxDQUFELEVBQ0MsQ0FBQyxjQUFELEVBQWlCLFNBQWpCLENBREQsRUFFQyxDQUFDLE1BQUQsRUFBUyxTQUFULENBRkQsRUFHQyxDQUFDLFlBQUQsRUFBZSxTQUFmLENBSEQsRUFJQyxDQUFDLE9BQUQsRUFBVSxTQUFWLENBSkQsRUFLQyxD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NkVrQlosV0E3RWxCLEVBNkUrQjtBQUMzQixZQUFJMkIsV0FBVyxDQUFmO0FBQ0FBLG9CQUFZM0IsV0FBWjtBQUNBLGFBQUs0Qix3QkFBTCxDQUE4QkQsUUFBOUI7QUFDQSxlQUFPLElBQVA7QUFDRDs7QUFFRDs7OztBQXBGRjtBQUFBLDBCQXdGb0I7QUFDaEIsZUFBTyxLQUFLZixNQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUE1RkY7QUFBQTtBQUFBLHdCQWtHY25CLE9BbEdkLEVBa0d1QjtBQUNuQixZQUFJLE9BQU9BLE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0IsZ0JBQU0sSUFBSU0sS0FBSixDQUFVLHNDQUFWLENBQU47QUFDRDs7QUFFRCxZQUFNZSxjQUFjLEtBQUtGLE1BQUwsR0FBYyxJQUFsQztBQUNBLFlBQU1HLGFBQWF2QixZQUFZQyxPQUFaLENBQW5CO0FBQ0EsWUFBSXNCLGVBQWVELFdBQW5CLEVBQWdDO0FBQzlCLGVBQUtGLE1BQUwsSUFBZSxVQUFmO0FBQ0EsZUFBS0EsTUFBTCxJQUFlRyxVQUFmOztBQUVBLGVBQUtJLGFBQUwsQ0FBbUJJLElBQW5CLENBQXdCUCxTQUF4QixFQUFtQztBQUNqQ1Esa0JBQU0sU0FEMkI7QUFFakNDLHFCQUFTWCxjQUFjLEtBRlU7QUFHakNZLHFCQUFTWCxhQUFhO0FBSFcsV0FBbkM7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7O0FBdEhGO0FBQUEsMEJBMEhnQjtBQUNaLGVBQU96QixXQUFXLEtBQUtzQixNQUFoQixDQUFQO0FBQ0Q7QUE1SEg7O0FBQUE7QUFBQSxJQUFzQ0osU0FBdEM7QUE4SEQiLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1tYWdpYy1udW1iZXJzICovXG5cInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcblxuLyoqXG4gKiBDb2xvciBrZXl3b3JkcyBhcyBkZWZpbmVkIGJ5IHRoZSBDU1MgY29sb3IgbW9kdWxlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2NvbG9yX3ZhbHVlfVxuICogQHR5cGUge01hcH1cbiAqL1xuY29uc3QgY29sb3JLZXl3b3JkcyA9IG5ldyBNYXAoW1tcImFsaWNlYmx1ZVwiLCBcIiNGMEY4RkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYW50aXF1ZXdoaXRlXCIsIFwiI0ZBRUJEN1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJhcXVhXCIsIFwiIzAwRkZGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJhcXVhbWFyaW5lXCIsIFwiIzdGRkZENFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJhenVyZVwiLCBcIiNGMEZGRkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYmVpZ2VcIiwgXCIjRjVGNURDXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImJpc3F1ZVwiLCBcIiNGRkU0QzRcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYmxhY2tcIiwgXCIjMDAwMDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImJsYW5jaGVkYWxtb25kXCIsIFwiI0ZGRUJDRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJibHVlXCIsIFwiIzAwMDBGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJibHVldmlvbGV0XCIsIFwiIzhBMkJFMlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJicm93blwiLCBcIiNBNTJBMkFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiYnVybHl3b29kXCIsIFwiI0RFQjg4N1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJjYWRldGJsdWVcIiwgXCIjNUY5RUEwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImNoYXJ0cmV1c2VcIiwgXCIjN0ZGRjAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImNob2NvbGF0ZVwiLCBcIiNEMjY5MUVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiY29yYWxcIiwgXCIjRkY3RjUwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImNvcm5mbG93ZXJibHVlXCIsIFwiIzY0OTVFRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJjb3Juc2lsa1wiLCBcIiNGRkY4RENcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiY3JpbXNvblwiLCBcIiNEQzE0M0NcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiY3lhblwiLCBcIiMwMEZGRkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya2JsdWVcIiwgXCIjMDAwMDhCXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRhcmtjeWFuXCIsIFwiIzAwOEI4QlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrZ29sZGVucm9kXCIsIFwiI0I4ODYwQlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrZ3JheVwiLCBcIiNBOUE5QTlcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya2dyZWVuXCIsIFwiIzAwNjQwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJra2hha2lcIiwgXCIjQkRCNzZCXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRhcmttYWdlbnRhXCIsIFwiIzhCMDA4QlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrb2xpdmVncmVlblwiLCBcIiM1NTZCMkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya29yYW5nZVwiLCBcIiNGRjhDMDBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya29yY2hpZFwiLCBcIiM5OTMyQ0NcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya3JlZFwiLCBcIiM4QjAwMDBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya3NhbG1vblwiLCBcIiNFOTk2N0FcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGFya3NlYWdyZWVuXCIsIFwiIzhGQkM4RlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrc2xhdGVibHVlXCIsIFwiIzQ4M0Q4QlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrc2xhdGVncmF5XCIsIFwiIzJGNEY0RlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrdHVycXVvaXNlXCIsIFwiIzAwQ0VEMVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkYXJrdmlvbGV0XCIsIFwiIzk0MDBEM1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJkZWVwcGlua1wiLCBcIiNGRjE0OTNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZGVlcHNreWJsdWVcIiwgXCIjMDBCRkZGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRpbWdyYXlcIiwgXCIjNjk2OTY5XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImRvZGdlcmJsdWVcIiwgXCIjMUU5MEZGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImZpcmVicmlja1wiLCBcIiNCMjIyMjJcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZmxvcmFsd2hpdGVcIiwgXCIjRkZGQUYwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImZvcmVzdGdyZWVuXCIsIFwiIzIyOEIyMlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJmdWNoc2lhXCIsIFwiI0ZGMDBGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJnYWluc2Jvcm9cIiwgXCIjRENEQ0RDXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdob3N0d2hpdGVcIiwgXCIjRjhGOEZGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdvbGRcIiwgXCIjRkZENzAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdvbGRlbnJvZFwiLCBcIiNEQUE1MjBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZ3JheVwiLCBcIiM4MDgwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiZ3JlZW5cIiwgXCIjMDA4MDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImdyZWVueWVsbG93XCIsIFwiI0FERkYyRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJob25leWRld1wiLCBcIiNGMEZGRjBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiaG90cGlua1wiLCBcIiNGRjY5QjRcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiaW5kaWFucmVkXCIsIFwiI0NENUM1Q1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJpbmRpZ29cIiwgXCIjNEIwMDgyXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIml2b3J5XCIsIFwiI0ZGRkZGMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJraGFraVwiLCBcIiNGMEU2OENcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGF2ZW5kZXJcIiwgXCIjRTZFNkZBXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxhdmVuZGVyYmx1c2hcIiwgXCIjRkZGMEY1XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxhd25ncmVlblwiLCBcIiM3Q0ZDMDBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGVtb25jaGlmZm9uXCIsIFwiI0ZGRkFDRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaWdodGJsdWVcIiwgXCIjQUREOEU2XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0Y29yYWxcIiwgXCIjRjA4MDgwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0Y3lhblwiLCBcIiNFMEZGRkZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIiwgXCIjRkFGQUQyXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0Z3JheVwiLCBcIiNEM0QzRDNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRncmVlblwiLCBcIiM5MEVFOTBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRwaW5rXCIsIFwiI0ZGQjZDMVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaWdodHNhbG1vblwiLCBcIiNGRkEwN0FcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRzZWFncmVlblwiLCBcIiMyMEIyQUFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRza3libHVlXCIsIFwiIzg3Q0VGQVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaWdodHNsYXRlZ3JheVwiLCBcIiM3Nzg4OTlcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibGlnaHRzdGVlbGJsdWVcIiwgXCIjQjBDNERFXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpZ2h0eWVsbG93XCIsIFwiI0ZGRkZFMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaW1lXCIsIFwiIzAwRkYwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJsaW1lZ3JlZW5cIiwgXCIjMzJDRDMyXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcImxpbmVuXCIsIFwiI0ZBRjBFNlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtYWdlbnRhXCIsIFwiI0ZGMDBGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtYXJvb25cIiwgXCIjODAwMDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1lZGl1bWFxdWFtYXJpbmVcIiwgXCIjNjZDREFBXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1lZGl1bWJsdWVcIiwgXCIjMDAwMENEXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1lZGl1bW9yY2hpZFwiLCBcIiNCQTU1RDNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWVkaXVtcHVycGxlXCIsIFwiIzkzNzBEQlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtZWRpdW1zZWFncmVlblwiLCBcIiMzQ0IzNzFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWVkaXVtc2xhdGVibHVlXCIsIFwiIzdCNjhFRVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtZWRpdW1zcHJpbmdncmVlblwiLCBcIiMwMEZBOUFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWVkaXVtdHVycXVvaXNlXCIsIFwiIzQ4RDFDQ1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtZWRpdW12aW9sZXRyZWRcIiwgXCIjQzcxNTg1XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1pZG5pZ2h0Ymx1ZVwiLCBcIiMxOTE5NzBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibWludGNyZWFtXCIsIFwiI0Y1RkZGQVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJtaXN0eXJvc2VcIiwgXCIjRkZFNEUxXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm1vY2Nhc2luXCIsIFwiI0ZGRTRCNVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJuYXZham93aGl0ZVwiLCBcIiNGRkRFQURcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wibmF2eVwiLCBcIiMwMDAwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib2xkbGFjZVwiLCBcIiNGREY1RTZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib2xpdmVcIiwgXCIjODA4MDAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm9saXZlZHJhYlwiLCBcIiM2QjhFMjNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib3JhbmdlXCIsIFwiI0ZGQTUwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJvcmFuZ2VyZWRcIiwgXCIjRkY0NTAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm9yY2hpZFwiLCBcIiNEQTcwRDZcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicGFsZWdvbGRlbnJvZFwiLCBcIiNFRUU4QUFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicGFsZWdyZWVuXCIsIFwiIzk4RkI5OFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwYWxldHVycXVvaXNlXCIsIFwiI0FGRUVFRVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwYWxldmlvbGV0cmVkXCIsIFwiI0RCNzA5M1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwYXBheWF3aGlwXCIsIFwiI0ZGRUZENVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJwZWFjaHB1ZmZcIiwgXCIjRkZEQUI5XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBlcnVcIiwgXCIjQ0Q4NTNGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBpbmtcIiwgXCIjRkZDMENCXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBsdW1cIiwgXCIjRERBMEREXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInBvd2RlcmJsdWVcIiwgXCIjQjBFMEU2XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInB1cnBsZVwiLCBcIiM4MDAwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicmViZWNjYXB1cnBsZVwiLCBcIiM2NjMzOTlcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicmVkXCIsIFwiI0ZGMDAwMFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJyb3N5YnJvd25cIiwgXCIjQkM4RjhGXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInJveWFsYmx1ZVwiLCBcIiM0MTY5RTFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2FkZGxlYnJvd25cIiwgXCIjOEI0NTEzXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNhbG1vblwiLCBcIiNGQTgwNzJcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2FuZHlicm93blwiLCBcIiNGNEE0NjBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2VhZ3JlZW5cIiwgXCIjMkU4QjU3XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNlYXNoZWxsXCIsIFwiI0ZGRjVFRVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJzaWVubmFcIiwgXCIjQTA1MjJEXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNpbHZlclwiLCBcIiNDMEMwQzBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2t5Ymx1ZVwiLCBcIiM4N0NFRUJcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wic2xhdGVibHVlXCIsIFwiIzZBNUFDRFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJzbGF0ZWdyYXlcIiwgXCIjNzA4MDkwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNub3dcIiwgXCIjRkZGQUZBXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInNwcmluZ2dyZWVuXCIsIFwiIzAwRkY3RlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJzdGVlbGJsdWVcIiwgXCIjNDY4MkI0XCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInRhblwiLCBcIiNEMkI0OENcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1widGVhbFwiLCBcIiMwMDgwODBcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1widGhpc3RsZVwiLCBcIiNEOEJGRDhcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1widG9tYXRvXCIsIFwiI0ZGNjM0N1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJ0dXJxdW9pc2VcIiwgXCIjNDBFMEQwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInZpb2xldFwiLCBcIiNFRTgyRUVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wid2hlYXRcIiwgXCIjRjVERUIzXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIndoaXRlXCIsIFwiI0ZGRkZGRlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJ3aGl0ZXNtb2tlXCIsIFwiI0Y1RjVGNVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJ5ZWxsb3dcIiwgXCIjRkZGRjAwXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcInllbGxvd2dyZWVuXCIsIFwiIzlBQ0QzMlwiXV0pXG5cbi8qKlxuICogcmdiIHJlZ2V4IHRvIGhhbmRsZSBcInJnYihbMC0yNTVdLFswLTI1NV0sWzAtMjU1XSlcIiBjb2xvciBzdHJpbmdzXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCByZ2JSZWdleCA9IC9ecmdiXFxzKlxcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqXFwpXFxzKiQvaVxuXG4vKipcbiAqIHJnYmEgcmVnZXggdG8gaGFuZGxlIFwicmdiYShbMC0yNTVdLFswLTI1NV0sWzAtMjU1XSxbMC4wLTEuMF0pXCIgY29sb3Igc3RyaW5nc1xuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgcmdiYVJlZ2V4ID0gL15yZ2JhXFxzKlxcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooWzAsMV0oPzpcXC5cXGQqKT8pXFxzKlxcKVxccyokL2lcblxuLyoqXG4gKiBoZXggcmVnZXggdG8gaGFuZGxlIFwiI1swMC1GRl1bMDAtRkZdWzAwLUZGXVwiIGNvbG9yIHN0cmluZ3MuXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCBoZXhSZWdleCA9IC9eIyhbMC05LGEtZixBLUZdezJ9KShbMC05LGEtZixBLUZdezJ9KShbMC05LGEtZixBLUZdezJ9KVxccyokL2lcblxuLyoqXG4gKiBFeHRyYWN0cyBhbiBvcGFjaXR5IGZyb20gYW4gcmdiYSBjb2xvciBwYWNrZWQgaW50byBhIDMyLWJpdCBpbnRlZ2VyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHBhY2tlZFJnYmFDb2xvclxuICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICAgICAgICAgb3BhY2l0eSBleHRyYWN0ZWQgaW4gcmFuZ2Ugb2YgWzAsMV1cbiAqL1xuZnVuY3Rpb24gZ2V0T3BhY2l0eShwYWNrZWRSZ2JhQ29sb3IpIHtcbiAgcmV0dXJuIChwYWNrZWRSZ2JhQ29sb3IgJiAweEZGKSAvIDI1NS4wXG59XG5cbi8qKlxuICogcGFja3MgYW4gb3BhY2l0eSB2YWx1ZSBbMCwxXSBpbnRvIGFuIDgtYml0IGludGVnZXIgdG8gYmUgcGFja2VkXG4gKiBpbnRvIGEgMzItYml0IGludFxuICogQHBhcmFtICB7bnVtYmVyfSBvcGFjaXR5IFswLDFdXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgWzAsMjU1XVxuICovXG5mdW5jdGlvbiBwYWNrT3BhY2l0eShvcGFjaXR5KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGguY2xhbXAwMShvcGFjaXR5KSAqIDI1NSlcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbG9yIHBhY2tlZCBpbnRvIGEgMzItYml0IGludGVnZXIsIHJldHVybnMgYSBjc3Mtc3R5bGUgXCJyZ2JhKClcIiBzdHJpbmdcbiAqIEBwYXJhbSAge251bWJlcn0gcGFja2VkUmdiYUNvbG9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICBpbnQgdGhlIGZvcm0gXCJyZ2JhKFswLDI1NV0sWzAsMjU1XSxbMCwyNTVdLFswLDFdKVwiXG4gKi9cbmZ1bmN0aW9uIGdldFJHQkFTdHJpbmcocGFja2VkUmdiYUNvbG9yKSB7XG4gIHJldHVybiBgcmdiYSgkeyhwYWNrZWRSZ2JhQ29sb3IpID4+PiAyNH0sICR7KHBhY2tlZFJnYmFDb2xvciAmIDB4RkYwMDAwKSA+PiAxNn0sICR7KHBhY2tlZFJnYmFDb2xvciAmIDB4RkYwMCkgPj4gOH0sICR7Z2V0T3BhY2l0eShwYWNrZWRSZ2JhQ29sb3IpfSlgXG59XG5cbi8qKlxuICogR2l2ZW4gYW4gcmdiYSgpIGNvbG9yIHN0cmluZywgZXh0cmFjdHMgYSBudW1lcmljIGNvbG9yIHBhY2tlZCBpbnRvIGEgMzItYml0IGludFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2xvclxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRQYWNrZWRDb2xvclJHQkFGcm9tU3RyaW5nKGNvbG9yKSB7XG4gIGlmICh0eXBlb2YgY29sb3IgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29sb3J9IGlzIG5vdCBhIHZhbGlkIGNvbG9yIHN0cmluZ2ApXG4gIH1cblxuICBsZXQgcGFja2VkQ29sb3IgPSAwXG5cbiAgbGV0IG1hdGNoID0gbnVsbFxuICBpZiAoKG1hdGNoID0gY29sb3IubWF0Y2gocmdiUmVnZXgpKSkge1xuICAgIHBhY2tlZENvbG9yID0gMjU1IC8vIChmdWxseSBvcGFxdWUpXG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbM10sIDEwKSwgMCwgMjU1KSA8PCA4XG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKSwgMCwgMjU1KSA8PCAxNlxuICAgIHBhY2tlZENvbG9yIHw9IE1hdGguY2xhbXAoTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCksIDAsIDI1NSkgPDwgMjRcbiAgfSBlbHNlIGlmICgobWF0Y2ggPSBjb2xvci5tYXRjaChyZ2JhUmVnZXgpKSkge1xuICAgIHBhY2tlZENvbG9yID0gcGFja09wYWNpdHkoTnVtYmVyLnBhcnNlRmxvYXQobWF0Y2hbNF0sIDEwKSlcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFszXSwgMTApLCAwLCAyNTUpIDw8IDhcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFsyXSwgMTApLCAwLCAyNTUpIDw8IDE2XG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKSwgMCwgMjU1KSA8PCAyNFxuICB9IGVsc2UgaWYgKChtYXRjaCA9IGNvbG9yLm1hdGNoKGhleFJlZ2V4KSkpIHtcbiAgICBwYWNrZWRDb2xvciA9IDI1NSAvLyAoZnVsbHkgb3BhcXVlKVxuICAgIHBhY2tlZENvbG9yIHw9IE1hdGguY2xhbXAoTnVtYmVyLnBhcnNlSW50KG1hdGNoWzNdLCAxNiksIDAsIDI1NSkgPDwgOFxuICAgIHBhY2tlZENvbG9yIHw9IE1hdGguY2xhbXAoTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxNiksIDAsIDI1NSkgPDwgMTZcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTYpLCAwLCAyNTUpIDw8IDI0XG4gIH0gZWxzZSBpZiAoY29sb3JLZXl3b3Jkcy5oYXMoY29sb3IpKSB7XG4gICAgbWF0Y2ggPSBjb2xvcktleXdvcmRzLmdldChjb2xvcikubWF0Y2goaGV4UmVnZXgpXG4gICAgcGFja2VkQ29sb3IgPSAyNTUgLy8gKGZ1bGx5IG9wYXF1ZSlcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFszXSwgMTYpLCAwLCAyNTUpIDw8IDhcbiAgICBwYWNrZWRDb2xvciB8PSBNYXRoLmNsYW1wKE51bWJlci5wYXJzZUludChtYXRjaFsyXSwgMTYpLCAwLCAyNTUpIDw8IDE2XG4gICAgcGFja2VkQ29sb3IgfD0gTWF0aC5jbGFtcChOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDE2KSwgMCwgMjU1KSA8PCAyNFxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtjb2xvcn0gaXMgbm90IGEgdmFsaWQgY29sb3Igc3RyaW5nYClcbiAgfVxuXG4gIHJldHVybiBwYWNrZWRDb2xvclxufVxuXG4vKiogQGNsYXNzIG1hbmFnZXMgY29sb3JzIGluIHRoZSBSR0JBIGNvbG9yIHNwYWNlLiBDYW4gYWxzbyBiZSB1c2VkIGFzIGEgbWl4aW4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yUkdCQSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbG9yIGluIHRoZSBSR0JBIGNvbG9yIHNwYWNlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgaW5pdENvbG9yU3RyIGNvbG9yIHN0cmluZyBpbiB0aGUgZm9ybSBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBhIGNvbG9yIGtleXdvcmQgKGkuZS4gXCJyZWRcIilcbiAgICogQHBhcmFtICB7Li4ub2JqZWN0fSBhcmdzICAgICAgICAgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGluaXRpYWxpemVycy9jb25zdHJ1Y3RvcnNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBvciBtaXhpblxuICAgKiBAcmV0dXJuIHtDb2xvclJHQkF9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpbml0Q29sb3JTdHIsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLmluaXRpYWxpemVyKGluaXRDb2xvclN0ciwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplcyBhIGNvbG9yIGluIHRoZSBSR0JBIGNvbG9yIHNwYWNlIHVzaW5nIGEgY29sb3Igc3RyaW5nXG4gICAqIEBwYXJhbSAge3N0cmluZ30gaW5pdENvbG9yU3RyIGluaXRpYWxpemVyIHN0cmluZyBpbiB0aGUgZm9ybSBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBjb2xvciBrZXl3b3JkXG4gICAqL1xuICBpbml0aWFsaXplcihpbml0Q29sb3JTdHIpIHtcbiAgICB0aGlzLl9jb2xvciA9IDBcbiAgICBpZiAoaW5pdENvbG9yU3RyKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5pdENvbG9yU3RyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldHMgYWxsIHRoZSBjaGFubmVscyBvZiB0aGUgUkdCQSBjb2xvciBnaXZlbiBhIGNvbG9yIHN0cmluZ1xuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvbG9yIGNvbG9yIHN0cmluZyBpbiB0aGUgZm9ybSBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBjb2xvciBrZXl3b3JkXG4gICAqIEByZXR1cm4ge0NvbG9yUkdCQX1cbiAgICovXG4gIHNldCB2YWx1ZShjb2xvcikge1xuICAgIHRoaXMuX2NvbG9yID0gZ2V0UGFja2VkQ29sb3JSR0JBRnJvbVN0cmluZyhjb2xvcilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJnYmEgY29sb3IgYXMgYSBjb2xvciBzdHJpbmcgXCJyZ2JhKClcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJnYmEgY29sb3IgYXMgYSBzdHJpbmdcbiAgICovXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gZ2V0UkdCQVN0cmluZyh0aGlzLl9jb2xvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgUkdCQSBjb2xvciBwYWNrZWQgYXMgYSAzMi1iaXQgaW50XG4gICAqIEBwYXJhbSAge251bWJlcn0gcGFja2VkQ29sb3JcbiAgICogQHJldHVybiB7Q29sb3JSR0JBfVxuICAgKi9cbiAgc2V0IHBhY2tlZFZhbHVlKHBhY2tlZENvbG9yKSB7XG4gICAgdGhpcy5fY29sb3IgPSAwXG4gICAgdGhpcy5fY29sb3IgfD0gcGFja2VkQ29sb3JcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFJHQkEgY29sb3IgYXMgYSBwYWNrZWQgMzItYml0IGludFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFja2VkVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yXG4gIH1cblxuICAvKipcbiAgICogc2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgUkdCQSBjb2xvciAobW9kaWZpZXMgYWxwaGEgY2hhbm5lbCBvbmx5KVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IG9wYWNpdHkgWzAsMV1cbiAgICogQHJldHVybiB7Q29sb3JSR0JBfVxuICAgKi9cbiAgc2V0IG9wYWNpdHkob3BhY2l0eSkge1xuICAgIGlmICh0eXBlb2Ygb3BhY2l0eSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3BhY2l0eSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMC0xXCIpXG4gICAgfVxuXG4gICAgY29uc3QgY3Vyck9wYWNpdHkgPSB0aGlzLl9jb2xvciAmIDB4RkZcbiAgICBjb25zdCBuZXdPcGFjaXR5ID0gcGFja09wYWNpdHkob3BhY2l0eSlcbiAgICBpZiAobmV3T3BhY2l0eSAhPT0gY3Vyck9wYWNpdHkpIHtcbiAgICAgIHRoaXMuX2NvbG9yICY9IDB4RkZGRkZGMDBcbiAgICAgIHRoaXMuX2NvbG9yIHw9IG5ld09wYWNpdHlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IG9wYWNpdHkgKGFscGhhIGNoYW5uZWwpIG9mIHRoZSBSR0JBIGNvbG9yXG4gICAqIEByZXR1cm4ge251bWJlcn0gWzAsMV1cbiAgICovXG4gIGdldCBvcGFjaXR5KCkge1xuICAgIHJldHVybiBnZXRPcGFjaXR5KHRoaXMuX2NvbG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGFjaXR5IG9mIHRoZSByZ2JhIGNvbG9yIDwgMVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNUcmFuc3BhcmVudCgpIHtcbiAgICByZXR1cm4gZ2V0T3BhY2l0eSh0aGlzLl9jb2xvcikgPCAxLjBcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29sb3IgUkdCQSBjbGFzcyB0aGF0IGZpcmVzIGV2ZW50cyB3aGVuZXZlciB0aGUgY29sb3JcbiAqIGlzIGNoYW5nZWQgZXh0ZXJuYWxseVxuICogQHBhcmFtICB7c3RyaW5nfSBldmVudE5hbWUgRXZlbnQgdHlwZSB0byBmaXJlIHdoZW4gY29sb3IgaXMgbW9kaWZpZWRcbiAqIEBwYXJhbSAge3N0cmluZ30gY29sb3JOYW1lIE5hbWUgb2YgdGhlIGNvbG9yIGF0dHJpYnV0ZS4gVGhpcyBzdHJpbmcgaXMgdXNlZCBpbiB0aGUgZXZlbnQgb2JqZWN0IGZpcmVkXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gICAgICAgICBOZXcgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50ZWRDb2xvclJHQkFDbGFzcyhldmVudE5hbWUsIGNvbG9yTmFtZSkge1xuXG4gIC8qKlxuICAgKiBAY2xhc3MgTmV3IHJnYmEgY29sb3IgY2xhc3MgdGhhdCBmaXJlcyBldmVudHMgd2hlbiBtb2RpZmllZFxuICAgKiBAZXh0ZW5kcyB7Q29sb3JSR0JBfVxuICAgKi9cbiAgcmV0dXJuIGNsYXNzIEV2ZW50ZWRDb2xvclJHQkEgZXh0ZW5kcyBDb2xvclJHQkEge1xuICAgIC8qKlxuICAgICAqIENvbG9yIG1vZGlmaWNhdGlvbiBldmVudFxuICAgICAqIEBldmVudCBFdmVudGVkQ29sb3IjY2hhbmdlZFxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHIgTmFtZSBvZiB0aGUgYXR0cmlidXRlIG1vZGlmaWVkXG4gICAgICogQHByb3BlcnR5IHt9IHByZXZWYWwgUHJldmlvdXMgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBwcmlvciB0byBtb2RpZmljYXRpb25cbiAgICAgKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgZXZlbnRlZCBjb2xvclxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gaW5pdENvbG9yU3RyIGluaXRpYWwgY29sb3IgYXMgc3RyaW5nXG4gICAgICogQHBhcmFtICB7RXZlbnRIYW5kbGVyfSBldmVudEhhbmRsZXIgRXZlbnQgaGFuZGxlciBpbnN0YW5jZSB1c2VkIHRvIG1hbmFnZSB0aGUgY29sb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb24gZXZlbnRzXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGluaXRpYWxpemVyKGluaXRDb2xvclN0ciwgZXZlbnRIYW5kbGVyKSB7XG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXJcbiAgICAgIHN1cGVyLmluaXRpYWxpemVyKGluaXRDb2xvclN0cilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgbW9kaWZpY2F0aW9uIG9mIHRoZSByZ2JhIGNvbG9yLCBhbmQgaWYgbW9kaWZpZWQsIGZpcmVzXG4gICAgICogbW9kaWZpY2F0aW9uIGV2ZW50c1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gbmV3UGFja2VkQ29sb3IgQ29sb3IgZGVmaW5lZCBieSBhIDMyLWJpdCBpbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jaGVja1BhY2tlZENvbG9yQ2hhbmdlZChuZXdQYWNrZWRDb2xvcikge1xuICAgICAgaWYgKG5ld1BhY2tlZENvbG9yICE9PSB0aGlzLl9jb2xvcikge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fY29sb3JcbiAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBnZXRPcGFjaXR5KHByZXYpXG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSBnZXRPcGFjaXR5KG5ld1BhY2tlZENvbG9yKVxuICAgICAgICB0aGlzLl9jb2xvciA9IG5ld1BhY2tlZENvbG9yXG5cbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogY29sb3JOYW1lLFxuICAgICAgICAgIHByZXZWYWw6IGdldFJHQkFTdHJpbmcocHJldiksXG4gICAgICAgICAgY3VyclZhbDogZ2V0UkdCQVN0cmluZyh0aGlzLl9jb2xvcilcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAob3BhY2l0eSAhPT0gcHJldk9wYWNpdHkpIHtcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGF0dHI6IFwib3BhY2l0eVwiLFxuICAgICAgICAgICAgcHJldlZhbDogcHJldk9wYWNpdHksXG4gICAgICAgICAgICBjdXJyVmFsOiBvcGFjaXR5XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgYWxsIHRoZSBjaGFubmVscyBvZiB0aGUgUkdCQSBjb2xvciBmcm9tIGEgY29sb3Igc3RyaW5nXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBjb2xvciBjb2xvciBzdHJpbmcgaW4gdGhlIGZvcm0gXCJyZ2IoKVwiLCBcInJnYmEoKVwiLCBcIiMuLi4uLi5cIiwgb3IgY29sb3Iga2V5d29yZFxuICAgICAqIEBmaXJlcyAgRXZlbnRlZENvbG9yI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtDb2xvclJHQkF9XG4gICAgICovXG4gICAgc2V0IHZhbHVlKGNvbG9yKSB7XG4gICAgICBjb25zdCB0bXBjb2xvciA9IGdldFBhY2tlZENvbG9yUkdCQUZyb21TdHJpbmcoY29sb3IpXG4gICAgICB0aGlzLl9jaGVja1BhY2tlZENvbG9yQ2hhbmdlZCh0bXBjb2xvcilcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmdiYSBjb2xvciBhcyBhIGNvbG9yIHN0cmluZyBcInJnYmEoKVwiXG4gICAgICogQHJldHVybiB7c3RyaW5nfSByZ2JhIGNvbG9yIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgcmV0dXJuIGdldFJHQkFTdHJpbmcodGhpcy5fY29sb3IpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIFJHQkEgY29sb3IgcGFja2VkIGFzIGEgMzItYml0IGludFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gcGFja2VkQ29sb3JcbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRDb2xvciNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7Q29sb3JSR0JBfVxuICAgICAqL1xuICAgIHNldCBwYWNrZWRWYWx1ZShwYWNrZWRDb2xvcikge1xuICAgICAgbGV0IHRtcGNvbG9yID0gMFxuICAgICAgdG1wY29sb3IgfD0gcGFja2VkQ29sb3JcbiAgICAgIHRoaXMuX2NoZWNrUGFja2VkQ29sb3JDaGFuZ2VkKHRtcGNvbG9yKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSR0JBIGNvbG9yIGFzIGEgcGFja2VkIDMyLWJpdCBpbnRcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHBhY2tlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgUkdCQSBjb2xvciAobW9kaWZpZXMgYWxwaGEgY2hhbm5lbCBvbmx5KVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gb3BhY2l0eSBbMCwxXVxuICAgICAqIEBmaXJlcyAgRXZlbnRlZENvbG9yI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtDb2xvclJHQkF9XG4gICAgICovXG4gICAgc2V0IG9wYWNpdHkob3BhY2l0eSkge1xuICAgICAgaWYgKHR5cGVvZiBvcGFjaXR5ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wYWNpdHkgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAtMVwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyT3BhY2l0eSA9IHRoaXMuX2NvbG9yICYgMHhGRlxuICAgICAgY29uc3QgbmV3T3BhY2l0eSA9IHBhY2tPcGFjaXR5KG9wYWNpdHkpXG4gICAgICBpZiAobmV3T3BhY2l0eSAhPT0gY3Vyck9wYWNpdHkpIHtcbiAgICAgICAgdGhpcy5fY29sb3IgJj0gMHhGRkZGRkYwMFxuICAgICAgICB0aGlzLl9jb2xvciB8PSBuZXdPcGFjaXR5XG5cbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJvcGFjaXR5XCIsXG4gICAgICAgICAgcHJldlZhbDogY3Vyck9wYWNpdHkgLyAyNTUuMCxcbiAgICAgICAgICBjdXJyVmFsOiBuZXdPcGFjaXR5IC8gMjU1LjBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBvcGFjaXR5IChhbHBoYSBjaGFubmVsKSBvZiB0aGUgUkdCQSBjb2xvclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gWzAsMV1cbiAgICAgKi9cbiAgICBnZXQgb3BhY2l0eSgpIHtcbiAgICAgIHJldHVybiBnZXRPcGFjaXR5KHRoaXMuX2NvbG9yKVxuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3R5bGUvY29sb3ItcmdiYS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.createEventedFillStyleMixin = createEventedFillStyleMixin;\n\nvar _colorRgba = __webpack_require__(16);\n\nvar _colorRgba2 = _interopRequireDefault(_colorRgba);\n\nvar _aggregation = __webpack_require__(7);\n\nvar _aggregation2 = _interopRequireDefault(_aggregation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {object} FillStyleOptions\n * @property {string} [fillColor=\"black\"] Fill color defined as a string\n * @property {number} [fillOpacity=1] Opacity of the fill color. This supersedes any opacity inherent in fillColor\n */\n\n/**\n * Manages the fill style of a 2d rendering context. Can be used as a mixin or base class\n * @class\n * @mixin\n */\nvar FillStyle = function () {\n /**\n * Creates a new fill style object\n * @param {FillStyleOptions} [opts]\n * @return {FillStyle}\n */\n function FillStyle(opts) {\n _classCallCheck(this, FillStyle);\n\n // TODO(croot): support gradients and patterns\n this.initializer(opts);\n }\n\n /**\n * initializes the fill style object from an options object\n * @param {FillStyleOptions} [opts]\n * @private\n */\n\n\n _createClass(FillStyle, [{\n key: \"_initFillStyleFromOptions\",\n value: function _initFillStyleFromOptions(opts) {\n if (opts) {\n if (typeof opts.fillColor !== \"undefined\") {\n this.fillColor = opts.fillColor;\n }\n if (typeof opts.fillOpacity !== \"undefined\") {\n this.fillOpacity = opts.fillOpacity;\n }\n }\n }\n\n /**\n * Initializer method to initialize a fill style. Used for both initializing\n * via base-class and mixin hierarchy.\n * @param {FillStyleOptions} [opts]\n */\n\n }, {\n key: \"initializer\",\n value: function initializer(opts) {\n this._fillColor = new _colorRgba2.default(\"black\");\n this._initFillStyleFromOptions(opts);\n }\n\n /**\n * Sets the fill color\n * @param {string} fillColor Color as a string, \"rgb()\", \"rgba()\", \"#......\", or a color keyword (i.e. \"black\")\n * @return {FillStyle}\n */\n\n }, {\n key: \"isFillVisible\",\n\n\n /**\n * Returns true if the fill style is visible, i.e. it has an opacity > 0\n * @return {Boolean}\n */\n value: function isFillVisible() {\n return this._fillColor.opacity > 0;\n }\n\n /**\n * Returns true if the fill style is transparent in any way, i.e. opacity < 1\n * @return {Boolean}\n */\n\n }, {\n key: \"isTransparent\",\n value: function isTransparent() {\n return this._fillColor.isTransparent();\n }\n\n /**\n * Sets the fill style state of a 2d rendering context\n * @param {CanvasRenderingContext2D} ctx\n */\n\n }, {\n key: \"setFillCtx\",\n value: function setFillCtx(ctx) {\n ctx.fillStyle = this.fillColor;\n }\n\n /**\n * Copies the properties of one fill style to another\n * @param {FillStyle} srcStyle FillStyle object to copy from\n * @param {FillStyle} dstStyle FillStyle object to copy to\n */\n\n }, {\n key: \"fillColor\",\n set: function set(fillColor) {\n this._fillColor.value = fillColor;\n return this;\n }\n\n /**\n * Gets the fill color of the style\n * @return {string}\n */\n ,\n get: function get() {\n return this._fillColor.value;\n }\n\n /**\n * Sets the opacity of the fill style\n * @param {number} opacity [0,1]\n * @return {FillStyle}\n */\n\n }, {\n key: \"fillOpacity\",\n set: function set(opacity) {\n this._fillColor.opacity = opacity;\n return this;\n }\n\n /**\n * Gets the current opacity of the fill style [0,1]\n * @return {number} Opacity in the range [0,1]\n */\n ,\n get: function get() {\n return this._fillColor.opacity;\n }\n\n /**\n * Sets the fill color of the style defined as a 32-bit int\n * @param {number} packedFillColor Color value as a 32-bit int (i.e. 0xFFFFFFFF)\n * @return {FillStyle}\n */\n\n }, {\n key: \"packedFillColor\",\n set: function set(packedFillColor) {\n this._fillColor.packedValue = packedFillColor;\n return this;\n }\n\n /**\n * Gets the current value of the color of the fill style as a 32-bit int\n * @return {number} i.e. 0xFFFFFFFF\n */\n ,\n get: function get() {\n return this._fillColor.packedValue;\n }\n }], [{\n key: \"copyFillStyle\",\n value: function copyFillStyle(srcStyle, dstStyle) {\n if (typeof srcStyle.packedFillColor === \"undefined\") {\n if (typeof srcStyle.fillColor !== \"undefined\") {\n dstStyle.fillColor = srcStyle.fillColor;\n }\n if (typeof srcStyle.fillOpacity !== \"undefined\") {\n dstStyle.fillOpacity = srcStyle.fillOpacity;\n }\n } else {\n dstStyle.packedFillColor = srcStyle.packedFillColor;\n }\n }\n\n /**\n * Comparison operator between two FillStyle objects. This is primarily\n * used for sorting to minimize context switching of a 2d renderer\n * @param {FillStyle} fillStyleA\n * @param {FillStyle} fillStyleB\n * @return {number} Returns < 0 if fillStyleA < fillStyleB, > 0 if fillStyleA > fillStyleB, or 0 if they are equal.\n */\n\n }, {\n key: \"compareFillStyle\",\n value: function compareFillStyle(fillStyleA, fillStyleB) {\n var valA = fillStyleA.isFillVisible();\n var valB = fillStyleB.isFillVisible();\n if (valA !== valB) {\n return valA - valB;\n }\n return fillStyleA.packedFillColor - fillStyleB.packedFillColor;\n }\n\n /**\n * Returns a json object of a FillStyle object\n * @param {FillStyle} fillStyleObj\n * @return {{fillColor: string}}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON(fillStyleObj) {\n return {\n fillColor: fillStyleObj.fillColor\n };\n }\n }]);\n\n return FillStyle;\n}();\n\n/**\n * Creates a new fill style class that fires events whenever the style\n * is modified.\n * @param {string} eventName Event type to fire when fill style is modified\n * @return {function} New class constructor function\n */\n\n\nexports.default = FillStyle;\nfunction createEventedFillStyleMixin(eventName) {\n /**\n * Evented fill color class to handle fill color modifications\n * @type {ColorRGBA}\n */\n var FillColorClass = (0, _colorRgba.createEventedColorRGBAClass)(eventName, \"fillColor\");\n\n /**\n * @mixin New evented fill style mixin. Will fire events whenever\n * the fill color is modified\n */\n return (0, _aggregation2.default)(null, FillStyle, function () {\n function EventedFillStyle() {\n _classCallCheck(this, EventedFillStyle);\n }\n\n _createClass(EventedFillStyle, [{\n key: \"initializer\",\n value: function initializer(opts) {\n this._fillColor = new FillColorClass(\"red\", this);\n this._initFillStyleFromOptions(opts);\n }\n }]);\n\n return EventedFillStyle;\n }());\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9maWxsLXN0eWxlLmpzP2I3MGIiXSwibmFtZXMiOlsiY3JlYXRlRXZlbnRlZEZpbGxTdHlsZU1peGluIiwiRmlsbFN0eWxlIiwib3B0cyIsImluaXRpYWxpemVyIiwiZmlsbENvbG9yIiwiZmlsbE9wYWNpdHkiLCJfZmlsbENvbG9yIiwiQ29sb3JSR0JBIiwiX2luaXRGaWxsU3R5bGVGcm9tT3B0aW9ucyIsIm9wYWNpdHkiLCJpc1RyYW5zcGFyZW50IiwiY3R4IiwiZmlsbFN0eWxlIiwidmFsdWUiLCJwYWNrZWRGaWxsQ29sb3IiLCJwYWNrZWRWYWx1ZSIsInNyY1N0eWxlIiwiZHN0U3R5bGUiLCJmaWxsU3R5bGVBIiwiZmlsbFN0eWxlQiIsInZhbEEiLCJpc0ZpbGxWaXNpYmxlIiwidmFsQiIsImZpbGxTdHlsZU9iaiIsImV2ZW50TmFtZSIsIkZpbGxDb2xvckNsYXNzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7UUF1TGdCQSwyQixHQUFBQSwyQjs7QUFyTGhCOzs7O0FBQ0E7Ozs7Ozs7O0FBRUE7Ozs7OztBQU1BOzs7OztJQUtxQkMsUztBQUNuQjs7Ozs7QUFLQSxxQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUNoQjtBQUNBLFNBQUtDLFdBQUwsQ0FBaUJELElBQWpCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs4Q0FLMEJBLEksRUFBTTtBQUM5QixVQUFJQSxJQUFKLEVBQVU7QUFDUixZQUFJLE9BQU9BLEtBQUtFLFNBQVosS0FBMEIsV0FBOUIsRUFBMkM7QUFDekMsZUFBS0EsU0FBTCxHQUFpQkYsS0FBS0UsU0FBdEI7QUFDRDtBQUNELFlBQUksT0FBT0YsS0FBS0csV0FBWixLQUE0QixXQUFoQyxFQUE2QztBQUMzQyxlQUFLQSxXQUFMLEdBQW1CSCxLQUFLRyxXQUF4QjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDs7Ozs7Ozs7Z0NBS1lILEksRUFBTTtBQUNoQixXQUFLSSxVQUFMLEdBQWtCLElBQUlDLG1CQUFKLENBQWMsT0FBZCxDQUFsQjtBQUNBLFdBQUtDLHlCQUFMLENBQStCTixJQUEvQjtBQUNEOztBQUVEOzs7Ozs7Ozs7O0FBc0RBOzs7O29DQUlnQjtBQUNkLGFBQU8sS0FBS0ksVUFBTCxDQUFnQkcsT0FBaEIsR0FBMEIsQ0FBakM7QUFDRDs7QUFFRDs7Ozs7OztvQ0FJZ0I7QUFDZCxhQUFPLEtBQUtILFVBQUwsQ0FBZ0JJLGFBQWhCLEVBQVA7QUFDRDs7QUFFRDs7Ozs7OzsrQkFJV0MsRyxFQUFLO0FBQ2RBLFVBQUlDLFNBQUosR0FBZ0IsS0FBS1IsU0FBckI7QUFDRDs7QUFFRDs7Ozs7Ozs7c0JBekVjQSxTLEVBQVc7QUFDdkIsV0FBS0UsVUFBTCxDQUFnQk8sS0FBaEIsR0FBd0JULFNBQXhCO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlnQjtBQUNkLGFBQU8sS0FBS0UsVUFBTCxDQUFnQk8sS0FBdkI7QUFDRDs7QUFFRDs7Ozs7Ozs7c0JBS2dCSixPLEVBQVM7QUFDdkIsV0FBS0gsVUFBTCxDQUFnQkcsT0FBaEIsR0FBMEJBLE9BQTFCO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlrQjtBQUNoQixhQUFPLEtBQUtILFVBQUwsQ0FBZ0JHLE9BQXZCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3NCQUtvQkssZSxFQUFpQjtBQUNuQyxXQUFLUixVQUFMLENBQWdCUyxXQUFoQixHQUE4QkQsZUFBOUI7QUFDQSxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7d0JBSXNCO0FBQ3BCLGFBQU8sS0FBS1IsVUFBTCxDQUFnQlMsV0FBdkI7QUFDRDs7O2tDQStCb0JDLFEsRUFBVUMsUSxFQUFVO0FBQ3ZDLFVBQUksT0FBT0QsU0FBU0YsZUFBaEIsS0FBb0MsV0FBeEMsRUFBcUQ7QUFDbkQsWUFBSSxPQUFPRSxTQUFTWixTQUFoQixLQUE4QixXQUFsQyxFQUErQztBQUM3Q2EsbUJBQVNiLFNBQVQsR0FBcUJZLFNBQVNaLFNBQTlCO0FBQ0Q7QUFDRCxZQUFJLE9BQU9ZLFNBQVNYLFdBQWhCLEtBQWdDLFdBQXBDLEVBQWlEO0FBQy9DWSxtQkFBU1osV0FBVCxHQUF1QlcsU0FBU1gsV0FBaEM7QUFDRDtBQUNGLE9BUEQsTUFPTztBQUNMWSxpQkFBU0gsZUFBVCxHQUEyQkUsU0FBU0YsZUFBcEM7QUFDRDtBQUNGOztBQUVEOzs7Ozs7Ozs7O3FDQU93QkksVSxFQUFZQyxVLEVBQVk7QUFDOUMsVUFBTUMsT0FBT0YsV0FBV0csYUFBWCxFQUFiO0FBQ0EsVUFBTUMsT0FBT0gsV0FBV0UsYUFBWCxFQUFiO0FBQ0EsVUFBSUQsU0FBU0UsSUFBYixFQUFtQjtBQUNqQixlQUFPRixPQUFPRSxJQUFkO0FBQ0Q7QUFDRCxhQUFPSixXQUFXSixlQUFYLEdBQTZCSyxXQUFXTCxlQUEvQztBQUNEOztBQUVEOzs7Ozs7OzsyQkFLY1MsWSxFQUFjO0FBQzFCLGFBQU87QUFDTG5CLG1CQUFXbUIsYUFBYW5CO0FBRG5CLE9BQVA7QUFHRDs7Ozs7O0FBR0g7Ozs7Ozs7O2tCQWpLcUJILFM7QUF1S2QsU0FBU0QsMkJBQVQsQ0FBcUN3QixTQUFyQyxFQUFnRDtBQUNyRDs7OztBQUlBLE1BQU1DLGlCQUFpQiw0Q0FBNEJELFNBQTVCLEVBQXVDLFdBQXZDLENBQXZCOztBQUVBOzs7O0FBSUEsU0FBTywyQkFBWSxJQUFaLEVBQWtCdkIsU0FBbEI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLGtDQUNPQyxJQURQLEVBQ2E7QUFDaEIsYUFBS0ksVUFBTCxHQUFrQixJQUFJbUIsY0FBSixDQUFtQixLQUFuQixFQUEwQixJQUExQixDQUFsQjtBQUNBLGFBQUtqQix5QkFBTCxDQUErQk4sSUFBL0I7QUFDRDtBQUpJOztBQUFBO0FBQUEsTUFBUDtBQU1EIiwiZmlsZSI6IjE3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0IENvbG9yUkdCQSwge2NyZWF0ZUV2ZW50ZWRDb2xvclJHQkFDbGFzc30gZnJvbSBcIi4vY29sb3ItcmdiYVwiXG5pbXBvcnQgYWdncmVnYXRpb24gZnJvbSBcIi4uL3V0aWwvYWdncmVnYXRpb25cIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbGxTdHlsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmlsbENvbG9yPVwiYmxhY2tcIl0gRmlsbCBjb2xvciBkZWZpbmVkIGFzIGEgc3RyaW5nXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2ZpbGxPcGFjaXR5PTFdIE9wYWNpdHkgb2YgdGhlIGZpbGwgY29sb3IuIFRoaXMgc3VwZXJzZWRlcyBhbnkgb3BhY2l0eSBpbmhlcmVudCBpbiBmaWxsQ29sb3JcbiAqL1xuXG4vKipcbiAqIE1hbmFnZXMgdGhlIGZpbGwgc3R5bGUgb2YgYSAyZCByZW5kZXJpbmcgY29udGV4dC4gQ2FuIGJlIHVzZWQgYXMgYSBtaXhpbiBvciBiYXNlIGNsYXNzXG4gKiBAY2xhc3NcbiAqIEBtaXhpblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxsU3R5bGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxsIHN0eWxlIG9iamVjdFxuICAgKiBAcGFyYW0ge0ZpbGxTdHlsZU9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJuIHtGaWxsU3R5bGV9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgLy8gVE9ETyhjcm9vdCk6IHN1cHBvcnQgZ3JhZGllbnRzIGFuZCBwYXR0ZXJuc1xuICAgIHRoaXMuaW5pdGlhbGl6ZXIob3B0cylcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplcyB0aGUgZmlsbCBzdHlsZSBvYmplY3QgZnJvbSBhbiBvcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0gIHtGaWxsU3R5bGVPcHRpb25zfSBbb3B0c11cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0RmlsbFN0eWxlRnJvbU9wdGlvbnMob3B0cykge1xuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMuZmlsbENvbG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3JcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5maWxsT3BhY2l0eSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLmZpbGxPcGFjaXR5ID0gb3B0cy5maWxsT3BhY2l0eVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhIGZpbGwgc3R5bGUuIFVzZWQgZm9yIGJvdGggaW5pdGlhbGl6aW5nXG4gICAqIHZpYSBiYXNlLWNsYXNzIGFuZCBtaXhpbiBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSAge0ZpbGxTdHlsZU9wdGlvbnN9IFtvcHRzXVxuICAgKi9cbiAgaW5pdGlhbGl6ZXIob3B0cykge1xuICAgIHRoaXMuX2ZpbGxDb2xvciA9IG5ldyBDb2xvclJHQkEoXCJibGFja1wiKVxuICAgIHRoaXMuX2luaXRGaWxsU3R5bGVGcm9tT3B0aW9ucyhvcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpbGwgY29sb3JcbiAgICogQHBhcmFtICB7c3RyaW5nfSBmaWxsQ29sb3IgQ29sb3IgYXMgYSBzdHJpbmcsIFwicmdiKClcIiwgXCJyZ2JhKClcIiwgXCIjLi4uLi4uXCIsIG9yIGEgY29sb3Iga2V5d29yZCAoaS5lLiBcImJsYWNrXCIpXG4gICAqIEByZXR1cm4ge0ZpbGxTdHlsZX1cbiAgICovXG4gIHNldCBmaWxsQ29sb3IoZmlsbENvbG9yKSB7XG4gICAgdGhpcy5fZmlsbENvbG9yLnZhbHVlID0gZmlsbENvbG9yXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaWxsIGNvbG9yIG9mIHRoZSBzdHlsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZmlsbENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxsQ29sb3IudmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcGFjaXR5IG9mIHRoZSBmaWxsIHN0eWxlXG4gICAqIEBwYXJhbSAge251bWJlcn0gb3BhY2l0eSBbMCwxXVxuICAgKiBAcmV0dXJuIHtGaWxsU3R5bGV9XG4gICAqL1xuICBzZXQgZmlsbE9wYWNpdHkob3BhY2l0eSkge1xuICAgIHRoaXMuX2ZpbGxDb2xvci5vcGFjaXR5ID0gb3BhY2l0eVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBvcGFjaXR5IG9mIHRoZSBmaWxsIHN0eWxlIFswLDFdXG4gICAqIEByZXR1cm4ge251bWJlcn0gT3BhY2l0eSBpbiB0aGUgcmFuZ2UgWzAsMV1cbiAgICovXG4gIGdldCBmaWxsT3BhY2l0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsbENvbG9yLm9wYWNpdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmaWxsIGNvbG9yIG9mIHRoZSBzdHlsZSBkZWZpbmVkIGFzIGEgMzItYml0IGludFxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHBhY2tlZEZpbGxDb2xvciBDb2xvciB2YWx1ZSBhcyBhIDMyLWJpdCBpbnQgKGkuZS4gMHhGRkZGRkZGRilcbiAgICogQHJldHVybiB7RmlsbFN0eWxlfVxuICAgKi9cbiAgc2V0IHBhY2tlZEZpbGxDb2xvcihwYWNrZWRGaWxsQ29sb3IpIHtcbiAgICB0aGlzLl9maWxsQ29sb3IucGFja2VkVmFsdWUgPSBwYWNrZWRGaWxsQ29sb3JcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbG9yIG9mIHRoZSBmaWxsIHN0eWxlIGFzIGEgMzItYml0IGludFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IGkuZS4gMHhGRkZGRkZGRlxuICAgKi9cbiAgZ2V0IHBhY2tlZEZpbGxDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsbENvbG9yLnBhY2tlZFZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxsIHN0eWxlIGlzIHZpc2libGUsIGkuZS4gaXQgaGFzIGFuIG9wYWNpdHkgPiAwXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0ZpbGxWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxsQ29sb3Iub3BhY2l0eSA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGwgc3R5bGUgaXMgdHJhbnNwYXJlbnQgaW4gYW55IHdheSwgaS5lLiBvcGFjaXR5IDwgMVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNUcmFuc3BhcmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsbENvbG9yLmlzVHJhbnNwYXJlbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpbGwgc3R5bGUgc3RhdGUgb2YgYSAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4XG4gICAqL1xuICBzZXRGaWxsQ3R4KGN0eCkge1xuICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLmZpbGxDb2xvclxuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyB0aGUgcHJvcGVydGllcyBvZiBvbmUgZmlsbCBzdHlsZSB0byBhbm90aGVyXG4gICAqIEBwYXJhbSAge0ZpbGxTdHlsZX0gc3JjU3R5bGUgRmlsbFN0eWxlIG9iamVjdCB0byBjb3B5IGZyb21cbiAgICogQHBhcmFtICB7RmlsbFN0eWxlfSBkc3RTdHlsZSBGaWxsU3R5bGUgb2JqZWN0IHRvIGNvcHkgdG9cbiAgICovXG4gIHN0YXRpYyBjb3B5RmlsbFN0eWxlKHNyY1N0eWxlLCBkc3RTdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUucGFja2VkRmlsbENvbG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHNyY1N0eWxlLmZpbGxDb2xvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkc3RTdHlsZS5maWxsQ29sb3IgPSBzcmNTdHlsZS5maWxsQ29sb3JcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUuZmlsbE9wYWNpdHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZHN0U3R5bGUuZmlsbE9wYWNpdHkgPSBzcmNTdHlsZS5maWxsT3BhY2l0eVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkc3RTdHlsZS5wYWNrZWRGaWxsQ29sb3IgPSBzcmNTdHlsZS5wYWNrZWRGaWxsQ29sb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyaXNvbiBvcGVyYXRvciBiZXR3ZWVuIHR3byBGaWxsU3R5bGUgb2JqZWN0cy4gVGhpcyBpcyBwcmltYXJpbHlcbiAgICogdXNlZCBmb3Igc29ydGluZyB0byBtaW5pbWl6ZSBjb250ZXh0IHN3aXRjaGluZyBvZiBhIDJkIHJlbmRlcmVyXG4gICAqIEBwYXJhbSAge0ZpbGxTdHlsZX0gZmlsbFN0eWxlQVxuICAgKiBAcGFyYW0gIHtGaWxsU3R5bGV9IGZpbGxTdHlsZUJcbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICAgIFJldHVybnMgPCAwIGlmIGZpbGxTdHlsZUEgPCBmaWxsU3R5bGVCLCA+IDAgaWYgZmlsbFN0eWxlQSA+IGZpbGxTdHlsZUIsIG9yIDAgaWYgdGhleSBhcmUgZXF1YWwuXG4gICAqL1xuICBzdGF0aWMgY29tcGFyZUZpbGxTdHlsZShmaWxsU3R5bGVBLCBmaWxsU3R5bGVCKSB7XG4gICAgY29uc3QgdmFsQSA9IGZpbGxTdHlsZUEuaXNGaWxsVmlzaWJsZSgpXG4gICAgY29uc3QgdmFsQiA9IGZpbGxTdHlsZUIuaXNGaWxsVmlzaWJsZSgpXG4gICAgaWYgKHZhbEEgIT09IHZhbEIpIHtcbiAgICAgIHJldHVybiB2YWxBIC0gdmFsQlxuICAgIH1cbiAgICByZXR1cm4gZmlsbFN0eWxlQS5wYWNrZWRGaWxsQ29sb3IgLSBmaWxsU3R5bGVCLnBhY2tlZEZpbGxDb2xvclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBqc29uIG9iamVjdCBvZiBhIEZpbGxTdHlsZSBvYmplY3RcbiAgICogQHBhcmFtICB7RmlsbFN0eWxlfSBmaWxsU3R5bGVPYmpcbiAgICogQHJldHVybiB7e2ZpbGxDb2xvcjogc3RyaW5nfX1cbiAgICovXG4gIHN0YXRpYyB0b0pTT04oZmlsbFN0eWxlT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGxDb2xvcjogZmlsbFN0eWxlT2JqLmZpbGxDb2xvclxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbCBzdHlsZSBjbGFzcyB0aGF0IGZpcmVzIGV2ZW50cyB3aGVuZXZlciB0aGUgc3R5bGVcbiAqIGlzIG1vZGlmaWVkLlxuICogQHBhcmFtICB7c3RyaW5nfSBldmVudE5hbWUgRXZlbnQgdHlwZSB0byBmaXJlIHdoZW4gZmlsbCBzdHlsZSBpcyBtb2RpZmllZFxuICogQHJldHVybiB7ZnVuY3Rpb259ICAgICAgICAgTmV3IGNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudGVkRmlsbFN0eWxlTWl4aW4oZXZlbnROYW1lKSB7XG4gIC8qKlxuICAgKiBFdmVudGVkIGZpbGwgY29sb3IgY2xhc3MgdG8gaGFuZGxlIGZpbGwgY29sb3IgbW9kaWZpY2F0aW9uc1xuICAgKiBAdHlwZSB7Q29sb3JSR0JBfVxuICAgKi9cbiAgY29uc3QgRmlsbENvbG9yQ2xhc3MgPSBjcmVhdGVFdmVudGVkQ29sb3JSR0JBQ2xhc3MoZXZlbnROYW1lLCBcImZpbGxDb2xvclwiKVxuXG4gIC8qKlxuICAgKiBAbWl4aW4gTmV3IGV2ZW50ZWQgZmlsbCBzdHlsZSBtaXhpbi4gV2lsbCBmaXJlIGV2ZW50cyB3aGVuZXZlclxuICAgKiAgICAgICAgdGhlIGZpbGwgY29sb3IgaXMgbW9kaWZpZWRcbiAgICovXG4gIHJldHVybiBhZ2dyZWdhdGlvbihudWxsLCBGaWxsU3R5bGUsIGNsYXNzIEV2ZW50ZWRGaWxsU3R5bGUge1xuICAgIGluaXRpYWxpemVyKG9wdHMpIHtcbiAgICAgIHRoaXMuX2ZpbGxDb2xvciA9IG5ldyBGaWxsQ29sb3JDbGFzcyhcInJlZFwiLCB0aGlzKVxuICAgICAgdGhpcy5faW5pdEZpbGxTdHlsZUZyb21PcHRpb25zKG9wdHMpXG4gICAgfVxuICB9KVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3R5bGUvZmlsbC1zdHlsZS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 18 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.createEventedFillStyleMixin = createEventedFillStyleMixin;\n\nvar _colorRgba = __webpack_require__(17);\n\nvar _colorRgba2 = _interopRequireDefault(_colorRgba);\n\nvar _aggregation = __webpack_require__(8);\n\nvar _aggregation2 = _interopRequireDefault(_aggregation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {object} FillStyleOptions\n * @property {string} [fillColor=\"black\"] Fill color defined as a string\n * @property {number} [fillOpacity=1] Opacity of the fill color. This supersedes any opacity inherent in fillColor\n */\n\n/**\n * Manages the fill style of a 2d rendering context. Can be used as a mixin or base class\n * @class\n * @mixin\n */\nvar FillStyle = function () {\n /**\n * Creates a new fill style object\n * @param {FillStyleOptions} [opts]\n * @return {FillStyle}\n */\n function FillStyle(opts) {\n _classCallCheck(this, FillStyle);\n\n // TODO(croot): support gradients and patterns\n this.initializer(opts);\n }\n\n /**\n * initializes the fill style object from an options object\n * @param {FillStyleOptions} [opts]\n * @private\n */\n\n\n _createClass(FillStyle, [{\n key: \"_initFillStyleFromOptions\",\n value: function _initFillStyleFromOptions(opts) {\n if (opts) {\n if (typeof opts.fillColor !== \"undefined\") {\n this.fillColor = opts.fillColor;\n }\n if (typeof opts.fillOpacity !== \"undefined\") {\n this.fillOpacity = opts.fillOpacity;\n }\n }\n }\n\n /**\n * Initializer method to initialize a fill style. Used for both initializing\n * via base-class and mixin hierarchy.\n * @param {FillStyleOptions} [opts]\n */\n\n }, {\n key: \"initializer\",\n value: function initializer(opts) {\n this._fillColor = new _colorRgba2.default(\"black\");\n this._initFillStyleFromOptions(opts);\n }\n\n /**\n * Sets the fill color\n * @param {string} fillColor Color as a string, \"rgb()\", \"rgba()\", \"#......\", or a color keyword (i.e. \"black\")\n * @return {FillStyle}\n */\n\n }, {\n key: \"isFillVisible\",\n\n\n /**\n * Returns true if the fill style is visible, i.e. it has an opacity > 0\n * @return {Boolean}\n */\n value: function isFillVisible() {\n return this._fillColor.opacity > 0;\n }\n\n /**\n * Returns true if the fill style is transparent in any way, i.e. opacity < 1\n * @return {Boolean}\n */\n\n }, {\n key: \"isTransparent\",\n value: function isTransparent() {\n return this._fillColor.isTransparent();\n }\n\n /**\n * Sets the fill style state of a 2d rendering context\n * @param {CanvasRenderingContext2D} ctx\n */\n\n }, {\n key: \"setFillCtx\",\n value: function setFillCtx(ctx) {\n ctx.fillStyle = this.fillColor;\n }\n\n /**\n * Copies the properties of one fill style to another\n * @param {FillStyle} srcStyle FillStyle object to copy from\n * @param {FillStyle} dstStyle FillStyle object to copy to\n */\n\n }, {\n key: \"fillColor\",\n set: function set(fillColor) {\n this._fillColor.value = fillColor;\n return this;\n }\n\n /**\n * Gets the fill color of the style\n * @return {string}\n */\n ,\n get: function get() {\n return this._fillColor.value;\n }\n\n /**\n * Sets the opacity of the fill style\n * @param {number} opacity [0,1]\n * @return {FillStyle}\n */\n\n }, {\n key: \"fillOpacity\",\n set: function set(opacity) {\n this._fillColor.opacity = opacity;\n return this;\n }\n\n /**\n * Gets the current opacity of the fill style [0,1]\n * @return {number} Opacity in the range [0,1]\n */\n ,\n get: function get() {\n return this._fillColor.opacity;\n }\n\n /**\n * Sets the fill color of the style defined as a 32-bit int\n * @param {number} packedFillColor Color value as a 32-bit int (i.e. 0xFFFFFFFF)\n * @return {FillStyle}\n */\n\n }, {\n key: \"packedFillColor\",\n set: function set(packedFillColor) {\n this._fillColor.packedValue = packedFillColor;\n return this;\n }\n\n /**\n * Gets the current value of the color of the fill style as a 32-bit int\n * @return {number} i.e. 0xFFFFFFFF\n */\n ,\n get: function get() {\n return this._fillColor.packedValue;\n }\n }], [{\n key: \"copyFillStyle\",\n value: function copyFillStyle(srcStyle, dstStyle) {\n if (typeof srcStyle.packedFillColor === \"undefined\") {\n if (typeof srcStyle.fillColor !== \"undefined\") {\n dstStyle.fillColor = srcStyle.fillColor;\n }\n if (typeof srcStyle.fillOpacity !== \"undefined\") {\n dstStyle.fillOpacity = srcStyle.fillOpacity;\n }\n } else {\n dstStyle.packedFillColor = srcStyle.packedFillColor;\n }\n }\n\n /**\n * Comparison operator between two FillStyle objects. This is primarily\n * used for sorting to minimize context switching of a 2d renderer\n * @param {FillStyle} fillStyleA\n * @param {FillStyle} fillStyleB\n * @return {number} Returns < 0 if fillStyleA < fillStyleB, > 0 if fillStyleA > fillStyleB, or 0 if they are equal.\n */\n\n }, {\n key: \"compareFillStyle\",\n value: function compareFillStyle(fillStyleA, fillStyleB) {\n var valA = fillStyleA.isFillVisible();\n var valB = fillStyleB.isFillVisible();\n if (valA !== valB) {\n return valA - valB;\n }\n return fillStyleA.packedFillColor - fillStyleB.packedFillColor;\n }\n\n /**\n * Returns a json object of a FillStyle object\n * @param {FillStyle} fillStyleObj\n * @return {{fillColor: string}}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON(fillStyleObj) {\n return {\n fillColor: fillStyleObj.fillColor\n };\n }\n }]);\n\n return FillStyle;\n}();\n\n/**\n * Creates a new fill style class that fires events whenever the style\n * is modified.\n * @param {string} eventName Event type to fire when fill style is modified\n * @return {function} New class constructor function\n */\n\n\nexports.default = FillStyle;\nfunction createEventedFillStyleMixin(eventName) {\n /**\n * Evented fill color class to handle fill color modifications\n * @type {ColorRGBA}\n */\n var FillColorClass = (0, _colorRgba.createEventedColorRGBAClass)(eventName, \"fillColor\");\n\n /**\n * @mixin New evented fill style mixin. Will fire events whenever\n * the fill color is modified\n */\n return (0, _aggregation2.default)(null, FillStyle, function () {\n function EventedFillStyle() {\n _classCallCheck(this, EventedFillStyle);\n }\n\n _createClass(EventedFillStyle, [{\n key: \"initializer\",\n value: function initializer(opts) {\n this._fillColor = new FillColorClass(\"red\", this);\n this._initFillStyleFromOptions(opts);\n }\n }]);\n\n return EventedFillStyle;\n }());\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9maWxsLXN0eWxlLmpzP2I3MGIiXSwibmFtZXMiOlsiY3JlYXRlRXZlbnRlZEZpbGxTdHlsZU1peGluIiwiRmlsbFN0eWxlIiwib3B0cyIsImluaXRpYWxpemVyIiwiZmlsbENvbG9yIiwiZmlsbE9wYWNpdHkiLCJfZmlsbENvbG9yIiwiX2luaXRGaWxsU3R5bGVGcm9tT3B0aW9ucyIsIm9wYWNpdHkiLCJpc1RyYW5zcGFyZW50IiwiY3R4IiwiZmlsbFN0eWxlIiwidmFsdWUiLCJwYWNrZWRGaWxsQ29sb3IiLCJwYWNrZWRWYWx1ZSIsInNyY1N0eWxlIiwiZHN0U3R5bGUiLCJmaWxsU3R5bGVBIiwiZmlsbFN0eWxlQiIsInZhbEEiLCJpc0ZpbGxWaXNpYmxlIiwidmFsQiIsImZpbGxTdHlsZU9iaiIsImV2ZW50TmFtZSIsIkZpbGxDb2xvckNsYXNzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7UUF1TGdCQSwyQixHQUFBQSwyQjs7QUFyTGhCOzs7O0FBQ0E7Ozs7Ozs7O0FBRUE7Ozs7OztBQU1BOzs7OztJQUtxQkMsUztBQUNuQjs7Ozs7QUFLQSxxQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUNoQjtBQUNBLFNBQUtDLFdBQUwsQ0FBaUJELElBQWpCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs4Q0FLMEJBLEksRUFBTTtBQUM5QixVQUFJQSxJQUFKLEVBQVU7QUFDUixZQUFJLE9BQU9BLEtBQUtFLFNBQVosS0FBMEIsV0FBOUIsRUFBMkM7QUFDekMsZUFBS0EsU0FBTCxHQUFpQkYsS0FBS0UsU0FBdEI7QUFDRDtBQUNELFlBQUksT0FBT0YsS0FBS0csV0FBWixLQUE0QixXQUFoQyxFQUE2QztBQUMzQyxlQUFLQSxXQUFMLEdBQW1CSCxLQUFLRyxXQUF4QjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDs7Ozs7Ozs7Z0NBS1lILEksRUFBTTtBQUNoQixXQUFLSSxVQUFMLEdBQWtCLHdCQUFjLE9BQWQsQ0FBbEI7QUFDQSxXQUFLQyx5QkFBTCxDQUErQkwsSUFBL0I7QUFDRDs7QUFFRDs7Ozs7Ozs7OztBQXNEQTs7OztvQ0FJZ0I7QUFDZCxhQUFPLEtBQUtJLFVBQUwsQ0FBZ0JFLE9BQWhCLEdBQTBCLENBQWpDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7b0NBSWdCO0FBQ2QsYUFBTyxLQUFLRixVQUFMLENBQWdCRyxhQUFoQixFQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7K0JBSVdDLEcsRUFBSztBQUNkQSxVQUFJQyxTQUFKLEdBQWdCLEtBQUtQLFNBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3NCQXpFY0EsUyxFQUFXO0FBQ3ZCLFdBQUtFLFVBQUwsQ0FBZ0JNLEtBQWhCLEdBQXdCUixTQUF4QjtBQUNBLGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozt3QkFJZ0I7QUFDZCxhQUFPLEtBQUtFLFVBQUwsQ0FBZ0JNLEtBQXZCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3NCQUtnQkosTyxFQUFTO0FBQ3ZCLFdBQUtGLFVBQUwsQ0FBZ0JFLE9BQWhCLEdBQTBCQSxPQUExQjtBQUNBLGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozt3QkFJa0I7QUFDaEIsYUFBTyxLQUFLRixVQUFMLENBQWdCRSxPQUF2QjtBQUNEOztBQUVEOzs7Ozs7OztzQkFLb0JLLGUsRUFBaUI7QUFDbkMsV0FBS1AsVUFBTCxDQUFnQlEsV0FBaEIsR0FBOEJELGVBQTlCO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlzQjtBQUNwQixhQUFPLEtBQUtQLFVBQUwsQ0FBZ0JRLFdBQXZCO0FBQ0Q7OztrQ0ErQm9CQyxRLEVBQVVDLFEsRUFBVTtBQUN2QyxVQUFJLE9BQU9ELFNBQVNGLGVBQWhCLEtBQW9DLFdBQXhDLEVBQXFEO0FBQ25ELFlBQUksT0FBT0UsU0FBU1gsU0FBaEIsS0FBOEIsV0FBbEMsRUFBK0M7QUFDN0NZLG1CQUFTWixTQUFULEdBQXFCVyxTQUFTWCxTQUE5QjtBQUNEO0FBQ0QsWUFBSSxPQUFPVyxTQUFTVixXQUFoQixLQUFnQyxXQUFwQyxFQUFpRDtBQUMvQ1csbUJBQVNYLFdBQVQsR0FBdUJVLFNBQVNWLFdBQWhDO0FBQ0Q7QUFDRixPQVBELE1BT087QUFDTFcsaUJBQVNILGVBQVQsR0FBMkJFLFNBQVNGLGVBQXBDO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7OztxQ0FPd0JJLFUsRUFBWUMsVSxFQUFZO0FBQzlDLFVBQU1DLE9BQU9GLFdBQVdHLGFBQVgsRUFBYjtBQUNBLFVBQU1DLE9BQU9ILFdBQVdFLGFBQVgsRUFBYjtBQUNBLFVBQUlELFNBQVNFLElBQWIsRUFBbUI7QUFDakIsZUFBT0YsT0FBT0UsSUFBZDtBQUNEO0FBQ0QsYUFBT0osV0FBV0osZUFBWCxHQUE2QkssV0FBV0wsZUFBL0M7QUFDRDs7QUFFRDs7Ozs7Ozs7MkJBS2NTLFksRUFBYztBQUMxQixhQUFPO0FBQ0xsQixtQkFBV2tCLGFBQWFsQjtBQURuQixPQUFQO0FBR0Q7Ozs7OztBQUdIOzs7Ozs7OztrQkFqS3FCSCxTO0FBdUtkLFNBQVNELDJCQUFULENBQXFDdUIsU0FBckMsRUFBZ0Q7QUFDckQ7Ozs7QUFJQSxNQUFNQyxpQkFBaUIsNENBQTRCRCxTQUE1QixFQUF1QyxXQUF2QyxDQUF2Qjs7QUFFQTs7OztBQUlBLFNBQU8sMkJBQVksSUFBWixFQUFrQnRCLFNBQWxCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSxrQ0FDT0MsSUFEUCxFQUNhO0FBQ2hCLGFBQUtJLFVBQUwsR0FBa0IsSUFBSWtCLGNBQUosQ0FBbUIsS0FBbkIsRUFBMEIsSUFBMUIsQ0FBbEI7QUFDQSxhQUFLakIseUJBQUwsQ0FBK0JMLElBQS9CO0FBQ0Q7QUFKSTs7QUFBQTtBQUFBLE1BQVA7QUFNRCIsImZpbGUiOiIxOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCBDb2xvclJHQkEsIHtjcmVhdGVFdmVudGVkQ29sb3JSR0JBQ2xhc3N9IGZyb20gXCIuL2NvbG9yLXJnYmFcIlxuaW1wb3J0IGFnZ3JlZ2F0aW9uIGZyb20gXCIuLi91dGlsL2FnZ3JlZ2F0aW9uXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWxsU3R5bGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZpbGxDb2xvcj1cImJsYWNrXCJdIEZpbGwgY29sb3IgZGVmaW5lZCBhcyBhIHN0cmluZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtmaWxsT3BhY2l0eT0xXSBPcGFjaXR5IG9mIHRoZSBmaWxsIGNvbG9yLiBUaGlzIHN1cGVyc2VkZXMgYW55IG9wYWNpdHkgaW5oZXJlbnQgaW4gZmlsbENvbG9yXG4gKi9cblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSBmaWxsIHN0eWxlIG9mIGEgMmQgcmVuZGVyaW5nIGNvbnRleHQuIENhbiBiZSB1c2VkIGFzIGEgbWl4aW4gb3IgYmFzZSBjbGFzc1xuICogQGNsYXNzXG4gKiBAbWl4aW5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsbFN0eWxlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZmlsbCBzdHlsZSBvYmplY3RcbiAgICogQHBhcmFtIHtGaWxsU3R5bGVPcHRpb25zfSBbb3B0c11cbiAgICogQHJldHVybiB7RmlsbFN0eWxlfVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIC8vIFRPRE8oY3Jvb3QpOiBzdXBwb3J0IGdyYWRpZW50cyBhbmQgcGF0dGVybnNcbiAgICB0aGlzLmluaXRpYWxpemVyKG9wdHMpXG4gIH1cblxuICAvKipcbiAgICogaW5pdGlhbGl6ZXMgdGhlIGZpbGwgc3R5bGUgb2JqZWN0IGZyb20gYW4gb3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtICB7RmlsbFN0eWxlT3B0aW9uc30gW29wdHNdXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdEZpbGxTdHlsZUZyb21PcHRpb25zKG9wdHMpIHtcbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmZpbGxDb2xvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMuZmlsbE9wYWNpdHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5maWxsT3BhY2l0eSA9IG9wdHMuZmlsbE9wYWNpdHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgbWV0aG9kIHRvIGluaXRpYWxpemUgYSBmaWxsIHN0eWxlLiBVc2VkIGZvciBib3RoIGluaXRpYWxpemluZ1xuICAgKiB2aWEgYmFzZS1jbGFzcyBhbmQgbWl4aW4gaGllcmFyY2h5LlxuICAgKiBAcGFyYW0gIHtGaWxsU3R5bGVPcHRpb25zfSBbb3B0c11cbiAgICovXG4gIGluaXRpYWxpemVyKG9wdHMpIHtcbiAgICB0aGlzLl9maWxsQ29sb3IgPSBuZXcgQ29sb3JSR0JBKFwiYmxhY2tcIilcbiAgICB0aGlzLl9pbml0RmlsbFN0eWxlRnJvbU9wdGlvbnMob3B0cylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmaWxsIGNvbG9yXG4gICAqIEBwYXJhbSAge3N0cmluZ30gZmlsbENvbG9yIENvbG9yIGFzIGEgc3RyaW5nLCBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBhIGNvbG9yIGtleXdvcmQgKGkuZS4gXCJibGFja1wiKVxuICAgKiBAcmV0dXJuIHtGaWxsU3R5bGV9XG4gICAqL1xuICBzZXQgZmlsbENvbG9yKGZpbGxDb2xvcikge1xuICAgIHRoaXMuX2ZpbGxDb2xvci52YWx1ZSA9IGZpbGxDb2xvclxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlsbCBjb2xvciBvZiB0aGUgc3R5bGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGZpbGxDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsbENvbG9yLnZhbHVlXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgZmlsbCBzdHlsZVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IG9wYWNpdHkgWzAsMV1cbiAgICogQHJldHVybiB7RmlsbFN0eWxlfVxuICAgKi9cbiAgc2V0IGZpbGxPcGFjaXR5KG9wYWNpdHkpIHtcbiAgICB0aGlzLl9maWxsQ29sb3Iub3BhY2l0eSA9IG9wYWNpdHlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgb3BhY2l0eSBvZiB0aGUgZmlsbCBzdHlsZSBbMCwxXVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IE9wYWNpdHkgaW4gdGhlIHJhbmdlIFswLDFdXG4gICAqL1xuICBnZXQgZmlsbE9wYWNpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvci5vcGFjaXR5XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZmlsbCBjb2xvciBvZiB0aGUgc3R5bGUgZGVmaW5lZCBhcyBhIDMyLWJpdCBpbnRcbiAgICogQHBhcmFtICB7bnVtYmVyfSBwYWNrZWRGaWxsQ29sb3IgQ29sb3IgdmFsdWUgYXMgYSAzMi1iaXQgaW50IChpLmUuIDB4RkZGRkZGRkYpXG4gICAqIEByZXR1cm4ge0ZpbGxTdHlsZX1cbiAgICovXG4gIHNldCBwYWNrZWRGaWxsQ29sb3IocGFja2VkRmlsbENvbG9yKSB7XG4gICAgdGhpcy5fZmlsbENvbG9yLnBhY2tlZFZhbHVlID0gcGFja2VkRmlsbENvbG9yXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb2xvciBvZiB0aGUgZmlsbCBzdHlsZSBhcyBhIDMyLWJpdCBpbnRcbiAgICogQHJldHVybiB7bnVtYmVyfSBpLmUuIDB4RkZGRkZGRkZcbiAgICovXG4gIGdldCBwYWNrZWRGaWxsQ29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvci5wYWNrZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsbCBzdHlsZSBpcyB2aXNpYmxlLCBpLmUuIGl0IGhhcyBhbiBvcGFjaXR5ID4gMFxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNGaWxsVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsbENvbG9yLm9wYWNpdHkgPiAwXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxsIHN0eWxlIGlzIHRyYW5zcGFyZW50IGluIGFueSB3YXksIGkuZS4gb3BhY2l0eSA8IDFcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzVHJhbnNwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvci5pc1RyYW5zcGFyZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmaWxsIHN0eWxlIHN0YXRlIG9mIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eFxuICAgKi9cbiAgc2V0RmlsbEN0eChjdHgpIHtcbiAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5maWxsQ29sb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgdGhlIHByb3BlcnRpZXMgb2Ygb25lIGZpbGwgc3R5bGUgdG8gYW5vdGhlclxuICAgKiBAcGFyYW0gIHtGaWxsU3R5bGV9IHNyY1N0eWxlIEZpbGxTdHlsZSBvYmplY3QgdG8gY29weSBmcm9tXG4gICAqIEBwYXJhbSAge0ZpbGxTdHlsZX0gZHN0U3R5bGUgRmlsbFN0eWxlIG9iamVjdCB0byBjb3B5IHRvXG4gICAqL1xuICBzdGF0aWMgY29weUZpbGxTdHlsZShzcmNTdHlsZSwgZHN0U3R5bGUpIHtcbiAgICBpZiAodHlwZW9mIHNyY1N0eWxlLnBhY2tlZEZpbGxDb2xvciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHR5cGVvZiBzcmNTdHlsZS5maWxsQ29sb3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZHN0U3R5bGUuZmlsbENvbG9yID0gc3JjU3R5bGUuZmlsbENvbG9yXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNyY1N0eWxlLmZpbGxPcGFjaXR5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGRzdFN0eWxlLmZpbGxPcGFjaXR5ID0gc3JjU3R5bGUuZmlsbE9wYWNpdHlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZHN0U3R5bGUucGFja2VkRmlsbENvbG9yID0gc3JjU3R5bGUucGFja2VkRmlsbENvbG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmlzb24gb3BlcmF0b3IgYmV0d2VlbiB0d28gRmlsbFN0eWxlIG9iamVjdHMuIFRoaXMgaXMgcHJpbWFyaWx5XG4gICAqIHVzZWQgZm9yIHNvcnRpbmcgdG8gbWluaW1pemUgY29udGV4dCBzd2l0Y2hpbmcgb2YgYSAyZCByZW5kZXJlclxuICAgKiBAcGFyYW0gIHtGaWxsU3R5bGV9IGZpbGxTdHlsZUFcbiAgICogQHBhcmFtICB7RmlsbFN0eWxlfSBmaWxsU3R5bGVCXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICBSZXR1cm5zIDwgMCBpZiBmaWxsU3R5bGVBIDwgZmlsbFN0eWxlQiwgPiAwIGlmIGZpbGxTdHlsZUEgPiBmaWxsU3R5bGVCLCBvciAwIGlmIHRoZXkgYXJlIGVxdWFsLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhcmVGaWxsU3R5bGUoZmlsbFN0eWxlQSwgZmlsbFN0eWxlQikge1xuICAgIGNvbnN0IHZhbEEgPSBmaWxsU3R5bGVBLmlzRmlsbFZpc2libGUoKVxuICAgIGNvbnN0IHZhbEIgPSBmaWxsU3R5bGVCLmlzRmlsbFZpc2libGUoKVxuICAgIGlmICh2YWxBICE9PSB2YWxCKSB7XG4gICAgICByZXR1cm4gdmFsQSAtIHZhbEJcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxTdHlsZUEucGFja2VkRmlsbENvbG9yIC0gZmlsbFN0eWxlQi5wYWNrZWRGaWxsQ29sb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEganNvbiBvYmplY3Qgb2YgYSBGaWxsU3R5bGUgb2JqZWN0XG4gICAqIEBwYXJhbSAge0ZpbGxTdHlsZX0gZmlsbFN0eWxlT2JqXG4gICAqIEByZXR1cm4ge3tmaWxsQ29sb3I6IHN0cmluZ319XG4gICAqL1xuICBzdGF0aWMgdG9KU09OKGZpbGxTdHlsZU9iaikge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxsQ29sb3I6IGZpbGxTdHlsZU9iai5maWxsQ29sb3JcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGwgc3R5bGUgY2xhc3MgdGhhdCBmaXJlcyBldmVudHMgd2hlbmV2ZXIgdGhlIHN0eWxlXG4gKiBpcyBtb2RpZmllZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gZXZlbnROYW1lIEV2ZW50IHR5cGUgdG8gZmlyZSB3aGVuIGZpbGwgc3R5bGUgaXMgbW9kaWZpZWRcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAgICAgICAgIE5ldyBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRlZEZpbGxTdHlsZU1peGluKGV2ZW50TmFtZSkge1xuICAvKipcbiAgICogRXZlbnRlZCBmaWxsIGNvbG9yIGNsYXNzIHRvIGhhbmRsZSBmaWxsIGNvbG9yIG1vZGlmaWNhdGlvbnNcbiAgICogQHR5cGUge0NvbG9yUkdCQX1cbiAgICovXG4gIGNvbnN0IEZpbGxDb2xvckNsYXNzID0gY3JlYXRlRXZlbnRlZENvbG9yUkdCQUNsYXNzKGV2ZW50TmFtZSwgXCJmaWxsQ29sb3JcIilcblxuICAvKipcbiAgICogQG1peGluIE5ldyBldmVudGVkIGZpbGwgc3R5bGUgbWl4aW4uIFdpbGwgZmlyZSBldmVudHMgd2hlbmV2ZXJcbiAgICogICAgICAgIHRoZSBmaWxsIGNvbG9yIGlzIG1vZGlmaWVkXG4gICAqL1xuICByZXR1cm4gYWdncmVnYXRpb24obnVsbCwgRmlsbFN0eWxlLCBjbGFzcyBFdmVudGVkRmlsbFN0eWxlIHtcbiAgICBpbml0aWFsaXplcihvcHRzKSB7XG4gICAgICB0aGlzLl9maWxsQ29sb3IgPSBuZXcgRmlsbENvbG9yQ2xhc3MoXCJyZWRcIiwgdGhpcylcbiAgICAgIHRoaXMuX2luaXRGaWxsU3R5bGVGcm9tT3B0aW9ucyhvcHRzKVxuICAgIH1cbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3N0eWxlL2ZpbGwtc3R5bGUuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.createEventedStrokeStyleMixin = createEventedStrokeStyleMixin;\n\nvar _colorRgba = __webpack_require__(16);\n\nvar _colorRgba2 = _interopRequireDefault(_colorRgba);\n\nvar _aggregation = __webpack_require__(7);\n\nvar _aggregation2 = _interopRequireDefault(_aggregation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {object} StrokeStyleOptions\n * @property {string} [strokeColor = \"black\"]\n * @property {number} [strokeWidth = 0]\n * @property {string} [lineJoin = \"miter\"]\n * @property {string} [lineCap = \"butt\"]\n * @property {number[]} [dashPattern = []]\n * @property {number} [dashOffset = 0]\n */\n\n/**\n * validates a possible stroke width value\n * @param {number} strokeWidth\n * @throws If validation fails\n * @private\n */\nfunction validateStrokeWidth(strokeWidth) {\n if (typeof strokeWidth !== \"number\") {\n throw new Error(\"Stroke width must be a number\");\n }\n}\n\n/**\n * Enum for line join values\n * @enum {number}\n */\nvar JoinEnum = {\n MITER: 0,\n BEVEL: 1,\n ROUND: 2\n\n /**\n * line join values as strings, the enum values match the index in this string\n * @type {string[]}\n */\n};var lineJoinOpts = [\"miter\", \"bevel\", \"round\"];\n\n/**\n * validates a line join value\n * @param {string} lineJoin Should be one of [\"miter\", \"bevel\", \"round\"]\n * @throws If validation fails\n * @return {JoinEnum}\n * @private\n */\nfunction validateLineJoin(lineJoin) {\n var idx = -1;\n if (typeof lineJoin !== \"string\" || (idx = lineJoinOpts.indexOf(lineJoin.toLowerCase())) < 0) {\n throw new Error(\"Line join must be a string and must be one of [\" + lineJoinOpts.join(\", \") + \"]\");\n }\n return idx;\n}\n\n/**\n * Enum for line cap values\n * @enum {number}\n */\nvar CapEnum = {\n BUTT: 0,\n SQUARE: 1,\n ROUND: 2\n\n /**\n * line cap values as strings, the CapEnum values match the index in this string\n * @type {string[]}\n */\n};var lineCapOpts = [\"butt\", \"square\", \"round\"];\n\n/**\n * validates a line cap value\n * @param {string} lineCap Should be one of \"butt\", \"square\", \"round\"\n * @throws If validation fails\n * @return {CapEnum}\n * @private\n */\nfunction validateLineCap(lineCap) {\n var idx = -1;\n if (typeof lineCap !== \"string\" || (idx = lineCapOpts.indexOf(lineCap.toLowerCase())) < 0) {\n throw new Error(\"Line cap must be a string and must be one of [\" + lineCapOpts.join(\", \") + \"]\");\n }\n return idx;\n}\n\n/**\n * validates a dash pattern value\n * @param {number[]} dashPattern\n * @throws If validation fails\n * @private\n */\nfunction validateDashPattern(dashPattern) {\n if (!dashPattern || !Array.isArray(dashPattern) || dashPattern.length % 2 !== 0) {\n throw new Error(\"The dash pattern must be an array with an even number of numbers (or an empty array)\");\n }\n}\n\n/**\n * validates a dash offset value\n * @param {number} dashOffset\n * @throws If validation fails\n * @private\n */\nfunction validateDashOffset(dashOffset) {\n if (typeof dashOffset !== \"number\") {\n throw new Error(\"The dash offset must be a number\");\n }\n}\n\n/**\n * Manages the stroke style of a 2d rendering context. Can be used as a mixin or base class\n * @class\n * @mixin\n */\n\nvar StrokeStyle = function () {\n function StrokeStyle(opts) {\n _classCallCheck(this, StrokeStyle);\n\n this.initializer(opts);\n }\n\n /**\n * initializes the stroke style object from an options object\n * @param {StrokeStyleOptions} [opts]\n * @private\n */\n\n\n _createClass(StrokeStyle, [{\n key: \"_initStrokeStyleFromOptions\",\n value: function _initStrokeStyleFromOptions(opts) {\n if (opts) {\n if (typeof opts.strokeColor !== \"undefined\") {\n this.strokeColor = opts.strokeColor;\n }\n if (typeof opts.strokeOpacity !== \"undefined\") {\n this.strokeOpacity = opts.strokeOpacity;\n }\n if (typeof opts.strokeWidth !== \"undefined\") {\n this.strokeWidth = opts.strokeWidth;\n }\n if (typeof opts.lineMiter !== \"undefined\") {\n this.lineJoin = opts.lineMiter;\n }\n if (typeof opts.lineCap !== \"undefined\") {\n this.lineCap = opts.lineCap;\n }\n if (typeof opts.dashPattern !== \"undefined\") {\n this.dashPattern = opts.dashPattern;\n }\n if (typeof opts.dashOffset !== \"undefined\") {\n this.dashOffset = opts.dashOffset;\n }\n }\n }\n\n /**\n * Initializer method to initialize a stroke style. Used for both initializing\n * via base-class and mixin hierarchy.\n * @param {StrokeStyleOptions} [opts]\n * @protected\n */\n\n }, {\n key: \"initializer\",\n value: function initializer(opts) {\n this._strokeColor = new _colorRgba2.default(\"black\");\n this._strokeWidth = 0;\n this._lineJoin = JoinEnum.MITER;\n this._lineCap = CapEnum.BUTT;\n this._dashPattern = [];\n this._dashOffset = 0;\n this._initStrokeStyleFromOptions(opts);\n }\n\n /**\n * Sets the stroke color\n * @param {string} strokeColor Color as a string, \"rgb()\", \"rgba()\", \"#......\", or a color keyword (i.e. \"black\")\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"isStrokeVisible\",\n\n\n /**\n * Returns true if the stroke style is visible, i.e. it is not fully transparent\n * and has a width > 0\n * @return {Boolean}\n */\n value: function isStrokeVisible() {\n return this._strokeColor.opacity > 0 && this._strokeWidth > 0;\n }\n\n /**\n * Returns true if stroke is partially transparent, i.e. opacity < 1\n * @return {Boolean} [description]\n */\n\n }, {\n key: \"isTransparent\",\n value: function isTransparent() {\n return this._strokeColor.isTransparent();\n }\n\n /**\n * Sets the stroke style state of a 2d rendering context\n * @param {CanvasRenderingContext2D} ctx\n */\n\n }, {\n key: \"setStrokeCtx\",\n value: function setStrokeCtx(ctx) {\n ctx.strokeStyle = this.strokeColor;\n ctx.lineWidth = this._strokeWidth;\n ctx.lineJoin = this._lineJoin;\n ctx.lineCap = this._lineCap;\n ctx.setLineDash(this._dashPattern);\n ctx.lineDashOffset = this._dashOffset;\n }\n\n /**\n * Copies the properties of one stroke style to another\n * @param {StrokeStyle} srcStyle StrokeStyle object to copy from\n * @param {StrokeStyle} dstStyle StrokeStyle object to copy to\n */\n\n }, {\n key: \"strokeColor\",\n set: function set(strokeColor) {\n this._strokeColor.value = strokeColor;\n return this;\n }\n\n /**\n * Gets the stroke color of the style\n * @return {string}\n */\n ,\n get: function get() {\n return this._strokeColor.value;\n }\n\n /**\n * Sets the opacity of the stroke style\n * @param {number} opacity [0,1]\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"strokeOpacity\",\n set: function set(opacity) {\n this._strokeColor.opacity = opacity;\n }\n\n /**\n * Gets the current opacity of the stroke style [0,1]\n * @return {number} Opacity in the range [0,1]\n */\n ,\n get: function get() {\n return this._strokeColor.opacity;\n }\n\n /**\n * Sets the stroke color of the style defined as a 32-bit int\n * @param {number} packedStrokeColor Color value as a 32-bit int (i.e. 0xFFFFFFFF)\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"packedStrokeColor\",\n set: function set(packedStrokeColor) {\n this._strokeColor.packedValue = packedStrokeColor;\n }\n\n /**\n * Gets the current value of the color of the stroke style as a 32-bit int\n * @return {number} i.e. 0xFFFFFFFF\n */\n ,\n get: function get() {\n return this._strokeColor.packedValue;\n }\n\n /**\n * Sets the stroke width\n * @param {number} strokeWidth\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"strokeWidth\",\n set: function set(strokeWidth) {\n validateStrokeWidth(strokeWidth);\n this._strokeWidth = strokeWidth;\n return this;\n }\n\n /**\n * Gets the current stroke width\n * @return {number}\n */\n ,\n get: function get() {\n return this._strokeWidth;\n }\n\n /**\n * Sets how lines should be joined\n * @param {string} lineJoin One of \"miter\", \"round\", or \"bevel\"\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"lineJoin\",\n set: function set(lineJoin) {\n var enumVal = validateLineJoin(lineJoin);\n this._lineJoin = enumVal;\n return this;\n }\n\n /**\n * Gets the current line join\n * @return {string}\n */\n ,\n get: function get() {\n return lineJoinOpts[this._lineJoin];\n }\n\n /**\n * Sets how lines should be capped\n * @param {string} lineCap One of \"butt\", \"square\", or \"round\"\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"lineCap\",\n set: function set(lineCap) {\n var enumVal = validateLineCap(lineCap);\n this._lineCap = enumVal;\n return this;\n }\n\n /**\n * Gets the current line cap of the style\n * @return {string}\n */\n ,\n get: function get() {\n return lineCapOpts[this._lineJoin];\n }\n\n /**\n * Sets the dash pattern of the style\n * @param {number[]} dashPattern A list of numbers that specifies distances to alternately\n * draw a line and a gap (in screen units)\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"dashPattern\",\n set: function set(dashPattern) {\n validateDashPattern(dashPattern);\n this._dashPattern = dashPattern.slice();\n return this;\n }\n\n /**\n * Gets the current dash pattern of the style\n * @return {number[]}\n */\n ,\n get: function get() {\n return this._dashPattern.slice();\n }\n\n /**\n * Sets the dash offset of the style\n * @param {number} dashOffset\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"dashOffset\",\n set: function set(dashOffset) {\n validateDashOffset(dashOffset);\n this._dashOffset = dashOffset;\n return this;\n }\n\n /**\n * Gets the current dash offset\n * @return {number}\n */\n ,\n get: function get() {\n return this._dashOffset;\n }\n }], [{\n key: \"copyStrokeStyle\",\n value: function copyStrokeStyle(srcStyle, dstStyle) {\n if (typeof srcStyle.packedStrokeColor === \"undefined\") {\n if (typeof srcStyle.strokeColor !== \"undefined\") {\n dstStyle.strokeColor = srcStyle.strokeColor;\n }\n if (typeof srcStyle.strokeOpacity !== \"undefined\") {\n dstStyle.strokeOpacity = srcStyle.strokeOpacity;\n }\n } else {\n dstStyle.packedStrokeColor = srcStyle.packedStrokeColor;\n }\n if (typeof srcStyle.strokeWidth !== \"undefined\") {\n dstStyle.strokeWidth = srcStyle.strokeWidth;\n }\n if (typeof srcStyle.lineJoin !== \"undefined\") {\n dstStyle.lineJoin = srcStyle.lineJoin;\n }\n if (typeof srcStyle.lineCap !== \"undefined\") {\n dstStyle.lineCap = srcStyle.lineCap;\n }\n if (typeof srcStyle.dashPattern !== \"undefined\") {\n dstStyle.dashPattern = srcStyle.dashPattern;\n }\n if (typeof srcStyle.dashOffset !== \"undefined\") {\n dstStyle.dashOffset = srcStyle.dashOffset;\n }\n }\n\n /**\n * Comparison operator between two StrokeStyle objects. This is primarily\n * used for sorting to minimize context switching of a 2d renderer\n * @param {StrokeStyle} strokeStyleA\n * @param {StrokeStyle} strokeStyleB\n * @return {number} Returns < 0 if strokeStyleA < strokeStyleB, > 0 if strokeStyleA > strokeStyleB, or 0 if they are equal.\n */\n\n }, {\n key: \"compareStrokeStyle\",\n value: function compareStrokeStyle(strokeStyleA, strokeStyleB) {\n var valA = strokeStyleA.isStrokeVisible();\n var valB = strokeStyleB.isStrokeVisible();\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA.packedStrokeColor;\n valB = strokeStyleB.packedStrokeColor;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA.strokeWidth;\n valB = strokeStyleB.strokeWidth;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA._lineJoin;\n valB = strokeStyleB._lineJoin;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA._lineCap;\n valB = strokeStyleB._lineCap;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA._dashPattern;\n valB = strokeStyleB._dashPattern;\n if (valA.length === valB.length && valA.length > 0) {\n for (var i = 0; i < valA.length; i += 1) {\n if (valA[i] !== valB[i]) {\n return valA[i] - valB[i];\n }\n }\n return strokeStyleA.dashOffset - strokeStyleB.dashOffset;\n }\n return valA.length - valB.length;\n }\n\n /**\n * Returns a json object of a StrokeStyle object\n * @param {StrokeStyle} strokeStyleObj\n * @return {{strokeColor: string,\n * strokeWidth: number,\n * lineJoin: string,\n * lineCap: string,\n * dashPattern: number[],\n * dashOffset: number\n * }}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON(strokeStyleObj) {\n return {\n strokeColor: strokeStyleObj.strokeColor,\n strokeWidth: strokeStyleObj.strokeWidth,\n lineJoin: strokeStyleObj.lineJoin,\n lineCap: strokeStyleObj.lineCap,\n dashPattern: strokeStyleObj.dashPattern,\n dashOffset: strokeStyleObj.dashOffset\n };\n }\n }]);\n\n return StrokeStyle;\n}();\n\n/**\n * Creates a new stroke style class that fires events whenever the style\n * is modified.\n * @param {string} eventName Event type to fire when stroke style is modified\n * @return {function} New class constructor function\n */\n\n\nexports.default = StrokeStyle;\nfunction createEventedStrokeStyleMixin(eventName) {\n /**\n * Evented stroke color class to handle color modification events\n * @type {ColorRGBA}\n */\n var StrokeColorClass = (0, _colorRgba.createEventedColorRGBAClass)(eventName, \"strokeColor\");\n\n /**\n * Stroke style modification event\n * @event EventedStrokeStyle#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n /**\n * @mixin New evented stroke style mixin. Will fire events whenever\n * the stroke is modified\n */\n return (0, _aggregation2.default)(null, StrokeStyle, function () {\n function EventedStrokeStyle() {\n _classCallCheck(this, EventedStrokeStyle);\n }\n\n _createClass(EventedStrokeStyle, [{\n key: \"initializer\",\n\n /**\n * Initializer method to initialize an evented stroke style.\n * @param {StrokeStyleOptions} [opts]\n * @protected\n */\n value: function initializer(opts) {\n this._strokeColor = new StrokeColorClass(\"black\", this);\n this._strokeWidth = 0;\n this._lineJoin = JoinEnum.MITER;\n this._lineCap = CapEnum.BUTT;\n this._dashPattern = [];\n this._dashOffset = 0;\n this._initStrokeStyleFromOptions(opts);\n }\n\n /**\n * Sets the stroke width\n * @param {number}\n * @fires EventedStrokeStyle#changed\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"strokeWidth\",\n set: function set(strokeWidth) {\n validateStrokeWidth(strokeWidth);\n if (strokeWidth !== this._strokeWidth) {\n var prev = this._strokeWidth;\n this._strokeWidth = strokeWidth;\n this.fire(eventName, {\n attr: \"strokeWidth\",\n prevVal: prev,\n curral: this._strokeWidth\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current stroke width\n * @return {number}\n */\n ,\n get: function get() {\n return this._strokeWidth;\n }\n\n /**\n * Sets the line join\n * @param {string} lineJoin\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"lineJoin\",\n set: function set(lineJoin) {\n var enumVal = validateLineJoin(lineJoin);\n\n if (enumVal !== this._lineJoin) {\n var prev = this._lineJoin;\n this._lineJoin = enumVal;\n this.fire(eventName, {\n attr: \"lineJoin\",\n prevVal: prev,\n curral: this._lineJoin\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current line join\n * @return {string}\n */\n ,\n get: function get() {\n return lineJoinOpts[this._lineJoin];\n }\n\n /**\n * Sets the line cap\n * @param {string} lineCap\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"lineCap\",\n set: function set(lineCap) {\n var enumVal = validateLineCap(lineCap);\n if (enumVal !== this._lineCap) {\n var prev = this._lineCap;\n this._lineCap = enumVal;\n this.fire(eventName, {\n attr: \"lineCap\",\n prevVal: prev,\n curral: this._lineCap\n });\n }\n return this;\n }\n\n /**\n * Gets the line cap\n * @return {string}\n */\n ,\n get: function get() {\n return lineCapOpts[this._lineCap];\n }\n\n /**\n * Sets the dash pattern\n * @param {number[]} dashPattern\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"dashPattern\",\n set: function set(dashPattern) {\n validateDashPattern(dashPattern);\n var diff = false;\n if (dashPattern.length === this._dashPattern.length) {\n for (var i = 0; i < dashPattern.length; i += 1) {\n if (dashPattern[i] !== this._dashPattern[i]) {\n diff = true;\n break;\n }\n }\n } else {\n diff = true;\n }\n\n if (diff) {\n var prev = this._dashPattern;\n this._dashPattern = dashPattern.slice();\n this.fire(eventName, {\n attr: \"dashPattern\",\n prevVal: prev,\n curral: this._dashPattern.slice()\n });\n }\n return this;\n }\n\n /**\n * Gets the current dash pattern\n * @return {number[]}\n */\n ,\n get: function get() {\n return this._dashPattern.slice();\n }\n\n /**\n * Sets the current dash offset\n * @param {number} dashOffset\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"dashOffset\",\n set: function set(dashOffset) {\n validateDashOffset(dashOffset);\n\n if (dashOffset !== this._dashOffset) {\n var prev = this._dashOffset;\n this._dashOffset = dashOffset;\n\n if (this._dashPattern.length) {\n // only fire if dashing is activated\n this.fire(eventName, {\n attr: \"dashOffset\",\n prevVal: prev,\n curral: this._dashOffset\n });\n }\n }\n return this;\n }\n\n /**\n * Gets the current dash offset\n * @return {number}\n */\n ,\n get: function get() {\n return this._dashOffset;\n }\n }]);\n\n return EventedStrokeStyle;\n }());\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9zdHJva2Utc3R5bGUuanM/MzNkZiJdLCJuYW1lcyI6WyJjcmVhdGVFdmVudGVkU3Ryb2tlU3R5bGVNaXhpbiIsInZhbGlkYXRlU3Ryb2tlV2lkdGgiLCJzdHJva2VXaWR0aCIsIkVycm9yIiwiSm9pbkVudW0iLCJNSVRFUiIsIkJFVkVMIiwiUk9VTkQiLCJsaW5lSm9pbk9wdHMiLCJ2YWxpZGF0ZUxpbmVKb2luIiwibGluZUpvaW4iLCJpZHgiLCJpbmRleE9mIiwidG9Mb3dlckNhc2UiLCJqb2luIiwiQ2FwRW51bSIsIkJVVFQiLCJTUVVBUkUiLCJsaW5lQ2FwT3B0cyIsInZhbGlkYXRlTGluZUNhcCIsImxpbmVDYXAiLCJ2YWxpZGF0ZURhc2hQYXR0ZXJuIiwiZGFzaFBhdHRlcm4iLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ2YWxpZGF0ZURhc2hPZmZzZXQiLCJkYXNoT2Zmc2V0IiwiU3Ryb2tlU3R5bGUiLCJvcHRzIiwiaW5pdGlhbGl6ZXIiLCJzdHJva2VDb2xvciIsInN0cm9rZU9wYWNpdHkiLCJsaW5lTWl0ZXIiLCJfc3Ryb2tlQ29sb3IiLCJDb2xvclJHQkEiLCJfc3Ryb2tlV2lkdGgiLCJfbGluZUpvaW4iLCJfbGluZUNhcCIsIl9kYXNoUGF0dGVybiIsIl9kYXNoT2Zmc2V0IiwiX2luaXRTdHJva2VTdHlsZUZyb21PcHRpb25zIiwib3BhY2l0eSIsImlzVHJhbnNwYXJlbnQiLCJjdHgiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsInNldExpbmVEYXNoIiwibGluZURhc2hPZmZzZXQiLCJ2YWx1ZSIsInBhY2tlZFN0cm9rZUNvbG9yIiwicGFja2VkVmFsdWUiLCJlbnVtVmFsIiwic2xpY2UiLCJzcmNTdHlsZSIsImRzdFN0eWxlIiwic3Ryb2tlU3R5bGVBIiwic3Ryb2tlU3R5bGVCIiwidmFsQSIsImlzU3Ryb2tlVmlzaWJsZSIsInZhbEIiLCJpIiwic3Ryb2tlU3R5bGVPYmoiLCJldmVudE5hbWUiLCJTdHJva2VDb2xvckNsYXNzIiwicHJldiIsImZpcmUiLCJhdHRyIiwicHJldlZhbCIsImN1cnJhbCIsImRpZmYiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztRQXdjZ0JBLDZCLEdBQUFBLDZCOztBQXRjaEI7Ozs7QUFDQTs7Ozs7Ozs7QUFFQTs7Ozs7Ozs7OztBQVVBOzs7Ozs7QUFNQSxTQUFTQyxtQkFBVCxDQUE2QkMsV0FBN0IsRUFBMEM7QUFDeEMsTUFBSSxPQUFPQSxXQUFQLEtBQXVCLFFBQTNCLEVBQXFDO0FBQ25DLFVBQU0sSUFBSUMsS0FBSixDQUFVLCtCQUFWLENBQU47QUFDRDtBQUNGOztBQUVEOzs7O0FBSUEsSUFBTUMsV0FBVztBQUNmQyxTQUFPLENBRFE7QUFFZkMsU0FBTyxDQUZRO0FBR2ZDLFNBQU87O0FBR1Q7Ozs7QUFOaUIsQ0FBakIsQ0FVQSxJQUFNQyxlQUFlLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsT0FBbkIsQ0FBckI7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQyxnQkFBVCxDQUEwQkMsUUFBMUIsRUFBb0M7QUFDbEMsTUFBSUMsTUFBTSxDQUFDLENBQVg7QUFDQSxNQUFJLE9BQU9ELFFBQVAsS0FBb0IsUUFBcEIsSUFBZ0MsQ0FBQ0MsTUFBTUgsYUFBYUksT0FBYixDQUFxQkYsU0FBU0csV0FBVCxFQUFyQixDQUFQLElBQXVELENBQTNGLEVBQThGO0FBQzVGLFVBQU0sSUFBSVYsS0FBSixxREFBNERLLGFBQWFNLElBQWIsQ0FBa0IsSUFBbEIsQ0FBNUQsT0FBTjtBQUNEO0FBQ0QsU0FBT0gsR0FBUDtBQUNEOztBQUVEOzs7O0FBSUEsSUFBTUksVUFBVTtBQUNkQyxRQUFNLENBRFE7QUFFZEMsVUFBUSxDQUZNO0FBR2RWLFNBQU87O0FBR1Q7Ozs7QUFOZ0IsQ0FBaEIsQ0FVQSxJQUFNVyxjQUFjLENBQUMsTUFBRCxFQUFTLFFBQVQsRUFBbUIsT0FBbkIsQ0FBcEI7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQyxlQUFULENBQXlCQyxPQUF6QixFQUFrQztBQUNoQyxNQUFJ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O0FBQ0E7QUFDRDtBQUNGO0FBQ0YsU0FQRCxNQU9PO0FBQ0xBLGlCQUFPLElBQVA7QUFDRDs7QUFFRCxZQUFJQSxJQUFKLEVBQVU7QUFDUixjQUFNTCxPQUFPLEtBQUsxQixZQUFsQjtBQUNBLGVBQUtBLFlBQUwsR0FBb0JqQixZQUFZK0IsS0FBWixFQUFwQjtBQUNBLGVBQUthLElBQUwsQ0FBVUgsU0FBVixFQUFxQjtBQUNuQkksa0JBQU0sYUFEYTtBQUVuQkMscUJBQVNILElBRlU7QUFHbkJJLG9CQUFRLEtBQUs5QixZQUFMLENBQWtCYyxLQUFsQjtBQUhXLFdBQXJCO0FBS0Q7QUFDRCxlQUFPLElBQVA7QUFDRDs7QUFFRDs7OztBQXZJSztBQUFBLDBCQTJJYTtBQUNoQixlQUFPLEtBQUtkLFlBQUwsQ0FBa0JjLEtBQWxCLEVBQVA7QUFDRDs7QUFFRDs7Ozs7OztBQS9JSztBQUFBO0FBQUEsd0JBcUpVMUIsVUFySlYsRUFxSnNCO0FBQ3pCRCwyQkFBbUJDLFVBQW5COztBQUVBLFlBQUlBLGVBQWUsS0FBS2EsV0FBeEIsRUFBcUM7QUFDbkMsY0FBTXlCLE9BQU8sS0FBS3pCLFdBQWxCO0FBQ0EsZUFBS0EsV0FBTCxHQUFtQmIsVUFBbkI7O0FBRUEsY0FBSSxLQUFLWSxZQUFMLENBQWtCZCxNQUF0QixFQUE4QjtBQUM1QjtBQUNBLGlCQUFLeUMsSUFBTCxDQUFVSCxTQUFWLEVBQXFCO0FBQ25CSSxvQkFBTSxZQURhO0FBRW5CQyx1QkFBU0gsSUFGVTtBQUduQkksc0JBQVEsS0FBSzdCO0FBSE0sYUFBckI7QUFLRDtBQUNGO0FBQ0QsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7QUF4S0s7QUFBQSwwQkE0S1k7QUFDZixlQUFPLEtBQUtBLFdBQVo7QUFDRDtBQTlLSTs7QUFBQTtBQUFBLE1BQVA7QUFnTEQiLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgQ29sb3JSR0JBLCB7Y3JlYXRlRXZlbnRlZENvbG9yUkdCQUNsYXNzfSBmcm9tIFwiLi9jb2xvci1yZ2JhXCJcbmltcG9ydCBhZ2dyZWdhdGlvbiBmcm9tIFwiLi4vdXRpbC9hZ2dyZWdhdGlvblwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3Ryb2tlU3R5bGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N0cm9rZUNvbG9yID0gXCJibGFja1wiXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzdHJva2VXaWR0aCA9IDBdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2xpbmVKb2luID0gXCJtaXRlclwiXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsaW5lQ2FwID0gXCJidXR0XCJdXG4gKiBAcHJvcGVydHkge251bWJlcltdfSBbZGFzaFBhdHRlcm4gPSBbXV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGFzaE9mZnNldCA9IDBdXG4gKi9cblxuLyoqXG4gKiB2YWxpZGF0ZXMgYSBwb3NzaWJsZSBzdHJva2Ugd2lkdGggdmFsdWVcbiAqIEBwYXJhbSAge251bWJlcn0gc3Ryb2tlV2lkdGhcbiAqIEB0aHJvd3MgSWYgdmFsaWRhdGlvbiBmYWlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJva2VXaWR0aChzdHJva2VXaWR0aCkge1xuICBpZiAodHlwZW9mIHN0cm9rZVdpZHRoICE9PSBcIm51bWJlclwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3Ryb2tlIHdpZHRoIG11c3QgYmUgYSBudW1iZXJcIilcbiAgfVxufVxuXG4vKipcbiAqIEVudW0gZm9yIGxpbmUgam9pbiB2YWx1ZXNcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmNvbnN0IEpvaW5FbnVtID0ge1xuICBNSVRFUjogMCxcbiAgQkVWRUw6IDEsXG4gIFJPVU5EOiAyXG59XG5cbi8qKlxuICogbGluZSBqb2luIHZhbHVlcyBhcyBzdHJpbmdzLCB0aGUgZW51bSB2YWx1ZXMgbWF0Y2ggdGhlIGluZGV4IGluIHRoaXMgc3RyaW5nXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKi9cbmNvbnN0IGxpbmVKb2luT3B0cyA9IFtcIm1pdGVyXCIsIFwiYmV2ZWxcIiwgXCJyb3VuZFwiXVxuXG4vKipcbiAqIHZhbGlkYXRlcyBhIGxpbmUgam9pbiB2YWx1ZVxuICogQHBhcmFtICB7c3RyaW5nfSBsaW5lSm9pbiBTaG91bGQgYmUgb25lIG9mIFtcIm1pdGVyXCIsIFwiYmV2ZWxcIiwgXCJyb3VuZFwiXVxuICogQHRocm93cyBJZiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcmV0dXJuIHtKb2luRW51bX1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTGluZUpvaW4obGluZUpvaW4pIHtcbiAgbGV0IGlkeCA9IC0xXG4gIGlmICh0eXBlb2YgbGluZUpvaW4gIT09IFwic3RyaW5nXCIgfHwgKGlkeCA9IGxpbmVKb2luT3B0cy5pbmRleE9mKGxpbmVKb2luLnRvTG93ZXJDYXNlKCkpKSA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmUgam9pbiBtdXN0IGJlIGEgc3RyaW5nIGFuZCBtdXN0IGJlIG9uZSBvZiBbJHtsaW5lSm9pbk9wdHMuam9pbihcIiwgXCIpfV1gKVxuICB9XG4gIHJldHVybiBpZHhcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBsaW5lIGNhcCB2YWx1ZXNcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmNvbnN0IENhcEVudW0gPSB7XG4gIEJVVFQ6IDAsXG4gIFNRVUFSRTogMSxcbiAgUk9VTkQ6IDJcbn1cblxuLyoqXG4gKiBsaW5lIGNhcCB2YWx1ZXMgYXMgc3RyaW5ncywgdGhlIENhcEVudW0gdmFsdWVzIG1hdGNoIHRoZSBpbmRleCBpbiB0aGlzIHN0cmluZ1xuICogQHR5cGUge3N0cmluZ1tdfVxuICovXG5jb25zdCBsaW5lQ2FwT3B0cyA9IFtcImJ1dHRcIiwgXCJzcXVhcmVcIiwgXCJyb3VuZFwiXVxuXG4vKipcbiAqIHZhbGlkYXRlcyBhIGxpbmUgY2FwIHZhbHVlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGxpbmVDYXAgU2hvdWxkIGJlIG9uZSBvZiBcImJ1dHRcIiwgXCJzcXVhcmVcIiwgXCJyb3VuZFwiXG4gKiBAdGhyb3dzIElmIHZhbGlkYXRpb24gZmFpbHNcbiAqIEByZXR1cm4ge0NhcEVudW19XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUxpbmVDYXAobGluZUNhcCkge1xuICBsZXQgaWR4ID0gLTFcbiAgaWYgKHR5cGVvZiBsaW5lQ2FwICE9PSBcInN0cmluZ1wiIHx8IChpZHggPSBsaW5lQ2FwT3B0cy5pbmRleE9mKGxpbmVDYXAudG9Mb3dlckNhc2UoKSkpIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGluZSBjYXAgbXVzdCBiZSBhIHN0cmluZyBhbmQgbXVzdCBiZSBvbmUgb2YgWyR7bGluZUNhcE9wdHMuam9pbihcIiwgXCIpfV1gKVxuICB9XG4gIHJldHVybiBpZHhcbn1cblxuLyoqXG4gKiB2YWxpZGF0ZXMgYSBkYXNoIHBhdHRlcm4gdmFsdWVcbiAqIEBwYXJhbSAge251bWJlcltdfSBkYXNoUGF0dGVyblxuICogQHRocm93cyBJZiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURhc2hQYXR0ZXJuKGRhc2hQYXR0ZXJuKSB7XG4gIGlmICghZGFzaFBhdHRlcm4gfHwgIUFycmF5LmlzQXJyYXkoZGFzaFBhdHRlcm4pIHx8IGRhc2hQYXR0ZXJuLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGFzaCBwYXR0ZXJuIG11c3QgYmUgYW4gYXJyYXkgd2l0aCBhbiBldmVuIG51bWJlciBvZiBudW1iZXJzIChvciBhbiBlbXB0eSBhcnJheSlcIilcbiAgfVxufVxuXG4vKipcbiAqIHZhbGlkYXRlcyBhIGRhc2ggb2Zmc2V0IHZhbHVlXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGRhc2hPZmZzZXRcbiAqIEB0aHJvd3MgSWYgdmFsaWRhdGlvbiBmYWlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEYXNoT2Zmc2V0KGRhc2hPZmZzZXQpIHtcbiAgaWYgKHR5cGVvZiBkYXNoT2Zmc2V0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGRhc2ggb2Zmc2V0IG11c3QgYmUgYSBudW1iZXJcIilcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXMgdGhlIHN0cm9rZSBzdHlsZSBvZiBhIDJkIHJlbmRlcmluZyBjb250ZXh0LiBDYW4gYmUgdXNlZCBhcyBhIG1peGluIG9yIGJhc2UgY2xhc3NcbiAqIEBjbGFzc1xuICogQG1peGluXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0cm9rZVN0eWxlIHtcbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZXIob3B0cylcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplcyB0aGUgc3Ryb2tlIHN0eWxlIG9iamVjdCBmcm9tIGFuIG9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSAge1N0cm9rZVN0eWxlT3B0aW9uc30gW29wdHNdXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdFN0cm9rZVN0eWxlRnJvbU9wdGlvbnMob3B0cykge1xuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMuc3Ryb2tlQ29sb3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3JcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5zdHJva2VPcGFjaXR5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMuc3Ryb2tlT3BhY2l0eSA9IG9wdHMuc3Ryb2tlT3BhY2l0eVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRzLnN0cm9rZVdpZHRoICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMubGluZU1pdGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMubGluZUpvaW4gPSBvcHRzLmxpbmVNaXRlclxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRzLmxpbmVDYXAgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5saW5lQ2FwID0gb3B0cy5saW5lQ2FwXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMuZGFzaFBhdHRlcm4gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5kYXNoUGF0dGVybiA9IG9wdHMuZGFzaFBhdHRlcm5cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5kYXNoT2Zmc2V0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRoaXMuZGFzaE9mZnNldCA9IG9wdHMuZGFzaE9mZnNldFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhIHN0cm9rZSBzdHlsZS4gVXNlZCBmb3IgYm90aCBpbml0aWFsaXppbmdcbiAgICogdmlhIGJhc2UtY2xhc3MgYW5kIG1peGluIGhpZXJhcmNoeS5cbiAgICogQHBhcmFtICB7U3Ryb2tlU3R5bGVPcHRpb25zfSBbb3B0c11cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZXIob3B0cykge1xuICAgIHRoaXMuX3N0cm9rZUNvbG9yID0gbmV3IENvbG9yUkdCQShcImJsYWNrXCIpXG4gICAgdGhpcy5fc3Ryb2tlV2lkdGggPSAwXG4gICAgdGhpcy5fbGluZUpvaW4gPSBKb2luRW51bS5NSVRFUlxuICAgIHRoaXMuX2xpbmVDYXAgPSBDYXBFbnVtLkJVVFRcbiAgICB0aGlzLl9kYXNoUGF0dGVybiA9IFtdXG4gICAgdGhpcy5fZGFzaE9mZnNldCA9IDBcbiAgICB0aGlzLl9pbml0U3Ryb2tlU3R5bGVGcm9tT3B0aW9ucyhvcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0cm9rZSBjb2xvclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHN0cm9rZUNvbG9yIENvbG9yIGFzIGEgc3RyaW5nLCBcInJnYigpXCIsIFwicmdiYSgpXCIsIFwiIy4uLi4uLlwiLCBvciBhIGNvbG9yIGtleXdvcmQgKGkuZS4gXCJibGFja1wiKVxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBzdHJva2VDb2xvcihzdHJva2VDb2xvcikge1xuICAgIHRoaXMuX3N0cm9rZUNvbG9yLnZhbHVlID0gc3Ryb2tlQ29sb3JcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0cm9rZSBjb2xvciBvZiB0aGUgc3R5bGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0cm9rZUNvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VDb2xvci52YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG9wYWNpdHkgb2YgdGhlIHN0cm9rZSBzdHlsZVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IG9wYWNpdHkgWzAsMV1cbiAgICogQHJldHVybiB7U3Ryb2tlU3R5bGV9XG4gICAqL1xuICBzZXQgc3Ryb2tlT3BhY2l0eShvcGFjaXR5KSB7XG4gICAgdGhpcy5fc3Ryb2tlQ29sb3Iub3BhY2l0eSA9IG9wYWNpdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IG9wYWNpdHkgb2YgdGhlIHN0cm9rZSBzdHlsZSBbMCwxXVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IE9wYWNpdHkgaW4gdGhlIHJhbmdlIFswLDFdXG4gICAqL1xuICBnZXQgc3Ryb2tlT3BhY2l0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Ryb2tlQ29sb3Iub3BhY2l0eVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0cm9rZSBjb2xvciBvZiB0aGUgc3R5bGUgZGVmaW5lZCBhcyBhIDMyLWJpdCBpbnRcbiAgICogQHBhcmFtICB7bnVtYmVyfSBwYWNrZWRTdHJva2VDb2xvciBDb2xvciB2YWx1ZSBhcyBhIDMyLWJpdCBpbnQgKGkuZS4gMHhGRkZGRkZGRilcbiAgICogQHJldHVybiB7U3Ryb2tlU3R5bGV9XG4gICAqL1xuICBzZXQgcGFja2VkU3Ryb2tlQ29sb3IocGFja2VkU3Ryb2tlQ29sb3IpIHtcbiAgICB0aGlzLl9zdHJva2VDb2xvci5wYWNrZWRWYWx1ZSA9IHBhY2tlZFN0cm9rZUNvbG9yXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29sb3Igb2YgdGhlIHN0cm9rZSBzdHlsZSBhcyBhIDMyLWJpdCBpbnRcbiAgICogQHJldHVybiB7bnVtYmVyfSBpLmUuIDB4RkZGRkZGRkZcbiAgICovXG4gIGdldCBwYWNrZWRTdHJva2VDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Ryb2tlQ29sb3IucGFja2VkVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdHJva2Ugd2lkdGhcbiAgICogQHBhcmFtICB7bnVtYmVyfSBzdHJva2VXaWR0aFxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBzdHJva2VXaWR0aChzdHJva2VXaWR0aCkge1xuICAgIHZhbGlkYXRlU3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgpXG4gICAgdGhpcy5fc3Ryb2tlV2lkdGggPSBzdHJva2VXaWR0aFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzdHJva2Ugd2lkdGhcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHN0cm9rZVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VXaWR0aFxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgaG93IGxpbmVzIHNob3VsZCBiZSBqb2luZWRcbiAgICogQHBhcmFtICB7c3RyaW5nfSBsaW5lSm9pbiBPbmUgb2YgXCJtaXRlclwiLCBcInJvdW5kXCIsIG9yIFwiYmV2ZWxcIlxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBsaW5lSm9pbihsaW5lSm9pbikge1xuICAgIGNvbnN0IGVudW1WYWwgPSB2YWxpZGF0ZUxpbmVKb2luKGxpbmVKb2luKVxuICAgIHRoaXMuX2xpbmVKb2luID0gZW51bVZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBsaW5lIGpvaW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxpbmVKb2luKCkge1xuICAgIHJldHVybiBsaW5lSm9pbk9wdHNbdGhpcy5fbGluZUpvaW5dXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBob3cgbGluZXMgc2hvdWxkIGJlIGNhcHBlZFxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxpbmVDYXAgT25lIG9mIFwiYnV0dFwiLCBcInNxdWFyZVwiLCBvciBcInJvdW5kXCJcbiAgICogQHJldHVybiB7U3Ryb2tlU3R5bGV9XG4gICAqL1xuICBzZXQgbGluZUNhcChsaW5lQ2FwKSB7XG4gICAgY29uc3QgZW51bVZhbCA9IHZhbGlkYXRlTGluZUNhcChsaW5lQ2FwKVxuICAgIHRoaXMuX2xpbmVDYXAgPSBlbnVtVmFsXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpbmUgY2FwIG9mIHRoZSBzdHlsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGluZUNhcCgpIHtcbiAgICByZXR1cm4gbGluZUNhcE9wdHNbdGhpcy5fbGluZUpvaW5dXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGFzaCBwYXR0ZXJuIG9mIHRoZSBzdHlsZVxuICAgKiBAcGFyYW0gIHtudW1iZXJbXX0gZGFzaFBhdHRlcm4gQSBsaXN0IG9mIG51bWJlcnMgdGhhdCBzcGVjaWZpZXMgZGlzdGFuY2VzIHRvIGFsdGVybmF0ZWx5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3IGEgbGluZSBhbmQgYSBnYXAgKGluIHNjcmVlbiB1bml0cylcbiAgICogQHJldHVybiB7U3Ryb2tlU3R5bGV9XG4gICAqL1xuICBzZXQgZGFzaFBhdHRlcm4oZGFzaFBhdHRlcm4pIHtcbiAgICB2YWxpZGF0ZURhc2hQYXR0ZXJuKGRhc2hQYXR0ZXJuKVxuICAgIHRoaXMuX2Rhc2hQYXR0ZXJuID0gZGFzaFBhdHRlcm4uc2xpY2UoKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBkYXNoIHBhdHRlcm4gb2YgdGhlIHN0eWxlXG4gICAqIEByZXR1cm4ge251bWJlcltdfVxuICAgKi9cbiAgZ2V0IGRhc2hQYXR0ZXJuKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXNoUGF0dGVybi5zbGljZSgpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGFzaCBvZmZzZXQgb2YgdGhlIHN0eWxlXG4gICAqIEBwYXJhbSAge251bWJlcn0gZGFzaE9mZnNldFxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBkYXNoT2Zmc2V0KGRhc2hPZmZzZXQpIHtcbiAgICB2YWxpZGF0ZURhc2hPZmZzZXQoZGFzaE9mZnNldClcbiAgICB0aGlzLl9kYXNoT2Zmc2V0ID0gZGFzaE9mZnNldFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBkYXNoIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGFzaE9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaE9mZnNldFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3Ryb2tlIHN0eWxlIGlzIHZpc2libGUsIGkuZS4gaXQgaXMgbm90IGZ1bGx5IHRyYW5zcGFyZW50XG4gICAqIGFuZCBoYXMgYSB3aWR0aCA+IDBcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzU3Ryb2tlVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Ryb2tlQ29sb3Iub3BhY2l0eSA+IDAgJiYgdGhpcy5fc3Ryb2tlV2lkdGggPiAwXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHN0cm9rZSBpcyBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQsIGkuZS4gb3BhY2l0eSA8IDFcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgaXNUcmFuc3BhcmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Ryb2tlQ29sb3IuaXNUcmFuc3BhcmVudCgpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3Ryb2tlIHN0eWxlIHN0YXRlIG9mIGEgMmQgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eFxuICAgKi9cbiAgc2V0U3Ryb2tlQ3R4KGN0eCkge1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc3Ryb2tlQ29sb3JcbiAgICBjdHgubGluZVdpZHRoID0gdGhpcy5fc3Ryb2tlV2lkdGhcbiAgICBjdHgubGluZUpvaW4gPSB0aGlzLl9saW5lSm9pblxuICAgIGN0eC5saW5lQ2FwID0gdGhpcy5fbGluZUNhcFxuICAgIGN0eC5zZXRMaW5lRGFzaCh0aGlzLl9kYXNoUGF0dGVybilcbiAgICBjdHgubGluZURhc2hPZmZzZXQgPSB0aGlzLl9kYXNoT2Zmc2V0XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIHRoZSBwcm9wZXJ0aWVzIG9mIG9uZSBzdHJva2Ugc3R5bGUgdG8gYW5vdGhlclxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZX0gc3JjU3R5bGUgU3Ryb2tlU3R5bGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZX0gZHN0U3R5bGUgU3Ryb2tlU3R5bGUgb2JqZWN0IHRvIGNvcHkgdG9cbiAgICovXG4gIHN0YXRpYyBjb3B5U3Ryb2tlU3R5bGUoc3JjU3R5bGUsIGRzdFN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBzcmNTdHlsZS5wYWNrZWRTdHJva2VDb2xvciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHR5cGVvZiBzcmNTdHlsZS5zdHJva2VDb2xvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkc3RTdHlsZS5zdHJva2VDb2xvciA9IHNyY1N0eWxlLnN0cm9rZUNvbG9yXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNyY1N0eWxlLnN0cm9rZU9wYWNpdHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZHN0U3R5bGUuc3Ryb2tlT3BhY2l0eSA9IHNyY1N0eWxlLnN0cm9rZU9wYWNpdHlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZHN0U3R5bGUucGFja2VkU3Ryb2tlQ29sb3IgPSBzcmNTdHlsZS5wYWNrZWRTdHJva2VDb2xvclxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNyY1N0eWxlLnN0cm9rZVdpZHRoICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBkc3RTdHlsZS5zdHJva2VXaWR0aCA9IHNyY1N0eWxlLnN0cm9rZVdpZHRoXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUubGluZUpvaW4gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGRzdFN0eWxlLmxpbmVKb2luID0gc3JjU3R5bGUubGluZUpvaW5cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzcmNTdHlsZS5saW5lQ2FwICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBkc3RTdHlsZS5saW5lQ2FwID0gc3JjU3R5bGUubGluZUNhcFxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNyY1N0eWxlLmRhc2hQYXR0ZXJuICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBkc3RTdHlsZS5kYXNoUGF0dGVybiA9IHNyY1N0eWxlLmRhc2hQYXR0ZXJuXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUuZGFzaE9mZnNldCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgZHN0U3R5bGUuZGFzaE9mZnNldCA9IHNyY1N0eWxlLmRhc2hPZmZzZXRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyaXNvbiBvcGVyYXRvciBiZXR3ZWVuIHR3byBTdHJva2VTdHlsZSBvYmplY3RzLiBUaGlzIGlzIHByaW1hcmlseVxuICAgKiB1c2VkIGZvciBzb3J0aW5nIHRvIG1pbmltaXplIGNvbnRleHQgc3dpdGNoaW5nIG9mIGEgMmQgcmVuZGVyZXJcbiAgICogQHBhcmFtICB7U3Ryb2tlU3R5bGV9IHN0cm9rZVN0eWxlQVxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZX0gc3Ryb2tlU3R5bGVCXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICBSZXR1cm5zIDwgMCBpZiBzdHJva2VTdHlsZUEgPCBzdHJva2VTdHlsZUIsID4gMCBpZiBzdHJva2VTdHlsZUEgPiBzdHJva2VTdHlsZUIsIG9yIDAgaWYgdGhleSBhcmUgZXF1YWwuXG4gICAqL1xuICBzdGF0aWMgY29tcGFyZVN0cm9rZVN0eWxlKHN0cm9rZVN0eWxlQSwgc3Ryb2tlU3R5bGVCKSB7XG4gICAgbGV0IHZhbEEgPSBzdHJva2VTdHlsZUEuaXNTdHJva2VWaXNpYmxlKClcbiAgICBsZXQgdmFsQiA9IHN0cm9rZVN0eWxlQi5pc1N0cm9rZVZpc2libGUoKVxuICAgIGlmICh2YWxBICE9PSB2YWxCKSB7XG4gICAgICByZXR1cm4gdmFsQSAtIHZhbEJcbiAgICB9XG4gICAgdmFsQSA9IHN0cm9rZVN0eWxlQS5wYWNrZWRTdHJva2VDb2xvclxuICAgIHZhbEIgPSBzdHJva2VTdHlsZUIucGFja2VkU3Ryb2tlQ29sb3JcbiAgICBpZiAodmFsQSAhPT0gdmFsQikge1xuICAgICAgcmV0dXJuIHZhbEEgLSB2YWxCXG4gICAgfVxuICAgIHZhbEEgPSBzdHJva2VTdHlsZUEuc3Ryb2tlV2lkdGhcbiAgICB2YWxCID0gc3Ryb2tlU3R5bGVCLnN0cm9rZVdpZHRoXG4gICAgaWYgKHZhbEEgIT09IHZhbEIpIHtcbiAgICAgIHJldHVybiB2YWxBIC0gdmFsQlxuICAgIH1cbiAgICB2YWxBID0gc3Ryb2tlU3R5bGVBLl9saW5lSm9pblxuICAgIHZhbEIgPSBzdHJva2VTdHlsZUIuX2xpbmVKb2luXG4gICAgaWYgKHZhbEEgIT09IHZhbEIpIHtcbiAgICAgIHJldHVybiB2YWxBIC0gdmFsQlxuICAgIH1cbiAgICB2YWxBID0gc3Ryb2tlU3R5bGVBLl9saW5lQ2FwXG4gICAgdmFsQiA9IHN0cm9rZVN0eWxlQi5fbGluZUNhcFxuICAgIGlmICh2YWxBICE9PSB2YWxCKSB7XG4gICAgICByZXR1cm4gdmFsQSAtIHZhbEJcbiAgICB9XG4gICAgdmFsQSA9IHN0cm9rZVN0eWxlQS5fZGFzaFBhdHRlcm5cbiAgICB2YWxCID0gc3Ryb2tlU3R5bGVCLl9kYXNoUGF0dGVyblxuICAgIGlmICh2YWxBLmxlbmd0aCA9PT0gdmFsQi5sZW5ndGggJiYgdmFsQS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbEEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKHZhbEFbaV0gIT09IHZhbEJbaV0pIHtcbiAgICAgICAgICByZXR1cm4gdmFsQVtpXSAtIHZhbEJbaV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cm9rZVN0eWxlQS5kYXNoT2Zmc2V0IC0gc3Ryb2tlU3R5bGVCLmRhc2hPZmZzZXRcbiAgICB9XG4gICAgcmV0dXJuIHZhbEEubGVuZ3RoIC0gdmFsQi5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEganNvbiBvYmplY3Qgb2YgYSBTdHJva2VTdHlsZSBvYmplY3RcbiAgICogQHBhcmFtICB7U3Ryb2tlU3R5bGV9IHN0cm9rZVN0eWxlT2JqXG4gICAqIEByZXR1cm4ge3tzdHJva2VDb2xvcjogc3RyaW5nLFxuICAgKiAgICAgICAgICAgc3Ryb2tlV2lkdGg6IG51bWJlcixcbiAgICogICAgICAgICAgIGxpbmVKb2luOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBsaW5lQ2FwOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBkYXNoUGF0dGVybjogbnVtYmVyW10sXG4gICAqICAgICAgICAgICBkYXNoT2Zmc2V0OiBudW1iZXJcbiAgICogICAgICAgICAgfX1cbiAgICovXG4gIHN0YXRpYyB0b0pTT04oc3Ryb2tlU3R5bGVPYmopIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3Ryb2tlQ29sb3I6IHN0cm9rZVN0eWxlT2JqLnN0cm9rZUNvbG9yLFxuICAgICAgc3Ryb2tlV2lkdGg6IHN0cm9rZVN0eWxlT2JqLnN0cm9rZVdpZHRoLFxuICAgICAgbGluZUpvaW46IHN0cm9rZVN0eWxlT2JqLmxpbmVKb2luLFxuICAgICAgbGluZUNhcDogc3Ryb2tlU3R5bGVPYmoubGluZUNhcCxcbiAgICAgIGRhc2hQYXR0ZXJuOiBzdHJva2VTdHlsZU9iai5kYXNoUGF0dGVybixcbiAgICAgIGRhc2hPZmZzZXQ6IHN0cm9rZVN0eWxlT2JqLmRhc2hPZmZzZXRcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHN0cm9rZSBzdHlsZSBjbGFzcyB0aGF0IGZpcmVzIGV2ZW50cyB3aGVuZXZlciB0aGUgc3R5bGVcbiAqIGlzIG1vZGlmaWVkLlxuICogQHBhcmFtICB7c3RyaW5nfSBldmVudE5hbWUgRXZlbnQgdHlwZSB0byBmaXJlIHdoZW4gc3Ryb2tlIHN0eWxlIGlzIG1vZGlmaWVkXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gICAgICAgICBOZXcgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50ZWRTdHJva2VTdHlsZU1peGluKGV2ZW50TmFtZSkge1xuICAvKipcbiAgICogRXZlbnRlZCBzdHJva2UgY29sb3IgY2xhc3MgdG8gaGFuZGxlIGNvbG9yIG1vZGlmaWNhdGlvbiBldmVudHNcbiAgICogQHR5cGUge0NvbG9yUkdCQX1cbiAgICovXG4gIGNvbnN0IFN0cm9rZUNvbG9yQ2xhc3MgPSBjcmVhdGVFdmVudGVkQ29sb3JSR0JBQ2xhc3MoZXZlbnROYW1lLCBcInN0cm9rZUNvbG9yXCIpXG5cbiAgLyoqXG4gICAqIFN0cm9rZSBzdHlsZSBtb2RpZmljYXRpb24gZXZlbnRcbiAgICogQGV2ZW50IEV2ZW50ZWRTdHJva2VTdHlsZSNjaGFuZ2VkXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBtb2RpZmllZFxuICAgKiBAcHJvcGVydHkge30gcHJldlZhbCBQcmV2aW91cyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHByaW9yIHRvIG1vZGlmaWNhdGlvblxuICAgKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWl4aW4gTmV3IGV2ZW50ZWQgc3Ryb2tlIHN0eWxlIG1peGluLiBXaWxsIGZpcmUgZXZlbnRzIHdoZW5ldmVyXG4gICAqICAgICAgICB0aGUgc3Ryb2tlIGlzIG1vZGlmaWVkXG4gICAqL1xuICByZXR1cm4gYWdncmVnYXRpb24obnVsbCwgU3Ryb2tlU3R5bGUsIGNsYXNzIEV2ZW50ZWRTdHJva2VTdHlsZSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXIgbWV0aG9kIHRvIGluaXRpYWxpemUgYW4gZXZlbnRlZCBzdHJva2Ugc3R5bGUuXG4gICAgICogQHBhcmFtICB7U3Ryb2tlU3R5bGVPcHRpb25zfSBbb3B0c11cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZXIob3B0cykge1xuICAgICAgdGhpcy5fc3Ryb2tlQ29sb3IgPSBuZXcgU3Ryb2tlQ29sb3JDbGFzcyhcImJsYWNrXCIsIHRoaXMpXG4gICAgICB0aGlzLl9zdHJva2VXaWR0aCA9IDBcbiAgICAgIHRoaXMuX2xpbmVKb2luID0gSm9pbkVudW0uTUlURVJcbiAgICAgIHRoaXMuX2xpbmVDYXAgPSBDYXBFbnVtLkJVVFRcbiAgICAgIHRoaXMuX2Rhc2hQYXR0ZXJuID0gW11cbiAgICAgIHRoaXMuX2Rhc2hPZmZzZXQgPSAwXG4gICAgICB0aGlzLl9pbml0U3Ryb2tlU3R5bGVGcm9tT3B0aW9ucyhvcHRzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0cm9rZSB3aWR0aFxuICAgICAqIEBwYXJhbSAge251bWJlcn1cbiAgICAgKiBAZmlyZXMgIEV2ZW50ZWRTdHJva2VTdHlsZSNjaGFuZ2VkXG4gICAgICogQHJldHVybiB7RXZlbnRlZFN0cm9rZVN0eWxlfVxuICAgICAqL1xuICAgIHNldCBzdHJva2VXaWR0aChzdHJva2VXaWR0aCkge1xuICAgICAgdmFsaWRhdGVTdHJva2VXaWR0aChzdHJva2VXaWR0aClcbiAgICAgIGlmIChzdHJva2VXaWR0aCAhPT0gdGhpcy5fc3Ryb2tlV2lkdGgpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3N0cm9rZVdpZHRoXG4gICAgICAgIHRoaXMuX3N0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGhcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwic3Ryb2tlV2lkdGhcIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJhbDogdGhpcy5fc3Ryb2tlV2lkdGhcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHN0cm9rZSB3aWR0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgc3Ryb2tlV2lkdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3Ryb2tlV2lkdGhcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaW5lIGpvaW5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxpbmVKb2luXG4gICAgICogQGZpcmVzIHtFdmVudGVkU3Ryb2tlU3R5bGUjY2hhbmdlZH1cbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkU3Ryb2tlU3R5bGV9XG4gICAgICovXG4gICAgc2V0IGxpbmVKb2luKGxpbmVKb2luKSB7XG4gICAgICBjb25zdCBlbnVtVmFsID0gdmFsaWRhdGVMaW5lSm9pbihsaW5lSm9pbilcblxuICAgICAgaWYgKGVudW1WYWwgIT09IHRoaXMuX2xpbmVKb2luKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLl9saW5lSm9pblxuICAgICAgICB0aGlzLl9saW5lSm9pbiA9IGVudW1WYWxcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwibGluZUpvaW5cIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJhbDogdGhpcy5fbGluZUpvaW5cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpbmUgam9pblxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgbGluZUpvaW4oKSB7XG4gICAgICByZXR1cm4gbGluZUpvaW5PcHRzW3RoaXMuX2xpbmVKb2luXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpbmUgY2FwXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBsaW5lQ2FwXG4gICAgICogQGZpcmVzIHtFdmVudGVkU3Ryb2tlU3R5bGUjY2hhbmdlZH1cbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkU3Ryb2tlU3R5bGV9XG4gICAgICovXG4gICAgc2V0IGxpbmVDYXAobGluZUNhcCkge1xuICAgICAgY29uc3QgZW51bVZhbCA9IHZhbGlkYXRlTGluZUNhcChsaW5lQ2FwKVxuICAgICAgaWYgKGVudW1WYWwgIT09IHRoaXMuX2xpbmVDYXApIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX2xpbmVDYXBcbiAgICAgICAgdGhpcy5fbGluZUNhcCA9IGVudW1WYWxcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwibGluZUNhcFwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VycmFsOiB0aGlzLl9saW5lQ2FwXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpbmUgY2FwXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCBsaW5lQ2FwKCkge1xuICAgICAgcmV0dXJuIGxpbmVDYXBPcHRzW3RoaXMuX2xpbmVDYXBdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGFzaCBwYXR0ZXJuXG4gICAgICogQHBhcmFtICB7bnVtYmVyW119IGRhc2hQYXR0ZXJuXG4gICAgICogQGZpcmVzIHtFdmVudGVkU3Ryb2tlU3R5bGUjY2hhbmdlZH1cbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkU3Ryb2tlU3R5bGV9XG4gICAgICovXG4gICAgc2V0IGRhc2hQYXR0ZXJuKGRhc2hQYXR0ZXJuKSB7XG4gICAgICB2YWxpZGF0ZURhc2hQYXR0ZXJuKGRhc2hQYXR0ZXJuKVxuICAgICAgbGV0IGRpZmYgPSBmYWxzZVxuICAgICAgaWYgKGRhc2hQYXR0ZXJuLmxlbmd0aCA9PT0gdGhpcy5fZGFzaFBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGFzaFBhdHRlcm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAoZGFzaFBhdHRlcm5baV0gIT09IHRoaXMuX2Rhc2hQYXR0ZXJuW2ldKSB7XG4gICAgICAgICAgICBkaWZmID0gdHJ1ZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpZmYgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLl9kYXNoUGF0dGVyblxuICAgICAgICB0aGlzLl9kYXNoUGF0dGVybiA9IGRhc2hQYXR0ZXJuLnNsaWNlKClcbiAgICAgICAgdGhpcy5maXJlKGV2ZW50TmFtZSwge1xuICAgICAgICAgIGF0dHI6IFwiZGFzaFBhdHRlcm5cIixcbiAgICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICAgIGN1cnJhbDogdGhpcy5fZGFzaFBhdHRlcm4uc2xpY2UoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRhc2ggcGF0dGVyblxuICAgICAqIEByZXR1cm4ge251bWJlcltdfVxuICAgICAqL1xuICAgIGdldCBkYXNoUGF0dGVybigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kYXNoUGF0dGVybi5zbGljZSgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBkYXNoIG9mZnNldFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGFzaE9mZnNldFxuICAgICAqIEBmaXJlcyB7RXZlbnRlZFN0cm9rZVN0eWxlI2NoYW5nZWR9XG4gICAgICogQHJldHVybiB7RXZlbnRlZFN0cm9rZVN0eWxlfVxuICAgICAqL1xuICAgIHNldCBkYXNoT2Zmc2V0KGRhc2hPZmZzZXQpIHtcbiAgICAgIHZhbGlkYXRlRGFzaE9mZnNldChkYXNoT2Zmc2V0KVxuXG4gICAgICBpZiAoZGFzaE9mZnNldCAhPT0gdGhpcy5fZGFzaE9mZnNldCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fZGFzaE9mZnNldFxuICAgICAgICB0aGlzLl9kYXNoT2Zmc2V0ID0gZGFzaE9mZnNldFxuXG4gICAgICAgIGlmICh0aGlzLl9kYXNoUGF0dGVybi5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBvbmx5IGZpcmUgaWYgZGFzaGluZyBpcyBhY3RpdmF0ZWRcbiAgICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBhdHRyOiBcImRhc2hPZmZzZXRcIixcbiAgICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgICBjdXJyYWw6IHRoaXMuX2Rhc2hPZmZzZXRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZGFzaCBvZmZzZXRcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGRhc2hPZmZzZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGFzaE9mZnNldFxuICAgIH1cbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3N0eWxlL3N0cm9rZS1zdHlsZS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 19 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.createEventedStrokeStyleMixin = createEventedStrokeStyleMixin;\n\nvar _colorRgba = __webpack_require__(17);\n\nvar _colorRgba2 = _interopRequireDefault(_colorRgba);\n\nvar _aggregation = __webpack_require__(8);\n\nvar _aggregation2 = _interopRequireDefault(_aggregation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {object} StrokeStyleOptions\n * @property {string} [strokeColor = \"black\"]\n * @property {number} [strokeWidth = 0]\n * @property {string} [lineJoin = \"miter\"]\n * @property {string} [lineCap = \"butt\"]\n * @property {number[]} [dashPattern = []]\n * @property {number} [dashOffset = 0]\n */\n\n/**\n * validates a possible stroke width value\n * @param {number} strokeWidth\n * @throws If validation fails\n * @private\n */\nfunction validateStrokeWidth(strokeWidth) {\n if (typeof strokeWidth !== \"number\") {\n throw new Error(\"Stroke width must be a number\");\n }\n}\n\n/**\n * Enum for line join values\n * @enum {number}\n */\nvar JoinEnum = {\n MITER: 0,\n BEVEL: 1,\n ROUND: 2\n};\n\n/**\n * line join values as strings, the enum values match the index in this string\n * @type {string[]}\n */\nvar lineJoinOpts = [\"miter\", \"bevel\", \"round\"];\n\n/**\n * validates a line join value\n * @param {string} lineJoin Should be one of [\"miter\", \"bevel\", \"round\"]\n * @throws If validation fails\n * @return {JoinEnum}\n * @private\n */\nfunction validateLineJoin(lineJoin) {\n var idx = -1;\n if (typeof lineJoin !== \"string\" || (idx = lineJoinOpts.indexOf(lineJoin.toLowerCase())) < 0) {\n throw new Error(\"Line join must be a string and must be one of [\" + lineJoinOpts.join(\", \") + \"]\");\n }\n return idx;\n}\n\n/**\n * Enum for line cap values\n * @enum {number}\n */\nvar CapEnum = {\n BUTT: 0,\n SQUARE: 1,\n ROUND: 2\n};\n\n/**\n * line cap values as strings, the CapEnum values match the index in this string\n * @type {string[]}\n */\nvar lineCapOpts = [\"butt\", \"square\", \"round\"];\n\n/**\n * validates a line cap value\n * @param {string} lineCap Should be one of \"butt\", \"square\", \"round\"\n * @throws If validation fails\n * @return {CapEnum}\n * @private\n */\nfunction validateLineCap(lineCap) {\n var idx = -1;\n if (typeof lineCap !== \"string\" || (idx = lineCapOpts.indexOf(lineCap.toLowerCase())) < 0) {\n throw new Error(\"Line cap must be a string and must be one of [\" + lineCapOpts.join(\", \") + \"]\");\n }\n return idx;\n}\n\n/**\n * validates a dash pattern value\n * @param {number[]} dashPattern\n * @throws If validation fails\n * @private\n */\nfunction validateDashPattern(dashPattern) {\n if (!dashPattern || !Array.isArray(dashPattern) || dashPattern.length % 2 !== 0) {\n throw new Error(\"The dash pattern must be an array with an even number of numbers (or an empty array)\");\n }\n}\n\n/**\n * validates a dash offset value\n * @param {number} dashOffset\n * @throws If validation fails\n * @private\n */\nfunction validateDashOffset(dashOffset) {\n if (typeof dashOffset !== \"number\") {\n throw new Error(\"The dash offset must be a number\");\n }\n}\n\n/**\n * Manages the stroke style of a 2d rendering context. Can be used as a mixin or base class\n * @class\n * @mixin\n */\n\nvar StrokeStyle = function () {\n function StrokeStyle(opts) {\n _classCallCheck(this, StrokeStyle);\n\n this.initializer(opts);\n }\n\n /**\n * initializes the stroke style object from an options object\n * @param {StrokeStyleOptions} [opts]\n * @private\n */\n\n\n _createClass(StrokeStyle, [{\n key: \"_initStrokeStyleFromOptions\",\n value: function _initStrokeStyleFromOptions(opts) {\n if (opts) {\n if (typeof opts.strokeColor !== \"undefined\") {\n this.strokeColor = opts.strokeColor;\n }\n if (typeof opts.strokeOpacity !== \"undefined\") {\n this.strokeOpacity = opts.strokeOpacity;\n }\n if (typeof opts.strokeWidth !== \"undefined\") {\n this.strokeWidth = opts.strokeWidth;\n }\n if (typeof opts.lineMiter !== \"undefined\") {\n this.lineJoin = opts.lineMiter;\n }\n if (typeof opts.lineCap !== \"undefined\") {\n this.lineCap = opts.lineCap;\n }\n if (typeof opts.dashPattern !== \"undefined\") {\n this.dashPattern = opts.dashPattern;\n }\n if (typeof opts.dashOffset !== \"undefined\") {\n this.dashOffset = opts.dashOffset;\n }\n }\n }\n\n /**\n * Initializer method to initialize a stroke style. Used for both initializing\n * via base-class and mixin hierarchy.\n * @param {StrokeStyleOptions} [opts]\n * @protected\n */\n\n }, {\n key: \"initializer\",\n value: function initializer(opts) {\n this._strokeColor = new _colorRgba2.default(\"black\");\n this._strokeWidth = 0;\n this._lineJoin = JoinEnum.MITER;\n this._lineCap = CapEnum.BUTT;\n this._dashPattern = [];\n this._dashOffset = 0;\n this._initStrokeStyleFromOptions(opts);\n }\n\n /**\n * Sets the stroke color\n * @param {string} strokeColor Color as a string, \"rgb()\", \"rgba()\", \"#......\", or a color keyword (i.e. \"black\")\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"isStrokeVisible\",\n\n\n /**\n * Returns true if the stroke style is visible, i.e. it is not fully transparent\n * and has a width > 0\n * @return {Boolean}\n */\n value: function isStrokeVisible() {\n return this._strokeColor.opacity > 0 && this._strokeWidth > 0;\n }\n\n /**\n * Returns true if stroke is partially transparent, i.e. opacity < 1\n * @return {Boolean} [description]\n */\n\n }, {\n key: \"isTransparent\",\n value: function isTransparent() {\n return this._strokeColor.isTransparent();\n }\n\n /**\n * Sets the stroke style state of a 2d rendering context\n * @param {CanvasRenderingContext2D} ctx\n */\n\n }, {\n key: \"setStrokeCtx\",\n value: function setStrokeCtx(ctx) {\n ctx.strokeStyle = this.strokeColor;\n ctx.lineWidth = this._strokeWidth;\n ctx.lineJoin = this._lineJoin;\n ctx.lineCap = this._lineCap;\n ctx.setLineDash(this._dashPattern);\n ctx.lineDashOffset = this._dashOffset;\n }\n\n /**\n * Copies the properties of one stroke style to another\n * @param {StrokeStyle} srcStyle StrokeStyle object to copy from\n * @param {StrokeStyle} dstStyle StrokeStyle object to copy to\n */\n\n }, {\n key: \"strokeColor\",\n set: function set(strokeColor) {\n this._strokeColor.value = strokeColor;\n return this;\n }\n\n /**\n * Gets the stroke color of the style\n * @return {string}\n */\n ,\n get: function get() {\n return this._strokeColor.value;\n }\n\n /**\n * Sets the opacity of the stroke style\n * @param {number} opacity [0,1]\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"strokeOpacity\",\n set: function set(opacity) {\n this._strokeColor.opacity = opacity;\n }\n\n /**\n * Gets the current opacity of the stroke style [0,1]\n * @return {number} Opacity in the range [0,1]\n */\n ,\n get: function get() {\n return this._strokeColor.opacity;\n }\n\n /**\n * Sets the stroke color of the style defined as a 32-bit int\n * @param {number} packedStrokeColor Color value as a 32-bit int (i.e. 0xFFFFFFFF)\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"packedStrokeColor\",\n set: function set(packedStrokeColor) {\n this._strokeColor.packedValue = packedStrokeColor;\n }\n\n /**\n * Gets the current value of the color of the stroke style as a 32-bit int\n * @return {number} i.e. 0xFFFFFFFF\n */\n ,\n get: function get() {\n return this._strokeColor.packedValue;\n }\n\n /**\n * Sets the stroke width\n * @param {number} strokeWidth\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"strokeWidth\",\n set: function set(strokeWidth) {\n validateStrokeWidth(strokeWidth);\n this._strokeWidth = strokeWidth;\n return this;\n }\n\n /**\n * Gets the current stroke width\n * @return {number}\n */\n ,\n get: function get() {\n return this._strokeWidth;\n }\n\n /**\n * Sets how lines should be joined\n * @param {string} lineJoin One of \"miter\", \"round\", or \"bevel\"\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"lineJoin\",\n set: function set(lineJoin) {\n var enumVal = validateLineJoin(lineJoin);\n this._lineJoin = enumVal;\n return this;\n }\n\n /**\n * Gets the current line join\n * @return {string}\n */\n ,\n get: function get() {\n return lineJoinOpts[this._lineJoin];\n }\n\n /**\n * Sets how lines should be capped\n * @param {string} lineCap One of \"butt\", \"square\", or \"round\"\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"lineCap\",\n set: function set(lineCap) {\n var enumVal = validateLineCap(lineCap);\n this._lineCap = enumVal;\n return this;\n }\n\n /**\n * Gets the current line cap of the style\n * @return {string}\n */\n ,\n get: function get() {\n return lineCapOpts[this._lineJoin];\n }\n\n /**\n * Sets the dash pattern of the style\n * @param {number[]} dashPattern A list of numbers that specifies distances to alternately\n * draw a line and a gap (in screen units)\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"dashPattern\",\n set: function set(dashPattern) {\n validateDashPattern(dashPattern);\n this._dashPattern = dashPattern.slice();\n return this;\n }\n\n /**\n * Gets the current dash pattern of the style\n * @return {number[]}\n */\n ,\n get: function get() {\n return this._dashPattern.slice();\n }\n\n /**\n * Sets the dash offset of the style\n * @param {number} dashOffset\n * @return {StrokeStyle}\n */\n\n }, {\n key: \"dashOffset\",\n set: function set(dashOffset) {\n validateDashOffset(dashOffset);\n this._dashOffset = dashOffset;\n return this;\n }\n\n /**\n * Gets the current dash offset\n * @return {number}\n */\n ,\n get: function get() {\n return this._dashOffset;\n }\n }], [{\n key: \"copyStrokeStyle\",\n value: function copyStrokeStyle(srcStyle, dstStyle) {\n if (typeof srcStyle.packedStrokeColor === \"undefined\") {\n if (typeof srcStyle.strokeColor !== \"undefined\") {\n dstStyle.strokeColor = srcStyle.strokeColor;\n }\n if (typeof srcStyle.strokeOpacity !== \"undefined\") {\n dstStyle.strokeOpacity = srcStyle.strokeOpacity;\n }\n } else {\n dstStyle.packedStrokeColor = srcStyle.packedStrokeColor;\n }\n if (typeof srcStyle.strokeWidth !== \"undefined\") {\n dstStyle.strokeWidth = srcStyle.strokeWidth;\n }\n if (typeof srcStyle.lineJoin !== \"undefined\") {\n dstStyle.lineJoin = srcStyle.lineJoin;\n }\n if (typeof srcStyle.lineCap !== \"undefined\") {\n dstStyle.lineCap = srcStyle.lineCap;\n }\n if (typeof srcStyle.dashPattern !== \"undefined\") {\n dstStyle.dashPattern = srcStyle.dashPattern;\n }\n if (typeof srcStyle.dashOffset !== \"undefined\") {\n dstStyle.dashOffset = srcStyle.dashOffset;\n }\n }\n\n /**\n * Comparison operator between two StrokeStyle objects. This is primarily\n * used for sorting to minimize context switching of a 2d renderer\n * @param {StrokeStyle} strokeStyleA\n * @param {StrokeStyle} strokeStyleB\n * @return {number} Returns < 0 if strokeStyleA < strokeStyleB, > 0 if strokeStyleA > strokeStyleB, or 0 if they are equal.\n */\n\n }, {\n key: \"compareStrokeStyle\",\n value: function compareStrokeStyle(strokeStyleA, strokeStyleB) {\n var valA = strokeStyleA.isStrokeVisible();\n var valB = strokeStyleB.isStrokeVisible();\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA.packedStrokeColor;\n valB = strokeStyleB.packedStrokeColor;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA.strokeWidth;\n valB = strokeStyleB.strokeWidth;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA._lineJoin;\n valB = strokeStyleB._lineJoin;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA._lineCap;\n valB = strokeStyleB._lineCap;\n if (valA !== valB) {\n return valA - valB;\n }\n valA = strokeStyleA._dashPattern;\n valB = strokeStyleB._dashPattern;\n if (valA.length === valB.length && valA.length > 0) {\n for (var i = 0; i < valA.length; i += 1) {\n if (valA[i] !== valB[i]) {\n return valA[i] - valB[i];\n }\n }\n return strokeStyleA.dashOffset - strokeStyleB.dashOffset;\n }\n return valA.length - valB.length;\n }\n\n /**\n * Returns a json object of a StrokeStyle object\n * @param {StrokeStyle} strokeStyleObj\n * @return {{strokeColor: string,\n * strokeWidth: number,\n * lineJoin: string,\n * lineCap: string,\n * dashPattern: number[],\n * dashOffset: number\n * }}\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON(strokeStyleObj) {\n return {\n strokeColor: strokeStyleObj.strokeColor,\n strokeWidth: strokeStyleObj.strokeWidth,\n lineJoin: strokeStyleObj.lineJoin,\n lineCap: strokeStyleObj.lineCap,\n dashPattern: strokeStyleObj.dashPattern,\n dashOffset: strokeStyleObj.dashOffset\n };\n }\n }]);\n\n return StrokeStyle;\n}();\n\n/**\n * Creates a new stroke style class that fires events whenever the style\n * is modified.\n * @param {string} eventName Event type to fire when stroke style is modified\n * @return {function} New class constructor function\n */\n\n\nexports.default = StrokeStyle;\nfunction createEventedStrokeStyleMixin(eventName) {\n /**\n * Evented stroke color class to handle color modification events\n * @type {ColorRGBA}\n */\n var StrokeColorClass = (0, _colorRgba.createEventedColorRGBAClass)(eventName, \"strokeColor\");\n\n /**\n * Stroke style modification event\n * @event EventedStrokeStyle#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n /**\n * @mixin New evented stroke style mixin. Will fire events whenever\n * the stroke is modified\n */\n return (0, _aggregation2.default)(null, StrokeStyle, function () {\n function EventedStrokeStyle() {\n _classCallCheck(this, EventedStrokeStyle);\n }\n\n _createClass(EventedStrokeStyle, [{\n key: \"initializer\",\n\n /**\n * Initializer method to initialize an evented stroke style.\n * @param {StrokeStyleOptions} [opts]\n * @protected\n */\n value: function initializer(opts) {\n this._strokeColor = new StrokeColorClass(\"black\", this);\n this._strokeWidth = 0;\n this._lineJoin = JoinEnum.MITER;\n this._lineCap = CapEnum.BUTT;\n this._dashPattern = [];\n this._dashOffset = 0;\n this._initStrokeStyleFromOptions(opts);\n }\n\n /**\n * Sets the stroke width\n * @param {number}\n * @fires EventedStrokeStyle#changed\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"strokeWidth\",\n set: function set(strokeWidth) {\n validateStrokeWidth(strokeWidth);\n if (strokeWidth !== this._strokeWidth) {\n var prev = this._strokeWidth;\n this._strokeWidth = strokeWidth;\n this.fire(eventName, {\n attr: \"strokeWidth\",\n prevVal: prev,\n curral: this._strokeWidth\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current stroke width\n * @return {number}\n */\n ,\n get: function get() {\n return this._strokeWidth;\n }\n\n /**\n * Sets the line join\n * @param {string} lineJoin\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"lineJoin\",\n set: function set(lineJoin) {\n var enumVal = validateLineJoin(lineJoin);\n\n if (enumVal !== this._lineJoin) {\n var prev = this._lineJoin;\n this._lineJoin = enumVal;\n this.fire(eventName, {\n attr: \"lineJoin\",\n prevVal: prev,\n curral: this._lineJoin\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current line join\n * @return {string}\n */\n ,\n get: function get() {\n return lineJoinOpts[this._lineJoin];\n }\n\n /**\n * Sets the line cap\n * @param {string} lineCap\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"lineCap\",\n set: function set(lineCap) {\n var enumVal = validateLineCap(lineCap);\n if (enumVal !== this._lineCap) {\n var prev = this._lineCap;\n this._lineCap = enumVal;\n this.fire(eventName, {\n attr: \"lineCap\",\n prevVal: prev,\n curral: this._lineCap\n });\n }\n return this;\n }\n\n /**\n * Gets the line cap\n * @return {string}\n */\n ,\n get: function get() {\n return lineCapOpts[this._lineCap];\n }\n\n /**\n * Sets the dash pattern\n * @param {number[]} dashPattern\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"dashPattern\",\n set: function set(dashPattern) {\n validateDashPattern(dashPattern);\n var diff = false;\n if (dashPattern.length === this._dashPattern.length) {\n for (var i = 0; i < dashPattern.length; i += 1) {\n if (dashPattern[i] !== this._dashPattern[i]) {\n diff = true;\n break;\n }\n }\n } else {\n diff = true;\n }\n\n if (diff) {\n var prev = this._dashPattern;\n this._dashPattern = dashPattern.slice();\n this.fire(eventName, {\n attr: \"dashPattern\",\n prevVal: prev,\n curral: this._dashPattern.slice()\n });\n }\n return this;\n }\n\n /**\n * Gets the current dash pattern\n * @return {number[]}\n */\n ,\n get: function get() {\n return this._dashPattern.slice();\n }\n\n /**\n * Sets the current dash offset\n * @param {number} dashOffset\n * @fires {EventedStrokeStyle#changed}\n * @return {EventedStrokeStyle}\n */\n\n }, {\n key: \"dashOffset\",\n set: function set(dashOffset) {\n validateDashOffset(dashOffset);\n\n if (dashOffset !== this._dashOffset) {\n var prev = this._dashOffset;\n this._dashOffset = dashOffset;\n\n if (this._dashPattern.length) {\n // only fire if dashing is activated\n this.fire(eventName, {\n attr: \"dashOffset\",\n prevVal: prev,\n curral: this._dashOffset\n });\n }\n }\n return this;\n }\n\n /**\n * Gets the current dash offset\n * @return {number}\n */\n ,\n get: function get() {\n return this._dashOffset;\n }\n }]);\n\n return EventedStrokeStyle;\n }());\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdHlsZS9zdHJva2Utc3R5bGUuanM/MzNkZiJdLCJuYW1lcyI6WyJjcmVhdGVFdmVudGVkU3Ryb2tlU3R5bGVNaXhpbiIsInZhbGlkYXRlU3Ryb2tlV2lkdGgiLCJzdHJva2VXaWR0aCIsIkVycm9yIiwiSm9pbkVudW0iLCJNSVRFUiIsIkJFVkVMIiwiUk9VTkQiLCJsaW5lSm9pbk9wdHMiLCJ2YWxpZGF0ZUxpbmVKb2luIiwibGluZUpvaW4iLCJpZHgiLCJpbmRleE9mIiwidG9Mb3dlckNhc2UiLCJqb2luIiwiQ2FwRW51bSIsIkJVVFQiLCJTUVVBUkUiLCJsaW5lQ2FwT3B0cyIsInZhbGlkYXRlTGluZUNhcCIsImxpbmVDYXAiLCJ2YWxpZGF0ZURhc2hQYXR0ZXJuIiwiZGFzaFBhdHRlcm4iLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ2YWxpZGF0ZURhc2hPZmZzZXQiLCJkYXNoT2Zmc2V0IiwiU3Ryb2tlU3R5bGUiLCJvcHRzIiwiaW5pdGlhbGl6ZXIiLCJzdHJva2VDb2xvciIsInN0cm9rZU9wYWNpdHkiLCJsaW5lTWl0ZXIiLCJfc3Ryb2tlQ29sb3IiLCJfc3Ryb2tlV2lkdGgiLCJfbGluZUpvaW4iLCJfbGluZUNhcCIsIl9kYXNoUGF0dGVybiIsIl9kYXNoT2Zmc2V0IiwiX2luaXRTdHJva2VTdHlsZUZyb21PcHRpb25zIiwib3BhY2l0eSIsImlzVHJhbnNwYXJlbnQiLCJjdHgiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsInNldExpbmVEYXNoIiwibGluZURhc2hPZmZzZXQiLCJ2YWx1ZSIsInBhY2tlZFN0cm9rZUNvbG9yIiwicGFja2VkVmFsdWUiLCJlbnVtVmFsIiwic2xpY2UiLCJzcmNTdHlsZSIsImRzdFN0eWxlIiwic3Ryb2tlU3R5bGVBIiwic3Ryb2tlU3R5bGVCIiwidmFsQSIsImlzU3Ryb2tlVmlzaWJsZSIsInZhbEIiLCJpIiwic3Ryb2tlU3R5bGVPYmoiLCJldmVudE5hbWUiLCJTdHJva2VDb2xv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T087QUFDTEEsaUJBQU8sSUFBUDtBQUNEOztBQUVELFlBQUlBLElBQUosRUFBVTtBQUNSLGNBQU1MLE9BQU8sS0FBSzFCLFlBQWxCO0FBQ0EsZUFBS0EsWUFBTCxHQUFvQmhCLFlBQVk4QixLQUFaLEVBQXBCO0FBQ0EsZUFBS2EsSUFBTCxDQUFVSCxTQUFWLEVBQXFCO0FBQ25CSSxrQkFBTSxhQURhO0FBRW5CQyxxQkFBU0gsSUFGVTtBQUduQkksb0JBQVEsS0FBSzlCLFlBQUwsQ0FBa0JjLEtBQWxCO0FBSFcsV0FBckI7QUFLRDtBQUNELGVBQU8sSUFBUDtBQUNEOztBQUVEOzs7O0FBdklLO0FBQUEsMEJBMklhO0FBQ2hCLGVBQU8sS0FBS2QsWUFBTCxDQUFrQmMsS0FBbEIsRUFBUDtBQUNEOztBQUVEOzs7Ozs7O0FBL0lLO0FBQUE7QUFBQSx3QkFxSlV6QixVQXJKVixFQXFKc0I7QUFDekJELDJCQUFtQkMsVUFBbkI7O0FBRUEsWUFBSUEsZUFBZSxLQUFLWSxXQUF4QixFQUFxQztBQUNuQyxjQUFNeUIsT0FBTyxLQUFLekIsV0FBbEI7QUFDQSxlQUFLQSxXQUFMLEdBQW1CWixVQUFuQjs7QUFFQSxjQUFJLEtBQUtXLFlBQUwsQ0FBa0JiLE1BQXRCLEVBQThCO0FBQzVCO0FBQ0EsaUJBQUt3QyxJQUFMLENBQVVILFNBQVYsRUFBcUI7QUFDbkJJLG9CQUFNLFlBRGE7QUFFbkJDLHVCQUFTSCxJQUZVO0FBR25CSSxzQkFBUSxLQUFLN0I7QUFITSxhQUFyQjtBQUtEO0FBQ0Y7QUFDRCxlQUFPLElBQVA7QUFDRDs7QUFFRDs7OztBQXhLSztBQUFBLDBCQTRLWTtBQUNmLGVBQU8sS0FBS0EsV0FBWjtBQUNEO0FBOUtJOztBQUFBO0FBQUEsTUFBUDtBQWdMRCIsImZpbGUiOiIxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCBDb2xvclJHQkEsIHtjcmVhdGVFdmVudGVkQ29sb3JSR0JBQ2xhc3N9IGZyb20gXCIuL2NvbG9yLXJnYmFcIlxuaW1wb3J0IGFnZ3JlZ2F0aW9uIGZyb20gXCIuLi91dGlsL2FnZ3JlZ2F0aW9uXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJva2VTdHlsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3Ryb2tlQ29sb3IgPSBcImJsYWNrXCJdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3N0cm9rZVdpZHRoID0gMF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGluZUpvaW4gPSBcIm1pdGVyXCJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2xpbmVDYXAgPSBcImJ1dHRcIl1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyW119IFtkYXNoUGF0dGVybiA9IFtdXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkYXNoT2Zmc2V0ID0gMF1cbiAqL1xuXG4vKipcbiAqIHZhbGlkYXRlcyBhIHBvc3NpYmxlIHN0cm9rZSB3aWR0aCB2YWx1ZVxuICogQHBhcmFtICB7bnVtYmVyfSBzdHJva2VXaWR0aFxuICogQHRocm93cyBJZiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKSB7XG4gIGlmICh0eXBlb2Ygc3Ryb2tlV2lkdGggIT09IFwibnVtYmVyXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJva2Ugd2lkdGggbXVzdCBiZSBhIG51bWJlclwiKVxuICB9XG59XG5cbi8qKlxuICogRW51bSBmb3IgbGluZSBqb2luIHZhbHVlc1xuICogQGVudW0ge251bWJlcn1cbiAqL1xuY29uc3QgSm9pbkVudW0gPSB7XG4gIE1JVEVSOiAwLFxuICBCRVZFTDogMSxcbiAgUk9VTkQ6IDJcbn1cblxuLyoqXG4gKiBsaW5lIGpvaW4gdmFsdWVzIGFzIHN0cmluZ3MsIHRoZSBlbnVtIHZhbHVlcyBtYXRjaCB0aGUgaW5kZXggaW4gdGhpcyBzdHJpbmdcbiAqIEB0eXBlIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgbGluZUpvaW5PcHRzID0gW1wibWl0ZXJcIiwgXCJiZXZlbFwiLCBcInJvdW5kXCJdXG5cbi8qKlxuICogdmFsaWRhdGVzIGEgbGluZSBqb2luIHZhbHVlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGxpbmVKb2luIFNob3VsZCBiZSBvbmUgb2YgW1wibWl0ZXJcIiwgXCJiZXZlbFwiLCBcInJvdW5kXCJdXG4gKiBAdGhyb3dzIElmIHZhbGlkYXRpb24gZmFpbHNcbiAqIEByZXR1cm4ge0pvaW5FbnVtfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaW5lSm9pbihsaW5lSm9pbikge1xuICBsZXQgaWR4ID0gLTFcbiAgaWYgKHR5cGVvZiBsaW5lSm9pbiAhPT0gXCJzdHJpbmdcIiB8fCAoaWR4ID0gbGluZUpvaW5PcHRzLmluZGV4T2YobGluZUpvaW4udG9Mb3dlckNhc2UoKSkpIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGluZSBqb2luIG11c3QgYmUgYSBzdHJpbmcgYW5kIG11c3QgYmUgb25lIG9mIFske2xpbmVKb2luT3B0cy5qb2luKFwiLCBcIil9XWApXG4gIH1cbiAgcmV0dXJuIGlkeFxufVxuXG4vKipcbiAqIEVudW0gZm9yIGxpbmUgY2FwIHZhbHVlc1xuICogQGVudW0ge251bWJlcn1cbiAqL1xuY29uc3QgQ2FwRW51bSA9IHtcbiAgQlVUVDogMCxcbiAgU1FVQVJFOiAxLFxuICBST1VORDogMlxufVxuXG4vKipcbiAqIGxpbmUgY2FwIHZhbHVlcyBhcyBzdHJpbmdzLCB0aGUgQ2FwRW51bSB2YWx1ZXMgbWF0Y2ggdGhlIGluZGV4IGluIHRoaXMgc3RyaW5nXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKi9cbmNvbnN0IGxpbmVDYXBPcHRzID0gW1wiYnV0dFwiLCBcInNxdWFyZVwiLCBcInJvdW5kXCJdXG5cbi8qKlxuICogdmFsaWRhdGVzIGEgbGluZSBjYXAgdmFsdWVcbiAqIEBwYXJhbSAge3N0cmluZ30gbGluZUNhcCBTaG91bGQgYmUgb25lIG9mIFwiYnV0dFwiLCBcInNxdWFyZVwiLCBcInJvdW5kXCJcbiAqIEB0aHJvd3MgSWYgdmFsaWRhdGlvbiBmYWlsc1xuICogQHJldHVybiB7Q2FwRW51bX1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTGluZUNhcChsaW5lQ2FwKSB7XG4gIGxldCBpZHggPSAtMVxuICBpZiAodHlwZW9mIGxpbmVDYXAgIT09IFwic3RyaW5nXCIgfHwgKGlkeCA9IGxpbmVDYXBPcHRzLmluZGV4T2YobGluZUNhcC50b0xvd2VyQ2FzZSgpKSkgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMaW5lIGNhcCBtdXN0IGJlIGEgc3RyaW5nIGFuZCBtdXN0IGJlIG9uZSBvZiBbJHtsaW5lQ2FwT3B0cy5qb2luKFwiLCBcIil9XWApXG4gIH1cbiAgcmV0dXJuIGlkeFxufVxuXG4vKipcbiAqIHZhbGlkYXRlcyBhIGRhc2ggcGF0dGVybiB2YWx1ZVxuICogQHBhcmFtICB7bnVtYmVyW119IGRhc2hQYXR0ZXJuXG4gKiBAdGhyb3dzIElmIHZhbGlkYXRpb24gZmFpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGFzaFBhdHRlcm4oZGFzaFBhdHRlcm4pIHtcbiAgaWYgKCFkYXNoUGF0dGVybiB8fCAhQXJyYXkuaXNBcnJheShkYXNoUGF0dGVybikgfHwgZGFzaFBhdHRlcm4ubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBkYXNoIHBhdHRlcm4gbXVzdCBiZSBhbiBhcnJheSB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIG51bWJlcnMgKG9yIGFuIGVtcHR5IGFycmF5KVwiKVxuICB9XG59XG5cbi8qKlxuICogdmFsaWRhdGVzIGEgZGFzaCBvZmZzZXQgdmFsdWVcbiAqIEBwYXJhbSAge251bWJlcn0gZGFzaE9mZnNldFxuICogQHRocm93cyBJZiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURhc2hPZmZzZXQoZGFzaE9mZnNldCkge1xuICBpZiAodHlwZW9mIGRhc2hPZmZzZXQgIT09IFwibnVtYmVyXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGFzaCBvZmZzZXQgbXVzdCBiZSBhIG51bWJlclwiKVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlcyB0aGUgc3Ryb2tlIHN0eWxlIG9mIGEgMmQgcmVuZGVyaW5nIGNvbnRleHQuIENhbiBiZSB1c2VkIGFzIGEgbWl4aW4gb3IgYmFzZSBjbGFzc1xuICogQGNsYXNzXG4gKiBAbWl4aW5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3Ryb2tlU3R5bGUge1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgdGhpcy5pbml0aWFsaXplcihvcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIGluaXRpYWxpemVzIHRoZSBzdHJva2Ugc3R5bGUgb2JqZWN0IGZyb20gYW4gb3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtICB7U3Ryb2tlU3R5bGVPcHRpb25zfSBbb3B0c11cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pbml0U3Ryb2tlU3R5bGVGcm9tT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5zdHJva2VDb2xvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvclxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRzLnN0cm9rZU9wYWNpdHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5zdHJva2VPcGFjaXR5ID0gb3B0cy5zdHJva2VPcGFjaXR5XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMuc3Ryb2tlV2lkdGggIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGhcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5saW5lTWl0ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5saW5lSm9pbiA9IG9wdHMubGluZU1pdGVyXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMubGluZUNhcCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLmxpbmVDYXAgPSBvcHRzLmxpbmVDYXBcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5kYXNoUGF0dGVybiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLmRhc2hQYXR0ZXJuID0gb3B0cy5kYXNoUGF0dGVyblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRhc2hPZmZzZXQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5kYXNoT2Zmc2V0ID0gb3B0cy5kYXNoT2Zmc2V0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIG1ldGhvZCB0byBpbml0aWFsaXplIGEgc3Ryb2tlIHN0eWxlLiBVc2VkIGZvciBib3RoIGluaXRpYWxpemluZ1xuICAgKiB2aWEgYmFzZS1jbGFzcyBhbmQgbWl4aW4gaGllcmFyY2h5LlxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZU9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBpbml0aWFsaXplcihvcHRzKSB7XG4gICAgdGhpcy5fc3Ryb2tlQ29sb3IgPSBuZXcgQ29sb3JSR0JBKFwiYmxhY2tcIilcbiAgICB0aGlzLl9zdHJva2VXaWR0aCA9IDBcbiAgICB0aGlzLl9saW5lSm9pbiA9IEpvaW5FbnVtLk1JVEVSXG4gICAgdGhpcy5fbGluZUNhcCA9IENhcEVudW0uQlVUVFxuICAgIHRoaXMuX2Rhc2hQYXR0ZXJuID0gW11cbiAgICB0aGlzLl9kYXNoT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2luaXRTdHJva2VTdHlsZUZyb21PcHRpb25zKG9wdHMpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3Ryb2tlIGNvbG9yXG4gICAqIEBwYXJhbSAge3N0cmluZ30gc3Ryb2tlQ29sb3IgQ29sb3IgYXMgYSBzdHJpbmcsIFwicmdiKClcIiwgXCJyZ2JhKClcIiwgXCIjLi4uLi4uXCIsIG9yIGEgY29sb3Iga2V5d29yZCAoaS5lLiBcImJsYWNrXCIpXG4gICAqIEByZXR1cm4ge1N0cm9rZVN0eWxlfVxuICAgKi9cbiAgc2V0IHN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKSB7XG4gICAgdGhpcy5fc3Ryb2tlQ29sb3IudmFsdWUgPSBzdHJva2VDb2xvclxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Ryb2tlIGNvbG9yIG9mIHRoZSBzdHlsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3Ryb2tlQ29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNvbG9yLnZhbHVlXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgc3Ryb2tlIHN0eWxlXG4gICAqIEBwYXJhbSAge251bWJlcn0gb3BhY2l0eSBbMCwxXVxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBzdHJva2VPcGFjaXR5KG9wYWNpdHkpIHtcbiAgICB0aGlzLl9zdHJva2VDb2xvci5vcGFjaXR5ID0gb3BhY2l0eVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgb3BhY2l0eSBvZiB0aGUgc3Ryb2tlIHN0eWxlIFswLDFdXG4gICAqIEByZXR1cm4ge251bWJlcn0gT3BhY2l0eSBpbiB0aGUgcmFuZ2UgWzAsMV1cbiAgICovXG4gIGdldCBzdHJva2VPcGFjaXR5KCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VDb2xvci5vcGFjaXR5XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3Ryb2tlIGNvbG9yIG9mIHRoZSBzdHlsZSBkZWZpbmVkIGFzIGEgMzItYml0IGludFxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHBhY2tlZFN0cm9rZUNvbG9yIENvbG9yIHZhbHVlIGFzIGEgMzItYml0IGludCAoaS5lLiAweEZGRkZGRkZGKVxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBwYWNrZWRTdHJva2VDb2xvcihwYWNrZWRTdHJva2VDb2xvcikge1xuICAgIHRoaXMuX3N0cm9rZUNvbG9yLnBhY2tlZFZhbHVlID0gcGFja2VkU3Ryb2tlQ29sb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb2xvciBvZiB0aGUgc3Ryb2tlIHN0eWxlIGFzIGEgMzItYml0IGludFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IGkuZS4gMHhGRkZGRkZGRlxuICAgKi9cbiAgZ2V0IHBhY2tlZFN0cm9rZUNvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VDb2xvci5wYWNrZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0cm9rZSB3aWR0aFxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHN0cm9rZVdpZHRoXG4gICAqIEByZXR1cm4ge1N0cm9rZVN0eWxlfVxuICAgKi9cbiAgc2V0IHN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKSB7XG4gICAgdmFsaWRhdGVTdHJva2VXaWR0aChzdHJva2VXaWR0aClcbiAgICB0aGlzLl9zdHJva2VXaWR0aCA9IHN0cm9rZVdpZHRoXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHN0cm9rZSB3aWR0aFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3Ryb2tlV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cm9rZVdpZHRoXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBob3cgbGluZXMgc2hvdWxkIGJlIGpvaW5lZFxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxpbmVKb2luIE9uZSBvZiBcIm1pdGVyXCIsIFwicm91bmRcIiwgb3IgXCJiZXZlbFwiXG4gICAqIEByZXR1cm4ge1N0cm9rZVN0eWxlfVxuICAgKi9cbiAgc2V0IGxpbmVKb2luKGxpbmVKb2luKSB7XG4gICAgY29uc3QgZW51bVZhbCA9IHZhbGlkYXRlTGluZUpvaW4obGluZUpvaW4pXG4gICAgdGhpcy5fbGluZUpvaW4gPSBlbnVtVmFsXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpbmUgam9pblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGluZUpvaW4oKSB7XG4gICAgcmV0dXJuIGxpbmVKb2luT3B0c1t0aGlzLl9saW5lSm9pbl1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGhvdyBsaW5lcyBzaG91bGQgYmUgY2FwcGVkXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbGluZUNhcCBPbmUgb2YgXCJidXR0XCIsIFwic3F1YXJlXCIsIG9yIFwicm91bmRcIlxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBsaW5lQ2FwKGxpbmVDYXApIHtcbiAgICBjb25zdCBlbnVtVmFsID0gdmFsaWRhdGVMaW5lQ2FwKGxpbmVDYXApXG4gICAgdGhpcy5fbGluZUNhcCA9IGVudW1WYWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgbGluZSBjYXAgb2YgdGhlIHN0eWxlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsaW5lQ2FwKCkge1xuICAgIHJldHVybiBsaW5lQ2FwT3B0c1t0aGlzLl9saW5lSm9pbl1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXNoIHBhdHRlcm4gb2YgdGhlIHN0eWxlXG4gICAqIEBwYXJhbSAge251bWJlcltdfSBkYXNoUGF0dGVybiBBIGxpc3Qgb2YgbnVtYmVycyB0aGF0IHNwZWNpZmllcyBkaXN0YW5jZXMgdG8gYWx0ZXJuYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcgYSBsaW5lIGFuZCBhIGdhcCAoaW4gc2NyZWVuIHVuaXRzKVxuICAgKiBAcmV0dXJuIHtTdHJva2VTdHlsZX1cbiAgICovXG4gIHNldCBkYXNoUGF0dGVybihkYXNoUGF0dGVybikge1xuICAgIHZhbGlkYXRlRGFzaFBhdHRlcm4oZGFzaFBhdHRlcm4pXG4gICAgdGhpcy5fZGFzaFBhdHRlcm4gPSBkYXNoUGF0dGVybi5zbGljZSgpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGRhc2ggcGF0dGVybiBvZiB0aGUgc3R5bGVcbiAgICogQHJldHVybiB7bnVtYmVyW119XG4gICAqL1xuICBnZXQgZGFzaFBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hQYXR0ZXJuLnNsaWNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXNoIG9mZnNldCBvZiB0aGUgc3R5bGVcbiAgICogQHBhcmFtICB7bnVtYmVyfSBkYXNoT2Zmc2V0XG4gICAqIEByZXR1cm4ge1N0cm9rZVN0eWxlfVxuICAgKi9cbiAgc2V0IGRhc2hPZmZzZXQoZGFzaE9mZnNldCkge1xuICAgIHZhbGlkYXRlRGFzaE9mZnNldChkYXNoT2Zmc2V0KVxuICAgIHRoaXMuX2Rhc2hPZmZzZXQgPSBkYXNoT2Zmc2V0XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGRhc2ggb2Zmc2V0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBkYXNoT2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXNoT2Zmc2V0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJva2Ugc3R5bGUgaXMgdmlzaWJsZSwgaS5lLiBpdCBpcyBub3QgZnVsbHkgdHJhbnNwYXJlbnRcbiAgICogYW5kIGhhcyBhIHdpZHRoID4gMFxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNTdHJva2VWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VDb2xvci5vcGFjaXR5ID4gMCAmJiB0aGlzLl9zdHJva2VXaWR0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgc3Ryb2tlIGlzIHBhcnRpYWxseSB0cmFuc3BhcmVudCwgaS5lLiBvcGFjaXR5IDwgMVxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBpc1RyYW5zcGFyZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VDb2xvci5pc1RyYW5zcGFyZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdHJva2Ugc3R5bGUgc3RhdGUgb2YgYSAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4XG4gICAqL1xuICBzZXRTdHJva2VDdHgoY3R4KSB7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2VDb2xvclxuICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLl9zdHJva2VXaWR0aFxuICAgIGN0eC5saW5lSm9pbiA9IHRoaXMuX2xpbmVKb2luXG4gICAgY3R4LmxpbmVDYXAgPSB0aGlzLl9saW5lQ2FwXG4gICAgY3R4LnNldExpbmVEYXNoKHRoaXMuX2Rhc2hQYXR0ZXJuKVxuICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IHRoaXMuX2Rhc2hPZmZzZXRcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgdGhlIHByb3BlcnRpZXMgb2Ygb25lIHN0cm9rZSBzdHlsZSB0byBhbm90aGVyXG4gICAqIEBwYXJhbSAge1N0cm9rZVN0eWxlfSBzcmNTdHlsZSBTdHJva2VTdHlsZSBvYmplY3QgdG8gY29weSBmcm9tXG4gICAqIEBwYXJhbSAge1N0cm9rZVN0eWxlfSBkc3RTdHlsZSBTdHJva2VTdHlsZSBvYmplY3QgdG8gY29weSB0b1xuICAgKi9cbiAgc3RhdGljIGNvcHlTdHJva2VTdHlsZShzcmNTdHlsZSwgZHN0U3R5bGUpIHtcbiAgICBpZiAodHlwZW9mIHNyY1N0eWxlLnBhY2tlZFN0cm9rZUNvbG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHNyY1N0eWxlLnN0cm9rZUNvbG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGRzdFN0eWxlLnN0cm9rZUNvbG9yID0gc3JjU3R5bGUuc3Ryb2tlQ29sb3JcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUuc3Ryb2tlT3BhY2l0eSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkc3RTdHlsZS5zdHJva2VPcGFjaXR5ID0gc3JjU3R5bGUuc3Ryb2tlT3BhY2l0eVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkc3RTdHlsZS5wYWNrZWRTdHJva2VDb2xvciA9IHNyY1N0eWxlLnBhY2tlZFN0cm9rZUNvbG9yXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUuc3Ryb2tlV2lkdGggIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGRzdFN0eWxlLnN0cm9rZVdpZHRoID0gc3JjU3R5bGUuc3Ryb2tlV2lkdGhcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzcmNTdHlsZS5saW5lSm9pbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgZHN0U3R5bGUubGluZUpvaW4gPSBzcmNTdHlsZS5saW5lSm9pblxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNyY1N0eWxlLmxpbmVDYXAgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGRzdFN0eWxlLmxpbmVDYXAgPSBzcmNTdHlsZS5saW5lQ2FwXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3JjU3R5bGUuZGFzaFBhdHRlcm4gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGRzdFN0eWxlLmRhc2hQYXR0ZXJuID0gc3JjU3R5bGUuZGFzaFBhdHRlcm5cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzcmNTdHlsZS5kYXNoT2Zmc2V0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBkc3RTdHlsZS5kYXNoT2Zmc2V0ID0gc3JjU3R5bGUuZGFzaE9mZnNldFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJpc29uIG9wZXJhdG9yIGJldHdlZW4gdHdvIFN0cm9rZVN0eWxlIG9iamVjdHMuIFRoaXMgaXMgcHJpbWFyaWx5XG4gICAqIHVzZWQgZm9yIHNvcnRpbmcgdG8gbWluaW1pemUgY29udGV4dCBzd2l0Y2hpbmcgb2YgYSAyZCByZW5kZXJlclxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZX0gc3Ryb2tlU3R5bGVBXG4gICAqIEBwYXJhbSAge1N0cm9rZVN0eWxlfSBzdHJva2VTdHlsZUJcbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICAgIFJldHVybnMgPCAwIGlmIHN0cm9rZVN0eWxlQSA8IHN0cm9rZVN0eWxlQiwgPiAwIGlmIHN0cm9rZVN0eWxlQSA+IHN0cm9rZVN0eWxlQiwgb3IgMCBpZiB0aGV5IGFyZSBlcXVhbC5cbiAgICovXG4gIHN0YXRpYyBjb21wYXJlU3Ryb2tlU3R5bGUoc3Ryb2tlU3R5bGVBLCBzdHJva2VTdHlsZUIpIHtcbiAgICBsZXQgdmFsQSA9IHN0cm9rZVN0eWxlQS5pc1N0cm9rZVZpc2libGUoKVxuICAgIGxldCB2YWxCID0gc3Ryb2tlU3R5bGVCLmlzU3Ryb2tlVmlzaWJsZSgpXG4gICAgaWYgKHZhbEEgIT09IHZhbEIpIHtcbiAgICAgIHJldHVybiB2YWxBIC0gdmFsQlxuICAgIH1cbiAgICB2YWxBID0gc3Ryb2tlU3R5bGVBLnBhY2tlZFN0cm9rZUNvbG9yXG4gICAgdmFsQiA9IHN0cm9rZVN0eWxlQi5wYWNrZWRTdHJva2VDb2xvclxuICAgIGlmICh2YWxBICE9PSB2YWxCKSB7XG4gICAgICByZXR1cm4gdmFsQSAtIHZhbEJcbiAgICB9XG4gICAgdmFsQSA9IHN0cm9rZVN0eWxlQS5zdHJva2VXaWR0aFxuICAgIHZhbEIgPSBzdHJva2VTdHlsZUIuc3Ryb2tlV2lkdGhcbiAgICBpZiAodmFsQSAhPT0gdmFsQikge1xuICAgICAgcmV0dXJuIHZhbEEgLSB2YWxCXG4gICAgfVxuICAgIHZhbEEgPSBzdHJva2VTdHlsZUEuX2xpbmVKb2luXG4gICAgdmFsQiA9IHN0cm9rZVN0eWxlQi5fbGluZUpvaW5cbiAgICBpZiAodmFsQSAhPT0gdmFsQikge1xuICAgICAgcmV0dXJuIHZhbEEgLSB2YWxCXG4gICAgfVxuICAgIHZhbEEgPSBzdHJva2VTdHlsZUEuX2xpbmVDYXBcbiAgICB2YWxCID0gc3Ryb2tlU3R5bGVCLl9saW5lQ2FwXG4gICAgaWYgKHZhbEEgIT09IHZhbEIpIHtcbiAgICAgIHJldHVybiB2YWxBIC0gdmFsQlxuICAgIH1cbiAgICB2YWxBID0gc3Ryb2tlU3R5bGVBLl9kYXNoUGF0dGVyblxuICAgIHZhbEIgPSBzdHJva2VTdHlsZUIuX2Rhc2hQYXR0ZXJuXG4gICAgaWYgKHZhbEEubGVuZ3RoID09PSB2YWxCLmxlbmd0aCAmJiB2YWxBLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsQS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAodmFsQVtpXSAhPT0gdmFsQltpXSkge1xuICAgICAgICAgIHJldHVybiB2YWxBW2ldIC0gdmFsQltpXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Ryb2tlU3R5bGVBLmRhc2hPZmZzZXQgLSBzdHJva2VTdHlsZUIuZGFzaE9mZnNldFxuICAgIH1cbiAgICByZXR1cm4gdmFsQS5sZW5ndGggLSB2YWxCLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBqc29uIG9iamVjdCBvZiBhIFN0cm9rZVN0eWxlIG9iamVjdFxuICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZX0gc3Ryb2tlU3R5bGVPYmpcbiAgICogQHJldHVybiB7e3N0cm9rZUNvbG9yOiBzdHJpbmcsXG4gICAqICAgICAgICAgICBzdHJva2VXaWR0aDogbnVtYmVyLFxuICAgKiAgICAgICAgICAgbGluZUpvaW46IHN0cmluZyxcbiAgICogICAgICAgICAgIGxpbmVDYXA6IHN0cmluZyxcbiAgICogICAgICAgICAgIGRhc2hQYXR0ZXJuOiBudW1iZXJbXSxcbiAgICogICAgICAgICAgIGRhc2hPZmZzZXQ6IG51bWJlclxuICAgKiAgICAgICAgICB9fVxuICAgKi9cbiAgc3RhdGljIHRvSlNPTihzdHJva2VTdHlsZU9iaikge1xuICAgIHJldHVybiB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlU3R5bGVPYmouc3Ryb2tlQ29sb3IsXG4gICAgICBzdHJva2VXaWR0aDogc3Ryb2tlU3R5bGVPYmouc3Ryb2tlV2lkdGgsXG4gICAgICBsaW5lSm9pbjogc3Ryb2tlU3R5bGVPYmoubGluZUpvaW4sXG4gICAgICBsaW5lQ2FwOiBzdHJva2VTdHlsZU9iai5saW5lQ2FwLFxuICAgICAgZGFzaFBhdHRlcm46IHN0cm9rZVN0eWxlT2JqLmRhc2hQYXR0ZXJuLFxuICAgICAgZGFzaE9mZnNldDogc3Ryb2tlU3R5bGVPYmouZGFzaE9mZnNldFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgc3Ryb2tlIHN0eWxlIGNsYXNzIHRoYXQgZmlyZXMgZXZlbnRzIHdoZW5ldmVyIHRoZSBzdHlsZVxuICogaXMgbW9kaWZpZWQuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCB0eXBlIHRvIGZpcmUgd2hlbiBzdHJva2Ugc3R5bGUgaXMgbW9kaWZpZWRcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAgICAgICAgIE5ldyBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRlZFN0cm9rZVN0eWxlTWl4aW4oZXZlbnROYW1lKSB7XG4gIC8qKlxuICAgKiBFdmVudGVkIHN0cm9rZSBjb2xvciBjbGFzcyB0byBoYW5kbGUgY29sb3IgbW9kaWZpY2F0aW9uIGV2ZW50c1xuICAgKiBAdHlwZSB7Q29sb3JSR0JBfVxuICAgKi9cbiAgY29uc3QgU3Ryb2tlQ29sb3JDbGFzcyA9IGNyZWF0ZUV2ZW50ZWRDb2xvclJHQkFDbGFzcyhldmVudE5hbWUsIFwic3Ryb2tlQ29sb3JcIilcblxuICAvKipcbiAgICogU3Ryb2tlIHN0eWxlIG1vZGlmaWNhdGlvbiBldmVudFxuICAgKiBAZXZlbnQgRXZlbnRlZFN0cm9rZVN0eWxlI2NoYW5nZWRcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHIgTmFtZSBvZiB0aGUgYXR0cmlidXRlIG1vZGlmaWVkXG4gICAqIEBwcm9wZXJ0eSB7fSBwcmV2VmFsIFByZXZpb3VzIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcHJpb3IgdG8gbW9kaWZpY2F0aW9uXG4gICAqIEBwcm9wZXJ0eSB7fSBjdXJyVmFsIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcG9zdCBtb2RpZmljYXRpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtaXhpbiBOZXcgZXZlbnRlZCBzdHJva2Ugc3R5bGUgbWl4aW4uIFdpbGwgZmlyZSBldmVudHMgd2hlbmV2ZXJcbiAgICogICAgICAgIHRoZSBzdHJva2UgaXMgbW9kaWZpZWRcbiAgICovXG4gIHJldHVybiBhZ2dyZWdhdGlvbihudWxsLCBTdHJva2VTdHlsZSwgY2xhc3MgRXZlbnRlZFN0cm9rZVN0eWxlIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplciBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbiBldmVudGVkIHN0cm9rZSBzdHlsZS5cbiAgICAgKiBAcGFyYW0gIHtTdHJva2VTdHlsZU9wdGlvbnN9IFtvcHRzXVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBpbml0aWFsaXplcihvcHRzKSB7XG4gICAgICB0aGlzLl9zdHJva2VDb2xvciA9IG5ldyBTdHJva2VDb2xvckNsYXNzKFwiYmxhY2tcIiwgdGhpcylcbiAgICAgIHRoaXMuX3N0cm9rZVdpZHRoID0gMFxuICAgICAgdGhpcy5fbGluZUpvaW4gPSBKb2luRW51bS5NSVRFUlxuICAgICAgdGhpcy5fbGluZUNhcCA9IENhcEVudW0uQlVUVFxuICAgICAgdGhpcy5fZGFzaFBhdHRlcm4gPSBbXVxuICAgICAgdGhpcy5fZGFzaE9mZnNldCA9IDBcbiAgICAgIHRoaXMuX2luaXRTdHJva2VTdHlsZUZyb21PcHRpb25zKG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3Ryb2tlIHdpZHRoXG4gICAgICogQHBhcmFtICB7bnVtYmVyfVxuICAgICAqIEBmaXJlcyAgRXZlbnRlZFN0cm9rZVN0eWxlI2NoYW5nZWRcbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkU3Ryb2tlU3R5bGV9XG4gICAgICovXG4gICAgc2V0IHN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKSB7XG4gICAgICB2YWxpZGF0ZVN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKVxuICAgICAgaWYgKHN0cm9rZVdpZHRoICE9PSB0aGlzLl9zdHJva2VXaWR0aCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fc3Ryb2tlV2lkdGhcbiAgICAgICAgdGhpcy5fc3Ryb2tlV2lkdGggPSBzdHJva2VXaWR0aFxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJzdHJva2VXaWR0aFwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VycmFsOiB0aGlzLl9zdHJva2VXaWR0aFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc3Ryb2tlIHdpZHRoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJva2VXaWR0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdHJva2VXaWR0aFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpbmUgam9pblxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbGluZUpvaW5cbiAgICAgKiBAZmlyZXMge0V2ZW50ZWRTdHJva2VTdHlsZSNjaGFuZ2VkfVxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRTdHJva2VTdHlsZX1cbiAgICAgKi9cbiAgICBzZXQgbGluZUpvaW4obGluZUpvaW4pIHtcbiAgICAgIGNvbnN0IGVudW1WYWwgPSB2YWxpZGF0ZUxpbmVKb2luKGxpbmVKb2luKVxuXG4gICAgICBpZiAoZW51bVZhbCAhPT0gdGhpcy5fbGluZUpvaW4pIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX2xpbmVKb2luXG4gICAgICAgIHRoaXMuX2xpbmVKb2luID0gZW51bVZhbFxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJsaW5lSm9pblwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VycmFsOiB0aGlzLl9saW5lSm9pblxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGluZSBqb2luXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCBsaW5lSm9pbigpIHtcbiAgICAgIHJldHVybiBsaW5lSm9pbk9wdHNbdGhpcy5fbGluZUpvaW5dXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGluZSBjYXBcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxpbmVDYXBcbiAgICAgKiBAZmlyZXMge0V2ZW50ZWRTdHJva2VTdHlsZSNjaGFuZ2VkfVxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRTdHJva2VTdHlsZX1cbiAgICAgKi9cbiAgICBzZXQgbGluZUNhcChsaW5lQ2FwKSB7XG4gICAgICBjb25zdCBlbnVtVmFsID0gdmFsaWRhdGVMaW5lQ2FwKGxpbmVDYXApXG4gICAgICBpZiAoZW51bVZhbCAhPT0gdGhpcy5fbGluZUNhcCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fbGluZUNhcFxuICAgICAgICB0aGlzLl9saW5lQ2FwID0gZW51bVZhbFxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJsaW5lQ2FwXCIsXG4gICAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgICBjdXJyYWw6IHRoaXMuX2xpbmVDYXBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGluZSBjYXBcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IGxpbmVDYXAoKSB7XG4gICAgICByZXR1cm4gbGluZUNhcE9wdHNbdGhpcy5fbGluZUNhcF1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXNoIHBhdHRlcm5cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJbXX0gZGFzaFBhdHRlcm5cbiAgICAgKiBAZmlyZXMge0V2ZW50ZWRTdHJva2VTdHlsZSNjaGFuZ2VkfVxuICAgICAqIEByZXR1cm4ge0V2ZW50ZWRTdHJva2VTdHlsZX1cbiAgICAgKi9cbiAgICBzZXQgZGFzaFBhdHRlcm4oZGFzaFBhdHRlcm4pIHtcbiAgICAgIHZhbGlkYXRlRGFzaFBhdHRlcm4oZGFzaFBhdHRlcm4pXG4gICAgICBsZXQgZGlmZiA9IGZhbHNlXG4gICAgICBpZiAoZGFzaFBhdHRlcm4ubGVuZ3RoID09PSB0aGlzLl9kYXNoUGF0dGVybi5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXNoUGF0dGVybi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChkYXNoUGF0dGVybltpXSAhPT0gdGhpcy5fZGFzaFBhdHRlcm5baV0pIHtcbiAgICAgICAgICAgIGRpZmYgPSB0cnVlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlmZiA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX2Rhc2hQYXR0ZXJuXG4gICAgICAgIHRoaXMuX2Rhc2hQYXR0ZXJuID0gZGFzaFBhdHRlcm4uc2xpY2UoKVxuICAgICAgICB0aGlzLmZpcmUoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYXR0cjogXCJkYXNoUGF0dGVyblwiLFxuICAgICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgICAgY3VycmFsOiB0aGlzLl9kYXNoUGF0dGVybi5zbGljZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZGFzaCBwYXR0ZXJuXG4gICAgICogQHJldHVybiB7bnVtYmVyW119XG4gICAgICovXG4gICAgZ2V0IGRhc2hQYXR0ZXJuKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rhc2hQYXR0ZXJuLnNsaWNlKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGRhc2ggb2Zmc2V0XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBkYXNoT2Zmc2V0XG4gICAgICogQGZpcmVzIHtFdmVudGVkU3Ryb2tlU3R5bGUjY2hhbmdlZH1cbiAgICAgKiBAcmV0dXJuIHtFdmVudGVkU3Ryb2tlU3R5bGV9XG4gICAgICovXG4gICAgc2V0IGRhc2hPZmZzZXQoZGFzaE9mZnNldCkge1xuICAgICAgdmFsaWRhdGVEYXNoT2Zmc2V0KGRhc2hPZmZzZXQpXG5cbiAgICAgIGlmIChkYXNoT2Zmc2V0ICE9PSB0aGlzLl9kYXNoT2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLl9kYXNoT2Zmc2V0XG4gICAgICAgIHRoaXMuX2Rhc2hPZmZzZXQgPSBkYXNoT2Zmc2V0XG5cbiAgICAgICAgaWYgKHRoaXMuX2Rhc2hQYXR0ZXJuLmxlbmd0aCkge1xuICAgICAgICAgIC8vIG9ubHkgZmlyZSBpZiBkYXNoaW5nIGlzIGFjdGl2YXRlZFxuICAgICAgICAgIHRoaXMuZmlyZShldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGF0dHI6IFwiZGFzaE9mZnNldFwiLFxuICAgICAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgICAgIGN1cnJhbDogdGhpcy5fZGFzaE9mZnNldFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBkYXNoIG9mZnNldFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgZGFzaE9mZnNldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kYXNoT2Zmc2V0XG4gICAgfVxuICB9KVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3R5bGUvc3Ryb2tlLXN0eWxlLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _interactUtils = __webpack_require__(20);\n\nvar InteractUtils = _interopRequireWildcard(_interactUtils);\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _basicStyle = __webpack_require__(8);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _drawEngine = __webpack_require__(13);\n\nvar _drawEngine2 = _interopRequireDefault(_drawEngine);\n\nvar _mat2d = __webpack_require__(4);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _polyLine = __webpack_require__(10);\n\nvar _polyLine2 = _interopRequireDefault(_polyLine);\n\nvar _vertEditableShape = __webpack_require__(21);\n\nvar _vertEditableShape2 = _interopRequireDefault(_vertEditableShape);\n\nvar _xformShape = __webpack_require__(22);\n\nvar _xformShape2 = _interopRequireDefault(_xformShape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar scaleSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cg transform='rotate(,24,24)'%3E%3Cpolygon style='fill:%23ffffff;' points='16,20 16,12 4,24 16,36 16,28 32,28 32,36 44,24 32,12 32,20 '/%3E%3Cpolygon points='14,22 14,17 7,24 14,31 14,26 34,26 34,31 41,24 34,17 34,22 '/%3E%3C/g%3E%3C/svg%3E\\\") no-repeat\";\n\nvar rotateSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cg transform='rotate(,24,24)'%3E%3Cpath style='fill:%23ffffff;' d='M25.9,4C16.6,4,8.8,11.2,7.4,20.8H6.7H3.3l1.6,2.9l3.8,7.1l1.8,3.3l1.8-3.3l3.8-7.1l1.6-2.9h-3.3h-0.1 c1.3-5.7,6.1-9.9,11.7-9.9c8,0,12.1,4.4,12.1,13.1c0,7.2-5.4,13.1-12.1,13.1h-2v2V42v2h2c10.4,0,18.8-9,18.8-20 C44.7,11.7,37.5,4,25.9,4L25.9,4z'/%3E%3Cpath d='M25.9,6c10.5,0,16.8,6.7,16.8,18c0,9.9-7.5,18-16.8,18v-2.9c7.8,0,14.1-6.8,14.1-15.1c0-5.6-1.8-15.1-14.1-15.1 c-7.4,0-13.4,6.1-14,13.9h2.4l-3.8,7.1l-3.8-7.1h2.5C9.7,13.4,17,6,25.9,6'/%3E%3C/g%3E%3C/svg%3E\\\") no-repeat\";\n\nvar addSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpolygon style='fill:%23ffffff;' points='31.2,28 24.8,28 24.8,32.8 20,32.8 20,39.2 24.8,39.2 24.8,44 31.2,44 31.2,39.2 36,39.2 36,32.8 31.2,32.8 '/%3E %3Cpolygon style='fill:%23ffffff' points='12,32 12,4 32.3,24.3 20,24.3 19.7,24.6 '/%3E%3Cpolygon points='13.8,8.2 13.8,27.8 19,22.8 19.2,22.5 28,22.5 '/%3E%3Cpolyline points='29.6,29.6 29.6,34.4 34.4,34.4 34.4,37.6 29.6,37.6 29.6,42.4 26.4,42.4 26.4,37.6 21.6,37.6 21.6,34.4 26.4,34.4 26.4,29.6 29.6,29.6 '/%3E%3C/svg%3E\\\") no-repeat\";\n\nvar removeSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Crect style='fill:%23ffffff;' x='20' y='32.8' width='16' height='6.4'/%3E%3Cpolygon style='fill:%23ffffff;' points='12,32 12,4 32.3,24.3 20,24.3 19.7,24.6 '/%3E%3Cpolygon points='13.8,8.2 13.8,27.8 19,22.8 19.2,22.5 28,22.5 '/%3E%3Cpolyline points='34.4,34.4 34.4,37.6 21.6,37.6 21.6,34.4 '/%3E%3C/svg%3E\\\") no-repeat\";\n\nvar repositionSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath style='fill:%23ffffff;' d='M24,17.5c-3.6,0-6.5,2.9-6.5,6.5s2.9,6.5,6.5,6.5s6.5-2.9,6.5-6.5S27.6,17.5,24,17.5L24,17.5z'/%3E%3Cpath style='fill:%23ffffff;' d='M24,4L4,24l20,20l20-20L24,4z M31.5,31.5h-15v-15h15V31.5z'/%3E%3Cpolygon points='17,34 24,40.5 31,34 '/%3E%3Cpolygon points='31,14 24,7.5 17,14 '/%3E%3Cpolygon points='14,17 7.5,24 14,31 '/%3E%3Cpolygon points='34,31 40.5,24 34,17 '/%3E%3Cpath d='M24,20c2.2,0,4,1.8,4,4s-1.8,4-4,4s-4-1.8-4-4S21.8,20,24,20'/%3E%3C/svg%3E\\\") no-repeat\";\n\nvar EventConstants = {\n SELECTION_CHANGED: \"draw:selectionChanged\",\n DRAG_BEGIN: \"draw:drag:begin\",\n DRAG_END: \"draw:drag:end\"\n};\n\nvar Constants = {\n SVG_OFFSET: -14,\n QUICK_CLICK_TIME: 500,\n RIGHT_ANGLE: 90,\n STRAIGHT_ANGLE: 180,\n FORTY_FIVE_ANGLE: 45\n};\n\nvar tmpPt1 = Point2d.create(0, 0);\nvar tmpPt2 = Point2d.create(0, 0);\n\nvar defaultXformStyle = {\n fillColor: \"white\",\n strokeColor: \"black\",\n strokeWidth: 2\n};\n\nvar EventsTypes = {\n MOUSEDOWN: \"mousedown\",\n MOUSEUP: \"mouseup\",\n MOUSEMOVE: \"mousemove\",\n TOUCHSTART: \"touchstart\",\n TOUCHEND: \"touchend\",\n TOUCHMOVE: \"touchmove\"\n};\n\nvar DOUBLE_CLICK_DELAY = 600; // To detect the double click in case of touch screen\n\n// This method will Add clientX, clientY & offsetX and offsetY for Touch events\nfunction getTouchCoordinates(event, canvas) {\n event.clientX = event.touches[0].clientX;\n event.clientY = event.touches[0].clientY;\n var element = canvas.getBoundingClientRect();\n event.offsetX = event.touches[0].clientX - element.left;\n event.offsetY = event.touches[0].clientY - element.top;\n return event;\n}\n\nfunction inCanvas(canvas, x, y) {\n var domrect = canvas.getBoundingClientRect();\n var localX = 0;\n var localY = 0;\n var isInCanvas = (localX = x - domrect.left - canvas.clientLeft) >= 0 && localX <= canvas.clientWidth && (localY = y - domrect.top - canvas.clientTop) >= 0 && localY <= canvas.clientHeight;\n return isInCanvas;\n}\n\nfunction getLocalMousePos(out, elem, event) {\n var domrect = elem.getBoundingClientRect();\n out[0] = event.clientX - domrect.left - elem.clientLeft;\n out[1] = event.clientY - domrect.top - elem.clientTop;\n}\n\nfunction transformSelectedShape(canvas, event, selectedInfo, camera) {\n getLocalMousePos(tmpPt1, canvas, event);\n Point2d.transformMat2d(tmpPt2, tmpPt1, camera.screenToWorldMatrix);\n var shape = selectedInfo.shape;\n if (shape instanceof _xformShape2.default) {\n InteractUtils.transformXformShape(shape, selectedInfo, tmpPt1, tmpPt2, camera);\n } else if (shape instanceof _vertEditableShape2.default) {\n InteractUtils.translateVert(shape, selectedInfo, tmpPt1, tmpPt2, camera);\n } else {\n InteractUtils.translateShape(shape, selectedInfo, tmpPt1, tmpPt2, camera);\n }\n}\n\nfunction addEventKeysToSelectedInfo(event, selectedInfo) {\n selectedInfo.keys = {\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey\n };\n}\n\nfunction getSelectedObjsFromMap(selectionMap) {\n var selectedObjs = [];\n selectionMap.forEach(function (subshape, shape) {\n selectedObjs.push(shape);\n });\n return selectedObjs;\n}\n\nfunction _selectShape(selectedShape, sortedShapes, currSelectedShapes, selectStyle, xformStyle, selectOpts) {\n var fireObject = {\n unselectedShapes: getSelectedObjsFromMap(currSelectedShapes)\n };\n clearSelectedShapes(currSelectedShapes);\n selectedShape.save();\n var maxZ = sortedShapes[sortedShapes.length - 1].zIndex;\n selectedShape.zIndex = maxZ + 1;\n _basicStyle2.default.copyBasicStyle(selectStyle, selectedShape);\n selectedShape.selected = true;\n // const dimensions = selectedShape.getDimensions()\n\n var newSelectShape = null;\n if (selectOpts.scalable || selectOpts.rotatable) {\n newSelectShape = new _xformShape2.default(xformStyle || defaultXformStyle, selectOpts);\n selectedShape.addChildXform(newSelectShape);\n }\n currSelectedShapes.set(selectedShape, newSelectShape);\n\n fireObject.selectedShapes = [selectedShape];\n return fireObject;\n}\n\nfunction clearSelectedShapes(selectedShapeMap) {\n selectedShapeMap.forEach(function (selectedShape, shape) {\n shape.restore();\n shape.selected = false;\n shape.removeChildXform(selectedShape);\n });\n selectedShapeMap.clear();\n}\n\nfunction clearSpecificShapes(selectedShapeMap, shapes) {\n var clearedShapes = [];\n shapes.forEach(function (shape) {\n var selectedShape = selectedShapeMap.get(shape);\n shape.restore();\n shape.selected = false;\n shape.removeChildXform(selectedShape);\n selectedShapeMap.delete(shape);\n clearedShapes.push(shape);\n });\n return clearedShapes;\n}\n\nvar hideCursor = function hideCursor() {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.style.display = \"none\";\n }\n};\n\nvar showCursor = function showCursor() {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.style.display = \"block\";\n }\n};\n\nvar hideCursorWithPointer = function hideCursorWithPointer(e) {\n e.target.parentNode.style.cursor = \"default\";\n hideCursor();\n};\n\nvar showCursorWithPointer = function showCursorWithPointer(e) {\n e.target.parentNode.style.cursor = \"none\";\n showCursor();\n};\n\n// understands how to return mouse coordinates as an object in the format {x: , y: }\n// accepts a mouse event and a DOM element as arguments\nfunction getMouseCoordinates(e, target) {\n var canvas = document.querySelector(\"\" + (\"#\" + target.id + \" canvas\"));\n\n var coords = {\n x: e.offsetX + canvas.offsetLeft,\n y: e.offsetY + canvas.offsetTop\n };\n\n return coords;\n}\n\n// understands how to append custom cursors to the DOM\n// accepts a mouse event, a DOM element, a cursorStyle, and pixel offsets as arguments\nfunction appendCustomCursor(_event, target, cursorStyle) {\n var offsetX = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Constants.SVG_OFFSET;\n var offsetY = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : Constants.SVG_OFFSET;\n\n var cursor = document.getElementById(\"cursor\");\n var mouse = getMouseCoordinates(_event, target);\n\n if (cursor === null) {\n var newCursor = document.createElement(\"span\");\n newCursor.setAttribute(\"id\", \"cursor\");\n newCursor.setAttribute(\"style\", \"position: absolute; top: \" + (mouse.y + \"px\") + \"; left: \" + (mouse.x + \"px\") + \"; width: 28px; height: 28px; background: \" + cursorStyle + \"; cursor: none; z-index: 10; pointer-events: none; transform: translate(\" + offsetX + \"px, \" + offsetY + \"px)\");\n target.appendChild(newCursor);\n } else if (cursor.style.background === cursorStyle) {\n updateCursorPosition(_event, target);\n } else {\n cursor.style.background = cursorStyle;\n updateCursorPosition(_event, target);\n }\n}\n\n// understands how to remove the custom cursor from the DOM\nfunction removeCustomCursor() {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.parentNode.removeChild(cursor);\n }\n}\n\n// understands how to change the position of the custom cursor on the page\n// accepts a mouse event and a DOM element as arguments\nfunction updateCursorPosition(_event, target) {\n var cursor = document.getElementById(\"cursor\");\n var mouse = getMouseCoordinates(_event, target);\n\n if (cursor !== null) {\n cursor.style.top = \"\" + (mouse.y + \"px\");\n cursor.style.left = \"\" + (mouse.x + \"px\");\n }\n}\n\nvar ShapeBuilder = function (_DrawEngine) {\n _inherits(ShapeBuilder, _DrawEngine);\n\n function ShapeBuilder() {\n _classCallCheck(this, ShapeBuilder);\n\n return _possibleConstructorReturn(this, (ShapeBuilder.__proto__ || Object.getPrototypeOf(ShapeBuilder)).apply(this, arguments));\n }\n\n _createClass(ShapeBuilder, [{\n key: \"_touchstartCB\",\n value: function _touchstartCB(event) {\n this._mousedownCB(event);\n }\n }, {\n key: \"_touchmoveCB\",\n value: function _touchmoveCB(event) {\n this._mousemoveCB(event);\n }\n }, {\n key: \"_touchendCB\",\n value: function _touchendCB(event) {\n this._mouseupCB(event);\n }\n }, {\n key: \"_mousedownCB\",\n value: function _mousedownCB(event) {\n this.setDenyMouseEventFlag(event);\n if (this.denyMouseEvent && !event.touches) {\n return;\n }\n if (event.touches) {\n event = getTouchCoordinates(event, this._drawCanvas);\n this.previousEventObj = event; // Assign event obj to variable to avoid the use it for touchend event\n }\n\n if (!inCanvas(this._drawCanvas, event.clientX, event.clientY)) {\n return;\n }\n\n this.timer = performance.now();\n\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var i = -1;\n var selectedShape = null;\n var selectedInfo = null;\n for (i = shapes.length - 1; i >= 0; i -= 1) {\n var shapeInfo = this._objects.get(shapes[i]);\n if (shapes[i].selected) {\n selectedShape = this._selectedShapes.get(shapes[i]);\n selectedInfo = shapeInfo;\n var hitInfo = null;\n if (selectedShape && (hitInfo = selectedShape.containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)).hit) {\n if (selectedShape instanceof _vertEditableShape2.default && event.altKey && hitInfo.controlIndex < shapes[i].numVerts) {\n shapes[i].removeVert(hitInfo.controlIndex);\n selectedShape = null;\n } else {\n var localXform = selectedShape.parent.localXform;\n var invLocalXform = _mat2d2.default.clone(localXform);\n _mat2d2.default.invert(invLocalXform, invLocalXform);\n var startObjPos = Point2d.clone(tmpPt2);\n Point2d.transformMat2d(startObjPos, startObjPos, invLocalXform);\n this._dragInfo = Object.assign({\n rotate: Boolean(hitInfo.rotate),\n controlIndex: hitInfo.controlIndex,\n startObjectPos: startObjPos,\n worldToObjectMatrix: invLocalXform,\n startLocalPos: selectedShape.parent.getPosition(),\n startLocalScale: selectedShape.parent.getScale(),\n startLocalRot: selectedShape.parent.getRotation(),\n shapeWidth: selectedShape.parent.width,\n shapeHeight: selectedShape.parent.height\n }, selectedInfo);\n }\n break;\n } else if (shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n selectedShape = shapes[i];\n break;\n }\n }\n // else if (shapeInfo.selectable && shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n // selectedShape = shapes[i]\n // selectedInfo = shapeInfo\n // const selectEventObj = selectShape(selectedShape, shapes, this._selectedShapes, this._selectStyle, this._xformStyle, selectedInfo)\n // this.fire(EventConstants.SELECTION_CHANGED, selectEventObj)\n // break\n // }\n }\n\n if (i < 0 && this._selectedShapes.size) {\n if (this._selectedShapes.size) {\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: getSelectedObjsFromMap(this._selectedShapes),\n selectedShapes: []\n });\n }\n this._dragInfo = null;\n clearSelectedShapes(this._selectedShapes);\n } else if (selectedShape && selectedInfo && (selectedInfo.movable || selectedInfo.rotatable || selectedInfo.scalable)) {\n var canvas = document.querySelector(\"\" + (\"#\" + this._parent.id + \" > canvas\"));\n if (canvas === null) {\n this._parent.addEventListener(\"mouseout\", hideCursor);\n this._parent.addEventListener(\"mouseover\", showCursor);\n } else {\n canvas.addEventListener(\"mouseout\", hideCursorWithPointer);\n canvas.addEventListener(\"mouseover\", showCursorWithPointer);\n }\n if (!this._dragInfo && selectedInfo.movable) {\n this._dragInfo = {\n startLocalPos: selectedShape.getPosition()\n };\n }\n\n if (this._dragInfo) {\n this._dragInfo.shape = selectedShape;\n this._dragInfo.startPos = Point2d.clone(tmpPt1);\n this._dragInfo.startWorldPos = Point2d.clone(tmpPt2);\n this._dragInfo.objectToWorldMatrix = _mat2d2.default.clone(selectedShape.globalXform);\n addEventKeysToSelectedInfo(event, this._dragInfo);\n event.stopImmediatePropagation();\n this.fire(EventConstants.DRAG_BEGIN, {\n shapes: getSelectedObjsFromMap(this._selectedShapes)\n });\n }\n if (!event.touches) {\n event.preventDefault();\n }\n }\n }\n }, {\n key: \"_mouseupCB\",\n value: function _mouseupCB(event) {\n if (this.denyMouseEvent && !event.touches) {\n this.setDenyMouseEventFlag(event);\n return; // Returning on next line to avoid ESLint error\n }\n if (event.touches) {\n // Use previously assigned event obj to get the offsetX & Y and clientX & Y calculation\n event = this.previousEventObj;\n }\n\n if (this._dragInfo && this._dragInfo.shape) {\n event.stopImmediatePropagation();\n if (event.cancelable) {\n event.preventDefault();\n }\n var canvas = document.querySelector(\"\" + (\"#\" + this._parent.id + \" > canvas\"));\n if (canvas === null) {\n this._parent.removeEventListener(\"mouseout\", hideCursor);\n this._parent.removeEventListener(\"mouseover\", showCursor);\n } else {\n canvas.removeEventListener(\"mouseout\", hideCursorWithPointer);\n canvas.removeEventListener(\"mouseover\", showCursorWithPointer);\n }\n this._dragInfo = null;\n this.fire(EventConstants.DRAG_END, {\n shapes: getSelectedObjsFromMap(this._selectedShapes)\n });\n } else if (performance.now() - this.timer < Constants.QUICK_CLICK_TIME) {\n // this is a relatively quick click\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var selectedShape = null;\n var selectedInfo = null;\n for (var i = shapes.length - 1; i >= 0; i -= 1) {\n selectedInfo = this._objects.get(shapes[i]);\n if (selectedInfo.selectable && shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n selectedShape = shapes[i];\n break;\n }\n }\n if (selectedShape && !selectedShape.selected) {\n var selectEventObj = _selectShape(selectedShape, shapes, this._selectedShapes, this._selectStyle, this._xformStyle, selectedInfo);\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n } else {\n // If user clicks anywhere outside then allow the movement of Base Map (Parents Container)\n this._makeParentElementMovable();\n }\n }\n // Added Support for Double click\n if (event.touches) {\n if (event.cancelable) {\n event.preventDefault();\n }\n if (Date.now() - this.firstTapTime < DOUBLE_CLICK_DELAY) {\n this._dblclickCB(event);\n }\n }\n this.firstTapTime = Date.now();\n }\n }, {\n key: \"_mousemoveCB\",\n value: function _mousemoveCB(event) {\n this.setDenyMouseEventFlag(event);\n if (this.denyMouseEvent && !event.touches) {\n return;\n }\n\n if (event.touches) {\n event = getTouchCoordinates(event, this._drawCanvas);\n this.previousEventObj = event; // Assign event obj to variable to avoid the use it for touchend event\n }\n\n if (!inCanvas(this._drawCanvas, event.clientX, event.clientY) && !this._dragInfo) {\n return;\n }\n\n if (this._dragInfo && this._dragInfo.shape) {\n updateCursorPosition(event, this._parent);\n addEventKeysToSelectedInfo(event, this._dragInfo);\n transformSelectedShape(this._drawCanvas, event, this._dragInfo, this._camera);\n event.stopImmediatePropagation();\n if (!event.touches) {\n event.preventDefault();\n }\n } else if (!event.buttons && this._selectedShapes.size) {\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var i = 0;\n var flipy = this._camera.isYFlipped();\n for (i = shapes.length - 1; i >= 0; i -= 1) {\n if (shapes[i].selected) {\n var selectInfo = this._objects.get(shapes[i]);\n var selectedShape = this._selectedShapes.get(shapes[i]);\n var hitInfo = null;\n this._parent.style.cursor = \"none\";\n // forEach not supported on nodelist in IE/Edge\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"none\";\n if (this._parent.childNodes[j].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[j].style.pointerEvents = \"none\";\n }\n }\n if (selectedShape && (hitInfo = selectedShape.containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)).hit) {\n if (selectedShape instanceof _xformShape2.default) {\n if (hitInfo.rotate) {\n var degrees = shapes[i].getRotation();\n if (flipy) {\n degrees *= -1;\n if (hitInfo.controlIndex === 1) {\n degrees -= Constants.RIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 0) {\n degrees += Constants.STRAIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 2) {\n degrees += Constants.RIGHT_ANGLE;\n }\n } else if (hitInfo.controlIndex === 0) {\n degrees -= Constants.RIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 1) {\n degrees += Constants.STRAIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 3) {\n // eslint-disable-line no-magic-numbers\n degrees += Constants.RIGHT_ANGLE;\n }\n appendCustomCursor(event, this._parent, \"\" + rotateSvg.replace(//g, \"\" + degrees));\n } else if (hitInfo.controlIndex < 4) {\n // eslint-disable-line no-magic-numbers\n if (hitInfo.controlIndex === 0 || hitInfo.controlIndex === 3) {\n // eslint-disable-line no-magic-numbers\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + (-shapes[i].getRotation() - Constants.FORTY_FIVE_ANGLE)));\n } else if (hitInfo.controlIndex === 1 || hitInfo.controlIndex === 2) {\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + (-shapes[i].getRotation() + Constants.FORTY_FIVE_ANGLE)));\n }\n } else if (hitInfo.controlIndex % 2 === 0) {\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + -shapes[i].getRotation()));\n } else {\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + (-shapes[i].getRotation() + Constants.RIGHT_ANGLE)));\n }\n } else if (selectedShape instanceof _vertEditableShape2.default) {\n this._parent.style.cursor = \"none\";\n // forEach not supported on nodelist in IE/Edge\n for (var _j = 0; _j < this._parent.childNodes.length; _j += 1) {\n this._parent.childNodes[_j].style.cursor = \"none\";\n if (this._parent.childNodes[_j].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[_j].style.pointerEvents = \"none\";\n }\n }\n if (hitInfo.controlIndex >= shapes[i].numVerts) {\n appendCustomCursor(event, this._parent, addSvg, -8, -6); // eslint-disable-line no-magic-numbers\n } else if (event.altKey) {\n appendCustomCursor(event, this._parent, removeSvg, -8, -6); // eslint-disable-line no-magic-numbers\n } else {\n appendCustomCursor(event, this._parent, repositionSvg, Constants.SVG_OFFSET, Constants.SVG_OFFSET);\n }\n }\n event.stopImmediatePropagation();\n event.preventDefault();\n break;\n } else if (shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n if (selectInfo && selectInfo.movable) {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.parentNode.removeChild(cursor);\n }\n this._parent.style.cursor = \"move\";\n for (var _j2 = 0; _j2 < this._parent.childNodes.length; _j2 += 1) {\n this._parent.childNodes[_j2].style.cursor = \"move\";\n }\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n break;\n }\n }\n }\n\n if (i < 0) {\n removeCustomCursor();\n this._parent.style.cursor = \"default\";\n // forEach not supported on nodelist in IE/Edge\n for (var _j3 = 0; _j3 < this._parent.childNodes.length; _j3 += 1) {\n this._parent.childNodes[_j3].style.cursor = \"default\";\n if (this._parent.childNodes[_j3].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[_j3].style.pointerEvents = \"auto\";\n }\n }\n }\n }\n }\n }, {\n key: \"_clickCB\",\n value: function _clickCB() {\n // noop\n }\n }, {\n key: \"_dblclickCB\",\n value: function _dblclickCB(event) {\n if (!inCanvas(this._drawCanvas, event.clientX, event.clientY)) {\n return;\n }\n\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var i = -1;\n for (i = shapes.length - 1; i >= 0; i -= 1) {\n var shapeInfo = this._objects.get(shapes[i]);\n if (shapeInfo.selectable && shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n if (shapeInfo.editable && shapes[i] instanceof _polyLine2.default) {\n var selectedShape = shapes[i];\n var doXform = false;\n if (shapes[i].selected) {\n var interactiveShape = this._selectedShapes.get(shapes[i]);\n if (interactiveShape) {\n selectedShape.restore();\n selectedShape.removeChildXform(interactiveShape);\n doXform = !(interactiveShape instanceof _xformShape2.default);\n }\n }\n\n selectedShape.selected = true;\n selectedShape.save();\n var maxZ = shapes[shapes.length - 1].zIndex;\n selectedShape.zIndex = maxZ + 1;\n _basicStyle2.default.copyBasicStyle(this._selectStyle, selectedShape);\n var newSelectShape = null;\n if (doXform) {\n if (shapeInfo.rotatable || shapeInfo.scalable) {\n newSelectShape = new _xformShape2.default(this._xformStyle || defaultXformStyle, shapeInfo);\n selectedShape.addChildXform(newSelectShape);\n }\n } else {\n newSelectShape = new _vertEditableShape2.default(selectedShape, this._xformStyle);\n selectedShape.addChildXform(newSelectShape);\n }\n this._selectedShapes.set(selectedShape, newSelectShape);\n } else if (!shapes[i].selected) {\n var selectEventObj = _selectShape(shapes[i], shapes, this._selectedShapes, this._selectStyle, this._xformStyle, shapeInfo);\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n break;\n }\n }\n\n if (i < 0 && this._selectedShapes.size) {\n if (this._selectedShapes.size) {\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: getSelectedObjsFromMap(this._selectedShapes),\n selectedShapes: []\n });\n }\n this._dragInfo = null;\n clearSelectedShapes(this._selectedShapes);\n } else {\n event.stopImmediatePropagation();\n }\n if (event.cancelable) {\n event.preventDefault();\n }\n }\n }, {\n key: \"_mouseoverCB\",\n value: function _mouseoverCB() {\n // noop\n }\n }, {\n key: \"_mouseoutCB\",\n value: function _mouseoutCB() {\n // noop\n }\n }, {\n key: \"_init\",\n value: function _init(parent, opts) {\n this._activated = opts && opts.enableInteractions;\n _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"_init\", this).call(this, parent, opts, this._activated);\n var myevents = Object.getOwnPropertyNames(EventConstants).map(function (event) {\n return EventConstants[event];\n });\n this.registerEvents(myevents);\n this._dragInfo = null;\n this._selectedShapes = new Map();\n this._selectStyle = new _basicStyle2.default(opts && opts.selectStyle ? opts.selectStyle : {\n fillColor: \"orange\"\n });\n\n this._xformStyle = new _basicStyle2.default(opts && opts.xformStyle ? opts.xformStyle : {\n fillColor: \"white\",\n strokeColor: \"black\",\n strokeWidth: 2\n });\n\n this.timer = 0;\n }\n\n // This function allow the movement of Parent Container (In our case it is Map) when user clicks anywhere on Map except on Shape\n // As well as it's changes the icon of mouse for Desktop devices\n\n }, {\n key: \"_makeParentElementMovable\",\n value: function _makeParentElementMovable() {\n removeCustomCursor();\n this._parent.style.cursor = \"default\"; // Change the Cursor icon for desktop device\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"default\"; // Change the Cursor icon for desktop device\n if (this._parent.childNodes[j].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[j].style.pointerEvents = \"auto\"; // Allow movemnet of parent container i.e Map\n }\n }\n }\n }, {\n key: \"_renderShapes\",\n value: function _renderShapes(ctx, drawShapes, camera) {\n var _this2 = this;\n\n var worldToScreenMat = camera.worldToScreenMatrix;\n drawShapes.forEach(function (shape) {\n if (shape.visible) {\n shape.render(ctx, worldToScreenMat, _this2._styleState);\n // shape.renderBounds(ctx, worldToScreenMat, boundsStrokeStyle)\n if (shape.selected) {\n var interacShape = _this2._selectedShapes.get(shape);\n if (interacShape) {\n interacShape.render(ctx, worldToScreenMat, _this2._styleState);\n // interacShape.renderBounds(ctx, worldToScreenMat, boundsStrokeStyle)\n }\n }\n }\n });\n }\n }, {\n key: \"selectShape\",\n value: function selectShape(shape) {\n var shapeInfo = this._objects.get(shape);\n if (shapeInfo && shapeInfo.selectable) {\n var selectEventObj = _selectShape(shape, this.sortedShapes, this._selectedShapes, this._selectStyle, this._xformStyle, shapeInfo);\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n }\n }, {\n key: \"clearSelection\",\n value: function clearSelection() {\n if (this._selectedShapes.size) {\n var selectedShapes = getSelectedObjsFromMap(this._selectedShapes);\n clearSelectedShapes(this._selectedShapes);\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: selectedShapes,\n selectedShapes: []\n });\n this._rerenderCb();\n }\n }\n }, {\n key: \"addShape\",\n value: function addShape(shape) {\n var _this3 = this;\n\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var select = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n\n _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"addShape\", this).call(this, shapes);\n shapes.forEach(function (newShape) {\n var shapeInfo = _this3._objects.get(newShape);\n if (shapeInfo) {\n shapeInfo.selectable = opts && typeof opts.selectable !== \"undefined\" ? Boolean(opts.selectable) : true;\n shapeInfo.movable = opts && typeof opts.movable !== \"undefined\" ? Boolean(opts.movable) : true;\n shapeInfo.rotatable = opts && typeof opts.rotatable !== \"undefined\" ? Boolean(opts.rotatable) : true;\n shapeInfo.scalable = opts && typeof opts.scalable !== \"undefined\" ? Boolean(opts.scalable) : true;\n shapeInfo.uniformScaleOnly = opts && typeof opts.uniformScaleOnly !== \"undefined\" ? Boolean(opts.uniformScaleOnly) : false;\n shapeInfo.centerScaleOnly = opts && typeof opts.centerScaleOnly !== \"undefined\" ? Boolean(opts.centerScaleOnly) : false;\n shapeInfo.editable = opts && typeof opts.editable !== \"undefined\" ? Boolean(opts.editable) : true;\n }\n });\n\n if (select) {\n var selectEventObj = {\n unselectedShapes: getSelectedObjsFromMap(this._selectedShapes)\n };\n var selectedShapes = [];\n shapes.forEach(function (newShape) {\n var shapeInfo = _this3._objects.get(newShape);\n if (shapeInfo.selectable) {\n _selectShape(newShape, _this3.sortedShapes, _this3._selectedShapes, _this3._selectStyle, _this3._xformStyle, shapeInfo);\n selectedShapes.push(newShape);\n }\n });\n\n if (selectedShapes.length) {\n selectEventObj.selectedShapes = selectedShapes;\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n }\n\n return this;\n }\n }, {\n key: \"deleteShape\",\n value: function deleteShape(shape) {\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n var selectClearedShapes = clearSpecificShapes(this._selectedShapes, shapes);\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: selectClearedShapes,\n selectedShapes: getSelectedObjsFromMap(this._selectedShapes)\n });\n\n removeCustomCursor();\n this._parent.style.cursor = \"default\";\n // forEach not supported on nodelist in IE/Edge\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"default\";\n this._parent.childNodes[j].style.pointerEvents = \"auto\";\n }\n\n return _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"deleteShape\", this).call(this, shapes);\n }\n }, {\n key: \"deleteSelectedShapes\",\n value: function deleteSelectedShapes() {\n var selectedShapes = getSelectedObjsFromMap(this._selectedShapes);\n clearSelectedShapes(this._selectedShapes);\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: selectedShapes,\n selectedShapes: []\n });\n\n removeCustomCursor();\n this._parent.style.cursor = \"default\";\n // forEach not supported on nodelist in IE/Edge\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"default\";\n this._parent.childNodes[j].style.pointerEvents = \"auto\";\n }\n\n return _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"deleteShape\", this).call(this, selectedShapes);\n }\n }, {\n key: \"enableInteractions\",\n value: function enableInteractions() {\n this._enableEvents();\n this._activated = true;\n return this;\n }\n }, {\n key: \"disableInteractions\",\n value: function disableInteractions() {\n var clearSelection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (clearSelection) {\n this.clearSelection();\n }\n this._disableEvents();\n this._activated = false;\n return this;\n }\n\n // This method is used to stop Mouse Event propagation Triggered from the Touch event\n\n }, {\n key: \"setDenyMouseEventFlag\",\n value: function setDenyMouseEventFlag(event) {\n if (event.touches) {\n this.denyMouseEvent = true;\n } else if (event.type === EventsTypes.MOUSEUP) {\n // set the Flag false at the end of mouse event i.e on MouseUp Event\n this.denyMouseEvent = false;\n }\n }\n }, {\n key: \"selectStyle\",\n set: function set(selectStyle) {\n _basicStyle2.default.copyBasicStyle(selectStyle, this._selectStyle);\n },\n get: function get() {\n return this._selectStyle;\n }\n }, {\n key: \"selectedShapes\",\n get: function get() {\n return getSelectedObjsFromMap(this._selectedShapes);\n }\n }, {\n key: \"interactionsEnabled\",\n get: function get() {\n return this._activated;\n }\n }]);\n\n return ShapeBuilder;\n}(_drawEngine2.default);\n\nexports.default = ShapeBuilder;\n\n\nObject.assign(EventConstants, _drawEngine2.default.EventConstants);\nShapeBuilder.EventConstants = EventConstants;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9lbmdpbmUvc2hhcGUtYnVpbGRlci5qcz8yNjg0Il0sIm5hbWVzIjpbIkludGVyYWN0VXRpbHMiLCJQb2ludDJkIiwic2NhbGVTdmciLCJyb3RhdGVTdmciLCJhZGRTdmciLCJyZW1vdmVTdmciLCJyZXBvc2l0aW9uU3ZnIiwiRXZlbnRDb25zdGFudHMiLCJTRUxFQ1RJT05fQ0hBTkdFRCIsIkRSQUdfQkVHSU4iLCJEUkFHX0VORCIsIkNvbnN0YW50cyIsIlNWR19PRkZTRVQiLCJRVUlDS19DTElDS19USU1FIiwiUklHSFRfQU5HTEUiLCJTVFJBSUdIVF9BTkdMRSIsIkZPUlRZX0ZJVkVfQU5HTEUiLCJ0bXBQdDEiLCJjcmVhdGUiLCJ0bXBQdDIiLCJkZWZhdWx0WGZvcm1TdHlsZSIsImZpbGxDb2xvciIsInN0cm9rZUNvbG9yIiwic3Ryb2tlV2lkdGgiLCJFdmVudHNUeXBlcyIsIk1PVVNFRE9XTiIsIk1PVVNFVVAiLCJNT1VTRU1PVkUiLCJUT1VDSFNUQVJUIiwiVE9VQ0hFTkQiLCJUT1VDSE1PVkUiLCJET1VCTEVfQ0xJQ0tfREVMQVkiLCJnZXRUb3VjaENvb3JkaW5hdGVzIiwiZXZlbnQiLCJjYW52YXMiLCJjbGllbnRYIiwidG91Y2hlcyIsImNsaWVudFkiLCJlbGVtZW50IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwib2Zmc2V0WCIsImxlZnQiLCJvZmZzZXRZIiwidG9wIiwiaW5DYW52YXMiLCJ4IiwieSIsImRvbXJlY3QiLCJsb2NhbFgiLCJsb2NhbFkiLCJpc0luQ2FudmFzIiwiY2xpZW50TGVmdCIsImNsaWVudFdpZHRoIiwiY2xpZW50VG9wIiwiY2xpZW50SGVpZ2h0IiwiZ2V0TG9jYWxNb3VzZVBvcyIsIm91dCIsImVsZW0iLCJ0cmFuc2Zvcm1TZWxlY3RlZFNoYXBlIiwic2VsZWN0ZWRJbmZvIiwiY2FtZXJhIiwidHJhbnNmb3JtTWF0MmQiLCJzY3JlZW5Ub1dvcmxkTWF0cml4Iiwic2hhcGUiLCJYZm9ybVNoYXBlIiwidHJhbnNmb3JtWGZvcm1TaGFwZSIsIlZlcnRFZGl0YWJsZVNoYXBlIiwidHJhbnNsYXRlVmVydCIsInRyYW5zbGF0ZVNoYXBlIiwiYWRkRXZlbnRLZXlzVG9TZWxlY3RlZEluZm8iLCJrZXlzIiwiYWx0S2V5IiwiY3RybEtleSIsInNoaWZ0S2V5IiwibWV0YUtleSIsImdldFNlbGVjdGVkT2Jqc0Zyb21NYXAiLCJzZWxlY3Rpb25NYXAiLCJzZWxlY3RlZE9ianMiLCJmb3JFYWNoIiwic3Vic2hhcGUiLCJwdXNoIiwic2VsZWN0U2hhcGUiLCJzZWxlY3RlZFNoYXBlIiwic29ydGVkU2hhcGVzIiwiY3VyclNlbGVjdGVkU2hhcGVzIiwic2VsZWN0U3R5bGUiLCJ4Zm9ybVN0eWxlIiwic2VsZWN0T3B0cyIsImZpcmVPYmplY3QiLCJ1bnNlbGVjdGVkU2hhcGVzIiwiY2xlYXJTZWxlY3RlZFNoYXBlcyIsInNhdmUiLCJtYXhaIiwibGVuZ3RoIiwiekluZGV4IiwiQmFzaWNTdHlsZSIsImNvcHlCYXNpY1N0eWxlIiwic2VsZWN0ZWQiLCJuZXdTZWxlY3RTaGFwZSIsInNjYWxhYmxlIiwicm90YXRhYmxlIiwiYWRkQ2hpbGRYZm9ybSIsInNldCIsInNlbGVjdGVkU2hhcGVzIiwic2VsZWN0ZWRTaGFwZU1hcCIsInJlc3RvcmUiLCJyZW1vdmVDaGlsZFhmb3JtIiwiY2xlYXIiLCJjbGVhclNwZWNpZmljU2hhcGVzIiwic2hhcGVzIiwiY2xlYXJlZFNoYXBlcyIsImdldCIsImRlbGV0ZSIsImhpZGVDdXJzb3IiLCJjdXJzb3IiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwic3R5bGUiLCJkaXNwbGF5Iiwic2hvd0N1cnNvciIsImhpZGVDdXJzb3JXaXRoUG9pbnRlciIsImUiLCJ0YXJnZXQiLCJwYXJlbnROb2RlIiwic2hvd0N1cnNvcldpdGhQb2ludGVyIiwiZ2V0TW91c2VDb29yZGluYXRlcyIsInF1ZXJ5U2VsZWN0b3IiLCJpZCIsImNvb3JkcyIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJhcHBlbmRDdXN0b21DdXJzb3IiLCJfZXZlbnQiLCJjdXJzb3JTdHlsZSIsIm1vdXNlIiwibmV3Q3Vyc29yIiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImFwcGVuZENoaWxkIiwiYmFja2dyb3VuZCIsInVwZGF0ZUN1cnNvclBvc2l0aW9uIiwicmVtb3ZlQ3VzdG9tQ3Vyc29yIiwicmVtb3ZlQ2hpbGQiLCJTaGFwZUJ1aWxkZXIiLCJfbW91c2Vkb3duQ0IiLCJfbW91c2Vtb3ZlQ0IiLCJfbW91c2V1cENCIiwic2V0RGVueU1vdXNlRXZlbnRGbGFnIiwiZGVueU1vdXNlRXZlbnQiLCJfZHJhd0NhbnZhcyIsInByZXZpb3VzRXZlbnRPYmoiLCJ0aW1lciIsInBlcmZvcm1hbmNlIiwibm93IiwiX2NhbWVyYSIsIndvcmxkVG9TY3JlZW5NYXRyaXgiLCJpIiwic2hhcGVJbmZvIiwiX29iamVjdHMiLCJfc2VsZWN0ZWRTaGFwZXMiLCJoaXRJbmZvIiwiY29udGFpbnNQb2ludCIsIl9kcmF3Q3R4IiwiaGl0IiwiY29udHJvbEluZGV4IiwibnVtVmVydHMiLCJyZW1vdmVWZXJ0IiwibG9jYWxYZm9ybSIsInBhcmVudCIsImludkxvY2FsWGZvcm0iLCJNYXQyZCIsImNsb25lIiwiaW52ZXJ0Iiwic3RhcnRPYmpQb3MiLCJfZHJhZ0luZm8iLCJPYmplY3QiLCJhc3NpZ24iLCJyb3RhdGUiLCJCb29sZWFuIiwic3RhcnRPYmplY3RQb3MiLCJ3b3JsZFRvT2JqZWN0TWF0cml4Iiwic3RhcnRMb2NhbFBvcyIsImdldFBvc2l0aW9uIiwic3RhcnRMb2NhbFNjYWxlIiwiZ2V0U2NhbGUiLCJzdGFydExvY2FsUm90IiwiZ2V0Um90YXRpb24iLCJzaGFwZVdpZHRoIiwid2lkdGgiLCJzaGFwZUhlaWdodCIsImhlaWdodCIsInNpemUiLCJmaXJlIiwibW92YWJsZSIsIl9wYXJlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwic3RhcnRQb3MiLCJzdGFydFdvcmxkUG9zIiwib2JqZWN0VG9Xb3JsZE1hdHJpeCIsImdsb2JhbFhmb3JtIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJjYW5jZWxhYmxlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNlbGVjdGFibGUiLCJzZWxlY3RFdmVudE9iaiIsIl9zZWxlY3RTdHlsZSIsIl94Zm9ybVN0eWxlIiwiX21ha2VQYXJlbnRFbGVtZW50TW92YWJsZSIsIkRhdGUiLCJmaXJzdFRhcFRpbWUiLCJfZGJsY2xpY2tDQiIsImJ1dHRvbnMiLCJmbGlweSIsImlzWUZsaXBwZWQiLCJzZWxlY3RJbmZvIiwiaiIsImNoaWxkTm9kZXMiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwicG9pbnRlckV2ZW50cyIsImRlZ3JlZXMiLCJyZXBsYWNlIiwiZWRpdGFibGUiLCJQb2x5TGluZSIsImRvWGZvcm0iLCJpbnRlcmFjdGl2ZVNoYXBlIiwib3B0cyIsIl9hY3RpdmF0ZWQiLCJlbmFibGVJbnRlcmFjdGlvbnMiLCJteWV2ZW50cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJtYXAiLCJyZWdpc3RlckV2ZW50cyIsIk1hcCIsImN0eCIsImRyYXdTaGFwZXMiLCJ3b3JsZFRvU2NyZWVuTWF0IiwidmlzaWJsZSIsInJlbmRlciIsIl9zdHlsZVN0YXRlIiwiaW50ZXJhY1NoYXBlIiwiX3JlcmVuZGVyQ2IiLCJzZWxlY3QiLCJBcnJheSIsImlzQXJyYXkiLCJuZXdTaGFwZSIsInVuaWZvcm1TY2FsZU9ubHkiLCJjZW50ZXJTY2FsZU9ubHkiLCJzZWxlY3RDbGVhcmVkU2hhcGVzIiwiX2VuYWJsZUV2ZW50cyIsImNsZWFyU2VsZWN0aW9uIiwiX2Rpc2FibGVFdmVudHMiLCJ0eXBlIiwiRHJhd0VuZ2luZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFFQTs7SUFBWUEsYTs7QUFDWjs7SUFBWUMsTzs7QUFDWjs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUMsV0FBVyxtV0FBakI7O0FBRUEs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UDtBQUNEOzs7MENBRTBDO0FBQUEsVUFBdkJ1QixjQUF1Qix1RUFBTixJQUFNOztBQUN6QyxVQUFJQSxjQUFKLEVBQW9CO0FBQ2xCLGFBQUtBLGNBQUw7QUFDRDtBQUNELFdBQUtDLGNBQUw7QUFDQSxXQUFLeEIsVUFBTCxHQUFrQixLQUFsQjtBQUNBLGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7OzBDQUNzQm5NLEssRUFBTztBQUMzQixVQUFJQSxNQUFNRyxPQUFWLEVBQW1CO0FBQ2pCLGFBQUtnSCxjQUFMLEdBQXNCLElBQXRCO0FBQ0QsT0FGRCxNQUVPLElBQUluSCxNQUFNNE4sSUFBTixLQUFlck8sWUFBWUUsT0FBL0IsRUFBd0M7QUFDN0M7QUFDQSxhQUFLMEgsY0FBTCxHQUFzQixLQUF0QjtBQUNEO0FBQ0Y7OztzQkEvSWUvRCxXLEVBQWE7QUFDM0JVLDJCQUFXQyxjQUFYLENBQTBCWCxXQUExQixFQUF1QyxLQUFLeUgsWUFBNUM7QUFDRCxLO3dCQUVpQjtBQUNoQixhQUFPLEtBQUtBLFlBQVo7QUFDRDs7O3dCQUVvQjtBQUNuQixhQUFPbkksdUJBQXVCLEtBQUtvRixlQUE1QixDQUFQO0FBQ0Q7Ozt3QkEwR3lCO0FBQ3hCLGFBQU8sS0FBS3FFLFVBQVo7QUFDRDs7OztFQTVpQnVDMEIsb0I7O2tCQUFyQi9HLFk7OztBQXdrQnJCZ0MsT0FBT0MsTUFBUCxDQUFjekssY0FBZCxFQUE4QnVQLHFCQUFXdlAsY0FBekM7QUFDQXdJLGFBQWF4SSxjQUFiLEdBQThCQSxjQUE5QiIsImZpbGUiOiIxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIEludGVyYWN0VXRpbHMgZnJvbSBcIi4uL2ludGVyYWN0aW9ucy9pbnRlcmFjdC11dGlsc1wiXG5pbXBvcnQgKiBhcyBQb2ludDJkIGZyb20gXCIuLi9jb3JlL3BvaW50MmRcIlxuaW1wb3J0IEJhc2ljU3R5bGUgZnJvbSBcIi4uL3N0eWxlL2Jhc2ljLXN0eWxlXCJcbmltcG9ydCBEcmF3RW5naW5lIGZyb20gXCIuL2RyYXctZW5naW5lXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQgUG9seUxpbmUgZnJvbSBcIi4uL3NoYXBlcy9wb2x5LWxpbmVcIlxuaW1wb3J0IFZlcnRFZGl0YWJsZVNoYXBlIGZyb20gXCIuLi9pbnRlcmFjdGlvbnMvdmVydC1lZGl0YWJsZS1zaGFwZVwiXG5pbXBvcnQgWGZvcm1TaGFwZSBmcm9tIFwiLi4vaW50ZXJhY3Rpb25zL3hmb3JtLXNoYXBlXCJcblxuY29uc3Qgc2NhbGVTdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCclM0UlM0NnIHRyYW5zZm9ybT0ncm90YXRlKDxkZWdyZWVzPiwyNCwyNCknJTNFJTNDcG9seWdvbiBzdHlsZT0nZmlsbDolMjNmZmZmZmY7JyBwb2ludHM9JzE2LDIwIDE2LDEyIDQsMjQgMTYsMzYgMTYsMjggMzIsMjggMzIsMzYgNDQsMjQgMzIsMTIgMzIsMjAgJy8lM0UlM0Nwb2x5Z29uIHBvaW50cz0nMTQsMjIgMTQsMTcgNywyNCAxNCwzMSAxNCwyNiAzNCwyNiAzNCwzMSA0MSwyNCAzNCwxNyAzNCwyMiAnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRVxcXCIpIG5vLXJlcGVhdFwiXG5cbmNvbnN0IHJvdGF0ZVN2ZyA9IFwidXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDQ4IDQ4JyUzRSUzQ2cgdHJhbnNmb3JtPSdyb3RhdGUoPGRlZ3JlZXM+LDI0LDI0KSclM0UlM0NwYXRoIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIGQ9J00yNS45LDRDMTYuNiw0LDguOCwxMS4yLDcuNCwyMC44SDYuN0gzLjNsMS42LDIuOWwzLjgsNy4xbDEuOCwzLjNsMS44LTMuM2wzLjgtNy4xbDEuNi0yLjloLTMuM2gtMC4xIGMxLjMtNS43LDYuMS05LjksMTEuNy05LjljOCwwLDEyLjEsNC40LDEyLjEsMTMuMWMwLDcuMi01LjQsMTMuMS0xMi4xLDEzLjFoLTJ2MlY0MnYyaDJjMTAuNCwwLDE4LjgtOSwxOC44LTIwIEM0NC43LDExLjcsMzcuNSw0LDI1LjksNEwyNS45LDR6Jy8lM0UlM0NwYXRoIGQ9J00yNS45LDZjMTAuNSwwLDE2LjgsNi43LDE2LjgsMThjMCw5LjktNy41LDE4LTE2LjgsMTh2LTIuOWM3LjgsMCwxNC4xLTYuOCwxNC4xLTE1LjFjMC01LjYtMS44LTE1LjEtMTQuMS0xNS4xIGMtNy40LDAtMTMuNCw2LjEtMTQsMTMuOWgyLjRsLTMuOCw3LjFsLTMuOC03LjFoMi41QzkuNywxMy40LDE3LDYsMjUuOSw2Jy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcXFwiKSBuby1yZXBlYXRcIlxuXG5jb25zdCBhZGRTdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCclM0UlM0Nwb2x5Z29uIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIHBvaW50cz0nMzEuMiwyOCAyNC44LDI4IDI0LjgsMzIuOCAyMCwzMi44IDIwLDM5LjIgMjQuOCwzOS4yIDI0LjgsNDQgMzEuMiw0NCAzMS4yLDM5LjIgMzYsMzkuMiAzNiwzMi44IDMxLjIsMzIuOCAnLyUzRSAlM0Nwb2x5Z29uIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZicgcG9pbnRzPScxMiwzMiAxMiw0IDMyLjMsMjQuMyAyMCwyNC4zIDE5LjcsMjQuNiAnLyUzRSUzQ3BvbHlnb24gcG9pbnRzPScxMy44LDguMiAxMy44LDI3LjggMTksMjIuOCAxOS4yLDIyLjUgMjgsMjIuNSAnLyUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMjkuNiwyOS42IDI5LjYsMzQuNCAzNC40LDM0LjQgMzQuNCwzNy42IDI5LjYsMzcuNiAyOS42LDQyLjQgMjYuNCw0Mi40IDI2LjQsMzcuNiAyMS42LDM3LjYgMjEuNiwzNC40IDI2LjQsMzQuNCAyNi40LDI5LjYgMjkuNiwyOS42ICAnLyUzRSUzQy9zdmclM0VcXFwiKSBuby1yZXBlYXRcIlxuXG5jb25zdCByZW1vdmVTdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCclM0UlM0NyZWN0IHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIHg9JzIwJyB5PSczMi44JyB3aWR0aD0nMTYnIGhlaWdodD0nNi40Jy8lM0UlM0Nwb2x5Z29uICBzdHlsZT0nZmlsbDolMjNmZmZmZmY7JyBwb2ludHM9JzEyLDMyIDEyLDQgMzIuMywyNC4zIDIwLDI0LjMgMTkuNywyNC42ICcvJTNFJTNDcG9seWdvbiBwb2ludHM9JzEzLjgsOC4yIDEzLjgsMjcuOCAxOSwyMi44IDE5LjIsMjIuNSAyOCwyMi41ICcvJTNFJTNDcG9seWxpbmUgcG9pbnRzPSczNC40LDM0LjQgMzQuNCwzNy42IDIxLjYsMzcuNiAyMS42LDM0LjQgJy8lM0UlM0Mvc3ZnJTNFXFxcIikgbm8tcmVwZWF0XCJcblxuY29uc3QgcmVwb3NpdGlvblN2ZyA9IFwidXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDQ4IDQ4JyUzRSUzQ3BhdGggc3R5bGU9J2ZpbGw6JTIzZmZmZmZmOycgZD0nTTI0LDE3LjVjLTMuNiwwLTYuNSwyLjktNi41LDYuNXMyLjksNi41LDYuNSw2LjVzNi41LTIuOSw2LjUtNi41UzI3LjYsMTcuNSwyNCwxNy41TDI0LDE3LjV6Jy8lM0UlM0NwYXRoIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIGQ9J00yNCw0TDQsMjRsMjAsMjBsMjAtMjBMMjQsNHogTTMxLjUsMzEuNWgtMTV2LTE1aDE1VjMxLjV6Jy8lM0UlM0Nwb2x5Z29uIHBvaW50cz0nMTcsMzQgMjQsNDAuNSAzMSwzNCAgJy8lM0UlM0Nwb2x5Z29uIHBvaW50cz0nMzEsMTQgMjQsNy41IDE3LDE0ICAgICAnLyUzRSUzQ3BvbHlnb24gcG9pbnRzPScxNCwxNyA3LjUsMjQgMTQsMzEgICAnLyUzRSUzQ3BvbHlnb24gcG9pbnRzPSczNCwzMSA0MC41LDI0IDM0LDE3ICAgICcvJTNFJTNDcGF0aCBkPSdNMjQsMjBjMi4yLDAsNCwxLjgsNCw0cy0xLjgsNC00LDRzLTQtMS44LTQtNFMyMS44LDIwLDI0LDIwJy8lM0UlM0Mvc3ZnJTNFXFxcIikgbm8tcmVwZWF0XCJcblxuY29uc3QgRXZlbnRDb25zdGFudHMgPSB7XG4gIFNFTEVDVElPTl9DSEFOR0VEOiBcImRyYXc6c2VsZWN0aW9uQ2hhbmdlZFwiLFxuICBEUkFHX0JFR0lOOiBcImRyYXc6ZHJhZzpiZWdpblwiLFxuICBEUkFHX0VORDogXCJkcmF3OmRyYWc6ZW5kXCJcbn1cblxuY29uc3QgQ29uc3RhbnRzID0ge1xuICBTVkdfT0ZGU0VUOiAtMTQsXG4gIFFVSUNLX0NMSUNLX1RJTUU6IDUwMCxcbiAgUklHSFRfQU5HTEU6IDkwLFxuICBTVFJBSUdIVF9BTkdMRTogMTgwLFxuICBGT1JUWV9GSVZFX0FOR0xFOiA0NVxufVxuXG5jb25zdCB0bXBQdDEgPSBQb2ludDJkLmNyZWF0ZSgwLCAwKVxuY29uc3QgdG1wUHQyID0gUG9pbnQyZC5jcmVhdGUoMCwgMClcblxuY29uc3QgZGVmYXVsdFhmb3JtU3R5bGUgPSB7XG4gIGZpbGxDb2xvcjogXCJ3aGl0ZVwiLFxuICBzdHJva2VDb2xvcjogXCJibGFja1wiLFxuICBzdHJva2VXaWR0aDogMlxufVxuXG5jb25zdCBFdmVudHNUeXBlcyA9IHtcbiAgTU9VU0VET1dOOiBcIm1vdXNlZG93blwiLFxuICBNT1VTRVVQOiBcIm1vdXNldXBcIixcbiAgTU9VU0VNT1ZFOiBcIm1vdXNlbW92ZVwiLFxuICBUT1VDSFNUQVJUOiBcInRvdWNoc3RhcnRcIixcbiAgVE9VQ0hFTkQ6IFwidG91Y2hlbmRcIixcbiAgVE9VQ0hNT1ZFOiBcInRvdWNobW92ZVwiXG59XG5cbmNvbnN0IERPVUJMRV9DTElDS19ERUxBWSA9IDYwMCAvLyBUbyBkZXRlY3QgdGhlIGRvdWJsZSBjbGljayBpbiBjYXNlIG9mIHRvdWNoIHNjcmVlblxuXG4vLyBUaGlzIG1ldGhvZCB3aWxsIEFkZCBjbGllbnRYLCBjbGllbnRZICYgb2Zmc2V0WCBhbmQgb2Zmc2V0WSBmb3IgVG91Y2ggZXZlbnRzXG5mdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKGV2ZW50LCBjYW52YXMpIHtcbiAgZXZlbnQuY2xpZW50WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WFxuICBldmVudC5jbGllbnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZXG4gIGNvbnN0IGVsZW1lbnQgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgZXZlbnQub2Zmc2V0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIGVsZW1lbnQubGVmdFxuICBldmVudC5vZmZzZXRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZIC0gZWxlbWVudC50b3BcbiAgcmV0dXJuIGV2ZW50XG59XG5cbmZ1bmN0aW9uIGluQ2FudmFzKGNhbnZhcywgeCwgeSkge1xuICBjb25zdCBkb21yZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gIGxldCBsb2NhbFggPSAwXG4gIGxldCBsb2NhbFkgPSAwXG4gIGNvbnN0IGlzSW5DYW52YXMgPSAoKGxvY2FsWCA9IHggLSBkb21yZWN0LmxlZnQgLSBjYW52YXMuY2xpZW50TGVmdCkgPj0gMCAmJiBsb2NhbFggPD0gY2FudmFzLmNsaWVudFdpZHRoICYmIChsb2NhbFkgPSB5IC0gZG9tcmVjdC50b3AgLSBjYW52YXMuY2xpZW50VG9wKSA+PSAwICYmIGxvY2FsWSA8PSBjYW52YXMuY2xpZW50SGVpZ2h0KVxuICByZXR1cm4gaXNJbkNhbnZhc1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhbE1vdXNlUG9zKG91dCwgZWxlbSwgZXZlbnQpIHtcbiAgY29uc3QgZG9tcmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgb3V0WzBdID0gZXZlbnQuY2xpZW50WCAtIGRvbXJlY3QubGVmdCAtIGVsZW0uY2xpZW50TGVmdFxuICBvdXRbMV0gPSBldmVudC5jbGllbnRZIC0gZG9tcmVjdC50b3AgLSBlbGVtLmNsaWVudFRvcFxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1TZWxlY3RlZFNoYXBlKGNhbnZhcywgZXZlbnQsIHNlbGVjdGVkSW5mbywgY2FtZXJhKSB7XG4gIGdldExvY2FsTW91c2VQb3ModG1wUHQxLCBjYW52YXMsIGV2ZW50KVxuICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcFB0MiwgdG1wUHQxLCBjYW1lcmEuc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgY29uc3Qgc2hhcGUgPSBzZWxlY3RlZEluZm8uc2hhcGVcbiAgaWYgKHNoYXBlIGluc3RhbmNlb2YgWGZvcm1TaGFwZSkge1xuICAgIEludGVyYWN0VXRpbHMudHJhbnNmb3JtWGZvcm1TaGFwZShzaGFwZSwgc2VsZWN0ZWRJbmZvLCB0bXBQdDEsIHRtcFB0MiwgY2FtZXJhKVxuICB9IGVsc2UgaWYgKHNoYXBlIGluc3RhbmNlb2YgVmVydEVkaXRhYmxlU2hhcGUpIHtcbiAgICBJbnRlcmFjdFV0aWxzLnRyYW5zbGF0ZVZlcnQoc2hhcGUsIHNlbGVjdGVkSW5mbywgdG1wUHQxLCB0bXBQdDIsIGNhbWVyYSlcbiAgfSBlbHNlIHtcbiAgICBJbnRlcmFjdFV0aWxzLnRyYW5zbGF0ZVNoYXBlKHNoYXBlLCBzZWxlY3RlZEluZm8sIHRtcFB0MSwgdG1wUHQyLCBjYW1lcmEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRLZXlzVG9TZWxlY3RlZEluZm8oZXZlbnQsIHNlbGVjdGVkSW5mbykge1xuICBzZWxlY3RlZEluZm8ua2V5cyA9IHtcbiAgICBhbHRLZXk6IGV2ZW50LmFsdEtleSxcbiAgICBjdHJsS2V5OiBldmVudC5jdHJsS2V5LFxuICAgIHNoaWZ0S2V5OiBldmVudC5zaGlmdEtleSxcbiAgICBtZXRhS2V5OiBldmVudC5tZXRhS2V5XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPYmpzRnJvbU1hcChzZWxlY3Rpb25NYXApIHtcbiAgY29uc3Qgc2VsZWN0ZWRPYmpzID0gW11cbiAgc2VsZWN0aW9uTWFwLmZvckVhY2goKHN1YnNoYXBlLCBzaGFwZSkgPT4ge1xuICAgIHNlbGVjdGVkT2Jqcy5wdXNoKHNoYXBlKVxuICB9KVxuICByZXR1cm4gc2VsZWN0ZWRPYmpzXG59XG5cbmZ1bmN0aW9uIHNlbGVjdFNoYXBlKHNlbGVjdGVkU2hhcGUsIHNvcnRlZFNoYXBlcywgY3VyclNlbGVjdGVkU2hhcGVzLCBzZWxlY3RTdHlsZSwgeGZvcm1TdHlsZSwgc2VsZWN0T3B0cykge1xuICBjb25zdCBmaXJlT2JqZWN0ID0ge1xuICAgIHVuc2VsZWN0ZWRTaGFwZXM6IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAoY3VyclNlbGVjdGVkU2hhcGVzKVxuICB9XG4gIGNsZWFyU2VsZWN0ZWRTaGFwZXMoY3VyclNlbGVjdGVkU2hhcGVzKVxuICBzZWxlY3RlZFNoYXBlLnNhdmUoKVxuICBjb25zdCBtYXhaID0gc29ydGVkU2hhcGVzW3NvcnRlZFNoYXBlcy5sZW5ndGggLSAxXS56SW5kZXhcbiAgc2VsZWN0ZWRTaGFwZS56SW5kZXggPSBtYXhaICsgMVxuICBCYXNpY1N0eWxlLmNvcHlCYXNpY1N0eWxlKHNlbGVjdFN0eWxlLCBzZWxlY3RlZFNoYXBlKVxuICBzZWxlY3RlZFNoYXBlLnNlbGVjdGVkID0gdHJ1ZVxuICAvLyBjb25zdCBkaW1lbnNpb25zID0gc2VsZWN0ZWRTaGFwZS5nZXREaW1lbnNpb25zKClcblxuICBsZXQgbmV3U2VsZWN0U2hhcGUgPSBudWxsXG4gIGlmIChzZWxlY3RPcHRzLnNjYWxhYmxlIHx8IHNlbGVjdE9wdHMucm90YXRhYmxlKSB7XG4gICAgbmV3U2VsZWN0U2hhcGUgPSBuZXcgWGZvcm1TaGFwZSh4Zm9ybVN0eWxlIHx8IGRlZmF1bHRYZm9ybVN0eWxlLCBzZWxlY3RPcHRzKVxuICAgIHNlbGVjdGVkU2hhcGUuYWRkQ2hpbGRYZm9ybShuZXdTZWxlY3RTaGFwZSlcbiAgfVxuICBjdXJyU2VsZWN0ZWRTaGFwZXMuc2V0KHNlbGVjdGVkU2hhcGUsIG5ld1NlbGVjdFNoYXBlKVxuXG4gIGZpcmVPYmplY3Quc2VsZWN0ZWRTaGFwZXMgPSBbc2VsZWN0ZWRTaGFwZV1cbiAgcmV0dXJuIGZpcmVPYmplY3Rcbn1cblxuZnVuY3Rpb24gY2xlYXJTZWxlY3RlZFNoYXBlcyhzZWxlY3RlZFNoYXBlTWFwKSB7XG4gIHNlbGVjdGVkU2hhcGVNYXAuZm9yRWFjaCgoc2VsZWN0ZWRTaGFwZSwgc2hhcGUpID0+IHtcbiAgICBzaGFwZS5yZXN0b3JlKClcbiAgICBzaGFwZS5zZWxlY3RlZCA9IGZhbHNlXG4gICAgc2hhcGUucmVtb3ZlQ2hpbGRYZm9ybShzZWxlY3RlZFNoYXBlKVxuICB9KVxuICBzZWxlY3RlZFNoYXBlTWFwLmNsZWFyKClcbn1cblxuZnVuY3Rpb24gY2xlYXJTcGVjaWZpY1NoYXBlcyhzZWxlY3RlZFNoYXBlTWFwLCBzaGFwZXMpIHtcbiAgY29uc3QgY2xlYXJlZFNoYXBlcyA9IFtdXG4gIHNoYXBlcy5mb3JFYWNoKHNoYXBlID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZFNoYXBlID0gc2VsZWN0ZWRTaGFwZU1hcC5nZXQoc2hhcGUpXG4gICAgc2hhcGUucmVzdG9yZSgpXG4gICAgc2hhcGUuc2VsZWN0ZWQgPSBmYWxzZVxuICAgIHNoYXBlLnJlbW92ZUNoaWxkWGZvcm0oc2VsZWN0ZWRTaGFwZSlcbiAgICBzZWxlY3RlZFNoYXBlTWFwLmRlbGV0ZShzaGFwZSlcbiAgICBjbGVhcmVkU2hhcGVzLnB1c2goc2hhcGUpXG4gIH0pXG4gIHJldHVybiBjbGVhcmVkU2hhcGVzXG59XG5cbmNvbnN0IGhpZGVDdXJzb3IgPSAoKSA9PiB7XG4gIGNvbnN0IGN1cnNvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3Vyc29yXCIpXG4gIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICBjdXJzb3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG4gIH1cbn1cblxuY29uc3Qgc2hvd0N1cnNvciA9ICgpID0+IHtcbiAgY29uc3QgY3Vyc29yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJzb3JcIilcbiAgaWYgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgIGN1cnNvci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiXG4gIH1cbn1cblxuY29uc3QgaGlkZUN1cnNvcldpdGhQb2ludGVyID0gKGUpID0+IHtcbiAgZS50YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5jdXJzb3IgPSBcImRlZmF1bHRcIlxuICBoaWRlQ3Vyc29yKClcbn1cblxuY29uc3Qgc2hvd0N1cnNvcldpdGhQb2ludGVyID0gKGUpID0+IHtcbiAgZS50YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5jdXJzb3IgPSBcIm5vbmVcIlxuICBzaG93Q3Vyc29yKClcbn1cblxuLy8gdW5kZXJzdGFuZHMgaG93IHRvIHJldHVybiBtb3VzZSBjb29yZGluYXRlcyBhcyBhbiBvYmplY3QgaW4gdGhlIGZvcm1hdCB7eDogPFgtQ09PUkQ+LCB5OiA8WS1DT09SRD59XG4vLyBhY2NlcHRzIGEgbW91c2UgZXZlbnQgYW5kIGEgRE9NIGVsZW1lbnQgYXMgYXJndW1lbnRzXG5mdW5jdGlvbiBnZXRNb3VzZUNvb3JkaW5hdGVzKGUsIHRhcmdldCkge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAke2AjJHt0YXJnZXQuaWR9IGNhbnZhc2B9YClcblxuICBjb25zdCBjb29yZHMgPSB7XG4gICAgeDogZS5vZmZzZXRYICsgY2FudmFzLm9mZnNldExlZnQsXG4gICAgeTogZS5vZmZzZXRZICsgY2FudmFzLm9mZnNldFRvcFxuICB9XG5cbiAgcmV0dXJuIGNvb3Jkc1xufVxuXG4vLyB1bmRlcnN0YW5kcyBob3cgdG8gYXBwZW5kIGN1c3RvbSBjdXJzb3JzIHRvIHRoZSBET01cbi8vIGFjY2VwdHMgYSBtb3VzZSBldmVudCwgYSBET00gZWxlbWVudCwgYSBjdXJzb3JTdHlsZSwgYW5kIHBpeGVsIG9mZnNldHMgYXMgYXJndW1lbnRzXG5mdW5jdGlvbiBhcHBlbmRDdXN0b21DdXJzb3IoX2V2ZW50LCB0YXJnZXQsIGN1cnNvclN0eWxlLCBvZmZzZXRYID0gQ29uc3RhbnRzLlNWR19PRkZTRVQsIG9mZnNldFkgPSBDb25zdGFudHMuU1ZHX09GRlNFVCkge1xuICBjb25zdCBjdXJzb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImN1cnNvclwiKVxuICBjb25zdCBtb3VzZSA9IGdldE1vdXNlQ29vcmRpbmF0ZXMoX2V2ZW50LCB0YXJnZXQpXG5cbiAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgIGNvbnN0IG5ld0N1cnNvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpXG4gICAgbmV3Q3Vyc29yLnNldEF0dHJpYnV0ZShcImlkXCIsIFwiY3Vyc29yXCIpXG4gICAgbmV3Q3Vyc29yLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIGBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogJHtgJHttb3VzZS55fXB4YH07IGxlZnQ6ICR7YCR7bW91c2UueH1weGB9OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4OyBiYWNrZ3JvdW5kOiAke2N1cnNvclN0eWxlfTsgY3Vyc29yOiBub25lOyB6LWluZGV4OiAxMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKCR7b2Zmc2V0WH1weCwgJHtvZmZzZXRZfXB4KWApXG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5ld0N1cnNvcilcbiAgfSBlbHNlIGlmIChjdXJzb3Iuc3R5bGUuYmFja2dyb3VuZCA9PT0gY3Vyc29yU3R5bGUpIHtcbiAgICB1cGRhdGVDdXJzb3JQb3NpdGlvbihfZXZlbnQsIHRhcmdldClcbiAgfSBlbHNlIHtcbiAgICBjdXJzb3Iuc3R5bGUuYmFja2dyb3VuZCA9IGN1cnNvclN0eWxlXG4gICAgdXBkYXRlQ3Vyc29yUG9zaXRpb24oX2V2ZW50LCB0YXJnZXQpXG4gIH1cbn1cblxuLy8gdW5kZXJzdGFuZHMgaG93IHRvIHJlbW92ZSB0aGUgY3VzdG9tIGN1cnNvciBmcm9tIHRoZSBET01cbmZ1bmN0aW9uIHJlbW92ZUN1c3RvbUN1cnNvcigpIHtcbiAgY29uc3QgY3Vyc29yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJzb3JcIilcbiAgaWYgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgIGN1cnNvci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGN1cnNvcilcbiAgfVxufVxuXG4vLyB1bmRlcnN0YW5kcyBob3cgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VzdG9tIGN1cnNvciBvbiB0aGUgcGFnZVxuLy8gYWNjZXB0cyBhIG1vdXNlIGV2ZW50IGFuZCBhIERPTSBlbGVtZW50IGFzIGFyZ3VtZW50c1xuZnVuY3Rpb24gdXBkYXRlQ3Vyc29yUG9zaXRpb24oX2V2ZW50LCB0YXJnZXQpIHtcbiAgY29uc3QgY3Vyc29yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJzb3JcIilcbiAgY29uc3QgbW91c2UgPSBnZXRNb3VzZUNvb3JkaW5hdGVzKF9ldmVudCwgdGFyZ2V0KVxuXG4gIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7YCR7bW91c2UueX1weGB9YFxuICAgIGN1cnNvci5zdHlsZS5sZWZ0ID0gYCR7YCR7bW91c2UueH1weGB9YFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXBlQnVpbGRlciBleHRlbmRzIERyYXdFbmdpbmUge1xuXG4gIF90b3VjaHN0YXJ0Q0IoZXZlbnQpIHtcbiAgICB0aGlzLl9tb3VzZWRvd25DQihldmVudClcbiAgfVxuXG4gIF90b3VjaG1vdmVDQihldmVudCkge1xuICAgIHRoaXMuX21vdXNlbW92ZUNCKGV2ZW50KVxuICB9XG5cbiAgX3RvdWNoZW5kQ0IoZXZlbnQpIHtcbiAgICB0aGlzLl9tb3VzZXVwQ0IoZXZlbnQpXG4gIH1cblxuICBfbW91c2Vkb3duQ0IoZXZlbnQpIHtcbiAgICB0aGlzLnNldERlbnlNb3VzZUV2ZW50RmxhZyhldmVudClcbiAgICBpZiAodGhpcy5kZW55TW91c2VFdmVudCAmJiAhZXZlbnQudG91Y2hlcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICBldmVudCA9IGdldFRvdWNoQ29vcmRpbmF0ZXMoZXZlbnQsIHRoaXMuX2RyYXdDYW52YXMpXG4gICAgICB0aGlzLnByZXZpb3VzRXZlbnRPYmogPSBldmVudCAvLyBBc3NpZ24gZXZlbnQgb2JqIHRvIHZhcmlhYmxlIHRvIGF2b2lkIHRoZSB1c2UgaXQgZm9yIHRvdWNoZW5kIGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCFpbkNhbnZhcyh0aGlzLl9kcmF3Q2FudmFzLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy50aW1lciA9IHBlcmZvcm1hbmNlLm5vdygpXG5cbiAgICBQb2ludDJkLnNldCh0bXBQdDEsIGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpXG4gICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0bXBQdDIsIHRtcFB0MSwgdGhpcy5fY2FtZXJhLnNjcmVlblRvV29ybGRNYXRyaXgpXG4gICAgY29uc3Qgd29ybGRUb1NjcmVlbk1hdHJpeCA9IHRoaXMuX2NhbWVyYS53b3JsZFRvU2NyZWVuTWF0cml4XG4gICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICBsZXQgaSA9IC0xXG4gICAgbGV0IHNlbGVjdGVkU2hhcGUgPSBudWxsXG4gICAgbGV0IHNlbGVjdGVkSW5mbyA9IG51bGxcbiAgICBmb3IgKGkgPSBzaGFwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KHNoYXBlc1tpXSlcbiAgICAgIGlmIChzaGFwZXNbaV0uc2VsZWN0ZWQpIHtcbiAgICAgICAgc2VsZWN0ZWRTaGFwZSA9IHRoaXMuX3NlbGVjdGVkU2hhcGVzLmdldChzaGFwZXNbaV0pXG4gICAgICAgIHNlbGVjdGVkSW5mbyA9IHNoYXBlSW5mb1xuICAgICAgICBsZXQgaGl0SW5mbyA9IG51bGxcbiAgICAgICAgaWYgKHNlbGVjdGVkU2hhcGUgJiYgKGhpdEluZm8gPSBzZWxlY3RlZFNoYXBlLmNvbnRhaW5zUG9pbnQodG1wUHQxLCB0bXBQdDIsIHdvcmxkVG9TY3JlZW5NYXRyaXgsIHRoaXMuX2RyYXdDdHgpKS5oaXQpIHtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRTaGFwZSBpbnN0YW5jZW9mIFZlcnRFZGl0YWJsZVNoYXBlICYmIGV2ZW50LmFsdEtleSAmJiBoaXRJbmZvLmNvbnRyb2xJbmRleCA8IHNoYXBlc1tpXS5udW1WZXJ0cykge1xuICAgICAgICAgICAgc2hhcGVzW2ldLnJlbW92ZVZlcnQoaGl0SW5mby5jb250cm9sSW5kZXgpXG4gICAgICAgICAgICBzZWxlY3RlZFNoYXBlID0gbnVsbFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFhmb3JtID0gc2VsZWN0ZWRTaGFwZS5wYXJlbnQubG9jYWxYZm9ybVxuICAgICAgICAgICAgY29uc3QgaW52TG9jYWxYZm9ybSA9IE1hdDJkLmNsb25lKGxvY2FsWGZvcm0pXG4gICAgICAgICAgICBNYXQyZC5pbnZlcnQoaW52TG9jYWxYZm9ybSwgaW52TG9jYWxYZm9ybSlcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2JqUG9zID0gUG9pbnQyZC5jbG9uZSh0bXBQdDIpXG4gICAgICAgICAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHN0YXJ0T2JqUG9zLCBzdGFydE9ialBvcywgaW52TG9jYWxYZm9ybSlcbiAgICAgICAgICAgIHRoaXMuX2RyYWdJbmZvID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgIHJvdGF0ZTogQm9vbGVhbihoaXRJbmZvLnJvdGF0ZSksXG4gICAgICAgICAgICAgIGNvbnRyb2xJbmRleDogaGl0SW5mby5jb250cm9sSW5kZXgsXG4gICAgICAgICAgICAgIHN0YXJ0T2JqZWN0UG9zOiBzdGFydE9ialBvcyxcbiAgICAgICAgICAgICAgd29ybGRUb09iamVjdE1hdHJpeDogaW52TG9jYWxYZm9ybSxcbiAgICAgICAgICAgICAgc3RhcnRMb2NhbFBvczogc2VsZWN0ZWRTaGFwZS5wYXJlbnQuZ2V0UG9zaXRpb24oKSxcbiAgICAgICAgICAgICAgc3RhcnRMb2NhbFNjYWxlOiBzZWxlY3RlZFNoYXBlLnBhcmVudC5nZXRTY2FsZSgpLFxuICAgICAgICAgICAgICBzdGFydExvY2FsUm90OiBzZWxlY3RlZFNoYXBlLnBhcmVudC5nZXRSb3RhdGlvbigpLFxuICAgICAgICAgICAgICBzaGFwZVdpZHRoOiBzZWxlY3RlZFNoYXBlLnBhcmVudC53aWR0aCxcbiAgICAgICAgICAgICAgc2hhcGVIZWlnaHQ6IHNlbGVjdGVkU2hhcGUucGFyZW50LmhlaWdodFxuICAgICAgICAgICAgfSwgc2VsZWN0ZWRJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlc1tpXS5jb250YWluc1BvaW50KHRtcFB0MSwgdG1wUHQyLCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLl9kcmF3Q3R4KSkge1xuICAgICAgICAgIHNlbGVjdGVkU2hhcGUgPSBzaGFwZXNbaV1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGlmIChzaGFwZUluZm8uc2VsZWN0YWJsZSAmJiBzaGFwZXNbaV0uY29udGFpbnNQb2ludCh0bXBQdDEsIHRtcFB0Miwgd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fZHJhd0N0eCkpIHtcbiAgICAgIC8vICAgc2VsZWN0ZWRTaGFwZSA9IHNoYXBlc1tpXVxuICAgICAgLy8gICBzZWxlY3RlZEluZm8gPSBzaGFwZUluZm9cbiAgICAgIC8vICAgY29uc3Qgc2VsZWN0RXZlbnRPYmogPSBzZWxlY3RTaGFwZShzZWxlY3RlZFNoYXBlLCBzaGFwZXMsIHRoaXMuX3NlbGVjdGVkU2hhcGVzLCB0aGlzLl9zZWxlY3RTdHlsZSwgdGhpcy5feGZvcm1TdHlsZSwgc2VsZWN0ZWRJbmZvKVxuICAgICAgLy8gICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHNlbGVjdEV2ZW50T2JqKVxuICAgICAgLy8gICBicmVha1xuICAgICAgLy8gfVxuICAgIH1cblxuICAgIGlmIChpIDwgMCAmJiB0aGlzLl9zZWxlY3RlZFNoYXBlcy5zaXplKSB7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWRTaGFwZXMuc2l6ZSkge1xuICAgICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHtcbiAgICAgICAgICB1bnNlbGVjdGVkU2hhcGVzOiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKSxcbiAgICAgICAgICBzZWxlY3RlZFNoYXBlczogW11cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RyYWdJbmZvID0gbnVsbFxuICAgICAgY2xlYXJTZWxlY3RlZFNoYXBlcyh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkU2hhcGUgJiYgc2VsZWN0ZWRJbmZvICYmIChzZWxlY3RlZEluZm8ubW92YWJsZSB8fCBzZWxlY3RlZEluZm8ucm90YXRhYmxlIHx8IHNlbGVjdGVkSW5mby5zY2FsYWJsZSkpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7YCMke3RoaXMuX3BhcmVudC5pZH0gPiBjYW52YXNgfWApXG4gICAgICBpZiAoY2FudmFzID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgaGlkZUN1cnNvcilcbiAgICAgICAgdGhpcy5fcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgc2hvd0N1cnNvcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgaGlkZUN1cnNvcldpdGhQb2ludGVyKVxuICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBzaG93Q3Vyc29yV2l0aFBvaW50ZXIpXG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuX2RyYWdJbmZvICYmIHNlbGVjdGVkSW5mby5tb3ZhYmxlKSB7XG4gICAgICAgIHRoaXMuX2RyYWdJbmZvID0ge1xuICAgICAgICAgIHN0YXJ0TG9jYWxQb3M6IHNlbGVjdGVkU2hhcGUuZ2V0UG9zaXRpb24oKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9kcmFnSW5mbykge1xuICAgICAgICB0aGlzLl9kcmFnSW5mby5zaGFwZSA9IHNlbGVjdGVkU2hhcGVcbiAgICAgICAgdGhpcy5fZHJhZ0luZm8uc3RhcnRQb3MgPSBQb2ludDJkLmNsb25lKHRtcFB0MSlcbiAgICAgICAgdGhpcy5fZHJhZ0luZm8uc3RhcnRXb3JsZFBvcyA9IFBvaW50MmQuY2xvbmUodG1wUHQyKVxuICAgICAgICB0aGlzLl9kcmFnSW5mby5vYmplY3RUb1dvcmxkTWF0cml4ID0gTWF0MmQuY2xvbmUoc2VsZWN0ZWRTaGFwZS5nbG9iYWxYZm9ybSlcbiAgICAgICAgYWRkRXZlbnRLZXlzVG9TZWxlY3RlZEluZm8oZXZlbnQsIHRoaXMuX2RyYWdJbmZvKVxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuRFJBR19CRUdJTiwge1xuICAgICAgICAgIHNoYXBlczogZ2V0U2VsZWN0ZWRPYmpzRnJvbU1hcCh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmICghZXZlbnQudG91Y2hlcykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX21vdXNldXBDQihldmVudCkge1xuICAgIGlmICh0aGlzLmRlbnlNb3VzZUV2ZW50ICYmICFldmVudC50b3VjaGVzKSB7XG4gICAgICB0aGlzLnNldERlbnlNb3VzZUV2ZW50RmxhZyhldmVudClcbiAgICAgIHJldHVybiAvLyBSZXR1cm5pbmcgb24gbmV4dCBsaW5lIHRvIGF2b2lkIEVTTGludCBlcnJvclxuICAgIH1cbiAgICBpZiAoZXZlbnQudG91Y2hlcykge1xuICAgICAgLy8gVXNlIHByZXZpb3VzbHkgYXNzaWduZWQgZXZlbnQgb2JqIHRvIGdldCB0aGUgb2Zmc2V0WCAmIFkgYW5kIGNsaWVudFggJiBZIGNhbGN1bGF0aW9uXG4gICAgICBldmVudCA9IHRoaXMucHJldmlvdXNFdmVudE9ialxuICAgIH1cblxuICAgIGlmICh0aGlzLl9kcmFnSW5mbyAmJiB0aGlzLl9kcmFnSW5mby5zaGFwZSkge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7YCMke3RoaXMuX3BhcmVudC5pZH0gPiBjYW52YXNgfWApXG4gICAgICBpZiAoY2FudmFzID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgaGlkZUN1cnNvcilcbiAgICAgICAgdGhpcy5fcGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgc2hvd0N1cnNvcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgaGlkZUN1cnNvcldpdGhQb2ludGVyKVxuICAgICAgICBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBzaG93Q3Vyc29yV2l0aFBvaW50ZXIpXG4gICAgICB9XG4gICAgICB0aGlzLl9kcmFnSW5mbyA9IG51bGxcbiAgICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5EUkFHX0VORCwge1xuICAgICAgICBzaGFwZXM6IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAodGhpcy5fc2VsZWN0ZWRTaGFwZXMpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAocGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnRpbWVyIDwgQ29uc3RhbnRzLlFVSUNLX0NMSUNLX1RJTUUpIHtcbiAgICAgIC8vIHRoaXMgaXMgYSByZWxhdGl2ZWx5IHF1aWNrIGNsaWNrXG4gICAgICBQb2ludDJkLnNldCh0bXBQdDEsIGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpXG4gICAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcFB0MiwgdG1wUHQxLCB0aGlzLl9jYW1lcmEuc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgICAgIGNvbnN0IHdvcmxkVG9TY3JlZW5NYXRyaXggPSB0aGlzLl9jYW1lcmEud29ybGRUb1NjcmVlbk1hdHJpeFxuICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICAgIGxldCBzZWxlY3RlZFNoYXBlID0gbnVsbFxuICAgICAgbGV0IHNlbGVjdGVkSW5mbyA9IG51bGxcbiAgICAgIGZvciAobGV0IGkgPSBzaGFwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgc2VsZWN0ZWRJbmZvID0gdGhpcy5fb2JqZWN0cy5nZXQoc2hhcGVzW2ldKVxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmZvLnNlbGVjdGFibGUgJiYgc2hhcGVzW2ldLmNvbnRhaW5zUG9pbnQodG1wUHQxLCB0bXBQdDIsIHdvcmxkVG9TY3JlZW5NYXRyaXgsIHRoaXMuX2RyYXdDdHgpKSB7XG4gICAgICAgICAgc2VsZWN0ZWRTaGFwZSA9IHNoYXBlc1tpXVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RlZFNoYXBlICYmICFzZWxlY3RlZFNoYXBlLnNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdEV2ZW50T2JqID0gc2VsZWN0U2hhcGUoc2VsZWN0ZWRTaGFwZSwgc2hhcGVzLCB0aGlzLl9zZWxlY3RlZFNoYXBlcywgdGhpcy5fc2VsZWN0U3R5bGUsIHRoaXMuX3hmb3JtU3R5bGUsIHNlbGVjdGVkSW5mbylcbiAgICAgICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCBzZWxlY3RFdmVudE9iailcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHVzZXIgY2xpY2tzIGFueXdoZXJlIG91dHNpZGUgdGhlbiBhbGxvdyB0aGUgbW92ZW1lbnQgb2YgQmFzZSBNYXAgKFBhcmVudHMgQ29udGFpbmVyKVxuICAgICAgICB0aGlzLl9tYWtlUGFyZW50RWxlbWVudE1vdmFibGUoKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGRlZCBTdXBwb3J0IGZvciBEb3VibGUgY2xpY2tcbiAgICBpZiAoZXZlbnQudG91Y2hlcykge1xuICAgICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgfVxuICAgICAgaWYgKChEYXRlLm5vdygpIC0gdGhpcy5maXJzdFRhcFRpbWUpIDwgRE9VQkxFX0NMSUNLX0RFTEFZKSB7XG4gICAgICAgIHRoaXMuX2RibGNsaWNrQ0IoZXZlbnQpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZmlyc3RUYXBUaW1lID0gRGF0ZS5ub3coKVxuICB9XG5cbiAgX21vdXNlbW92ZUNCKGV2ZW50KSB7XG4gICAgdGhpcy5zZXREZW55TW91c2VFdmVudEZsYWcoZXZlbnQpXG4gICAgaWYgKHRoaXMuZGVueU1vdXNlRXZlbnQgJiYgIWV2ZW50LnRvdWNoZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICBldmVudCA9IGdldFRvdWNoQ29vcmRpbmF0ZXMoZXZlbnQsIHRoaXMuX2RyYXdDYW52YXMpXG4gICAgICB0aGlzLnByZXZpb3VzRXZlbnRPYmogPSBldmVudCAvLyBBc3NpZ24gZXZlbnQgb2JqIHRvIHZhcmlhYmxlIHRvIGF2b2lkIHRoZSB1c2UgaXQgZm9yIHRvdWNoZW5kIGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCEoaW5DYW52YXModGhpcy5fZHJhd0NhbnZhcywgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpICYmICF0aGlzLl9kcmFnSW5mbykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RyYWdJbmZvICYmIHRoaXMuX2RyYWdJbmZvLnNoYXBlKSB7XG4gICAgICB1cGRhdGVDdXJzb3JQb3NpdGlvbihldmVudCwgdGhpcy5fcGFyZW50KVxuICAgICAgYWRkRXZlbnRLZXlzVG9TZWxlY3RlZEluZm8oZXZlbnQsIHRoaXMuX2RyYWdJbmZvKVxuICAgICAgdHJhbnNmb3JtU2VsZWN0ZWRTaGFwZSh0aGlzLl9kcmF3Q2FudmFzLCBldmVudCwgdGhpcy5fZHJhZ0luZm8sIHRoaXMuX2NhbWVyYSlcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBpZiAoIWV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWV2ZW50LmJ1dHRvbnMgJiYgdGhpcy5fc2VsZWN0ZWRTaGFwZXMuc2l6ZSkge1xuICAgICAgUG9pbnQyZC5zZXQodG1wUHQxLCBldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKVxuICAgICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0bXBQdDIsIHRtcFB0MSwgdGhpcy5fY2FtZXJhLnNjcmVlblRvV29ybGRNYXRyaXgpXG4gICAgICBjb25zdCB3b3JsZFRvU2NyZWVuTWF0cml4ID0gdGhpcy5fY2FtZXJhLndvcmxkVG9TY3JlZW5NYXRyaXhcbiAgICAgIGNvbnN0IHNoYXBlcyA9IHRoaXMuc29ydGVkU2hhcGVzXG4gICAgICBsZXQgaSA9IDBcbiAgICAgIGNvbnN0IGZsaXB5ID0gdGhpcy5fY2FtZXJhLmlzWUZsaXBwZWQoKVxuICAgICAgZm9yIChpID0gc2hhcGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgIGlmIChzaGFwZXNbaV0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RJbmZvID0gdGhpcy5fb2JqZWN0cy5nZXQoc2hhcGVzW2ldKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkU2hhcGUgPSB0aGlzLl9zZWxlY3RlZFNoYXBlcy5nZXQoc2hhcGVzW2ldKVxuICAgICAgICAgIGxldCBoaXRJbmZvID0gbnVsbFxuICAgICAgICAgIHRoaXMuX3BhcmVudC5zdHlsZS5jdXJzb3IgPSBcIm5vbmVcIlxuICAgICAgICAgIC8vIGZvckVhY2ggbm90IHN1cHBvcnRlZCBvbiBub2RlbGlzdCBpbiBJRS9FZGdlXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUuY3Vyc29yID0gXCJub25lXCJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRTaGFwZSAmJiAoaGl0SW5mbyA9IHNlbGVjdGVkU2hhcGUuY29udGFpbnNQb2ludCh0bXBQdDEsIHRtcFB0Miwgd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fZHJhd0N0eCkpLmhpdCkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2hhcGUgaW5zdGFuY2VvZiBYZm9ybVNoYXBlKSB7XG4gICAgICAgICAgICAgIGlmIChoaXRJbmZvLnJvdGF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkZWdyZWVzID0gc2hhcGVzW2ldLmdldFJvdGF0aW9uKClcbiAgICAgICAgICAgICAgICBpZiAoZmxpcHkpIHtcbiAgICAgICAgICAgICAgICAgIGRlZ3JlZXMgKj0gLTFcbiAgICAgICAgICAgICAgICAgIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBkZWdyZWVzIC09IENvbnN0YW50cy5SSUdIVF9BTkdMRVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWdyZWVzICs9IENvbnN0YW50cy5TVFJBSUdIVF9BTkdMRVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBkZWdyZWVzICs9IENvbnN0YW50cy5SSUdIVF9BTkdMRVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGl0SW5mby5jb250cm9sSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGRlZ3JlZXMgLT0gQ29uc3RhbnRzLlJJR0hUX0FOR0xFXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgZGVncmVlcyArPSBDb25zdGFudHMuU1RSQUlHSFRfQU5HTEVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID09PSAzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgICAgICAgZGVncmVlcyArPSBDb25zdGFudHMuUklHSFRfQU5HTEVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXBwZW5kQ3VzdG9tQ3Vyc29yKGV2ZW50LCB0aGlzLl9wYXJlbnQsIGAke3JvdGF0ZVN2Zy5yZXBsYWNlKC88ZGVncmVlcz4vZywgYCR7ZGVncmVlc31gKX1gKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4IDwgNCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICAgICAgICBpZiAoaGl0SW5mby5jb250cm9sSW5kZXggPT09IDAgfHwgaGl0SW5mby5jb250cm9sSW5kZXggPT09IDMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICAgICAgICBhcHBlbmRDdXN0b21DdXJzb3IoZXZlbnQsIHRoaXMuX3BhcmVudCwgYCR7c2NhbGVTdmcucmVwbGFjZSgvPGRlZ3JlZXM+L2csIGAkey1zaGFwZXNbaV0uZ2V0Um90YXRpb24oKSAtIENvbnN0YW50cy5GT1JUWV9GSVZFX0FOR0xFfWApfWApXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMSB8fCBoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgYXBwZW5kQ3VzdG9tQ3Vyc29yKGV2ZW50LCB0aGlzLl9wYXJlbnQsIGAke3NjYWxlU3ZnLnJlcGxhY2UoLzxkZWdyZWVzPi9nLCBgJHstc2hhcGVzW2ldLmdldFJvdGF0aW9uKCkgKyBDb25zdGFudHMuRk9SVFlfRklWRV9BTkdMRX1gKX1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhcHBlbmRDdXN0b21DdXJzb3IoZXZlbnQsIHRoaXMuX3BhcmVudCwgYCR7c2NhbGVTdmcucmVwbGFjZSgvPGRlZ3JlZXM+L2csIGAkey1zaGFwZXNbaV0uZ2V0Um90YXRpb24oKX1gKX1gKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcGVuZEN1c3RvbUN1cnNvcihldmVudCwgdGhpcy5fcGFyZW50LCBgJHtzY2FsZVN2Zy5yZXBsYWNlKC88ZGVncmVlcz4vZywgYCR7LXNoYXBlc1tpXS5nZXRSb3RhdGlvbigpICsgQ29uc3RhbnRzLlJJR0hUX0FOR0xFfWApfWApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRTaGFwZSBpbnN0YW5jZW9mIFZlcnRFZGl0YWJsZVNoYXBlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5zdHlsZS5jdXJzb3IgPSBcIm5vbmVcIlxuICAgICAgICAgICAgICAvLyBmb3JFYWNoIG5vdCBzdXBwb3J0ZWQgb24gbm9kZWxpc3QgaW4gSUUvRWRnZVxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUuY3Vyc29yID0gXCJub25lXCJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJjYW52YXNcIikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA+PSBzaGFwZXNbaV0ubnVtVmVydHMpIHtcbiAgICAgICAgICAgICAgICBhcHBlbmRDdXN0b21DdXJzb3IoZXZlbnQsIHRoaXMuX3BhcmVudCwgYWRkU3ZnLCAtOCwgLTYpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGFwcGVuZEN1c3RvbUN1cnNvcihldmVudCwgdGhpcy5fcGFyZW50LCByZW1vdmVTdmcsIC04LCAtNikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kQ3VzdG9tQ3Vyc29yKGV2ZW50LCB0aGlzLl9wYXJlbnQsIHJlcG9zaXRpb25TdmcsIENvbnN0YW50cy5TVkdfT0ZGU0VULCBDb25zdGFudHMuU1ZHX09GRlNFVClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfSBlbHNlIGlmIChzaGFwZXNbaV0uY29udGFpbnNQb2ludCh0bXBQdDEsIHRtcFB0Miwgd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fZHJhd0N0eCkpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RJbmZvICYmIHNlbGVjdEluZm8ubW92YWJsZSkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImN1cnNvclwiKVxuICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY3Vyc29yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3Vyc29yKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5zdHlsZS5jdXJzb3IgPSBcIm1vdmVcIlxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUuY3Vyc29yID0gXCJtb3ZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgcmVtb3ZlQ3VzdG9tQ3Vyc29yKClcbiAgICAgICAgdGhpcy5fcGFyZW50LnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiXG4gICAgICAgIC8vIGZvckVhY2ggbm90IHN1cHBvcnRlZCBvbiBub2RlbGlzdCBpbiBJRS9FZGdlXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5jdXJzb3IgPSBcImRlZmF1bHRcIlxuICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2xpY2tDQigpIHtcbiAgICAvLyBub29wXG4gIH1cblxuICBfZGJsY2xpY2tDQihldmVudCkge1xuICAgIGlmICghaW5DYW52YXModGhpcy5fZHJhd0NhbnZhcywgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIFBvaW50MmQuc2V0KHRtcFB0MSwgZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSlcbiAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcFB0MiwgdG1wUHQxLCB0aGlzLl9jYW1lcmEuc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgICBjb25zdCB3b3JsZFRvU2NyZWVuTWF0cml4ID0gdGhpcy5fY2FtZXJhLndvcmxkVG9TY3JlZW5NYXRyaXhcbiAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnNvcnRlZFNoYXBlc1xuICAgIGxldCBpID0gLTFcbiAgICBmb3IgKGkgPSBzaGFwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KHNoYXBlc1tpXSlcbiAgICAgIGlmIChzaGFwZUluZm8uc2VsZWN0YWJsZSAmJiBzaGFwZXNbaV0uY29udGFpbnNQb2ludCh0bXBQdDEsIHRtcFB0Miwgd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fZHJhd0N0eCkpIHtcbiAgICAgICAgaWYgKHNoYXBlSW5mby5lZGl0YWJsZSAmJiBzaGFwZXNbaV0gaW5zdGFuY2VvZiBQb2x5TGluZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkU2hhcGUgPSBzaGFwZXNbaV1cbiAgICAgICAgICBsZXQgZG9YZm9ybSA9IGZhbHNlXG4gICAgICAgICAgaWYgKHNoYXBlc1tpXS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVTaGFwZSA9IHRoaXMuX3NlbGVjdGVkU2hhcGVzLmdldChzaGFwZXNbaV0pXG4gICAgICAgICAgICBpZiAoaW50ZXJhY3RpdmVTaGFwZSkge1xuICAgICAgICAgICAgICBzZWxlY3RlZFNoYXBlLnJlc3RvcmUoKVxuICAgICAgICAgICAgICBzZWxlY3RlZFNoYXBlLnJlbW92ZUNoaWxkWGZvcm0oaW50ZXJhY3RpdmVTaGFwZSlcbiAgICAgICAgICAgICAgZG9YZm9ybSA9ICEoaW50ZXJhY3RpdmVTaGFwZSBpbnN0YW5jZW9mIFhmb3JtU2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZWN0ZWRTaGFwZS5zZWxlY3RlZCA9IHRydWVcbiAgICAgICAgICBzZWxlY3RlZFNoYXBlLnNhdmUoKVxuICAgICAgICAgIGNvbnN0IG1heFogPSBzaGFwZXNbc2hhcGVzLmxlbmd0aCAtIDFdLnpJbmRleFxuICAgICAgICAgIHNlbGVjdGVkU2hhcGUuekluZGV4ID0gbWF4WiArIDFcbiAgICAgICAgICBCYXNpY1N0eWxlLmNvcHlCYXNpY1N0eWxlKHRoaXMuX3NlbGVjdFN0eWxlLCBzZWxlY3RlZFNoYXBlKVxuICAgICAgICAgIGxldCBuZXdTZWxlY3RTaGFwZSA9IG51bGxcbiAgICAgICAgICBpZiAoZG9YZm9ybSkge1xuICAgICAgICAgICAgaWYgKHNoYXBlSW5mby5yb3RhdGFibGUgfHwgc2hhcGVJbmZvLnNjYWxhYmxlKSB7XG4gICAgICAgICAgICAgIG5ld1NlbGVjdFNoYXBlID0gbmV3IFhmb3JtU2hhcGUodGhpcy5feGZvcm1TdHlsZSB8fCBkZWZhdWx0WGZvcm1TdHlsZSwgc2hhcGVJbmZvKVxuICAgICAgICAgICAgICBzZWxlY3RlZFNoYXBlLmFkZENoaWxkWGZvcm0obmV3U2VsZWN0U2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1NlbGVjdFNoYXBlID0gbmV3IFZlcnRFZGl0YWJsZVNoYXBlKHNlbGVjdGVkU2hhcGUsIHRoaXMuX3hmb3JtU3R5bGUpXG4gICAgICAgICAgICBzZWxlY3RlZFNoYXBlLmFkZENoaWxkWGZvcm0obmV3U2VsZWN0U2hhcGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU2hhcGVzLnNldChzZWxlY3RlZFNoYXBlLCBuZXdTZWxlY3RTaGFwZSlcbiAgICAgICAgfSBlbHNlIGlmICghc2hhcGVzW2ldLnNlbGVjdGVkKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0RXZlbnRPYmogPSBzZWxlY3RTaGFwZShzaGFwZXNbaV0sIHNoYXBlcywgdGhpcy5fc2VsZWN0ZWRTaGFwZXMsIHRoaXMuX3NlbGVjdFN0eWxlLCB0aGlzLl94Zm9ybVN0eWxlLCBzaGFwZUluZm8pXG4gICAgICAgICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCBzZWxlY3RFdmVudE9iailcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpIDwgMCAmJiB0aGlzLl9zZWxlY3RlZFNoYXBlcy5zaXplKSB7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWRTaGFwZXMuc2l6ZSkge1xuICAgICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHtcbiAgICAgICAgICB1bnNlbGVjdGVkU2hhcGVzOiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKSxcbiAgICAgICAgICBzZWxlY3RlZFNoYXBlczogW11cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RyYWdJbmZvID0gbnVsbFxuICAgICAgY2xlYXJTZWxlY3RlZFNoYXBlcyh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgICB9IGVsc2Uge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICB9XG4gICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG4gIH1cblxuICBfbW91c2VvdmVyQ0IoKSB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgX21vdXNlb3V0Q0IoKSB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgX2luaXQocGFyZW50LCBvcHRzKSB7XG4gICAgdGhpcy5fYWN0aXZhdGVkID0gKG9wdHMgJiYgb3B0cy5lbmFibGVJbnRlcmFjdGlvbnMpXG4gICAgc3VwZXIuX2luaXQocGFyZW50LCBvcHRzLCB0aGlzLl9hY3RpdmF0ZWQpXG4gICAgY29uc3QgbXlldmVudHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhFdmVudENvbnN0YW50cykubWFwKGV2ZW50ID0+IEV2ZW50Q29uc3RhbnRzW2V2ZW50XSlcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRzKG15ZXZlbnRzKVxuICAgIHRoaXMuX2RyYWdJbmZvID0gbnVsbFxuICAgIHRoaXMuX3NlbGVjdGVkU2hhcGVzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fc2VsZWN0U3R5bGUgPSBuZXcgQmFzaWNTdHlsZSgob3B0cyAmJiBvcHRzLnNlbGVjdFN0eWxlID8gb3B0cy5zZWxlY3RTdHlsZSA6IHtcbiAgICAgIGZpbGxDb2xvcjogXCJvcmFuZ2VcIlxuICAgIH0pKVxuXG4gICAgdGhpcy5feGZvcm1TdHlsZSA9IG5ldyBCYXNpY1N0eWxlKChvcHRzICYmIG9wdHMueGZvcm1TdHlsZSA/IG9wdHMueGZvcm1TdHlsZSA6IHtcbiAgICAgIGZpbGxDb2xvcjogXCJ3aGl0ZVwiLFxuICAgICAgc3Ryb2tlQ29sb3I6IFwiYmxhY2tcIixcbiAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgfSkpXG5cbiAgICB0aGlzLnRpbWVyID0gMFxuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0aGUgbW92ZW1lbnQgb2YgUGFyZW50IENvbnRhaW5lciAoSW4gb3VyIGNhc2UgaXQgaXMgTWFwKSB3aGVuIHVzZXIgY2xpY2tzIGFueXdoZXJlIG9uIE1hcCBleGNlcHQgb24gU2hhcGVcbiAgLy8gQXMgd2VsbCBhcyBpdCdzIGNoYW5nZXMgdGhlIGljb24gb2YgbW91c2UgZm9yIERlc2t0b3AgZGV2aWNlc1xuICBfbWFrZVBhcmVudEVsZW1lbnRNb3ZhYmxlKCkge1xuICAgIHJlbW92ZUN1c3RvbUN1cnNvcigpXG4gICAgdGhpcy5fcGFyZW50LnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiIC8vIENoYW5nZSB0aGUgQ3Vyc29yIGljb24gZm9yIGRlc2t0b3AgZGV2aWNlXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCIgLy8gQ2hhbmdlIHRoZSBDdXJzb3IgaWNvbiBmb3IgZGVza3RvcCBkZXZpY2VcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNhbnZhc1wiKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIiAvLyBBbGxvdyBtb3ZlbW5ldCBvZiBwYXJlbnQgY29udGFpbmVyIGkuZSBNYXBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfcmVuZGVyU2hhcGVzKGN0eCwgZHJhd1NoYXBlcywgY2FtZXJhKSB7XG4gICAgY29uc3Qgd29ybGRUb1NjcmVlbk1hdCA9IGNhbWVyYS53b3JsZFRvU2NyZWVuTWF0cml4XG4gICAgZHJhd1NoYXBlcy5mb3JFYWNoKHNoYXBlID0+IHtcbiAgICAgIGlmIChzaGFwZS52aXNpYmxlKSB7XG4gICAgICAgIHNoYXBlLnJlbmRlcihjdHgsIHdvcmxkVG9TY3JlZW5NYXQsIHRoaXMuX3N0eWxlU3RhdGUpXG4gICAgICAgIC8vIHNoYXBlLnJlbmRlckJvdW5kcyhjdHgsIHdvcmxkVG9TY3JlZW5NYXQsIGJvdW5kc1N0cm9rZVN0eWxlKVxuICAgICAgICBpZiAoc2hhcGUuc2VsZWN0ZWQpIHtcbiAgICAgICAgICBjb25zdCBpbnRlcmFjU2hhcGUgPSB0aGlzLl9zZWxlY3RlZFNoYXBlcy5nZXQoc2hhcGUpXG4gICAgICAgICAgaWYgKGludGVyYWNTaGFwZSkge1xuICAgICAgICAgICAgaW50ZXJhY1NoYXBlLnJlbmRlcihjdHgsIHdvcmxkVG9TY3JlZW5NYXQsIHRoaXMuX3N0eWxlU3RhdGUpXG4gICAgICAgICAgICAvLyBpbnRlcmFjU2hhcGUucmVuZGVyQm91bmRzKGN0eCwgd29ybGRUb1NjcmVlbk1hdCwgYm91bmRzU3Ryb2tlU3R5bGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNldCBzZWxlY3RTdHlsZShzZWxlY3RTdHlsZSkge1xuICAgIEJhc2ljU3R5bGUuY29weUJhc2ljU3R5bGUoc2VsZWN0U3R5bGUsIHRoaXMuX3NlbGVjdFN0eWxlKVxuICB9XG5cbiAgZ2V0IHNlbGVjdFN0eWxlKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RTdHlsZVxuICB9XG5cbiAgZ2V0IHNlbGVjdGVkU2hhcGVzKCkge1xuICAgIHJldHVybiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICB9XG5cbiAgc2VsZWN0U2hhcGUoc2hhcGUpIHtcbiAgICBjb25zdCBzaGFwZUluZm8gPSB0aGlzLl9vYmplY3RzLmdldChzaGFwZSlcbiAgICBpZiAoc2hhcGVJbmZvICYmIHNoYXBlSW5mby5zZWxlY3RhYmxlKSB7XG4gICAgICBjb25zdCBzZWxlY3RFdmVudE9iaiA9IHNlbGVjdFNoYXBlKHNoYXBlLCB0aGlzLnNvcnRlZFNoYXBlcywgdGhpcy5fc2VsZWN0ZWRTaGFwZXMsIHRoaXMuX3NlbGVjdFN0eWxlLCB0aGlzLl94Zm9ybVN0eWxlLCBzaGFwZUluZm8pXG4gICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHNlbGVjdEV2ZW50T2JqKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZFNoYXBlcy5zaXplKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFNoYXBlcyA9IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAodGhpcy5fc2VsZWN0ZWRTaGFwZXMpXG4gICAgICBjbGVhclNlbGVjdGVkU2hhcGVzKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCB7XG4gICAgICAgIHVuc2VsZWN0ZWRTaGFwZXM6IHNlbGVjdGVkU2hhcGVzLFxuICAgICAgICBzZWxlY3RlZFNoYXBlczogW11cbiAgICAgIH0pXG4gICAgICB0aGlzLl9yZXJlbmRlckNiKClcbiAgICB9XG4gIH1cblxuICBhZGRTaGFwZShzaGFwZSwgb3B0cyA9IG51bGwsIHNlbGVjdCA9IGZhbHNlKSB7XG4gICAgbGV0IHNoYXBlcyA9IHNoYXBlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXBlcykpIHtcbiAgICAgIHNoYXBlcyA9IFtzaGFwZV1cbiAgICB9XG5cbiAgICBzdXBlci5hZGRTaGFwZShzaGFwZXMpXG4gICAgc2hhcGVzLmZvckVhY2gobmV3U2hhcGUgPT4ge1xuICAgICAgY29uc3Qgc2hhcGVJbmZvID0gdGhpcy5fb2JqZWN0cy5nZXQobmV3U2hhcGUpXG4gICAgICBpZiAoc2hhcGVJbmZvKSB7XG4gICAgICAgIHNoYXBlSW5mby5zZWxlY3RhYmxlID0gKG9wdHMgJiYgdHlwZW9mIG9wdHMuc2VsZWN0YWJsZSAhPT0gXCJ1bmRlZmluZWRcIiA/IEJvb2xlYW4ob3B0cy5zZWxlY3RhYmxlKSA6IHRydWUpXG4gICAgICAgIHNoYXBlSW5mby5tb3ZhYmxlID0gKG9wdHMgJiYgdHlwZW9mIG9wdHMubW92YWJsZSAhPT0gXCJ1bmRlZmluZWRcIiA/IEJvb2xlYW4ob3B0cy5tb3ZhYmxlKSA6IHRydWUpXG4gICAgICAgIHNoYXBlSW5mby5yb3RhdGFibGUgPSAob3B0cyAmJiB0eXBlb2Ygb3B0cy5yb3RhdGFibGUgIT09IFwidW5kZWZpbmVkXCIgPyBCb29sZWFuKG9wdHMucm90YXRhYmxlKSA6IHRydWUpXG4gICAgICAgIHNoYXBlSW5mby5zY2FsYWJsZSA9IChvcHRzICYmIHR5cGVvZiBvcHRzLnNjYWxhYmxlICE9PSBcInVuZGVmaW5lZFwiID8gQm9vbGVhbihvcHRzLnNjYWxhYmxlKSA6IHRydWUpXG4gICAgICAgIHNoYXBlSW5mby51bmlmb3JtU2NhbGVPbmx5ID0gKG9wdHMgJiYgdHlwZW9mIG9wdHMudW5pZm9ybVNjYWxlT25seSAhPT0gXCJ1bmRlZmluZWRcIiA/IEJvb2xlYW4ob3B0cy51bmlmb3JtU2NhbGVPbmx5KSA6IGZhbHNlKVxuICAgICAgICBzaGFwZUluZm8uY2VudGVyU2NhbGVPbmx5ID0gKG9wdHMgJiYgdHlwZW9mIG9wdHMuY2VudGVyU2NhbGVPbmx5ICE9PSBcInVuZGVmaW5lZFwiID8gQm9vbGVhbihvcHRzLmNlbnRlclNjYWxlT25seSkgOiBmYWxzZSlcbiAgICAgICAgc2hhcGVJbmZvLmVkaXRhYmxlID0gKG9wdHMgJiYgdHlwZW9mIG9wdHMuZWRpdGFibGUgIT09IFwidW5kZWZpbmVkXCIgPyBCb29sZWFuKG9wdHMuZWRpdGFibGUpIDogdHJ1ZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHNlbGVjdCkge1xuICAgICAgY29uc3Qgc2VsZWN0RXZlbnRPYmogPSB7XG4gICAgICAgIHVuc2VsZWN0ZWRTaGFwZXM6IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAodGhpcy5fc2VsZWN0ZWRTaGFwZXMpXG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3RlZFNoYXBlcyA9IFtdXG4gICAgICBzaGFwZXMuZm9yRWFjaChuZXdTaGFwZSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KG5ld1NoYXBlKVxuICAgICAgICBpZiAoc2hhcGVJbmZvLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICBzZWxlY3RTaGFwZShuZXdTaGFwZSwgdGhpcy5zb3J0ZWRTaGFwZXMsIHRoaXMuX3NlbGVjdGVkU2hhcGVzLCB0aGlzLl9zZWxlY3RTdHlsZSwgdGhpcy5feGZvcm1TdHlsZSwgc2hhcGVJbmZvKVxuICAgICAgICAgIHNlbGVjdGVkU2hhcGVzLnB1c2gobmV3U2hhcGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGlmIChzZWxlY3RlZFNoYXBlcy5sZW5ndGgpIHtcbiAgICAgICAgc2VsZWN0RXZlbnRPYmouc2VsZWN0ZWRTaGFwZXMgPSBzZWxlY3RlZFNoYXBlc1xuICAgICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHNlbGVjdEV2ZW50T2JqKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIGRlbGV0ZVNoYXBlKHNoYXBlKSB7XG4gICAgbGV0IHNoYXBlcyA9IHNoYXBlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXBlcykpIHtcbiAgICAgIHNoYXBlcyA9IFtzaGFwZV1cbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0Q2xlYXJlZFNoYXBlcyA9IGNsZWFyU3BlY2lmaWNTaGFwZXModGhpcy5fc2VsZWN0ZWRTaGFwZXMsIHNoYXBlcylcbiAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHtcbiAgICAgIHVuc2VsZWN0ZWRTaGFwZXM6IHNlbGVjdENsZWFyZWRTaGFwZXMsXG4gICAgICBzZWxlY3RlZFNoYXBlczogZ2V0U2VsZWN0ZWRPYmpzRnJvbU1hcCh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgICB9KVxuXG4gICAgcmVtb3ZlQ3VzdG9tQ3Vyc29yKClcbiAgICB0aGlzLl9wYXJlbnQuc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCJcbiAgICAvLyBmb3JFYWNoIG5vdCBzdXBwb3J0ZWQgb24gbm9kZWxpc3QgaW4gSUUvRWRnZVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiXG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCJcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZGVsZXRlU2hhcGUoc2hhcGVzKVxuICB9XG5cbiAgZGVsZXRlU2VsZWN0ZWRTaGFwZXMoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRTaGFwZXMgPSBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgIGNsZWFyU2VsZWN0ZWRTaGFwZXModGhpcy5fc2VsZWN0ZWRTaGFwZXMpXG4gICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCB7XG4gICAgICB1bnNlbGVjdGVkU2hhcGVzOiBzZWxlY3RlZFNoYXBlcyxcbiAgICAgIHNlbGVjdGVkU2hhcGVzOiBbXVxuICAgIH0pXG5cbiAgICByZW1vdmVDdXN0b21DdXJzb3IoKVxuICAgIHRoaXMuX3BhcmVudC5zdHlsZS5jdXJzb3IgPSBcImRlZmF1bHRcIlxuICAgIC8vIGZvckVhY2ggbm90IHN1cHBvcnRlZCBvbiBub2RlbGlzdCBpbiBJRS9FZGdlXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCJcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIlxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5kZWxldGVTaGFwZShzZWxlY3RlZFNoYXBlcylcbiAgfVxuXG4gIGdldCBpbnRlcmFjdGlvbnNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmF0ZWRcbiAgfVxuXG4gIGVuYWJsZUludGVyYWN0aW9ucygpIHtcbiAgICB0aGlzLl9lbmFibGVFdmVudHMoKVxuICAgIHRoaXMuX2FjdGl2YXRlZCA9IHRydWVcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZGlzYWJsZUludGVyYWN0aW9ucyhjbGVhclNlbGVjdGlvbiA9IHRydWUpIHtcbiAgICBpZiAoY2xlYXJTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKVxuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxlRXZlbnRzKClcbiAgICB0aGlzLl9hY3RpdmF0ZWQgPSBmYWxzZVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHN0b3AgTW91c2UgRXZlbnQgcHJvcGFnYXRpb24gVHJpZ2dlcmVkIGZyb20gdGhlIFRvdWNoIGV2ZW50XG4gIHNldERlbnlNb3VzZUV2ZW50RmxhZyhldmVudCkge1xuICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICB0aGlzLmRlbnlNb3VzZUV2ZW50ID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gRXZlbnRzVHlwZXMuTU9VU0VVUCkge1xuICAgICAgLy8gc2V0IHRoZSBGbGFnIGZhbHNlIGF0IHRoZSBlbmQgb2YgbW91c2UgZXZlbnQgaS5lIG9uIE1vdXNlVXAgRXZlbnRcbiAgICAgIHRoaXMuZGVueU1vdXNlRXZlbnQgPSBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG5PYmplY3QuYXNzaWduKEV2ZW50Q29uc3RhbnRzLCBEcmF3RW5naW5lLkV2ZW50Q29uc3RhbnRzKVxuU2hhcGVCdWlsZGVyLkV2ZW50Q29uc3RhbnRzID0gRXZlbnRDb25zdGFudHNcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2VuZ2luZS9zaGFwZS1idWlsZGVyLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 20 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 3x3 Matrix\n * @name mat3\n */\nvar mat3 = {};\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.create = function() {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n};\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\nmat3.fromMat4 = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n};\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\nmat3.fromValues = function(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n};\n\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\nmat3.set = function(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n};\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nmat3.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1], a02 = a[2], a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.invert = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n b01 = a22 * a11 - a12 * a21,\n b11 = -a22 * a10 + a12 * a20,\n b21 = a21 * a10 - a11 * a20,\n\n // Calculate the determinant\n det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.adjoint = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8];\n\n out[0] = (a11 * a22 - a12 * a21);\n out[1] = (a02 * a21 - a01 * a22);\n out[2] = (a01 * a12 - a02 * a11);\n out[3] = (a12 * a20 - a10 * a22);\n out[4] = (a00 * a22 - a02 * a20);\n out[5] = (a02 * a10 - a00 * a12);\n out[6] = (a10 * a21 - a11 * a20);\n out[7] = (a01 * a20 - a00 * a21);\n out[8] = (a00 * a11 - a01 * a10);\n return out;\n};\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nmat3.determinant = function (a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8];\n\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n};\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.multiply = function (out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n b00 = b[0], b01 = b[1], b02 = b[2],\n b10 = b[3], b11 = b[4], b12 = b[5],\n b20 = b[6], b21 = b[7], b22 = b[8];\n\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n};\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nmat3.mul = mat3.multiply;\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nmat3.translate = function(out, a, v) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n x = v[0], y = v[1];\n\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n};\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.rotate = function (out, a, rad) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n s = Math.sin(rad),\n c = Math.cos(rad);\n\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n};\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.scale = function(out, a, v) {\n var x = v[0], y = v[1];\n\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat3} out\n */\nmat3.fromTranslation = function(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.fromRotation = function(out, rad) {\n var s = Math.sin(rad), c = Math.cos(rad);\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat3} out\n */\nmat3.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat2d} a the matrix to copy\n * @returns {mat3} out\n **/\nmat3.fromMat2d = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n};\n\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\nmat3.fromQuat = function (out, q) {\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n yx = y * x2,\n yy = y * y2,\n zx = z * x2,\n zy = z * y2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n\n return out;\n};\n\n/**\n* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {mat4} a Mat4 to derive the normal matrix from\n*\n* @returns {mat3} out\n*/\nmat3.normalFromMat4 = function (out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n\n // Calculate the determinant\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n return out;\n};\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat3.str = function (a) {\n return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + \n a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {mat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat3.frob = function (a) {\n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)))\n};\n\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n};\n\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\nmat3.sub = mat3.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\nmat3.multiplyScalar = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n};\n\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\nmat3.multiplyScalarAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n out[3] = a[3] + (b[3] * scale);\n out[4] = a[4] + (b[4] * scale);\n out[5] = a[5] + (b[5] * scale);\n out[6] = a[6] + (b[6] * scale);\n out[7] = a[7] + (b[7] * scale);\n out[8] = a[8] + (b[8] * scale);\n return out;\n};\n\n/*\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && \n a[3] === b[3] && a[4] === b[4] && a[5] === b[5] &&\n a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.equals = function (a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = a[6], b7 = b[7], b8 = b[8];\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)));\n};\n\n\nmodule.exports = mat3;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQzLmpzPzhlYTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGU7QUFDQSxvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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O0FBQ0Esb0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EiLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDN4MyBNYXRyaXhcbiAqIEBuYW1lIG1hdDNcbiAqL1xudmFyIG1hdDMgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDNcbiAqXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5tYXQzLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDE7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3BpZXMgdGhlIHVwcGVyLWxlZnQgM3gzIHZhbHVlcyBpbnRvIHRoZSBnaXZlbiBtYXQzLlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgM3gzIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhICAgdGhlIHNvdXJjZSA0eDQgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuZnJvbU1hdDQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzRdO1xuICAgIG91dFs0XSA9IGFbNV07XG4gICAgb3V0WzVdID0gYVs2XTtcbiAgICBvdXRbNl0gPSBhWzhdO1xuICAgIG91dFs3XSA9IGFbOV07XG4gICAgb3V0WzhdID0gYVsxMF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQzfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDN9IGEgbmV3IDN4MyBtYXRyaXhcbiAqL1xubWF0My5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG1hdDMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHJldHVybnMge21hdDN9IEEgbmV3IG1hdDNcbiAqL1xubWF0My5mcm9tVmFsdWVzID0gZnVuY3Rpb24obTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgICBvdXRbMF0gPSBtMDA7XG4gICAgb3V0WzFdID0gbTAxO1xuICAgIG91dFsyXSA9IG0wMjtcbiAgICBvdXRbM10gPSBtMTA7XG4gICAgb3V0WzRdID0gbTExO1xuICAgIG91dFs1XSA9IG0xMjtcbiAgICBvdXRbNl0gPSBtMjA7XG4gICAgb3V0WzddID0gbTIxO1xuICAgIG91dFs4XSA9IG0yMjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnNldCA9IGZ1bmN0aW9uKG91dCwgbTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikge1xuICAgIG91dFswXSA9IG0wMDtcbiAgICBvdXRbMV0gPSBtMDE7XG4gICAgb3V0WzJdID0gbTAyO1xuICAgIG91dFszXSA9IG0xMDtcbiAgICBvdXRbNF0gPSBtMTE7XG4gICAgb3V0WzVdID0gbTEyO1xuICAgIG91dFs2XSA9IG0yMDtcbiAgICBvdXRbN10gPSBtMjE7XG4gICAgb3V0WzhdID0gbTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDE7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGExMiA9IGFbNV07XG4gICAgICAgIG91dFsxXSA9IGFbM107XG4gICAgICAgIG91dFsyXSA9IGFbNl07XG4gICAgICAgIG91dFszXSA9IGEwMTtcbiAgICAgICAgb3V0WzVdID0gYVs3XTtcbiAgICAgICAgb3V0WzZdID0gYTAyO1xuICAgICAgICBvdXRbN10gPSBhMTI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVszXTtcbiAgICAgICAgb3V0WzJdID0gYVs2XTtcbiAgICAgICAgb3V0WzNdID0gYVsxXTtcbiAgICAgICAgb3V0WzRdID0gYVs0XTtcbiAgICAgICAgb3V0WzVdID0gYVs3XTtcbiAgICAgICAgb3V0WzZdID0gYVsyXTtcbiAgICAgICAgb3V0WzddID0gYVs1XTtcbiAgICAgICAgb3V0WzhdID0gYVs4XTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxLFxuICAgICAgICBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwLFxuICAgICAgICBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjAsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XG5cbiAgICBpZiAoIWRldCkgeyBcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSBiMDEgKiBkZXQ7XG4gICAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICAgIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICAgIG91dFszXSA9IGIxMSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gICAgb3V0WzZdID0gYjIxICogZGV0O1xuICAgIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdO1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGEyMiAtIGExMiAqIGEyMSk7XG4gICAgb3V0WzFdID0gKGEwMiAqIGEyMSAtIGEwMSAqIGEyMik7XG4gICAgb3V0WzJdID0gKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XG4gICAgb3V0WzNdID0gKGExMiAqIGEyMCAtIGExMCAqIGEyMik7XG4gICAgb3V0WzRdID0gKGEwMCAqIGEyMiAtIGEwMiAqIGEyMCk7XG4gICAgb3V0WzVdID0gKGEwMiAqIGExMCAtIGEwMCAqIGExMik7XG4gICAgb3V0WzZdID0gKGExMCAqIGEyMSAtIGExMSAqIGEyMCk7XG4gICAgb3V0WzddID0gKGEwMSAqIGEyMCAtIGEwMCAqIGEyMSk7XG4gICAgb3V0WzhdID0gKGEwMCAqIGExMSAtIGEwMSAqIGExMCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDMuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdO1xuXG4gICAgcmV0dXJuIGEwMCAqIChhMjIgKiBhMTEgLSBhMTIgKiBhMjEpICsgYTAxICogKC1hMjIgKiBhMTAgKyBhMTIgKiBhMjApICsgYTAyICogKGEyMSAqIGExMCAtIGExMSAqIGEyMCk7XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDMnc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBiMDAgPSBiWzBdLCBiMDEgPSBiWzFdLCBiMDIgPSBiWzJdLFxuICAgICAgICBiMTAgPSBiWzNdLCBiMTEgPSBiWzRdLCBiMTIgPSBiWzVdLFxuICAgICAgICBiMjAgPSBiWzZdLCBiMjEgPSBiWzddLCBiMjIgPSBiWzhdO1xuXG4gICAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICAgIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTtcbiAgICBvdXRbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XG5cbiAgICBvdXRbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7XG4gICAgb3V0WzRdID0gYjEwICogYTAxICsgYjExICogYTExICsgYjEyICogYTIxO1xuICAgIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcblxuICAgIG91dFs2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMDtcbiAgICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gICAgb3V0WzhdID0gYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0My5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQzLm11bCA9IG1hdDMubXVsdGlwbHk7XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcbiAgICAgICAgeCA9IHZbMF0sIHkgPSB2WzFdO1xuXG4gICAgb3V0WzBdID0gYTAwO1xuICAgIG91dFsxXSA9IGEwMTtcbiAgICBvdXRbMl0gPSBhMDI7XG5cbiAgICBvdXRbM10gPSBhMTA7XG4gICAgb3V0WzRdID0gYTExO1xuICAgIG91dFs1XSA9IGExMjtcblxuICAgIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICAgIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICAgIG91dFs4XSA9IHggKiBhMDIgKyB5ICogYTEyICsgYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYyAqIGEwMCArIHMgKiBhMTA7XG4gICAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gICAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XG5cbiAgICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTtcbiAgICBvdXRbNV0gPSBjICogYTEyIC0gcyAqIGEwMjtcblxuICAgIG91dFs2XSA9IGEyMDtcbiAgICBvdXRbN10gPSBhMjE7XG4gICAgb3V0WzhdID0gYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MyBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5tYXQzLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXTtcblxuICAgIG91dFswXSA9IHggKiBhWzBdO1xuICAgIG91dFsxXSA9IHggKiBhWzFdO1xuICAgIG91dFsyXSA9IHggKiBhWzJdO1xuXG4gICAgb3V0WzNdID0geSAqIGFbM107XG4gICAgb3V0WzRdID0geSAqIGFbNF07XG4gICAgb3V0WzVdID0geSAqIGFbNV07XG5cbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDMudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmZyb21UcmFuc2xhdGlvbiA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IHZbMF07XG4gICAgb3V0WzddID0gdlsxXTtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDMucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSwgYyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBjO1xuICAgIG91dFsxXSA9IHM7XG4gICAgb3V0WzJdID0gMDtcblxuICAgIG91dFszXSA9IC1zO1xuICAgIG91dFs0XSA9IGM7XG4gICAgb3V0WzVdID0gMDtcblxuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDMuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tU2NhbGluZyA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IHZbMF07XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuXG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB2WzFdO1xuICAgIG91dFs1XSA9IDA7XG5cbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBtYXQyZCBpbnRvIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gY29weVxuICogQHJldHVybnMge21hdDN9IG91dFxuICoqL1xubWF0My5mcm9tTWF0MmQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gMDtcblxuICAgIG91dFszXSA9IGFbMl07XG4gICAgb3V0WzRdID0gYVszXTtcbiAgICBvdXRbNV0gPSAwO1xuXG4gICAgb3V0WzZdID0gYVs0XTtcbiAgICBvdXRbN10gPSBhWzVdO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4qXG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHtxdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5tYXQzLmZyb21RdWF0ID0gZnVuY3Rpb24gKG91dCwgcSkge1xuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeXggPSB5ICogeDIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB6eCA9IHogKiB4MixcbiAgICAgICAgenkgPSB6ICogeTIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gICAgb3V0WzNdID0geXggLSB3ejtcbiAgICBvdXRbNl0gPSB6eCArIHd5O1xuXG4gICAgb3V0WzFdID0geXggKyB3ejtcbiAgICBvdXRbNF0gPSAxIC0geHggLSB6ejtcbiAgICBvdXRbN10gPSB6eSAtIHd4O1xuXG4gICAgb3V0WzJdID0genggLSB3eTtcbiAgICBvdXRbNV0gPSB6eSArIHd4O1xuICAgIG91dFs4XSA9IDEgLSB4eCAtIHl5O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4qXG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbm1hdDMubm9ybWFsRnJvbU1hdDQgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV0sXG5cbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMixcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICAgIGlmICghZGV0KSB7IFxuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICAgIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICAgIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuXG4gICAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG5cbiAgICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgICBvdXRbN10gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBtYXQgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xubWF0My5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MygnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbM10gKyAnLCAnICsgYVs0XSArICcsICcgKyBhWzVdICsgJywgJyArIFxuICAgICAgICAgICAgICAgICAgICBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICsgYVs4XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cbm1hdDMuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyBNYXRoLnBvdyhhWzZdLCAyKSArIE1hdGgucG93KGFbN10sIDIpICsgTWF0aC5wb3coYVs4XSwgMikpKVxufTtcblxuLyoqXG4gKiBBZGRzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSArIGJbM107XG4gICAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gICAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gICAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gICAgb3V0WzddID0gYVs3XSArIGJbN107XG4gICAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgICBvdXRbOF0gPSBhWzhdIC0gYls4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0My5zdWIgPSBtYXQzLnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLm11bHRpcGx5U2NhbGFyID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgb3V0WzJdID0gYVsyXSAqIGI7XG4gICAgb3V0WzNdID0gYVszXSAqIGI7XG4gICAgb3V0WzRdID0gYVs0XSAqIGI7XG4gICAgb3V0WzVdID0gYVs1XSAqIGI7XG4gICAgb3V0WzZdID0gYVs2XSAqIGI7XG4gICAgb3V0WzddID0gYVs3XSAqIGI7XG4gICAgb3V0WzhdID0gYVs4XSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gbWF0MydzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5tdWx0aXBseVNjYWxhckFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICBvdXRbM10gPSBhWzNdICsgKGJbM10gKiBzY2FsZSk7XG4gICAgb3V0WzRdID0gYVs0XSArIChiWzRdICogc2NhbGUpO1xuICAgIG91dFs1XSA9IGFbNV0gKyAoYls1XSAqIHNjYWxlKTtcbiAgICBvdXRbNl0gPSBhWzZdICsgKGJbNl0gKiBzY2FsZSk7XG4gICAgb3V0WzddID0gYVs3XSArIChiWzddICogc2NhbGUpO1xuICAgIG91dFs4XSA9IGFbOF0gKyAoYls4XSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLypcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7bWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xubWF0My5leGFjdEVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIFxuICAgICAgICAgICBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJlxuICAgICAgICAgICBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7bWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQzfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQzLmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSwgYTQgPSBhWzRdLCBhNSA9IGFbNV0sIGE2ID0gYVs2XSwgYTcgPSBhWzddLCBhOCA9IGFbOF07XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXSwgYjQgPSBiWzRdLCBiNSA9IGJbNV0sIGI2ID0gYVs2XSwgYjcgPSBiWzddLCBiOCA9IGJbOF07XG4gICAgcmV0dXJuIChNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpKTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtYXQzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQzLmpzXG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9"); + eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.transformXformShape = transformXformShape;\nexports.translateShape = translateShape;\nexports.translateVert = translateVert;\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _mat2d = __webpack_require__(4);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _vec2d = __webpack_require__(9);\n\nvar _vec2d2 = _interopRequireDefault(_vec2d);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction rotateOBBox(shape, parentShape, selectedInfo, screenPos, worldPos) {\n var pt = [0, 0];\n var scale = [0, 0];\n _mat2d2.default.svd(pt, scale, null, selectedInfo.objectToWorldMatrix);\n var startDir = [0, 0];\n Point2d.sub(startDir, selectedInfo.startWorldPos, pt);\n _vec2d2.default.normalize(startDir, startDir);\n var dir = pt;\n Point2d.sub(dir, worldPos, pt);\n _vec2d2.default.normalize(dir, dir);\n var angle = _vec2d2.default.angle(startDir, dir);\n\n if (selectedInfo.keys.shiftKey) {\n angle = Math.round(angle / Math.QUATER_PI) * Math.QUATER_PI;\n }\n\n // if (!camera.isYFlipped()) {\n // angle *= -1\n // }\n\n parentShape.setRotation(selectedInfo.startLocalRot + Math.RAD_TO_DEG * angle);\n}\n\nfunction transformXformShape(shape, selectedInfo, screenPos, worldPos, camera) {\n var parentShape = shape.parent;\n var objPos = [0, 0];\n var deltaPos = [0, 0];\n var deltaDims = [0, 0];\n\n if (selectedInfo.rotate) {\n rotateOBBox(shape, parentShape, selectedInfo, screenPos, worldPos, camera);\n return;\n }\n\n var uniformScale = selectedInfo.keys.shiftKey || selectedInfo.uniformScaleOnly;\n var centerScale = selectedInfo.keys.altKey || selectedInfo.centerScaleOnly;\n\n // get the position of the shape at start of transform\n var pt = [0, 0];\n _mat2d2.default.svd(pt, null, null, selectedInfo.objectToWorldMatrix);\n\n // get the mouse delta in world space\n _vec2d2.default.sub(deltaPos, worldPos, selectedInfo.startWorldPos);\n\n if (uniformScale && selectedInfo.controlIndex < 4) {\n var xAxisDir = [selectedInfo.objectToWorldMatrix[0], selectedInfo.objectToWorldMatrix[1]];\n var yAxisDir = [selectedInfo.objectToWorldMatrix[2], selectedInfo.objectToWorldMatrix[3]];\n var diagDir = [0, 0];\n\n if (selectedInfo.controlIndex < 2) {\n _vec2d2.default.negate(xAxisDir, xAxisDir);\n }\n if (selectedInfo.controlIndex % 2 === 0) {\n _vec2d2.default.negate(yAxisDir, yAxisDir);\n }\n\n _vec2d2.default.normalize(xAxisDir, xAxisDir);\n _vec2d2.default.normalize(yAxisDir, yAxisDir);\n\n _vec2d2.default.add(diagDir, xAxisDir, yAxisDir);\n _vec2d2.default.normalize(diagDir, diagDir);\n\n var cross = _vec2d2.default.cross2d(deltaPos, diagDir);\n var axisToUse = null;\n if (selectedInfo.controlIndex === 0 || selectedInfo.controlIndex === 3) {\n axisToUse = yAxisDir;\n if (cross < 0) {\n axisToUse = xAxisDir;\n }\n } else {\n axisToUse = xAxisDir;\n if (cross < 0) {\n axisToUse = yAxisDir;\n }\n }\n var mindist = _vec2d2.default.dot(deltaPos, axisToUse);\n mindist = Math.sign(mindist) * Math.sqrt(2 * mindist * mindist);\n _vec2d2.default.scale(deltaPos, diagDir, mindist);\n Point2d.addVec2(worldPos, selectedInfo.startWorldPos, deltaPos);\n }\n\n // first convert world point to object space\n Point2d.copy(objPos, worldPos);\n Point2d.transformMat2d(objPos, objPos, selectedInfo.worldToObjectMatrix);\n\n // get the mouse delta in object space and multipy by the\n // scale of the selected object at the start of the transform\n // to get the scale delta in object space\n _vec2d2.default.sub(deltaDims, objPos, selectedInfo.startObjectPos);\n\n Point2d.copy(pt, selectedInfo.startLocalPos);\n\n // now determine the transform direction depending\n // on which control vertex of the object-oriented bounds\n // was selected\n var xScale = 0;\n var yScale = 0;\n if (selectedInfo.controlIndex < 4) {\n // dragging a corner vertex\n xScale = selectedInfo.controlIndex < 2 ? -1 : 1;\n yScale = selectedInfo.controlIndex % 2 === 0 ? -1 : 1;\n\n // can translate based on the mouse delta in world space\n // This is done to offset the scale, which is done at\n // the shape's center. This ultimately acts as a pivot\n // for the transformation. Only do this if the alt key\n // isn't pressed\n if (!centerScale) {\n Point2d.addVec2(pt, pt, _vec2d2.default.scale(deltaPos, deltaPos, 0.5));\n }\n\n parentShape.setPosition(pt);\n } else {\n // dragging a side vertex, which means we only scale in\n // one dimension, rather than 2. So we need to figure\n // out that direction based on the orientation of the\n // shape\n var idx = selectedInfo.controlIndex - 4;\n var axisDir = [0, 0];\n if (idx % 2 === 0) {\n // scaling in the object's X direction\n _vec2d2.default.set(axisDir, selectedInfo.objectToWorldMatrix[0], selectedInfo.objectToWorldMatrix[1]);\n yScale = 0;\n xScale = idx < 2 ? -1 : 1;\n if (uniformScale) {\n yScale = xScale;\n deltaDims[1] = deltaDims[0];\n }\n } else {\n // scaling in the object's Y direction\n _vec2d2.default.set(axisDir, selectedInfo.objectToWorldMatrix[2], selectedInfo.objectToWorldMatrix[3]);\n xScale = 0;\n yScale = idx < 2 ? -1 : 1;\n if (uniformScale) {\n xScale = yScale;\n deltaDims[0] = deltaDims[1];\n }\n }\n\n // now find the pivot offset for the axis-aligned scale\n if (!centerScale) {\n _vec2d2.default.normalize(axisDir, axisDir);\n _vec2d2.default.scale(axisDir, axisDir, _vec2d2.default.dot(deltaPos, axisDir));\n Point2d.addVec2(pt, pt, _vec2d2.default.scale(axisDir, axisDir, 0.5));\n }\n\n parentShape.setPosition(pt);\n }\n\n if (centerScale) {\n xScale *= 2;\n yScale *= 2;\n }\n\n // perform the scale\n parentShape.setScale([selectedInfo.startLocalScale[0] * (1 + xScale * deltaDims[0] / selectedInfo.shapeWidth), selectedInfo.startLocalScale[1] * (1 + yScale * deltaDims[1] / selectedInfo.shapeHeight)]);\n}\n\nfunction translateShape(shape, selectedInfo, screenPos, worldPos, camera) {\n var diff = [0, 0];\n var pt = [0, 0];\n _mat2d2.default.svd(pt, null, null, selectedInfo.objectToWorldMatrix);\n if (selectedInfo.keys.shiftKey) {\n Point2d.sub(diff, screenPos, selectedInfo.startPos);\n var angle = Math.atan2(diff[1], diff[0]);\n angle = Math.round(angle / Math.QUATER_PI) * Math.QUATER_PI;\n var transformDir = [Math.cos(angle), Math.sin(angle)];\n _vec2d2.default.scale(diff, transformDir, _vec2d2.default.dot(diff, transformDir));\n _vec2d2.default.transformMat2(diff, diff, camera.screenToWorldMatrix);\n } else {\n _vec2d2.default.sub(diff, worldPos, selectedInfo.startWorldPos);\n }\n Point2d.addVec2(pt, selectedInfo.startLocalPos, diff);\n\n shape.setPosition(pt);\n}\n\nfunction translateVert(shape, selectedInfo, screenPos, worldPos) {\n var parentShape = shape.parent;\n\n // get the position of the shape at start of transform\n // const pt = [0, 0]\n // Mat2d.svd(pt, null, null, selectedInfo.objectToWorldMatrix)\n\n // get the mouse delta in world space\n // Vec2d.sub(deltaPos, worldPos, selectedInfo.startWorldPos)\n\n // first convert world point to object space\n // Point2d.copy(objPos, worldPos)\n // Point2d.transformMat2d(objPos, objPos, selectedInfo.worldToObjectMatrix)\n\n // get the diff\n // const diff = objPos\n // Point2d.sub(diff, objPos, selectedInfo.startObjectPos)\n\n var numVerts = parentShape.numVerts;\n if (selectedInfo.controlIndex >= numVerts) {\n var idx1 = Math.min(selectedInfo.controlIndex - numVerts, numVerts - 1);\n var idx2 = idx1 === numVerts - 1 ? 0 : idx1 + 1;\n var pt = [0, 0];\n var pt1 = [0, 0];\n var pt2 = [0, 0];\n var vec = [0, 0];\n var verts = parentShape.vertsRef;\n var xform = parentShape.globalXform;\n Point2d.transformMat2d(pt1, verts[idx1], xform);\n Point2d.transformMat2d(pt2, verts[idx2], xform);\n Point2d.sub(vec, pt2, pt1);\n _vec2d2.default.scale(vec, vec, 0.5);\n Point2d.addVec2(pt, pt1, vec);\n selectedInfo.controlIndex = parentShape.insertVert(idx1 + 1, pt);\n } else {\n parentShape.setVertPosition(selectedInfo.controlIndex, worldPos);\n }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmFjdGlvbnMvaW50ZXJhY3QtdXRpbHMuanM/NzE0YiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm1YZm9ybVNoYXBlIiwidHJhbnNsYXRlU2hhcGUiLCJ0cmFuc2xhdGVWZXJ0IiwiUG9pbnQyZCIsInJvdGF0ZU9CQm94Iiwic2hhcGUiLCJwYXJlbnRTaGFwZSIsInNlbGVjdGVkSW5mbyIsInNjcmVlblBvcyIsIndvcmxkUG9zIiwicHQiLCJzY2FsZSIsIk1hdDJkIiwic3ZkIiwib2JqZWN0VG9Xb3JsZE1hdHJpeCIsInN0YXJ0RGlyIiwic3ViIiwic3RhcnRXb3JsZFBvcyIsIlZlYzJkIiwibm9ybWFsaXplIiwiZGlyIiwiYW5nbGUiLCJrZXlzIiwic2hpZnRLZXkiLCJNYXRoIiwicm91bmQiLCJRVUFURVJfUEkiLCJzZXRSb3RhdGlvbiIsInN0YXJ0TG9jYWxSb3QiLCJSQURfVE9fREVHIiwiY2FtZXJhIiwicGFyZW50Iiwib2JqUG9zIiwiZGVsdGFQb3MiLCJkZWx0YURpbXMiLCJyb3RhdGUiLCJ1bmlmb3JtU2NhbGUiLCJ1bmlmb3JtU2NhbGVPbmx5IiwiY2VudGVyU2NhbGUiLCJhbHRLZXkiLCJjZW50ZXJTY2FsZU9ubHkiLCJjb250cm9sSW5kZXgiLCJ4QXhpc0RpciIsInlBeGlzRGlyIiwiZGlhZ0RpciIsIm5lZ2F0ZSIsImFkZCIsImNyb3NzIiwiY3Jvc3MyZCIsImF4aXNUb1VzZSIsIm1pbmRpc3QiLCJkb3QiLCJzaWduIiwic3FydCIsImFkZFZlYzIiLCJjb3B5IiwidHJhbnNmb3JtTWF0MmQiLCJ3b3JsZFRvT2JqZWN0TWF0cml4Iiwic3RhcnRPYmplY3RQb3MiLCJzdGFydExvY2FsUG9zIiwieFNjYWxlIiwieVNjYWxlIiwic2V0UG9zaXRpb24iLCJpZHgiLCJheGlzRGlyIiwic2V0Iiwic2V0U2NhbGUiLCJzdGFydExvY2FsU2NhbGUiLCJzaGFwZVdpZHRoIiwic2hhcGVIZWlnaHQiLCJkaWZmIiwic3RhcnRQb3MiLCJhdGFuMiIsInRyYW5zZm9ybURpciIsImNvcyIsInNpbiIsInRyYW5zZm9ybU1hdDIiLCJzY3JlZW5Ub1dvcmxkTWF0cml4IiwibnVtVmVydHMiLCJpZHgxIiwibWluIiwiaWR4MiIsInB0MSIsInB0MiIsInZlYyIsInZlcnRzIiwidmVydHNSZWYiLCJ4Zm9ybSIsImdsb2JhbFhmb3JtIiwiaW5zZXJ0VmVydCIsInNldFZlcnRQb3NpdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7Ozs7UUE2QmdCQSxtQixHQUFBQSxtQjtRQXVJQUMsYyxHQUFBQSxjO1FBbUJBQyxhLEdBQUFBLGE7O0FBckxoQjs7SUFBWUMsTzs7QUFDWjs7OztBQUNBOzs7Ozs7OztBQUVBLFNBQVNDLFdBQVQsQ0FBcUJDLEtBQXJCLEVBQTRCQyxXQUE1QixFQUF5Q0MsWUFBekMsRUFBdURDLFNBQXZELEVBQWtFQyxRQUFsRSxFQUE0RTtBQUMxRSxNQUFNQyxLQUFLLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBWDtBQUNBLE1BQU1DLFFBQVEsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFkO0FBQ0FDLGtCQUFNQyxHQUFOLENBQVVILEVBQVYsRUFBY0MsS0FBZCxFQUFxQixJQUFyQixFQUEyQkosYUFBYU8sbUJBQXhDO0FBQ0EsTUFBTUMsV0FBVyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWpCO0FBQ0FaLFVBQVFhLEdBQVIsQ0FBWUQsUUFBWixFQUFzQlIsYUFBYVUsYUFBbkMsRUFBa0RQLEVBQWxEO0FBQ0FRLGtCQUFNQyxTQUFOLENBQWdCSixRQUFoQixFQUEwQkEsUUFBMUI7QUFDQSxNQUFNSyxNQUFNVixFQUFaO0FBQ0FQLFVBQVFhLEdBQVIsQ0FBWUksR0FBWixFQUFpQlgsUUFBakIsRUFBMkJDLEVBQTNCO0FBQ0FRLGtCQUFNQyxTQUFOLENBQWdCQyxHQUFoQixFQUFxQkEsR0FBckI7QUFDQSxNQUFJQyxRQUFRSCxnQkFBTUcsS0FBTixDQUFZTixRQUFaLEVBQXNCSyxHQUF0QixDQUFaOztBQUVBLE1BQUliLGFBQWFlLElB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Q0FBU3pFLGFBQWFrQyxZQUFiLEdBQTRCcUMsUUFBckMsRUFBK0NBLFdBQVcsQ0FBMUQsQ0FBYjtBQUNBLFFBQU1HLE9BQVFGLFNBQVNELFdBQVcsQ0FBcEIsR0FBd0IsQ0FBeEIsR0FBNEJDLE9BQU8sQ0FBakQ7QUFDQSxRQUFNckUsS0FBSyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQVg7QUFDQSxRQUFNd0UsTUFBTSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQVo7QUFDQSxRQUFNQyxNQUFNLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBWjtBQUNBLFFBQU1DLE1BQU0sQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFaO0FBQ0EsUUFBTUMsUUFBUS9FLFlBQVlnRixRQUExQjtBQUNBLFFBQU1DLFFBQVFqRixZQUFZa0YsV0FBMUI7QUFDQXJGLFlBQVFxRCxjQUFSLENBQXVCMEIsR0FBdkIsRUFBNEJHLE1BQU1OLElBQU4sQ0FBNUIsRUFBeUNRLEtBQXpDO0FBQ0FwRixZQUFRcUQsY0FBUixDQUF1QjJCLEdBQXZCLEVBQTRCRSxNQUFNSixJQUFOLENBQTVCLEVBQXlDTSxLQUF6QztBQUNBcEYsWUFBUWEsR0FBUixDQUFZb0UsR0FBWixFQUFpQkQsR0FBakIsRUFBc0JELEdBQXRCO0FBQ0FoRSxvQkFBTVAsS0FBTixDQUFZeUUsR0FBWixFQUFpQkEsR0FBakIsRUFBc0IsR0FBdEI7QUFDQWpGLFlBQVFtRCxPQUFSLENBQWdCNUMsRUFBaEIsRUFBb0J3RSxHQUFwQixFQUF5QkUsR0FBekI7QUFDQTdFLGlCQUFha0MsWUFBYixHQUE0Qm5DLFlBQVltRixVQUFaLENBQXVCVixPQUFPLENBQTlCLEVBQWlDckUsRUFBakMsQ0FBNUI7QUFDRCxHQWZELE1BZU87QUFDTEosZ0JBQVlvRixlQUFaLENBQTRCbkYsYUFBYWtDLFlBQXpDLEVBQXVEaEMsUUFBdkQ7QUFDRDtBQUNGIiwiZmlsZSI6IjIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgUG9pbnQyZCBmcm9tIFwiLi4vY29yZS9wb2ludDJkXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQgVmVjMmQgZnJvbSBcIi4uL2NvcmUvdmVjMmRcIlxuXG5mdW5jdGlvbiByb3RhdGVPQkJveChzaGFwZSwgcGFyZW50U2hhcGUsIHNlbGVjdGVkSW5mbywgc2NyZWVuUG9zLCB3b3JsZFBvcykge1xuICBjb25zdCBwdCA9IFswLCAwXVxuICBjb25zdCBzY2FsZSA9IFswLCAwXVxuICBNYXQyZC5zdmQocHQsIHNjYWxlLCBudWxsLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeClcbiAgY29uc3Qgc3RhcnREaXIgPSBbMCwgMF1cbiAgUG9pbnQyZC5zdWIoc3RhcnREaXIsIHNlbGVjdGVkSW5mby5zdGFydFdvcmxkUG9zLCBwdClcbiAgVmVjMmQubm9ybWFsaXplKHN0YXJ0RGlyLCBzdGFydERpcilcbiAgY29uc3QgZGlyID0gcHRcbiAgUG9pbnQyZC5zdWIoZGlyLCB3b3JsZFBvcywgcHQpXG4gIFZlYzJkLm5vcm1hbGl6ZShkaXIsIGRpcilcbiAgbGV0IGFuZ2xlID0gVmVjMmQuYW5nbGUoc3RhcnREaXIsIGRpcilcblxuICBpZiAoc2VsZWN0ZWRJbmZvLmtleXMuc2hpZnRLZXkpIHtcbiAgICBhbmdsZSA9IE1hdGgucm91bmQoYW5nbGUgLyBNYXRoLlFVQVRFUl9QSSkgKiBNYXRoLlFVQVRFUl9QSVxuICB9XG5cbiAgLy8gaWYgKCFjYW1lcmEuaXNZRmxpcHBlZCgpKSB7XG4gIC8vICAgYW5nbGUgKj0gLTFcbiAgLy8gfVxuXG4gIHBhcmVudFNoYXBlLnNldFJvdGF0aW9uKHNlbGVjdGVkSW5mby5zdGFydExvY2FsUm90ICsgTWF0aC5SQURfVE9fREVHICogYW5nbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1YZm9ybVNoYXBlKHNoYXBlLCBzZWxlY3RlZEluZm8sIHNjcmVlblBvcywgd29ybGRQb3MsIGNhbWVyYSkge1xuICBjb25zdCBwYXJlbnRTaGFwZSA9IHNoYXBlLnBhcmVudFxuICBjb25zdCBvYmpQb3MgPSBbMCwgMF1cbiAgY29uc3QgZGVsdGFQb3MgPSBbMCwgMF1cbiAgY29uc3QgZGVsdGFEaW1zID0gWzAsIDBdXG5cbiAgaWYgKHNlbGVjdGVkSW5mby5yb3RhdGUpIHtcbiAgICByb3RhdGVPQkJveChzaGFwZSwgcGFyZW50U2hhcGUsIHNlbGVjdGVkSW5mbywgc2NyZWVuUG9zLCB3b3JsZFBvcywgY2FtZXJhKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdW5pZm9ybVNjYWxlID0gKHNlbGVjdGVkSW5mby5rZXlzLnNoaWZ0S2V5IHx8IHNlbGVjdGVkSW5mby51bmlmb3JtU2NhbGVPbmx5KVxuICBjb25zdCBjZW50ZXJTY2FsZSA9IChzZWxlY3RlZEluZm8ua2V5cy5hbHRLZXkgfHwgc2VsZWN0ZWRJbmZvLmNlbnRlclNjYWxlT25seSlcblxuICAvLyBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzaGFwZSBhdCBzdGFydCBvZiB0cmFuc2Zvcm1cbiAgY29uc3QgcHQgPSBbMCwgMF1cbiAgTWF0MmQuc3ZkKHB0LCBudWxsLCBudWxsLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeClcblxuICAvLyBnZXQgdGhlIG1vdXNlIGRlbHRhIGluIHdvcmxkIHNwYWNlXG4gIFZlYzJkLnN1YihkZWx0YVBvcywgd29ybGRQb3MsIHNlbGVjdGVkSW5mby5zdGFydFdvcmxkUG9zKVxuXG4gIGlmICh1bmlmb3JtU2NhbGUgJiYgc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA8IDQpIHtcbiAgICBjb25zdCB4QXhpc0RpciA9IFtzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeFswXSwgc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXhbMV1dXG4gICAgY29uc3QgeUF4aXNEaXIgPSBbc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXhbMl0sIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4WzNdXVxuICAgIGNvbnN0IGRpYWdEaXIgPSBbMCwgMF1cblxuICAgIGlmIChzZWxlY3RlZEluZm8uY29udHJvbEluZGV4IDwgMikge1xuICAgICAgVmVjMmQubmVnYXRlKHhBeGlzRGlyLCB4QXhpc0RpcilcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggJSAyID09PSAwKSB7XG4gICAgICBWZWMyZC5uZWdhdGUoeUF4aXNEaXIsIHlBeGlzRGlyKVxuICAgIH1cblxuICAgIFZlYzJkLm5vcm1hbGl6ZSh4QXhpc0RpciwgeEF4aXNEaXIpXG4gICAgVmVjMmQubm9ybWFsaXplKHlBeGlzRGlyLCB5QXhpc0RpcilcblxuICAgIFZlYzJkLmFkZChkaWFnRGlyLCB4QXhpc0RpciwgeUF4aXNEaXIpXG4gICAgVmVjMmQubm9ybWFsaXplKGRpYWdEaXIsIGRpYWdEaXIpXG5cbiAgICBjb25zdCBjcm9zcyA9IFZlYzJkLmNyb3NzMmQoZGVsdGFQb3MsIGRpYWdEaXIpXG4gICAgbGV0IGF4aXNUb1VzZSA9IG51bGxcbiAgICBpZiAoc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMCB8fCBzZWxlY3RlZEluZm8uY29udHJvbEluZGV4ID09PSAzKSB7XG4gICAgICBheGlzVG9Vc2UgPSB5QXhpc0RpclxuICAgICAgaWYgKGNyb3NzIDwgMCkge1xuICAgICAgICBheGlzVG9Vc2UgPSB4QXhpc0RpclxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBheGlzVG9Vc2UgPSB4QXhpc0RpclxuICAgICAgaWYgKGNyb3NzIDwgMCkge1xuICAgICAgICBheGlzVG9Vc2UgPSB5QXhpc0RpclxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbWluZGlzdCA9IFZlYzJkLmRvdChkZWx0YVBvcywgYXhpc1RvVXNlKVxuICAgIG1pbmRpc3QgPSBNYXRoLnNpZ24obWluZGlzdCkgKiBNYXRoLnNxcnQoMiAqIG1pbmRpc3QgKiBtaW5kaXN0KVxuICAgIFZlYzJkLnNjYWxlKGRlbHRhUG9zLCBkaWFnRGlyLCBtaW5kaXN0KVxuICAgIFBvaW50MmQuYWRkVmVjMih3b3JsZFBvcywgc2VsZWN0ZWRJbmZvLnN0YXJ0V29ybGRQb3MsIGRlbHRhUG9zKVxuICB9XG5cbiAgLy8gZmlyc3QgY29udmVydCB3b3JsZCBwb2ludCB0byBvYmplY3Qgc3BhY2VcbiAgUG9pbnQyZC5jb3B5KG9ialBvcywgd29ybGRQb3MpXG4gIFBvaW50MmQudHJhbnNmb3JtTWF0MmQob2JqUG9zLCBvYmpQb3MsIHNlbGVjdGVkSW5mby53b3JsZFRvT2JqZWN0TWF0cml4KVxuXG4gIC8vIGdldCB0aGUgbW91c2UgZGVsdGEgaW4gb2JqZWN0IHNwYWNlIGFuZCBtdWx0aXB5IGJ5IHRoZVxuICAvLyBzY2FsZSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0IGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhbnNmb3JtXG4gIC8vIHRvIGdldCB0aGUgc2NhbGUgZGVsdGEgaW4gb2JqZWN0IHNwYWNlXG4gIFZlYzJkLnN1YihkZWx0YURpbXMsIG9ialBvcywgc2VsZWN0ZWRJbmZvLnN0YXJ0T2JqZWN0UG9zKVxuXG4gIFBvaW50MmQuY29weShwdCwgc2VsZWN0ZWRJbmZvLnN0YXJ0TG9jYWxQb3MpXG5cbiAgLy8gbm93IGRldGVybWluZSB0aGUgdHJhbnNmb3JtIGRpcmVjdGlvbiBkZXBlbmRpbmdcbiAgLy8gb24gd2hpY2ggY29udHJvbCB2ZXJ0ZXggb2YgdGhlIG9iamVjdC1vcmllbnRlZCBib3VuZHNcbiAgLy8gd2FzIHNlbGVjdGVkXG4gIGxldCB4U2NhbGUgPSAwXG4gIGxldCB5U2NhbGUgPSAwXG4gIGlmIChzZWxlY3RlZEluZm8uY29udHJvbEluZGV4IDwgNCkge1xuICAgIC8vIGRyYWdnaW5nIGEgY29ybmVyIHZlcnRleFxuICAgIHhTY2FsZSA9IChzZWxlY3RlZEluZm8uY29udHJvbEluZGV4IDwgMiA/IC0xIDogMSlcbiAgICB5U2NhbGUgPSAoc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCAlIDIgPT09IDAgPyAtMSA6IDEpXG5cbiAgICAvLyBjYW4gdHJhbnNsYXRlIGJhc2VkIG9uIHRoZSBtb3VzZSBkZWx0YSBpbiB3b3JsZCBzcGFjZVxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byBvZmZzZXQgdGhlIHNjYWxlLCB3aGljaCBpcyBkb25lIGF0XG4gICAgLy8gdGhlIHNoYXBlJ3MgY2VudGVyLiBUaGlzIHVsdGltYXRlbHkgYWN0cyBhcyBhIHBpdm90XG4gICAgLy8gZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbi4gT25seSBkbyB0aGlzIGlmIHRoZSBhbHQga2V5XG4gICAgLy8gaXNuJ3QgcHJlc3NlZFxuICAgIGlmICghY2VudGVyU2NhbGUpIHtcbiAgICAgIFBvaW50MmQuYWRkVmVjMihwdCwgcHQsIFZlYzJkLnNjYWxlKGRlbHRhUG9zLCBkZWx0YVBvcywgMC41KSlcbiAgICB9XG5cbiAgICBwYXJlbnRTaGFwZS5zZXRQb3NpdGlvbihwdClcbiAgfSBlbHNlIHtcbiAgICAvLyBkcmFnZ2luZyBhIHNpZGUgdmVydGV4LCB3aGljaCBtZWFucyB3ZSBvbmx5IHNjYWxlIGluXG4gICAgLy8gb25lIGRpbWVuc2lvbiwgcmF0aGVyIHRoYW4gMi4gU28gd2UgbmVlZCB0byBmaWd1cmVcbiAgICAvLyBvdXQgdGhhdCBkaXJlY3Rpb24gYmFzZWQgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZVxuICAgIC8vIHNoYXBlXG4gICAgY29uc3QgaWR4ID0gc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCAtIDRcbiAgICBjb25zdCBheGlzRGlyID0gWzAsIDBdXG4gICAgaWYgKGlkeCAlIDIgPT09IDApIHtcbiAgICAgIC8vIHNjYWxpbmcgaW4gdGhlIG9iamVjdCdzIFggZGlyZWN0aW9uXG4gICAgICBWZWMyZC5zZXQoYXhpc0Rpciwgc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXhbMF0sIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4WzFdKVxuICAgICAgeVNjYWxlID0gMFxuICAgICAgeFNjYWxlID0gKGlkeCA8IDIgPyAtMSA6IDEpXG4gICAgICBpZiAodW5pZm9ybVNjYWxlKSB7XG4gICAgICAgIHlTY2FsZSA9IHhTY2FsZVxuICAgICAgICBkZWx0YURpbXNbMV0gPSBkZWx0YURpbXNbMF1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2NhbGluZyBpbiB0aGUgb2JqZWN0J3MgWSBkaXJlY3Rpb25cbiAgICAgIFZlYzJkLnNldChheGlzRGlyLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeFsyXSwgc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXhbM10pXG4gICAgICB4U2NhbGUgPSAwXG4gICAgICB5U2NhbGUgPSAoaWR4IDwgMiA/IC0xIDogMSlcbiAgICAgIGlmICh1bmlmb3JtU2NhbGUpIHtcbiAgICAgICAgeFNjYWxlID0geVNjYWxlXG4gICAgICAgIGRlbHRhRGltc1swXSA9IGRlbHRhRGltc1sxXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdyBmaW5kIHRoZSBwaXZvdCBvZmZzZXQgZm9yIHRoZSBheGlzLWFsaWduZWQgc2NhbGVcbiAgICBpZiAoIWNlbnRlclNjYWxlKSB7XG4gICAgICBWZWMyZC5ub3JtYWxpemUoYXhpc0RpciwgYXhpc0RpcilcbiAgICAgIFZlYzJkLnNjYWxlKGF4aXNEaXIsIGF4aXNEaXIsIFZlYzJkLmRvdChkZWx0YVBvcywgYXhpc0RpcikpXG4gICAgICBQb2ludDJkLmFkZFZlYzIocHQsIHB0LCBWZWMyZC5zY2FsZShheGlzRGlyLCBheGlzRGlyLCAwLjUpKVxuICAgIH1cblxuICAgIHBhcmVudFNoYXBlLnNldFBvc2l0aW9uKHB0KVxuICB9XG5cbiAgaWYgKGNlbnRlclNjYWxlKSB7XG4gICAgeFNjYWxlICo9IDJcbiAgICB5U2NhbGUgKj0gMlxuICB9XG5cbiAgLy8gcGVyZm9ybSB0aGUgc2NhbGVcbiAgcGFyZW50U2hhcGUuc2V0U2NhbGUoW3NlbGVjdGVkSW5mby5zdGFydExvY2FsU2NhbGVbMF0gKiAoMSArIHhTY2FsZSAqIGRlbHRhRGltc1swXSAvIHNlbGVjdGVkSW5mby5zaGFwZVdpZHRoKSwgc2VsZWN0ZWRJbmZvLnN0YXJ0TG9jYWxTY2FsZVsxXSAqICgxICsgeVNjYWxlICogZGVsdGFEaW1zWzFdIC8gc2VsZWN0ZWRJbmZvLnNoYXBlSGVpZ2h0KV0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTaGFwZShzaGFwZSwgc2VsZWN0ZWRJbmZvLCBzY3JlZW5Qb3MsIHdvcmxkUG9zLCBjYW1lcmEpIHtcbiAgY29uc3QgZGlmZiA9IFswLCAwXVxuICBjb25zdCBwdCA9IFswLCAwXVxuICBNYXQyZC5zdmQocHQsIG51bGwsIG51bGwsIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4KVxuICBpZiAoc2VsZWN0ZWRJbmZvLmtleXMuc2hpZnRLZXkpIHtcbiAgICBQb2ludDJkLnN1YihkaWZmLCBzY3JlZW5Qb3MsIHNlbGVjdGVkSW5mby5zdGFydFBvcylcbiAgICBsZXQgYW5nbGUgPSBNYXRoLmF0YW4yKGRpZmZbMV0sIGRpZmZbMF0pXG4gICAgYW5nbGUgPSBNYXRoLnJvdW5kKGFuZ2xlIC8gTWF0aC5RVUFURVJfUEkpICogTWF0aC5RVUFURVJfUElcbiAgICBjb25zdCB0cmFuc2Zvcm1EaXIgPSBbTWF0aC5jb3MoYW5nbGUpLCBNYXRoLnNpbihhbmdsZSldXG4gICAgVmVjMmQuc2NhbGUoZGlmZiwgdHJhbnNmb3JtRGlyLCBWZWMyZC5kb3QoZGlmZiwgdHJhbnNmb3JtRGlyKSlcbiAgICBWZWMyZC50cmFuc2Zvcm1NYXQyKGRpZmYsIGRpZmYsIGNhbWVyYS5zY3JlZW5Ub1dvcmxkTWF0cml4KVxuICB9IGVsc2Uge1xuICAgIFZlYzJkLnN1YihkaWZmLCB3b3JsZFBvcywgc2VsZWN0ZWRJbmZvLnN0YXJ0V29ybGRQb3MpXG4gIH1cbiAgUG9pbnQyZC5hZGRWZWMyKHB0LCBzZWxlY3RlZEluZm8uc3RhcnRMb2NhbFBvcywgZGlmZilcblxuICBzaGFwZS5zZXRQb3NpdGlvbihwdClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZVZlcnQoc2hhcGUsIHNlbGVjdGVkSW5mbywgc2NyZWVuUG9zLCB3b3JsZFBvcykge1xuICBjb25zdCBwYXJlbnRTaGFwZSA9IHNoYXBlLnBhcmVudFxuXG4gIC8vIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHNoYXBlIGF0IHN0YXJ0IG9mIHRyYW5zZm9ybVxuICAvLyBjb25zdCBwdCA9IFswLCAwXVxuICAvLyBNYXQyZC5zdmQocHQsIG51bGwsIG51bGwsIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4KVxuXG4gIC8vIGdldCB0aGUgbW91c2UgZGVsdGEgaW4gd29ybGQgc3BhY2VcbiAgLy8gVmVjMmQuc3ViKGRlbHRhUG9zLCB3b3JsZFBvcywgc2VsZWN0ZWRJbmZvLnN0YXJ0V29ybGRQb3MpXG5cbiAgLy8gZmlyc3QgY29udmVydCB3b3JsZCBwb2ludCB0byBvYmplY3Qgc3BhY2VcbiAgLy8gUG9pbnQyZC5jb3B5KG9ialBvcywgd29ybGRQb3MpXG4gIC8vIFBvaW50MmQudHJhbnNmb3JtTWF0MmQob2JqUG9zLCBvYmpQb3MsIHNlbGVjdGVkSW5mby53b3JsZFRvT2JqZWN0TWF0cml4KVxuXG4gIC8vIGdldCB0aGUgZGlmZlxuICAvLyBjb25zdCBkaWZmID0gb2JqUG9zXG4gIC8vIFBvaW50MmQuc3ViKGRpZmYsIG9ialBvcywgc2VsZWN0ZWRJbmZvLnN0YXJ0T2JqZWN0UG9zKVxuXG4gIGNvbnN0IG51bVZlcnRzID0gcGFyZW50U2hhcGUubnVtVmVydHNcbiAgaWYgKHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggPj0gbnVtVmVydHMpIHtcbiAgICBjb25zdCBpZHgxID0gTWF0aC5taW4oc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCAtIG51bVZlcnRzLCBudW1WZXJ0cyAtIDEpXG4gICAgY29uc3QgaWR4MiA9IChpZHgxID09PSBudW1WZXJ0cyAtIDEgPyAwIDogaWR4MSArIDEpXG4gICAgY29uc3QgcHQgPSBbMCwgMF1cbiAgICBjb25zdCBwdDEgPSBbMCwgMF1cbiAgICBjb25zdCBwdDIgPSBbMCwgMF1cbiAgICBjb25zdCB2ZWMgPSBbMCwgMF1cbiAgICBjb25zdCB2ZXJ0cyA9IHBhcmVudFNoYXBlLnZlcnRzUmVmXG4gICAgY29uc3QgeGZvcm0gPSBwYXJlbnRTaGFwZS5nbG9iYWxYZm9ybVxuICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQocHQxLCB2ZXJ0c1tpZHgxXSwgeGZvcm0pXG4gICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZChwdDIsIHZlcnRzW2lkeDJdLCB4Zm9ybSlcbiAgICBQb2ludDJkLnN1Yih2ZWMsIHB0MiwgcHQxKVxuICAgIFZlYzJkLnNjYWxlKHZlYywgdmVjLCAwLjUpXG4gICAgUG9pbnQyZC5hZGRWZWMyKHB0LCBwdDEsIHZlYylcbiAgICBzZWxlY3RlZEluZm8uY29udHJvbEluZGV4ID0gcGFyZW50U2hhcGUuaW5zZXJ0VmVydChpZHgxICsgMSwgcHQpXG4gIH0gZWxzZSB7XG4gICAgcGFyZW50U2hhcGUuc2V0VmVydFBvc2l0aW9uKHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXgsIHdvcmxkUG9zKVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9pbnRlcmFjdGlvbnMvaW50ZXJhY3QtdXRpbHMuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 21 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 3 Dimensional Vector\n * @name vec3\n */\nvar vec3 = {};\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nvec3.create = function() {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n return out;\n};\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nvec3.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n};\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nvec3.fromValues = function(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nvec3.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n};\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nvec3.set = function(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nvec3.sub = vec3.subtract;\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nvec3.mul = vec3.multiply;\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nvec3.div = vec3.divide;\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to ceil\n * @returns {vec3} out\n */\nvec3.ceil = function (out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n};\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to floor\n * @returns {vec3} out\n */\nvec3.floor = function (out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n};\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n};\n\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to round\n * @returns {vec3} out\n */\nvec3.round = function (out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n};\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nvec3.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n};\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nvec3.scaleAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nvec3.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2];\n return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nvec3.dist = vec3.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec3.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2];\n return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nvec3.sqrDist = vec3.squaredDistance;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec3.length = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nvec3.len = vec3.length;\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec3.squaredLength = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nvec3.sqrLen = vec3.squaredLength;\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nvec3.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n};\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\nvec3.inverse = function(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n};\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nvec3.normalize = function(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var len = x*x + y*y + z*z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec3.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n};\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.cross = function(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2],\n bx = b[0], by = b[1], bz = b[2];\n\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n};\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n};\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.hermite = function (out, a, b, c, d, t) {\n var factorTimes2 = t * t,\n factor1 = factorTimes2 * (2 * t - 3) + 1,\n factor2 = factorTimes2 * (t - 2) + t,\n factor3 = factorTimes2 * (t - 1),\n factor4 = factorTimes2 * (3 - 2 * t);\n \n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n \n return out;\n};\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.bezier = function (out, a, b, c, d, t) {\n var inverseFactor = 1 - t,\n inverseFactorTimesTwo = inverseFactor * inverseFactor,\n factorTimes2 = t * t,\n factor1 = inverseFactorTimesTwo * inverseFactor,\n factor2 = 3 * t * inverseFactorTimesTwo,\n factor3 = 3 * factorTimes2 * inverseFactor,\n factor4 = factorTimes2 * t;\n \n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n \n return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\nvec3.random = function (out, scale) {\n scale = scale || 1.0;\n\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = (glMatrix.RANDOM() * 2.0) - 1.0;\n var zScale = Math.sqrt(1.0-z*z) * scale;\n\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n};\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat4 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2],\n w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n};\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat3 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n};\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nvec3.transformQuat = function(out, a, q) {\n // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations\n\n var x = a[0], y = a[1], z = a[2],\n qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n // calculate quat * vec\n ix = qw * x + qy * z - qz * y,\n iy = qw * y + qz * x - qx * z,\n iz = qw * z + qx * y - qy * x,\n iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return out;\n};\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateX = function(out, a, b, c){\n var p = [], r=[];\n\t //Translate point to the origin\n\t p[0] = a[0] - b[0];\n\t p[1] = a[1] - b[1];\n \tp[2] = a[2] - b[2];\n\n\t //perform rotation\n\t r[0] = p[0];\n\t r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c);\n\t r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c);\n\n\t //translate to correct position\n\t out[0] = r[0] + b[0];\n\t out[1] = r[1] + b[1];\n\t out[2] = r[2] + b[2];\n\n \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateY = function(out, a, b, c){\n \tvar p = [], r=[];\n \t//Translate point to the origin\n \tp[0] = a[0] - b[0];\n \tp[1] = a[1] - b[1];\n \tp[2] = a[2] - b[2];\n \n \t//perform rotation\n \tr[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c);\n \tr[1] = p[1];\n \tr[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c);\n \n \t//translate to correct position\n \tout[0] = r[0] + b[0];\n \tout[1] = r[1] + b[1];\n \tout[2] = r[2] + b[2];\n \n \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateZ = function(out, a, b, c){\n \tvar p = [], r=[];\n \t//Translate point to the origin\n \tp[0] = a[0] - b[0];\n \tp[1] = a[1] - b[1];\n \tp[2] = a[2] - b[2];\n \n \t//perform rotation\n \tr[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c);\n \tr[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c);\n \tr[2] = p[2];\n \n \t//translate to correct position\n \tout[0] = r[0] + b[0];\n \tout[1] = r[1] + b[1];\n \tout[2] = r[2] + b[2];\n \n \treturn out;\n};\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec3.forEach = (function() {\n var vec = vec3.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 3;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2];\n }\n \n return a;\n };\n})();\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nvec3.angle = function(a, b) {\n \n var tempA = vec3.fromValues(a[0], a[1], a[2]);\n var tempB = vec3.fromValues(b[0], b[1], b[2]);\n \n vec3.normalize(tempA, tempA);\n vec3.normalize(tempB, tempB);\n \n var cosine = vec3.dot(tempA, tempB);\n\n if(cosine > 1.0){\n return 0;\n } else {\n return Math.acos(cosine);\n } \n};\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec3.str = function (a) {\n return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.equals = function (a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2];\n var b0 = b[0], b1 = b[1], b2 = b[2];\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)));\n};\n\nmodule.exports = vec3;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWMzLmpzP2RkOGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSx1QkFBdUIsT0FBTztBQUM5QiwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEs7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDMgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMzXG4gKi9cbnZhciB2ZWMzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3ViID0gdmVjMy5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5tdWwgPSB2ZWMzLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGl2ID0gdmVjMy5kaXZpZGU7XG5cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jZWlsID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5mbG9vciA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICAgIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yb3VuZCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGlzdCA9IHZlYzMuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyRGlzdCA9IHZlYzMuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzMubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5sZW4gPSB2ZWMzLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMzLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6Kno7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyTGVuID0gdmVjMy5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmhlcm1pdGUgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDEsXG4gICAgICBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQsXG4gICAgICBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKSxcbiAgICAgIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgXG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIFxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuYmV6aWVyID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0LFxuICAgICAgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3IsXG4gICAgICBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvLFxuICAgICAgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIFxuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICBcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuXG4gICAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gICAgdmFyIHogPSAoZ2xNYXRyaXguUkFORE9NKCkgKiAyLjApIC0gMS4wO1xuICAgIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wLXoqeikgKiBzY2FsZTtcblxuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICAgIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICAgIHcgPSB3IHx8IDEuMDtcbiAgICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0My5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gdGhlIDN4MyBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG4gICAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICAgIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgICBvdXRbMl0gPSB4ICogbVsyXSArIHkgKiBtWzVdICsgeiAqIG1bOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIC8vIGJlbmNobWFya3M6IGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSxcbiAgICAgICAgcXggPSBxWzBdLCBxeSA9IHFbMV0sIHF6ID0gcVsyXSwgcXcgPSBxWzNdLFxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG4gICAgICAgIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5LFxuICAgICAgICBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogeixcbiAgICAgICAgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHgsXG4gICAgICAgIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHt2ZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yb3RhdGVYID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBjKXtcbiAgIHZhciBwID0gW10sIHI9W107XG5cdCAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXHQgIHBbMF0gPSBhWzBdIC0gYlswXTtcblx0ICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuXG5cdCAgLy9wZXJmb3JtIHJvdGF0aW9uXG5cdCAgclswXSA9IHBbMF07XG5cdCAgclsxXSA9IHBbMV0qTWF0aC5jb3MoYykgLSBwWzJdKk1hdGguc2luKGMpO1xuXHQgIHJbMl0gPSBwWzFdKk1hdGguc2luKGMpICsgcFsyXSpNYXRoLmNvcyhjKTtcblxuXHQgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblx0ICBvdXRbMF0gPSByWzBdICsgYlswXTtcblx0ICBvdXRbMV0gPSByWzFdICsgYlsxXTtcblx0ICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFsyXSpNYXRoLnNpbihjKSArIHBbMF0qTWF0aC5jb3MoYyk7XG4gIFx0clsxXSA9IHBbMV07XG4gIFx0clsyXSA9IHBbMl0qTWF0aC5jb3MoYykgLSBwWzBdKk1hdGguc2luKGMpO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVogPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFswXSpNYXRoLmNvcyhjKSAtIHBbMV0qTWF0aC5zaW4oYyk7XG4gIFx0clsxXSA9IHBbMF0qTWF0aC5zaW4oYykgKyBwWzFdKk1hdGguY29zKGMpO1xuICBcdHJbMl0gPSBwWzJdO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDM7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07IGFbaSsyXSA9IHZlY1syXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbnZlYzMuYW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7XG4gICBcbiAgICB2YXIgdGVtcEEgPSB2ZWMzLmZyb21WYWx1ZXMoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgdmFyIHRlbXBCID0gdmVjMy5mcm9tVmFsdWVzKGJbMF0sIGJbMV0sIGJbMl0pO1xuIFxuICAgIHZlYzMubm9ybWFsaXplKHRlbXBBLCB0ZW1wQSk7XG4gICAgdmVjMy5ub3JtYWxpemUodGVtcEIsIHRlbXBCKTtcbiBcbiAgICB2YXIgY29zaW5lID0gdmVjMy5kb3QodGVtcEEsIHRlbXBCKTtcblxuICAgIGlmKGNvc2luZSA+IDEuMCl7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgICB9ICAgICBcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzMuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzMoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG52ZWMzLmV4YWN0RXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzMuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXTtcbiAgICByZXR1cm4gKE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB2ZWMzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWMzLmpzXG4vLyBtb2R1bGUgaWQgPSAyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9"); + eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _glMatrix = __webpack_require__(1);\n\nvar _baseShape = __webpack_require__(6);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar VertEditableShape = function (_BaseShape) {\n _inherits(VertEditableShape, _BaseShape);\n\n function VertEditableShape(baseVertShape, opts) {\n _classCallCheck(this, VertEditableShape);\n\n var _this = _possibleConstructorReturn(this, (VertEditableShape.__proto__ || Object.getPrototypeOf(VertEditableShape)).call(this, opts));\n\n _this._baseVertShape = baseVertShape;\n _this._vertRadius = 4;\n _this._transformedVerts = [];\n _this._baseaabox = AABox2d.create();\n _this._worldToScreenMatrix = _glMatrix.mat2d.create();\n return _this;\n }\n\n _createClass(VertEditableShape, [{\n key: \"_updateAABox\",\n value: function _updateAABox(worldToScreenMatrix) {\n var aabox = this._baseVertShape.aabox;\n if (!AABox2d.equals(aabox, this._baseaabox) || !_glMatrix.mat2d.equals(worldToScreenMatrix, this._worldToScreenMatrix)) {\n AABox2d.copy(this._baseaabox, aabox);\n _glMatrix.mat2d.copy(this._worldToScreenMatrix, worldToScreenMatrix);\n AABox2d.transformMat2d(this._aabox, this._baseaabox, this._worldToScreenMatrix);\n var pad = this._vertRadius + this.strokeWidth;\n AABox2d.expand(this._aabox, this._aabox, [pad, pad]);\n }\n }\n }, {\n key: \"containsPoint\",\n value: function containsPoint(screenPt, worldPt, worldToScreenMatrix, ctx) {\n // Should we update here, or is it safe to\n // say that this is stateful, meaning a render\n // should have been performed beforehand which\n // would've updated its state\n var rtnObj = {\n hit: false,\n controlIndex: -1\n };\n\n this._updateAABox(worldToScreenMatrix);\n if (this.visible && AABox2d.containsPt(this._aabox, screenPt)) {\n var aabox = AABox2d.create();\n var pad = this._vertRadius + this.strokeWidth / 2;\n var extents = [pad, pad];\n\n var i = 0;\n for (i = 0; i < this._transformedVerts.length; i += 1) {\n AABox2d.initCenterExtents(aabox, this._transformedVerts[i], extents);\n if (AABox2d.containsPt(aabox, screenPt)) {\n rtnObj.hit = true;\n rtnObj.controlIndex = i;\n break;\n }\n }\n\n if (!rtnObj.hit) {\n var tmpPt = [0, 0];\n var tmpVec = [0, 0];\n var radius = ctx.lineWidth * 1.5;\n _glMatrix.vec2.set(extents, radius, radius);\n for (i = 0; i < this._transformedVerts.length - 1; i += 1) {\n Point2d.sub(tmpVec, this._transformedVerts[i + 1], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n AABox2d.initCenterExtents(aabox, tmpPt, extents);\n if (AABox2d.containsPt(aabox, screenPt)) {\n rtnObj.hit = true;\n rtnObj.controlIndex = this._transformedVerts.length + i;\n break;\n }\n }\n\n if (i > 0 && i === this._transformedVerts.length - 1) {\n Point2d.sub(tmpVec, this._transformedVerts[0], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n AABox2d.initCenterExtents(aabox, tmpPt, extents);\n if (AABox2d.containsPt(aabox, screenPt)) {\n rtnObj.hit = true;\n rtnObj.controlIndex = this._transformedVerts.length + i;\n }\n }\n }\n }\n\n return rtnObj;\n }\n }, {\n key: \"renderBounds\",\n value: function renderBounds(ctx, worldToScreenMatrix, boundsStrokeStyle) {\n // we're storing our AABox in screen space here, so worldToScreenMatrix is\n // unused\n this._updateAABox(worldToScreenMatrix);\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n boundsStrokeStyle.setStrokeCtx(ctx);\n var center = [0, 0];\n var extents = [0, 0];\n AABox2d.getCenter(center, this._aabox);\n AABox2d.getExtents(extents, this._aabox);\n ctx.beginPath();\n ctx.rect(center[0] - extents[0], center[1] - extents[1], extents[0] * 2, extents[1] * 2);\n ctx.stroke();\n ctx.restore();\n }\n }, {\n key: \"render\",\n value: function render(ctx) {\n var _this2 = this;\n\n ctx.save();\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n var objToScreenMatrix = this._baseVertShape._fullXform;\n var verts = this._baseVertShape.vertsRef;\n this._transformedVerts = new Array(verts.length);\n var tmpPt = [0, 0];\n var tmpVec = [0, 0];\n\n ctx.beginPath();\n var i = 0;\n this._transformedVerts[i] = [0, 0];\n Point2d.transformMat2d(this._transformedVerts[i], verts[i], objToScreenMatrix);\n\n var radius = Math.max(ctx.lineWidth * 1.5, 2.5);\n for (i = 0; i < verts.length - 1; i += 1) {\n this._transformedVerts[i + 1] = [0, 0];\n Point2d.transformMat2d(this._transformedVerts[i + 1], verts[i + 1], objToScreenMatrix);\n Point2d.sub(tmpVec, this._transformedVerts[i + 1], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n\n ctx.moveTo(tmpPt[0] + radius, tmpPt[1]);\n ctx.arc(tmpPt[0], tmpPt[1], radius, 0, Math.TWO_PI);\n }\n\n if (i > 0) {\n Point2d.sub(tmpVec, this._transformedVerts[0], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n ctx.moveTo(tmpPt[0] + radius, tmpPt[1]);\n ctx.arc(tmpPt[0], tmpPt[1], radius, 0, Math.TWO_PI);\n\n // TODO(croot): Is this appropriate? Can the fill/stroke style\n // be cross compatible? What about gradients/patterns?\n // We can probably safely assume no gradients/patterns at\n // this point\n ctx.fillStyle = ctx.strokeStyle;\n ctx.fill();\n }\n\n ctx.beginPath();\n\n this._transformedVerts.forEach(function (vert) {\n ctx.moveTo(vert[0] + _this2._vertRadius, vert[1]);\n ctx.arc(vert[0], vert[1], _this2._vertRadius, 0, Math.TWO_PI);\n });\n\n if (this.isFillVisible()) {\n this.setFillCtx(ctx);\n ctx.fill();\n }\n\n if (this.isStrokeVisible()) {\n this.setStrokeCtx(ctx);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }]);\n\n return VertEditableShape;\n}(_baseShape2.default);\n\nexports.default = VertEditableShape;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmFjdGlvbnMvdmVydC1lZGl0YWJsZS1zaGFwZS5qcz80ZWQzIl0sIm5hbWVzIjpbIkFBQm94MmQiLCJQb2ludDJkIiwiVmVydEVkaXRhYmxlU2hhcGUiLCJiYXNlVmVydFNoYXBlIiwib3B0cyIsIl9iYXNlVmVydFNoYXBlIiwiX3ZlcnRSYWRpdXMiLCJfdHJhbnNmb3JtZWRWZXJ0cyIsIl9iYXNlYWFib3giLCJjcmVhdGUiLCJfd29ybGRUb1NjcmVlbk1hdHJpeCIsIk1hdDJkIiwid29ybGRUb1NjcmVlbk1hdHJpeCIsImFhYm94IiwiZXF1YWxzIiwiY29weSIsInRyYW5zZm9ybU1hdDJkIiwiX2FhYm94IiwicGFkIiwic3Ryb2tlV2lkdGgiLCJleHBhbmQiLCJzY3JlZW5QdCIsIndvcmxkUHQiLCJjdHgiLCJydG5PYmoiLCJoaXQiLCJjb250cm9sSW5kZXgiLCJfdXBkYXRlQUFCb3giLCJ2aXNpYmxlIiwiY29udGFpbnNQdCIsImV4dGVudHMiLCJpIiwibGVuZ3RoIiwiaW5pdENlbnRlckV4dGVudHMiLCJ0bXBQdCIsInRtcFZlYyIsInJhZGl1cyIsImxpbmVXaWR0aCIsIlZlYzJkIiwic2V0Iiwic3ViIiwic2NhbGUiLCJhZGRWZWMyIiwiYm91bmRzU3Ryb2tlU3R5bGUiLCJzYXZlIiwic2V0VHJhbnNmb3JtIiwic2V0U3Ryb2tlQ3R4IiwiY2VudGVyIiwiZ2V0Q2VudGVyIiwiZ2V0RXh0ZW50cyIsImJlZ2luUGF0aCIsInJlY3QiLCJzdHJva2UiLCJyZXN0b3JlIiwib2JqVG9TY3JlZW5NYXRyaXgiLCJfZnVsbFhmb3JtIiwidmVydHMiLCJ2ZXJ0c1JlZiIsIkFycmF5IiwiTWF0aCIsIm1heCIsIm1vdmVUbyIsImFyYyIsIlRXT19QSSIsImZpbGxTdHlsZSIsInN0cm9rZVN0eWxlIiwiZmlsbCIsImZvckVhY2giLCJ2ZXJ0IiwiaXNGaWxsVmlzaWJsZSIsInNldEZpbGxDdHgiLCJpc1N0cm9rZVZpc2libGUiLCJCYXNl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QXBCO0FBQ0ExQyxZQUFJMkMsSUFBSjtBQUNEOztBQUVEM0MsVUFBSTJCLFNBQUo7O0FBRUEsV0FBSzNDLGlCQUFMLENBQXVCNEQsT0FBdkIsQ0FBK0IsZ0JBQVE7QUFDckM1QyxZQUFJc0MsTUFBSixDQUFXTyxLQUFLLENBQUwsSUFBVSxPQUFLOUQsV0FBMUIsRUFBdUM4RCxLQUFLLENBQUwsQ0FBdkM7QUFDQTdDLFlBQUl1QyxHQUFKLENBQVFNLEtBQUssQ0FBTCxDQUFSLEVBQWlCQSxLQUFLLENBQUwsQ0FBakIsRUFBMEIsT0FBSzlELFdBQS9CLEVBQTRDLENBQTVDLEVBQStDcUQsS0FBS0ksTUFBcEQ7QUFDRCxPQUhEOztBQUtBLFVBQUksS0FBS00sYUFBTCxFQUFKLEVBQTBCO0FBQ3hCLGFBQUtDLFVBQUwsQ0FBZ0IvQyxHQUFoQjtBQUNBQSxZQUFJMkMsSUFBSjtBQUNEOztBQUVELFVBQUksS0FBS0ssZUFBTCxFQUFKLEVBQTRCO0FBQzFCLGFBQUt6QixZQUFMLENBQWtCdkIsR0FBbEI7QUFDQUEsWUFBSTZCLE1BQUo7QUFDRDs7QUFFRDdCLFVBQUk4QixPQUFKO0FBQ0Q7Ozs7RUE3SjRDbUIsbUI7O2tCQUExQnRFLGlCIiwiZmlsZSI6IjIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQge21hdDJkIGFzIE1hdDJkLCB2ZWMyIGFzIFZlYzJkfSBmcm9tIFwiZ2wtbWF0cml4XCJcbmltcG9ydCBCYXNlU2hhcGUgZnJvbSBcIi4uL3NoYXBlcy9iYXNlLXNoYXBlXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydEVkaXRhYmxlU2hhcGUgZXh0ZW5kcyBCYXNlU2hhcGUge1xuICBjb25zdHJ1Y3RvcihiYXNlVmVydFNoYXBlLCBvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl9iYXNlVmVydFNoYXBlID0gYmFzZVZlcnRTaGFwZVxuICAgIHRoaXMuX3ZlcnRSYWRpdXMgPSA0XG4gICAgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0cyA9IFtdXG4gICAgdGhpcy5fYmFzZWFhYm94ID0gQUFCb3gyZC5jcmVhdGUoKVxuICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5NYXRyaXggPSBNYXQyZC5jcmVhdGUoKVxuICB9XG5cbiAgX3VwZGF0ZUFBQm94KHdvcmxkVG9TY3JlZW5NYXRyaXgpIHtcbiAgICBjb25zdCBhYWJveCA9IHRoaXMuX2Jhc2VWZXJ0U2hhcGUuYWFib3hcbiAgICBpZiAoIUFBQm94MmQuZXF1YWxzKGFhYm94LCB0aGlzLl9iYXNlYWFib3gpIHx8ICFNYXQyZC5lcXVhbHMod29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeCkpIHtcbiAgICAgIEFBQm94MmQuY29weSh0aGlzLl9iYXNlYWFib3gsIGFhYm94KVxuICAgICAgTWF0MmQuY29weSh0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4LCB3b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgICAgQUFCb3gyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl9hYWJveCwgdGhpcy5fYmFzZWFhYm94LCB0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgICAgY29uc3QgcGFkID0gdGhpcy5fdmVydFJhZGl1cyArIHRoaXMuc3Ryb2tlV2lkdGhcbiAgICAgIEFBQm94MmQuZXhwYW5kKHRoaXMuX2FhYm94LCB0aGlzLl9hYWJveCwgW3BhZCwgcGFkXSlcbiAgICB9XG4gIH1cblxuICBjb250YWluc1BvaW50KHNjcmVlblB0LCB3b3JsZFB0LCB3b3JsZFRvU2NyZWVuTWF0cml4LCBjdHgpIHtcbiAgICAvLyBTaG91bGQgd2UgdXBkYXRlIGhlcmUsIG9yIGlzIGl0IHNhZmUgdG9cbiAgICAvLyBzYXkgdGhhdCB0aGlzIGlzIHN0YXRlZnVsLCBtZWFuaW5nIGEgcmVuZGVyXG4gICAgLy8gc2hvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgYmVmb3JlaGFuZCB3aGljaFxuICAgIC8vIHdvdWxkJ3ZlIHVwZGF0ZWQgaXRzIHN0YXRlXG4gICAgY29uc3QgcnRuT2JqID0ge1xuICAgICAgaGl0OiBmYWxzZSxcbiAgICAgIGNvbnRyb2xJbmRleDogLTFcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVBQUJveCh3b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgIGlmICh0aGlzLnZpc2libGUgJiYgQUFCb3gyZC5jb250YWluc1B0KHRoaXMuX2FhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgIGNvbnN0IGFhYm94ID0gQUFCb3gyZC5jcmVhdGUoKVxuICAgICAgY29uc3QgcGFkID0gdGhpcy5fdmVydFJhZGl1cyArIHRoaXMuc3Ryb2tlV2lkdGggLyAyXG4gICAgICBjb25zdCBleHRlbnRzID0gW3BhZCwgcGFkXVxuXG4gICAgICBsZXQgaSA9IDBcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIEFBQm94MmQuaW5pdENlbnRlckV4dGVudHMoYWFib3gsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0sIGV4dGVudHMpXG4gICAgICAgIGlmIChBQUJveDJkLmNvbnRhaW5zUHQoYWFib3gsIHNjcmVlblB0KSkge1xuICAgICAgICAgIHJ0bk9iai5oaXQgPSB0cnVlXG4gICAgICAgICAgcnRuT2JqLmNvbnRyb2xJbmRleCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcnRuT2JqLmhpdCkge1xuICAgICAgICBjb25zdCB0bXBQdCA9IFswLCAwXVxuICAgICAgICBjb25zdCB0bXBWZWMgPSBbMCwgMF1cbiAgICAgICAgY29uc3QgcmFkaXVzID0gY3R4LmxpbmVXaWR0aCAqIDEuNVxuICAgICAgICBWZWMyZC5zZXQoZXh0ZW50cywgcmFkaXVzLCByYWRpdXMpXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgICAgICAgIFBvaW50MmQuc3ViKHRtcFZlYywgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpICsgMV0sIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0pXG4gICAgICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgICAgICBQb2ludDJkLmFkZFZlYzIodG1wUHQsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0sIHRtcFZlYylcbiAgICAgICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKGFhYm94LCB0bXBQdCwgZXh0ZW50cylcbiAgICAgICAgICBpZiAoQUFCb3gyZC5jb250YWluc1B0KGFhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgICAgICAgIHJ0bk9iai5oaXQgPSB0cnVlXG4gICAgICAgICAgICBydG5PYmouY29udHJvbEluZGV4ID0gdGhpcy5fdHJhbnNmb3JtZWRWZXJ0cy5sZW5ndGggKyBpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpID4gMCAmJiBpID09PSB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBQb2ludDJkLnN1Yih0bXBWZWMsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbMF0sIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0pXG4gICAgICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgICAgICBQb2ludDJkLmFkZFZlYzIodG1wUHQsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0sIHRtcFZlYylcbiAgICAgICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKGFhYm94LCB0bXBQdCwgZXh0ZW50cylcbiAgICAgICAgICBpZiAoQUFCb3gyZC5jb250YWluc1B0KGFhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgICAgICAgIHJ0bk9iai5oaXQgPSB0cnVlXG4gICAgICAgICAgICBydG5PYmouY29udHJvbEluZGV4ID0gdGhpcy5fdHJhbnNmb3JtZWRWZXJ0cy5sZW5ndGggKyBpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ0bk9ialxuICB9XG5cbiAgcmVuZGVyQm91bmRzKGN0eCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgYm91bmRzU3Ryb2tlU3R5bGUpIHtcbiAgICAvLyB3ZSdyZSBzdG9yaW5nIG91ciBBQUJveCBpbiBzY3JlZW4gc3BhY2UgaGVyZSwgc28gd29ybGRUb1NjcmVlbk1hdHJpeCBpc1xuICAgIC8vIHVudXNlZFxuICAgIHRoaXMuX3VwZGF0ZUFBQm94KHdvcmxkVG9TY3JlZW5NYXRyaXgpXG4gICAgY3R4LnNhdmUoKVxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBib3VuZHNTdHJva2VTdHlsZS5zZXRTdHJva2VDdHgoY3R4KVxuICAgIGNvbnN0IGNlbnRlciA9IFswLCAwXVxuICAgIGNvbnN0IGV4dGVudHMgPSBbMCwgMF1cbiAgICBBQUJveDJkLmdldENlbnRlcihjZW50ZXIsIHRoaXMuX2FhYm94KVxuICAgIEFBQm94MmQuZ2V0RXh0ZW50cyhleHRlbnRzLCB0aGlzLl9hYWJveClcbiAgICBjdHguYmVnaW5QYXRoKClcbiAgICBjdHgucmVjdChjZW50ZXJbMF0gLSBleHRlbnRzWzBdLCBjZW50ZXJbMV0gLSBleHRlbnRzWzFdLCBleHRlbnRzWzBdICogMiwgZXh0ZW50c1sxXSAqIDIpXG4gICAgY3R4LnN0cm9rZSgpXG4gICAgY3R4LnJlc3RvcmUoKVxuICB9XG5cbiAgcmVuZGVyKGN0eCkge1xuICAgIGN0eC5zYXZlKClcblxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBjb25zdCBvYmpUb1NjcmVlbk1hdHJpeCA9IHRoaXMuX2Jhc2VWZXJ0U2hhcGUuX2Z1bGxYZm9ybVxuICAgIGNvbnN0IHZlcnRzID0gdGhpcy5fYmFzZVZlcnRTaGFwZS52ZXJ0c1JlZlxuICAgIHRoaXMuX3RyYW5zZm9ybWVkVmVydHMgPSBuZXcgQXJyYXkodmVydHMubGVuZ3RoKVxuICAgIGNvbnN0IHRtcFB0ID0gWzAsIDBdXG4gICAgY29uc3QgdG1wVmVjID0gWzAsIDBdXG5cbiAgICBjdHguYmVnaW5QYXRoKClcbiAgICBsZXQgaSA9IDBcbiAgICB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldID0gWzAsIDBdXG4gICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldLCB2ZXJ0c1tpXSwgb2JqVG9TY3JlZW5NYXRyaXgpXG5cbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1heChjdHgubGluZVdpZHRoICogMS41LCAyLjUpXG4gICAgZm9yIChpID0gMDsgaSA8IHZlcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpICsgMV0gPSBbMCwgMF1cbiAgICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQodGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpICsgMV0sIHZlcnRzW2kgKyAxXSwgb2JqVG9TY3JlZW5NYXRyaXgpXG4gICAgICBQb2ludDJkLnN1Yih0bXBWZWMsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaSArIDFdLCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldKVxuICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgIFBvaW50MmQuYWRkVmVjMih0bXBQdCwgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpXSwgdG1wVmVjKVxuXG4gICAgICBjdHgubW92ZVRvKHRtcFB0WzBdICsgcmFkaXVzLCB0bXBQdFsxXSlcbiAgICAgIGN0eC5hcmModG1wUHRbMF0sIHRtcFB0WzFdLCByYWRpdXMsIDAsIE1hdGguVFdPX1BJKVxuICAgIH1cblxuICAgIGlmIChpID4gMCkge1xuICAgICAgUG9pbnQyZC5zdWIodG1wVmVjLCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzWzBdLCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldKVxuICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgIFBvaW50MmQuYWRkVmVjMih0bXBQdCwgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpXSwgdG1wVmVjKVxuICAgICAgY3R4Lm1vdmVUbyh0bXBQdFswXSArIHJhZGl1cywgdG1wUHRbMV0pXG4gICAgICBjdHguYXJjKHRtcFB0WzBdLCB0bXBQdFsxXSwgcmFkaXVzLCAwLCBNYXRoLlRXT19QSSlcblxuICAgICAgLy8gVE9ETyhjcm9vdCk6IElzIHRoaXMgYXBwcm9wcmlhdGU/IENhbiB0aGUgZmlsbC9zdHJva2Ugc3R5bGVcbiAgICAgIC8vIGJlIGNyb3NzIGNvbXBhdGlibGU/IFdoYXQgYWJvdXQgZ3JhZGllbnRzL3BhdHRlcm5zP1xuICAgICAgLy8gV2UgY2FuIHByb2JhYmx5IHNhZmVseSBhc3N1bWUgbm8gZ3JhZGllbnRzL3BhdHRlcm5zIGF0XG4gICAgICAvLyB0aGlzIHBvaW50XG4gICAgICBjdHguZmlsbFN0eWxlID0gY3R4LnN0cm9rZVN0eWxlXG4gICAgICBjdHguZmlsbCgpXG4gICAgfVxuXG4gICAgY3R4LmJlZ2luUGF0aCgpXG5cbiAgICB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmZvckVhY2godmVydCA9PiB7XG4gICAgICBjdHgubW92ZVRvKHZlcnRbMF0gKyB0aGlzLl92ZXJ0UmFkaXVzLCB2ZXJ0WzFdKVxuICAgICAgY3R4LmFyYyh2ZXJ0WzBdLCB2ZXJ0WzFdLCB0aGlzLl92ZXJ0UmFkaXVzLCAwLCBNYXRoLlRXT19QSSlcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuaXNGaWxsVmlzaWJsZSgpKSB7XG4gICAgICB0aGlzLnNldEZpbGxDdHgoY3R4KVxuICAgICAgY3R4LmZpbGwoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3Ryb2tlVmlzaWJsZSgpKSB7XG4gICAgICB0aGlzLnNldFN0cm9rZUN0eChjdHgpXG4gICAgICBjdHguc3Ryb2tlKClcbiAgICB9XG5cbiAgICBjdHgucmVzdG9yZSgpXG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2ludGVyYWN0aW9ucy92ZXJ0LWVkaXRhYmxlLXNoYXBlLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 22 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 4 Dimensional Vector\n * @name vec4\n */\nvar vec4 = {};\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nvec4.create = function() {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n return out;\n};\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nvec4.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nvec4.fromValues = function(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n};\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nvec4.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nvec4.set = function(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n};\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nvec4.sub = vec4.subtract;\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nvec4.mul = vec4.multiply;\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nvec4.div = vec4.divide;\n\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to ceil\n * @returns {vec4} out\n */\nvec4.ceil = function (out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n};\n\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to floor\n * @returns {vec4} out\n */\nvec4.floor = function (out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n};\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n};\n\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to round\n * @returns {vec4} out\n */\nvec4.round = function (out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n};\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nvec4.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n};\n\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\nvec4.scaleAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n out[3] = a[3] + (b[3] * scale);\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\nvec4.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2],\n w = b[3] - a[3];\n return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nvec4.dist = vec4.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec4.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2],\n w = b[3] - a[3];\n return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nvec4.sqrDist = vec4.squaredDistance;\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec4.length = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nvec4.len = vec4.length;\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec4.squaredLength = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nvec4.sqrLen = vec4.squaredLength;\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\nvec4.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n};\n\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to invert\n * @returns {vec4} out\n */\nvec4.inverse = function(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n};\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nvec4.normalize = function(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var len = x*x + y*y + z*z + w*w;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec4.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n};\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nvec4.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\nvec4.random = function (out, scale) {\n scale = scale || 1.0;\n\n //TODO: This is a pretty awful way of doing this. Find something better.\n out[0] = glMatrix.RANDOM();\n out[1] = glMatrix.RANDOM();\n out[2] = glMatrix.RANDOM();\n out[3] = glMatrix.RANDOM();\n vec4.normalize(out, out);\n vec4.scale(out, out, scale);\n return out;\n};\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\nvec4.transformMat4 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n};\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\nvec4.transformQuat = function(out, a, q) {\n var x = a[0], y = a[1], z = a[2],\n qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n // calculate quat * vec\n ix = qw * x + qy * z - qz * y,\n iy = qw * y + qz * x - qx * z,\n iz = qw * z + qx * y - qy * x,\n iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n};\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec4.forEach = (function() {\n var vec = vec4.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 4;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec4.str = function (a) {\n return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.equals = function (a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\nmodule.exports = vec4;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWM0LmpzP2ZhYTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSx1QkFBdUIsT0FBTztBQUM5QiwwQkFBMEIsaUJBQWlCLGlCQUFpQjtBQUM1RDtBQUNBLDBCQUEwQixpQkFBaUIsaUJBQWlCO0FBQzVEOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjNFxuICovXG52YXIgdmVjNCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcbiAqXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cbnZlYzQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnN1YiA9IHZlYzQuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm11bHRpcGx5ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubXVsID0gdmVjNC5tdWx0aXBseTtcblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuZGl2aWRlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpdiA9IHZlYzQuZGl2aWRlO1xuXG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuY2VpbCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICAgIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLmNlaWwoYVszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmZsb29yID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICAgIG91dFszXSA9IE1hdGguZmxvb3IoYVszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICAgIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLm1heChhWzNdLCBiWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIHJvdW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQucm91bmQgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5yb3VuZChhWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWM0IGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIG91dFszXSA9IGFbM10gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIG91dFszXSA9IGFbM10gKyAoYlszXSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjNC5kaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXSxcbiAgICAgICAgdyA9IGJbM10gLSBhWzNdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6ICsgdyp3KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuZGlzdCA9IHZlYzQuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWM0LnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXSxcbiAgICAgICAgdyA9IGJbM10gLSBhWzNdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zcXJEaXN0ID0gdmVjNC5zcXVhcmVkRGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xudmVjNC5sZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeiArIHcqdyk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5sZW4gPSB2ZWM0Lmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWM0LnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnNxckxlbiA9IHZlYzQuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IC1hWzBdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9IC1hWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuaW52ZXJzZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHZhciBsZW4gPSB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgICAgICBvdXRbMF0gPSB4ICogbGVuO1xuICAgICAgICBvdXRbMV0gPSB5ICogbGVuO1xuICAgICAgICBvdXRbMl0gPSB6ICogbGVuO1xuICAgICAgICBvdXRbM10gPSB3ICogbGVuO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cbnZlYzQuZG90ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdLFxuICAgICAgICBheiA9IGFbMl0sXG4gICAgICAgIGF3ID0gYVszXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICBvdXRbM10gPSBhdyArIHQgKiAoYlszXSAtIGF3KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnJhbmRvbSA9IGZ1bmN0aW9uIChvdXQsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG5cbiAgICAvL1RPRE86IFRoaXMgaXMgYSBwcmV0dHkgYXdmdWwgd2F5IG9mIGRvaW5nIHRoaXMuIEZpbmQgc29tZXRoaW5nIGJldHRlci5cbiAgICBvdXRbMF0gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICBvdXRbMV0gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICBvdXRbMl0gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICBvdXRbM10gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICB2ZWM0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgdmVjNC5zY2FsZShvdXQsIG91dCwgc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIG1hdDQuXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnRyYW5zZm9ybU1hdDQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSwgdyA9IGFbM107XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdICogdztcbiAgICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM10sXG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcbiAgICAgICAgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHksXG4gICAgICAgIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6LFxuICAgICAgICBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeCxcbiAgICAgICAgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuICAgIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gICAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgICBvdXRbMl0gPSBpeiAqIHF3ICsgaXcgKiAtcXogKyBpeCAqIC1xeSAtIGl5ICogLXF4O1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWM0LmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gNDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKGNvdW50KSB7XG4gICAgICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbCA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgdmVjWzBdID0gYVtpXTsgdmVjWzFdID0gYVtpKzFdOyB2ZWNbMl0gPSBhW2krMl07IHZlY1szXSA9IGFbaSszXTtcbiAgICAgICAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgICAgICAgYVtpXSA9IHZlY1swXTsgYVtpKzFdID0gdmVjWzFdOyBhW2krMl0gPSB2ZWNbMl07IGFbaSszXSA9IHZlY1szXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWM0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzQuZXhhY3RFcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7dmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG52ZWM0LmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdO1xuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlYzQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9+L2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3ZlYzQuanNcbi8vIG1vZHVsZSBpZCA9IDIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _point2d = __webpack_require__(3);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _transform2d = __webpack_require__(11);\n\nvar _mat2d = __webpack_require__(4);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _rect = __webpack_require__(15);\n\nvar _rect2 = _interopRequireDefault(_rect);\n\nvar _vec2d = __webpack_require__(9);\n\nvar _vec2d2 = _interopRequireDefault(_vec2d);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Constants = {\n SIDES: 4\n};\n\nfunction drawOBBoxModifierRect(ctx, pt, objToScreenMat, modifierSize, modifierHalfSize, modifierRotation, scale) {\n Point2d.transformMat2d(pt, pt, objToScreenMat);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.translate(pt[0], pt[1]);\n ctx.rotate(modifierRotation[1]);\n ctx.scale(scale[0], scale[1]);\n ctx.rotate(modifierRotation[0]);\n ctx.translate(-pt[0], -pt[1]);\n ctx.rect(pt[0] - modifierHalfSize, pt[1] - modifierHalfSize, modifierSize, modifierSize);\n\n // ctx.moveTo(pt[0], pt[1])\n // ctx.lineTo(pt[0], pt[1] + 20)\n // ctx.moveTo(pt[0], pt[1])\n // ctx.lineTo(pt[0] + 20, pt[1])\n\n // ctx.font = \"24px serif\"\n // ctx.fillText(text, pt[0], pt[1])\n}\n\nfunction isPointInOBBoxModifierRect(screenPt, modifierPt, objToScreenMat, modifierMat, halfBoxSz, boxSz, padBoxSz, padBoxRadius, xScale, yScale) {\n var hit = false;\n var rotate = false;\n Point2d.transformMat2d(modifierPt, modifierPt, objToScreenMat);\n if (Point2d.distance(modifierPt, screenPt) <= padBoxRadius) {\n _vec2d2.default.negate(modifierPt, modifierPt);\n modifierMat[4] = modifierMat[0] * modifierPt[0] + modifierMat[2] * modifierPt[1];\n modifierMat[5] = modifierMat[1] * modifierPt[0] + modifierMat[3] * modifierPt[1];\n\n var x = 0;\n var y = 0;\n Point2d.transformMat2d(modifierPt, screenPt, modifierMat);\n if (Math.abs(modifierPt[0]) <= halfBoxSz && Math.abs(modifierPt[1]) <= halfBoxSz || Boolean(xScale) && Boolean(yScale) && (rotate = (x = xScale * modifierPt[0]) > -halfBoxSz && x <= padBoxSz && (y = yScale * modifierPt[1]) > -halfBoxSz && y <= padBoxSz)) {\n hit = true;\n }\n }\n return {\n hit: hit,\n rotate: rotate\n };\n}\n\nvar XformShape = function (_Rect) {\n _inherits(XformShape, _Rect);\n\n function XformShape(opts) {\n var selectOpts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n scalable: true,\n rotatable: true\n };\n\n _classCallCheck(this, XformShape);\n\n var _this = _possibleConstructorReturn(this, (XformShape.__proto__ || Object.getPrototypeOf(XformShape)).call(this, opts));\n\n _this._interactiveBoxSize = 8;\n _this._interactiveBoxPadding = 10;\n if (opts && typeof opts.vertexSize !== \"undefined\") {\n _this._interactiveBoxSize = opts.vertexSize;\n }\n\n _this._scalable = true;\n _this._rotatable = true;\n if (selectOpts) {\n if (typeof selectOpts.scalable !== \"undefined\") {\n _this._scalable = Boolean(selectOpts.scalable);\n }\n\n if (typeof selectOpts.rotatable !== \"undefined\") {\n _this._rotatable = Boolean(selectOpts.rotatable);\n }\n }\n return _this;\n }\n\n _createClass(XformShape, [{\n key: \"containsPoint\",\n value: function containsPoint(screenPt) {\n // Should we update here, or is it safe to\n // say that this is stateful, meaning a render\n // should have been performed beforehand which\n // would've updated its state\n var rtnObj = {\n hit: false,\n rotate: false,\n controlIndex: -1\n };\n\n var aabox = this.aabox;\n if ((this._rotatable || this._scalable) && this.visible && AABox2d.containsPt(aabox, screenPt)) {\n var scale = [0, 0];\n var rot = [0, 0];\n _mat2d2.default.svd(null, scale, rot, this._fullXform);\n var mat = _mat2d2.default.create();\n\n scale[0] = scale[0] < 0 ? -1 : 1;\n scale[1] = scale[1] < 0 ? -1 : 1;\n\n if (scale[0] * scale[1] > 0) {\n _vec2d2.default.negate(rot, rot);\n }\n\n _mat2d2.default.rotate(mat, mat, rot[1]);\n _mat2d2.default.scale(mat, mat, scale);\n _mat2d2.default.rotate(mat, mat, rot[0]);\n\n var boxPadding = this._rotatable ? this._interactiveBoxPadding : 0;\n var halfBoxSz = this._interactiveBoxSize / 2;\n var halfWidth = this.width / 2;\n var halfHeight = this.height / 2;\n var pt = [0, 0];\n var padSz = halfBoxSz + boxPadding;\n var padRadius = Math.sqrt(2 * padSz * padSz);\n var xScale = 0;\n var yScale = 0;\n\n for (var i = 0; i < Constants.SIDES; i += 1) {\n xScale = i < 2 ? -1 : 1;\n yScale = i % 2 === 0 ? -1 : 1;\n Point2d.set(pt, xScale * halfWidth, yScale * halfHeight);\n rtnObj = isPointInOBBoxModifierRect(screenPt, pt, this._fullXform, mat, halfBoxSz, this._interactiveBoxSize, padSz, padRadius, xScale, yScale, scale);\n if (rtnObj.hit) {\n rtnObj.controlIndex = i;\n break;\n }\n }\n\n if (!rtnObj.hit && this._scalable) {\n for (var _i = 0; _i < Constants.SIDES; _i += 1) {\n xScale = _i % 2 === 0 ? _i < 2 ? -1 : 1 : 0;\n yScale = _i % 2 === 0 ? 0 : _i < 2 ? -1 : 1;\n Point2d.set(pt, xScale * halfWidth, yScale * halfHeight);\n rtnObj = isPointInOBBoxModifierRect(screenPt, pt, this._fullXform, mat, halfBoxSz, this._interactiveBoxSize, padSz, padRadius, xScale, yScale, scale);\n if (rtnObj.hit) {\n rtnObj.controlIndex = _i + Constants.SIDES;\n break;\n }\n }\n }\n\n if (rtnObj.rotate && !this._rotatable) {\n rtnObj.rotate = false;\n } else if (!rtnObj.rotate && !this._scalable) {\n rtnObj.rotate = true;\n }\n }\n\n return rtnObj;\n }\n }, {\n key: \"_updatelocalxform\",\n value: function _updatelocalxform(force) {\n if (this._lxformDirty || force) {\n var pos = Point2d.clone(this._pos);\n Point2d.addVec2(pos, pos, this._parent.pivotRef);\n (0, _transform2d.buildXformMatrix)(this._localXform, this._rotDeg, this._scale, pos, this._pivot);\n if (this._localXformUpdated) {\n this._localXformUpdated();\n }\n this._lxformDirty = false;\n }\n }\n }, {\n key: \"_updateglobalxform\",\n value: function _updateglobalxform() {\n if (this._lxformDirty || this._xformDirty) {\n this._updatelocalxform(true);\n if (this._parent) {\n _mat2d2.default.multiply(this._globalXform, this._parent.globalXform, this._localXform);\n } else {\n _mat2d2.default.copy(this._globalXform, this._localXform);\n }\n if (this._globalXformUpdated) {\n this._globalXformUpdated();\n }\n this._xformDirty = false;\n }\n }\n }, {\n key: \"_updateAABox\",\n value: function _updateAABox() {\n var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (force || this._geomDirty || this._boundsOutOfDate) {\n var boxPadding = this._rotatable ? this._interactiveBoxPadding : 0;\n var padding = boxPadding + this._interactiveBoxSize / 2;\n AABox2d.initCenterExtents(this._aabox, [0, 0], [this.width / 2, this.height / 2]);\n AABox2d.transformMat2d(this._aabox, this._aabox, this._fullXform);\n AABox2d.expand(this._aabox, this._aabox, [padding, padding]);\n this._aaboxUpdated = true;\n this._geomDirty = this._boundsOutOfDate = false;\n }\n }\n }, {\n key: \"renderBounds\",\n value: function renderBounds(ctx, worldToScreenMatrix, boundsStrokeStyle) {\n // we're storing our AABox in screen space here, so worldToScreenMatrix is\n // unused\n var aabox = this.aabox;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n boundsStrokeStyle.setStrokeCtx(ctx);\n var center = [0, 0];\n var extents = [0, 0];\n AABox2d.getCenter(center, aabox);\n AABox2d.getExtents(extents, aabox);\n ctx.beginPath();\n ctx.rect(center[0] - extents[0], center[1] - extents[1], extents[0] * 2, extents[1] * 2);\n ctx.stroke();\n ctx.restore();\n }\n }, {\n key: \"render\",\n value: function render(ctx, worldToScreenMatrix, styleState) {\n if (!this.parent || typeof this.parent.width === \"undefined\" || this.parent.height === \"undefined\") {\n return;\n }\n\n this._aaboxUpdated = false;\n // do not fill the primary rectangle\n _get(XformShape.prototype.__proto__ || Object.getPrototypeOf(XformShape.prototype), \"render\", this).call(this, ctx, worldToScreenMatrix, styleState, false);\n if (!this._aaboxUpdated) {\n this._updateAABox(true);\n }\n\n var scale = [0, 0];\n var rot = [0, 0];\n _mat2d2.default.svd(null, scale, rot, this._fullXform);\n scale[0] = scale[0] < 0 ? -1 : 1;\n scale[1] = scale[1] < 0 ? -1 : 1;\n\n var halfBoxSz = this._interactiveBoxSize / 2;\n var halfWidth = this.width / 2;\n var halfHeight = this.height / 2;\n var pt = [halfWidth, halfHeight];\n\n ctx.save();\n\n ctx.beginPath();\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"3\");\n\n Point2d.set(pt, halfWidth, -halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"2\");\n\n Point2d.set(pt, -halfWidth, -halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"0\");\n\n Point2d.set(pt, -halfWidth, halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"1\");\n\n if (this._scalable) {\n Point2d.set(pt, 0, halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n\n Point2d.set(pt, 0, -halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n\n Point2d.set(pt, halfWidth, 0);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n\n Point2d.set(pt, -halfWidth, 0);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n }\n\n if (this.isFillVisible()) {\n styleState.setFillStyle(ctx, this);\n ctx.fill();\n }\n\n if (this.isStrokeVisible()) {\n styleState.setStrokeStyle(ctx, this);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }, {\n key: \"width\",\n get: function get() {\n return this.parent && this.parent.width !== \"undefined\" ? this.parent.width : 0;\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.parent && this.parent.height !== \"undefined\" ? this.parent.height : 0;\n }\n }]);\n\n return XformShape;\n}(_rect2.default);\n\nexports.default = XformShape;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmFjdGlvbnMveGZvcm0tc2hhcGUuanM/MmU2MyJdLCJuYW1lcyI6WyJBQUJveDJkIiwiUG9pbnQyZCIsIkNvbnN0YW50cyIsIlNJREVTIiwiZHJhd09CQm94TW9kaWZpZXJSZWN0IiwiY3R4IiwicHQiLCJvYmpUb1NjcmVlbk1hdCIsIm1vZGlmaWVyU2l6ZSIsIm1vZGlmaWVySGFsZlNpemUiLCJtb2RpZmllclJvdGF0aW9uIiwic2NhbGUiLCJ0cmFuc2Zvcm1NYXQyZCIsInNldFRyYW5zZm9ybSIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsInJlY3QiLCJpc1BvaW50SW5PQkJveE1vZGlmaWVyUmVjdCIsInNjcmVlblB0IiwibW9kaWZpZXJQdCIsIm1vZGlmaWVyTWF0IiwiaGFsZkJveFN6IiwiYm94U3oiLCJwYWRCb3hTeiIsInBhZEJveFJhZGl1cyIsInhTY2FsZSIsInlTY2FsZSIsImhpdCIsImRpc3RhbmNlIiwiVmVjMmQiLCJuZWdhdGUiLCJ4IiwieSIsIk1hdGgiLCJhYnMiLCJCb29sZWFuIiwiWGZvcm1TaGFwZSIsIm9wdHMiLCJzZWxlY3RPcHRzIiwic2NhbGFibGUiLCJyb3RhdGFibGUiLCJfaW50ZXJhY3RpdmVCb3hTaXplIiwiX2ludGVyYWN0aXZlQm94UGFkZGluZyIsInZlcnRleFNpemUiLCJfc2NhbGFibGUiLCJfcm90YXRhYmxlIiwicnRuT2JqIiwiY29udHJvbEluZGV4IiwiYWFib3giLCJ2aXNpYmxlIiwiY29udGFpbnNQdCIsInJvdCIsIk1hdDJkIiwic3ZkIiwiX2Z1bGxYZm9ybSIsIm1hdCIsImNyZWF0ZSIsImJveFBhZGRpbmciLCJoYWxmV2lkdGgiLCJ3aWR0aCIsImhhbGZIZWlnaHQiLCJoZWlnaHQiLCJwYWRTeiIsInBhZFJhZGl1cyIsInNxcnQiLCJpIiwic2V0IiwiZm9yY2UiLCJfbHhmb3JtRGlydHkiLCJwb3MiLCJjbG9uZSIsIl9wb3MiLCJhZGRWZWMyIiwiX3BhcmVudCIsInBpdm90UmVmIiwiX2xvY2FsWGZvcm0iLCJfcm90RGVnIiwiX3NjYWxlIiwiX3Bpdm90IiwiX2xvY2FsWGZvcm1VcGRhdGVkIiwiX3hmb3JtRGlydHkiLCJfdXBkYXRlbG9jYWx4Zm9ybSIsIm11bHRpcGx5IiwiX2dsb2JhbFhmb3JtIiwiZ2xvYmFsWGZvcm0iLCJjb3B5IiwiX2dsb2JhbFhmb3JtVXBkYXRlZCIsIl9nZW9tRGlydHkiLCJfYm91bmRzT3V0T2ZEYXRlIiwicGFkZGluZyIsImluaXRDZW50ZXJFeHRlbnRzIiwiX2FhYm94IiwiZXhwYW5kIiwiX2FhYm94VXBkYXRlZCIsIndvcmxkVG9TY3JlZW5NYXRyaXgiLCJib3VuZHNTdHJva2VTdHlsZSIsInNhdmUiLCJzZXRTdHJva2VDdHgiLCJjZW50ZXIiLCJleHRlbnRzIiwiZ2V0Q2VudGVyIiwiZ2V0RXh0ZW50cyIsImJlZ2luUGF0aCIsInN0cm9rZSIsInJlc3RvcmUiLCJzdHlsZVN0YXRlIiwicGFyZW50IiwiX3VwZGF0ZUFBQm94IiwiaXNGaWxsVmlzaWJsZSIsInNldEZpbGxTdHlsZSIsImZpbGwiLCJpc1N0cm9rZVZpc2libGUiLCJzZXRTdHJva2VTdHlsZSIsIlJlY3QiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBRUE7O0lBQVlBLE87O0FBQ1o7O0lBQVlDLE87O0FBQ1o7O0FBR0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1DLFlBQVk7QUFDaEJDLFNBQU87QUFEUyxDQUFsQjs7QUFJQSxTQUFTQyxxQkFBVCxDQUErQkMsR0FBL0IsRUFBb0NDLEVBQXBDLEVBQXdDQyxjQUF4QyxFQUF3REMsWUFBeEQsRUFBc0VDLGdCQUF0RSxFQUF3RkMsZ0JBQXhGLEVBQTBHQyxLQUExRyxFQUFpSDtBQUMvR1YsVUFBUVcsY0FBUixDQUF1Qk4sRUFBdkIsRUFBMkJBLEVBQTNCLEVBQStCQyxjQUEvQjtBQUNBRixNQUFJUSxZQUFKLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLEVBQXVCLENBQXZCLEVBQTBCLENBQTFCLEVBQTZC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SXlHLElBQUo7QUFDRDs7QUFFRCxVQUFJLEtBQUtDLGVBQUwsRUFBSixFQUE0QjtBQUMxQk4sbUJBQVdPLGNBQVgsQ0FBMEIzRyxHQUExQixFQUErQixJQUEvQjtBQUNBQSxZQUFJUSxZQUFKLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLEVBQXVCLENBQXZCLEVBQTBCLENBQTFCLEVBQTZCLENBQTdCLEVBQWdDLENBQWhDO0FBQ0FSLFlBQUlrRyxNQUFKO0FBQ0Q7O0FBRURsRyxVQUFJbUcsT0FBSjtBQUNEOzs7d0JBeEZXO0FBQ1YsYUFBUSxLQUFLRSxNQUFMLElBQWUsS0FBS0EsTUFBTCxDQUFZL0MsS0FBWixLQUFzQixXQUFyQyxHQUFtRCxLQUFLK0MsTUFBTCxDQUFZL0MsS0FBL0QsR0FBdUUsQ0FBL0U7QUFDRDs7O3dCQUVZO0FBQ1gsYUFBUSxLQUFLK0MsTUFBTCxJQUFlLEtBQUtBLE1BQUwsQ0FBWTdDLE1BQVosS0FBdUIsV0FBdEMsR0FBb0QsS0FBSzZDLE1BQUwsQ0FBWTdDLE1BQWhFLEdBQXlFLENBQWpGO0FBQ0Q7Ozs7RUFoSnFDb0QsYzs7a0JBQW5CN0UsVSIsImZpbGUiOiIyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIEFBQm94MmQgZnJvbSBcIi4uL2NvcmUvYWFib3gyZFwiXG5pbXBvcnQgKiBhcyBQb2ludDJkIGZyb20gXCIuLi9jb3JlL3BvaW50MmRcIlxuaW1wb3J0IHtcbiAgYnVpbGRYZm9ybU1hdHJpeFxufSBmcm9tIFwiLi4vc2hhcGVzL3RyYW5zZm9ybTJkXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQgUmVjdCBmcm9tIFwiLi4vc2hhcGVzL3JlY3RcIlxuaW1wb3J0IFZlYzJkIGZyb20gXCIuLi9jb3JlL3ZlYzJkXCJcblxuY29uc3QgQ29uc3RhbnRzID0ge1xuICBTSURFUzogNFxufVxuXG5mdW5jdGlvbiBkcmF3T0JCb3hNb2RpZmllclJlY3QoY3R4LCBwdCwgb2JqVG9TY3JlZW5NYXQsIG1vZGlmaWVyU2l6ZSwgbW9kaWZpZXJIYWxmU2l6ZSwgbW9kaWZpZXJSb3RhdGlvbiwgc2NhbGUpIHtcbiAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZChwdCwgcHQsIG9ialRvU2NyZWVuTWF0KVxuICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gIGN0eC50cmFuc2xhdGUocHRbMF0sIHB0WzFdKVxuICBjdHgucm90YXRlKG1vZGlmaWVyUm90YXRpb25bMV0pXG4gIGN0eC5zY2FsZShzY2FsZVswXSwgc2NhbGVbMV0pXG4gIGN0eC5yb3RhdGUobW9kaWZpZXJSb3RhdGlvblswXSlcbiAgY3R4LnRyYW5zbGF0ZSgtcHRbMF0sIC1wdFsxXSlcbiAgY3R4LnJlY3QocHRbMF0gLSBtb2RpZmllckhhbGZTaXplLCBwdFsxXSAtIG1vZGlmaWVySGFsZlNpemUsIG1vZGlmaWVyU2l6ZSwgbW9kaWZpZXJTaXplKVxuXG4gIC8vIGN0eC5tb3ZlVG8ocHRbMF0sIHB0WzFdKVxuICAvLyBjdHgubGluZVRvKHB0WzBdLCBwdFsxXSArIDIwKVxuICAvLyBjdHgubW92ZVRvKHB0WzBdLCBwdFsxXSlcbiAgLy8gY3R4LmxpbmVUbyhwdFswXSArIDIwLCBwdFsxXSlcblxuICAvLyBjdHguZm9udCA9IFwiMjRweCBzZXJpZlwiXG4gIC8vIGN0eC5maWxsVGV4dCh0ZXh0LCBwdFswXSwgcHRbMV0pXG59XG5cbmZ1bmN0aW9uIGlzUG9pbnRJbk9CQm94TW9kaWZpZXJSZWN0KHNjcmVlblB0LCBtb2RpZmllclB0LCBvYmpUb1NjcmVlbk1hdCwgbW9kaWZpZXJNYXQsIGhhbGZCb3hTeiwgYm94U3osIHBhZEJveFN6LCBwYWRCb3hSYWRpdXMsIHhTY2FsZSwgeVNjYWxlKSB7XG4gIGxldCBoaXQgPSBmYWxzZVxuICBsZXQgcm90YXRlID0gZmFsc2VcbiAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZChtb2RpZmllclB0LCBtb2RpZmllclB0LCBvYmpUb1NjcmVlbk1hdClcbiAgaWYgKFBvaW50MmQuZGlzdGFuY2UobW9kaWZpZXJQdCwgc2NyZWVuUHQpIDw9IHBhZEJveFJhZGl1cykge1xuICAgIFZlYzJkLm5lZ2F0ZShtb2RpZmllclB0LCBtb2RpZmllclB0KVxuICAgIG1vZGlmaWVyTWF0WzRdID0gbW9kaWZpZXJNYXRbMF0gKiBtb2RpZmllclB0WzBdICsgbW9kaWZpZXJNYXRbMl0gKiBtb2RpZmllclB0WzFdXG4gICAgbW9kaWZpZXJNYXRbNV0gPSBtb2RpZmllck1hdFsxXSAqIG1vZGlmaWVyUHRbMF0gKyBtb2RpZmllck1hdFszXSAqIG1vZGlmaWVyUHRbMV1cblxuICAgIGxldCB4ID0gMFxuICAgIGxldCB5ID0gMFxuICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQobW9kaWZpZXJQdCwgc2NyZWVuUHQsIG1vZGlmaWVyTWF0KVxuICAgIGlmICgoTWF0aC5hYnMobW9kaWZpZXJQdFswXSkgPD0gaGFsZkJveFN6ICYmIE1hdGguYWJzKG1vZGlmaWVyUHRbMV0pIDw9IGhhbGZCb3hTeikgfHxcbiAgICAgIChCb29sZWFuKHhTY2FsZSkgJiYgQm9vbGVhbih5U2NhbGUpICYmXG4gICAgICAgIChyb3RhdGUgPSAoKHggPSB4U2NhbGUgKiBtb2RpZmllclB0WzBdKSA+IC1oYWxmQm94U3ogJiYgeCA8PSBwYWRCb3hTeiAmJlxuICAgICAgICAgICh5ID0geVNjYWxlICogbW9kaWZpZXJQdFsxXSkgPiAtaGFsZkJveFN6ICYmIHkgPD0gcGFkQm94U3opKSkpIHtcbiAgICAgIGhpdCA9IHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBoaXQsXG4gICAgcm90YXRlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgWGZvcm1TaGFwZSBleHRlbmRzIFJlY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRzLCBzZWxlY3RPcHRzID0ge1xuICAgIHNjYWxhYmxlOiB0cnVlLFxuICAgIHJvdGF0YWJsZTogdHJ1ZVxuICB9KSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUgPSA4XG4gICAgdGhpcy5faW50ZXJhY3RpdmVCb3hQYWRkaW5nID0gMTBcbiAgICBpZiAob3B0cyAmJiB0eXBlb2Ygb3B0cy52ZXJ0ZXhTaXplICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUgPSBvcHRzLnZlcnRleFNpemVcbiAgICB9XG5cbiAgICB0aGlzLl9zY2FsYWJsZSA9IHRydWVcbiAgICB0aGlzLl9yb3RhdGFibGUgPSB0cnVlXG4gICAgaWYgKHNlbGVjdE9wdHMpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0T3B0cy5zY2FsYWJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLl9zY2FsYWJsZSA9IEJvb2xlYW4oc2VsZWN0T3B0cy5zY2FsYWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzZWxlY3RPcHRzLnJvdGF0YWJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLl9yb3RhdGFibGUgPSBCb29sZWFuKHNlbGVjdE9wdHMucm90YXRhYmxlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnRhaW5zUG9pbnQoc2NyZWVuUHQpIHtcbiAgICAvLyBTaG91bGQgd2UgdXBkYXRlIGhlcmUsIG9yIGlzIGl0IHNhZmUgdG9cbiAgICAvLyBzYXkgdGhhdCB0aGlzIGlzIHN0YXRlZnVsLCBtZWFuaW5nIGEgcmVuZGVyXG4gICAgLy8gc2hvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgYmVmb3JlaGFuZCB3aGljaFxuICAgIC8vIHdvdWxkJ3ZlIHVwZGF0ZWQgaXRzIHN0YXRlXG4gICAgbGV0IHJ0bk9iaiA9IHtcbiAgICAgIGhpdDogZmFsc2UsXG4gICAgICByb3RhdGU6IGZhbHNlLFxuICAgICAgY29udHJvbEluZGV4OiAtMVxuICAgIH1cblxuICAgIGNvbnN0IGFhYm94ID0gdGhpcy5hYWJveFxuICAgIGlmICgodGhpcy5fcm90YXRhYmxlIHx8IHRoaXMuX3NjYWxhYmxlKSAmJiB0aGlzLnZpc2libGUgJiYgQUFCb3gyZC5jb250YWluc1B0KGFhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gWzAsIDBdXG4gICAgICBjb25zdCByb3QgPSBbMCwgMF1cbiAgICAgIE1hdDJkLnN2ZChudWxsLCBzY2FsZSwgcm90LCB0aGlzLl9mdWxsWGZvcm0pXG4gICAgICBjb25zdCBtYXQgPSBNYXQyZC5jcmVhdGUoKVxuXG4gICAgICBzY2FsZVswXSA9IChzY2FsZVswXSA8IDAgPyAtMSA6IDEpXG4gICAgICBzY2FsZVsxXSA9IChzY2FsZVsxXSA8IDAgPyAtMSA6IDEpXG5cbiAgICAgIGlmIChzY2FsZVswXSAqIHNjYWxlWzFdID4gMCkge1xuICAgICAgICBWZWMyZC5uZWdhdGUocm90LCByb3QpXG4gICAgICB9XG5cbiAgICAgIE1hdDJkLnJvdGF0ZShtYXQsIG1hdCwgcm90WzFdKVxuICAgICAgTWF0MmQuc2NhbGUobWF0LCBtYXQsIHNjYWxlKVxuICAgICAgTWF0MmQucm90YXRlKG1hdCwgbWF0LCByb3RbMF0pXG5cbiAgICAgIGNvbnN0IGJveFBhZGRpbmcgPSAodGhpcy5fcm90YXRhYmxlID8gdGhpcy5faW50ZXJhY3RpdmVCb3hQYWRkaW5nIDogMClcbiAgICAgIGNvbnN0IGhhbGZCb3hTeiA9IHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSAvIDJcbiAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IHRoaXMud2lkdGggLyAyXG4gICAgICBjb25zdCBoYWxmSGVpZ2h0ID0gdGhpcy5oZWlnaHQgLyAyXG4gICAgICBjb25zdCBwdCA9IFswLCAwXVxuICAgICAgY29uc3QgcGFkU3ogPSBoYWxmQm94U3ogKyBib3hQYWRkaW5nXG4gICAgICBjb25zdCBwYWRSYWRpdXMgPSBNYXRoLnNxcnQoMiAqIHBhZFN6ICogcGFkU3opXG4gICAgICBsZXQgeFNjYWxlID0gMFxuICAgICAgbGV0IHlTY2FsZSA9IDBcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDb25zdGFudHMuU0lERVM7IGkgKz0gMSkge1xuICAgICAgICB4U2NhbGUgPSAoaSA8IDIgPyAtMSA6IDEpXG4gICAgICAgIHlTY2FsZSA9IChpICUgMiA9PT0gMCA/IC0xIDogMSlcbiAgICAgICAgUG9pbnQyZC5zZXQocHQsIHhTY2FsZSAqIGhhbGZXaWR0aCwgeVNjYWxlICogaGFsZkhlaWdodClcbiAgICAgICAgcnRuT2JqID0gaXNQb2ludEluT0JCb3hNb2RpZmllclJlY3Qoc2NyZWVuUHQsIHB0LCB0aGlzLl9mdWxsWGZvcm0sIG1hdCwgaGFsZkJveFN6LCB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUsIHBhZFN6LCBwYWRSYWRpdXMsIHhTY2FsZSwgeVNjYWxlLCBzY2FsZSlcbiAgICAgICAgaWYgKHJ0bk9iai5oaXQpIHtcbiAgICAgICAgICBydG5PYmouY29udHJvbEluZGV4ID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFydG5PYmouaGl0ICYmIHRoaXMuX3NjYWxhYmxlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ29uc3RhbnRzLlNJREVTOyBpICs9IDEpIHtcbiAgICAgICAgICB4U2NhbGUgPSAoaSAlIDIgPT09IDAgPyAoaSA8IDIgPyAtMSA6IDEpIDogMClcbiAgICAgICAgICB5U2NhbGUgPSAoaSAlIDIgPT09IDAgPyAwIDogKGkgPCAyID8gLTEgOiAxKSlcbiAgICAgICAgICBQb2ludDJkLnNldChwdCwgeFNjYWxlICogaGFsZldpZHRoLCB5U2NhbGUgKiBoYWxmSGVpZ2h0KVxuICAgICAgICAgIHJ0bk9iaiA9IGlzUG9pbnRJbk9CQm94TW9kaWZpZXJSZWN0KHNjcmVlblB0LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCBtYXQsIGhhbGZCb3hTeiwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBwYWRTeiwgcGFkUmFkaXVzLCB4U2NhbGUsIHlTY2FsZSwgc2NhbGUpXG4gICAgICAgICAgaWYgKHJ0bk9iai5oaXQpIHtcbiAgICAgICAgICAgIHJ0bk9iai5jb250cm9sSW5kZXggPSBpICsgQ29uc3RhbnRzLlNJREVTXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocnRuT2JqLnJvdGF0ZSAmJiAhdGhpcy5fcm90YXRhYmxlKSB7XG4gICAgICAgIHJ0bk9iai5yb3RhdGUgPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmICghcnRuT2JqLnJvdGF0ZSAmJiAhdGhpcy5fc2NhbGFibGUpIHtcbiAgICAgICAgcnRuT2JqLnJvdGF0ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcnRuT2JqXG4gIH1cblxuICBfdXBkYXRlbG9jYWx4Zm9ybShmb3JjZSkge1xuICAgIGlmICh0aGlzLl9seGZvcm1EaXJ0eSB8fCBmb3JjZSkge1xuICAgICAgY29uc3QgcG9zID0gUG9pbnQyZC5jbG9uZSh0aGlzLl9wb3MpXG4gICAgICBQb2ludDJkLmFkZFZlYzIocG9zLCBwb3MsIHRoaXMuX3BhcmVudC5waXZvdFJlZilcbiAgICAgIGJ1aWxkWGZvcm1NYXRyaXgodGhpcy5fbG9jYWxYZm9ybSwgdGhpcy5fcm90RGVnLCB0aGlzLl9zY2FsZSwgcG9zLCB0aGlzLl9waXZvdClcbiAgICAgIGlmICh0aGlzLl9sb2NhbFhmb3JtVXBkYXRlZCkge1xuICAgICAgICB0aGlzLl9sb2NhbFhmb3JtVXBkYXRlZCgpXG4gICAgICB9XG4gICAgICB0aGlzLl9seGZvcm1EaXJ0eSA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZWdsb2JhbHhmb3JtKCkge1xuICAgIGlmICh0aGlzLl9seGZvcm1EaXJ0eSB8fCB0aGlzLl94Zm9ybURpcnR5KSB7XG4gICAgICB0aGlzLl91cGRhdGVsb2NhbHhmb3JtKHRydWUpXG4gICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgIE1hdDJkLm11bHRpcGx5KHRoaXMuX2dsb2JhbFhmb3JtLCB0aGlzLl9wYXJlbnQuZ2xvYmFsWGZvcm0sIHRoaXMuX2xvY2FsWGZvcm0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBNYXQyZC5jb3B5KHRoaXMuX2dsb2JhbFhmb3JtLCB0aGlzLl9sb2NhbFhmb3JtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2dsb2JhbFhmb3JtVXBkYXRlZCkge1xuICAgICAgICB0aGlzLl9nbG9iYWxYZm9ybVVwZGF0ZWQoKVxuICAgICAgfVxuICAgICAgdGhpcy5feGZvcm1EaXJ0eSA9IGZhbHNlXG4gICAgfVxuICB9XG5cblxuICBfdXBkYXRlQUFCb3goZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmIChmb3JjZSB8fCB0aGlzLl9nZW9tRGlydHkgfHwgdGhpcy5fYm91bmRzT3V0T2ZEYXRlKSB7XG4gICAgICBjb25zdCBib3hQYWRkaW5nID0gKHRoaXMuX3JvdGF0YWJsZSA/IHRoaXMuX2ludGVyYWN0aXZlQm94UGFkZGluZyA6IDApXG4gICAgICBjb25zdCBwYWRkaW5nID0gYm94UGFkZGluZyArIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSAvIDJcbiAgICAgIEFBQm94MmQuaW5pdENlbnRlckV4dGVudHModGhpcy5fYWFib3gsIFswLCAwXSwgW3RoaXMud2lkdGggLyAyLCB0aGlzLmhlaWdodCAvIDJdKVxuICAgICAgQUFCb3gyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl9hYWJveCwgdGhpcy5fYWFib3gsIHRoaXMuX2Z1bGxYZm9ybSlcbiAgICAgIEFBQm94MmQuZXhwYW5kKHRoaXMuX2FhYm94LCB0aGlzLl9hYWJveCwgW3BhZGRpbmcsIHBhZGRpbmddKVxuICAgICAgdGhpcy5fYWFib3hVcGRhdGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC53aWR0aCAhPT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMucGFyZW50LndpZHRoIDogMClcbiAgfVxuXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5oZWlnaHQgIT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLnBhcmVudC5oZWlnaHQgOiAwKVxuICB9XG5cbiAgcmVuZGVyQm91bmRzKGN0eCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgYm91bmRzU3Ryb2tlU3R5bGUpIHtcbiAgICAvLyB3ZSdyZSBzdG9yaW5nIG91ciBBQUJveCBpbiBzY3JlZW4gc3BhY2UgaGVyZSwgc28gd29ybGRUb1NjcmVlbk1hdHJpeCBpc1xuICAgIC8vIHVudXNlZFxuICAgIGNvbnN0IGFhYm94ID0gdGhpcy5hYWJveFxuICAgIGN0eC5zYXZlKClcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgYm91bmRzU3Ryb2tlU3R5bGUuc2V0U3Ryb2tlQ3R4KGN0eClcbiAgICBjb25zdCBjZW50ZXIgPSBbMCwgMF1cbiAgICBjb25zdCBleHRlbnRzID0gWzAsIDBdXG4gICAgQUFCb3gyZC5nZXRDZW50ZXIoY2VudGVyLCBhYWJveClcbiAgICBBQUJveDJkLmdldEV4dGVudHMoZXh0ZW50cywgYWFib3gpXG4gICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgY3R4LnJlY3QoY2VudGVyWzBdIC0gZXh0ZW50c1swXSwgY2VudGVyWzFdIC0gZXh0ZW50c1sxXSwgZXh0ZW50c1swXSAqIDIsIGV4dGVudHNbMV0gKiAyKVxuICAgIGN0eC5zdHJva2UoKVxuICAgIGN0eC5yZXN0b3JlKClcbiAgfVxuXG4gIHJlbmRlcihjdHgsIHdvcmxkVG9TY3JlZW5NYXRyaXgsIHN0eWxlU3RhdGUpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50IHx8IHR5cGVvZiB0aGlzLnBhcmVudC53aWR0aCA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0aGlzLnBhcmVudC5oZWlnaHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FhYm94VXBkYXRlZCA9IGZhbHNlXG4gICAgLy8gZG8gbm90IGZpbGwgdGhlIHByaW1hcnkgcmVjdGFuZ2xlXG4gICAgc3VwZXIucmVuZGVyKGN0eCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgc3R5bGVTdGF0ZSwgZmFsc2UpXG4gICAgaWYgKCF0aGlzLl9hYWJveFVwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUFBQm94KHRydWUpXG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGUgPSBbMCwgMF1cbiAgICBjb25zdCByb3QgPSBbMCwgMF1cbiAgICBNYXQyZC5zdmQobnVsbCwgc2NhbGUsIHJvdCwgdGhpcy5fZnVsbFhmb3JtKVxuICAgIHNjYWxlWzBdID0gKHNjYWxlWzBdIDwgMCA/IC0xIDogMSlcbiAgICBzY2FsZVsxXSA9IChzY2FsZVsxXSA8IDAgPyAtMSA6IDEpXG5cbiAgICBjb25zdCBoYWxmQm94U3ogPSB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUgLyAyXG4gICAgY29uc3QgaGFsZldpZHRoID0gdGhpcy53aWR0aCAvIDJcbiAgICBjb25zdCBoYWxmSGVpZ2h0ID0gdGhpcy5oZWlnaHQgLyAyXG4gICAgY29uc3QgcHQgPSBbaGFsZldpZHRoLCBoYWxmSGVpZ2h0XVxuXG4gICAgY3R4LnNhdmUoKVxuXG4gICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBoYWxmQm94U3osIHJvdCwgc2NhbGUsIFwiM1wiKVxuXG4gICAgUG9pbnQyZC5zZXQocHQsIGhhbGZXaWR0aCwgLWhhbGZIZWlnaHQpXG4gICAgZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBoYWxmQm94U3osIHJvdCwgc2NhbGUsIFwiMlwiKVxuXG4gICAgUG9pbnQyZC5zZXQocHQsIC1oYWxmV2lkdGgsIC1oYWxmSGVpZ2h0KVxuICAgIGRyYXdPQkJveE1vZGlmaWVyUmVjdChjdHgsIHB0LCB0aGlzLl9mdWxsWGZvcm0sIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSwgaGFsZkJveFN6LCByb3QsIHNjYWxlLCBcIjBcIilcblxuICAgIFBvaW50MmQuc2V0KHB0LCAtaGFsZldpZHRoLCBoYWxmSGVpZ2h0KVxuICAgIGRyYXdPQkJveE1vZGlmaWVyUmVjdChjdHgsIHB0LCB0aGlzLl9mdWxsWGZvcm0sIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSwgaGFsZkJveFN6LCByb3QsIHNjYWxlLCBcIjFcIilcblxuICAgIGlmICh0aGlzLl9zY2FsYWJsZSkge1xuICAgICAgUG9pbnQyZC5zZXQocHQsIDAsIGhhbGZIZWlnaHQpXG4gICAgICBkcmF3T0JCb3hNb2RpZmllclJlY3QoY3R4LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUsIGhhbGZCb3hTeiwgcm90LCBzY2FsZSlcblxuICAgICAgUG9pbnQyZC5zZXQocHQsIDAsIC1oYWxmSGVpZ2h0KVxuICAgICAgZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBoYWxmQm94U3osIHJvdCwgc2NhbGUpXG5cbiAgICAgIFBvaW50MmQuc2V0KHB0LCBoYWxmV2lkdGgsIDApXG4gICAgICBkcmF3T0JCb3hNb2RpZmllclJlY3QoY3R4LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUsIGhhbGZCb3hTeiwgcm90LCBzY2FsZSlcblxuICAgICAgUG9pbnQyZC5zZXQocHQsIC1oYWxmV2lkdGgsIDApXG4gICAgICBkcmF3T0JCb3hNb2RpZmllclJlY3QoY3R4LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUsIGhhbGZCb3hTeiwgcm90LCBzY2FsZSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZpbGxWaXNpYmxlKCkpIHtcbiAgICAgIHN0eWxlU3RhdGUuc2V0RmlsbFN0eWxlKGN0eCwgdGhpcylcbiAgICAgIGN0eC5maWxsKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1N0cm9rZVZpc2libGUoKSkge1xuICAgICAgc3R5bGVTdGF0ZS5zZXRTdHJva2VTdHlsZShjdHgsIHRoaXMpXG4gICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgICBjdHguc3Ryb2tlKClcbiAgICB9XG5cbiAgICBjdHgucmVzdG9yZSgpXG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2ludGVyYWN0aW9ucy94Zm9ybS1zaGFwZS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 23 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _interactUtils = __webpack_require__(24);\n\nvar InteractUtils = _interopRequireWildcard(_interactUtils);\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _basicStyle = __webpack_require__(9);\n\nvar _basicStyle2 = _interopRequireDefault(_basicStyle);\n\nvar _drawEngine = __webpack_require__(14);\n\nvar _drawEngine2 = _interopRequireDefault(_drawEngine);\n\nvar _mat2d = __webpack_require__(5);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _polyLine = __webpack_require__(11);\n\nvar _polyLine2 = _interopRequireDefault(_polyLine);\n\nvar _vertEditableShape = __webpack_require__(25);\n\nvar _vertEditableShape2 = _interopRequireDefault(_vertEditableShape);\n\nvar _xformShape = __webpack_require__(26);\n\nvar _xformShape2 = _interopRequireDefault(_xformShape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar scaleSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cg transform='rotate(,24,24)'%3E%3Cpolygon style='fill:%23ffffff;' points='16,20 16,12 4,24 16,36 16,28 32,28 32,36 44,24 32,12 32,20 '/%3E%3Cpolygon points='14,22 14,17 7,24 14,31 14,26 34,26 34,31 41,24 34,17 34,22 '/%3E%3C/g%3E%3C/svg%3E\\\") no-repeat\";\n\nvar rotateSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cg transform='rotate(,24,24)'%3E%3Cpath style='fill:%23ffffff;' d='M25.9,4C16.6,4,8.8,11.2,7.4,20.8H6.7H3.3l1.6,2.9l3.8,7.1l1.8,3.3l1.8-3.3l3.8-7.1l1.6-2.9h-3.3h-0.1 c1.3-5.7,6.1-9.9,11.7-9.9c8,0,12.1,4.4,12.1,13.1c0,7.2-5.4,13.1-12.1,13.1h-2v2V42v2h2c10.4,0,18.8-9,18.8-20 C44.7,11.7,37.5,4,25.9,4L25.9,4z'/%3E%3Cpath d='M25.9,6c10.5,0,16.8,6.7,16.8,18c0,9.9-7.5,18-16.8,18v-2.9c7.8,0,14.1-6.8,14.1-15.1c0-5.6-1.8-15.1-14.1-15.1 c-7.4,0-13.4,6.1-14,13.9h2.4l-3.8,7.1l-3.8-7.1h2.5C9.7,13.4,17,6,25.9,6'/%3E%3C/g%3E%3C/svg%3E\\\") no-repeat\";\n\nvar addSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpolygon style='fill:%23ffffff;' points='31.2,28 24.8,28 24.8,32.8 20,32.8 20,39.2 24.8,39.2 24.8,44 31.2,44 31.2,39.2 36,39.2 36,32.8 31.2,32.8 '/%3E %3Cpolygon style='fill:%23ffffff' points='12,32 12,4 32.3,24.3 20,24.3 19.7,24.6 '/%3E%3Cpolygon points='13.8,8.2 13.8,27.8 19,22.8 19.2,22.5 28,22.5 '/%3E%3Cpolyline points='29.6,29.6 29.6,34.4 34.4,34.4 34.4,37.6 29.6,37.6 29.6,42.4 26.4,42.4 26.4,37.6 21.6,37.6 21.6,34.4 26.4,34.4 26.4,29.6 29.6,29.6 '/%3E%3C/svg%3E\\\") no-repeat\";\n\nvar removeSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Crect style='fill:%23ffffff;' x='20' y='32.8' width='16' height='6.4'/%3E%3Cpolygon style='fill:%23ffffff;' points='12,32 12,4 32.3,24.3 20,24.3 19.7,24.6 '/%3E%3Cpolygon points='13.8,8.2 13.8,27.8 19,22.8 19.2,22.5 28,22.5 '/%3E%3Cpolyline points='34.4,34.4 34.4,37.6 21.6,37.6 21.6,34.4 '/%3E%3C/svg%3E\\\") no-repeat\";\n\nvar repositionSvg = \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath style='fill:%23ffffff;' d='M24,17.5c-3.6,0-6.5,2.9-6.5,6.5s2.9,6.5,6.5,6.5s6.5-2.9,6.5-6.5S27.6,17.5,24,17.5L24,17.5z'/%3E%3Cpath style='fill:%23ffffff;' d='M24,4L4,24l20,20l20-20L24,4z M31.5,31.5h-15v-15h15V31.5z'/%3E%3Cpolygon points='17,34 24,40.5 31,34 '/%3E%3Cpolygon points='31,14 24,7.5 17,14 '/%3E%3Cpolygon points='14,17 7.5,24 14,31 '/%3E%3Cpolygon points='34,31 40.5,24 34,17 '/%3E%3Cpath d='M24,20c2.2,0,4,1.8,4,4s-1.8,4-4,4s-4-1.8-4-4S21.8,20,24,20'/%3E%3C/svg%3E\\\") no-repeat\";\n\nvar EventConstants = {\n SELECTION_CHANGED: \"draw:selectionChanged\",\n DRAG_BEGIN: \"draw:drag:begin\",\n DRAG_END: \"draw:drag:end\"\n};\n\nvar Constants = {\n SVG_OFFSET: -14,\n QUICK_CLICK_TIME: 500,\n RIGHT_ANGLE: 90,\n STRAIGHT_ANGLE: 180,\n FORTY_FIVE_ANGLE: 45\n};\n\nvar tmpPt1 = Point2d.create(0, 0);\nvar tmpPt2 = Point2d.create(0, 0);\n\nvar defaultXformStyle = {\n fillColor: \"white\",\n strokeColor: \"black\",\n strokeWidth: 2\n};\n\nfunction inCanvas(canvas, x, y) {\n var domrect = canvas.getBoundingClientRect();\n var localX = 0;\n var localY = 0;\n var isInCanvas = (localX = x - domrect.left - canvas.clientLeft) >= 0 && localX <= canvas.clientWidth && (localY = y - domrect.top - canvas.clientTop) >= 0 && localY <= canvas.clientHeight;\n return isInCanvas;\n}\n\nfunction getLocalMousePos(out, elem, event) {\n var domrect = elem.getBoundingClientRect();\n out[0] = event.clientX - domrect.left - elem.clientLeft;\n out[1] = event.clientY - domrect.top - elem.clientTop;\n}\n\nfunction transformSelectedShape(canvas, event, selectedInfo, camera) {\n getLocalMousePos(tmpPt1, canvas, event);\n Point2d.transformMat2d(tmpPt2, tmpPt1, camera.screenToWorldMatrix);\n var shape = selectedInfo.shape;\n if (shape instanceof _xformShape2.default) {\n InteractUtils.transformXformShape(shape, selectedInfo, tmpPt1, tmpPt2, camera);\n } else if (shape instanceof _vertEditableShape2.default) {\n InteractUtils.translateVert(shape, selectedInfo, tmpPt1, tmpPt2, camera);\n } else {\n InteractUtils.translateShape(shape, selectedInfo, tmpPt1, tmpPt2, camera);\n }\n}\n\nfunction addEventKeysToSelectedInfo(event, selectedInfo) {\n selectedInfo.keys = {\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey\n };\n}\n\nfunction getSelectedObjsFromMap(selectionMap) {\n var selectedObjs = [];\n selectionMap.forEach(function (subshape, shape) {\n selectedObjs.push(shape);\n });\n return selectedObjs;\n}\n\nfunction _selectShape(selectedShape, sortedShapes, currSelectedShapes, selectStyle, xformStyle, selectOpts) {\n var fireObject = {\n unselectedShapes: getSelectedObjsFromMap(currSelectedShapes)\n };\n clearSelectedShapes(currSelectedShapes);\n selectedShape.save();\n var maxZ = sortedShapes[sortedShapes.length - 1].zIndex;\n selectedShape.zIndex = maxZ + 1;\n _basicStyle2.default.copyBasicStyle(selectStyle, selectedShape);\n selectedShape.selected = true;\n // const dimensions = selectedShape.getDimensions()\n\n var newSelectShape = null;\n if (selectOpts.scalable || selectOpts.rotatable) {\n newSelectShape = new _xformShape2.default(xformStyle || defaultXformStyle, selectOpts);\n selectedShape.addChildXform(newSelectShape);\n }\n currSelectedShapes.set(selectedShape, newSelectShape);\n\n fireObject.selectedShapes = [selectedShape];\n return fireObject;\n}\n\nfunction clearSelectedShapes(selectedShapeMap) {\n selectedShapeMap.forEach(function (selectedShape, shape) {\n shape.restore();\n shape.selected = false;\n shape.removeChildXform(selectedShape);\n });\n selectedShapeMap.clear();\n}\n\nfunction clearSpecificShapes(selectedShapeMap, shapes) {\n var clearedShapes = [];\n shapes.forEach(function (shape) {\n var selectedShape = selectedShapeMap.get(shape);\n shape.restore();\n shape.selected = false;\n shape.removeChildXform(selectedShape);\n selectedShapeMap.delete(shape);\n clearedShapes.push(shape);\n });\n return clearedShapes;\n}\n\nvar hideCursor = function hideCursor() {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.style.display = \"none\";\n }\n};\n\nvar showCursor = function showCursor() {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.style.display = \"block\";\n }\n};\n\nvar hideCursorWithPointer = function hideCursorWithPointer(e) {\n e.target.parentNode.style.cursor = \"default\";\n hideCursor();\n};\n\nvar showCursorWithPointer = function showCursorWithPointer(e) {\n e.target.parentNode.style.cursor = \"none\";\n showCursor();\n};\n\n// understands how to return mouse coordinates as an object in the format {x: , y: }\n// accepts a mouse event and a DOM element as arguments\nfunction getMouseCoordinates(e, target) {\n var canvas = document.querySelector(\"\" + (\"#\" + target.id + \" canvas\"));\n\n var coords = {\n x: e.offsetX + canvas.offsetLeft,\n y: e.offsetY + canvas.offsetTop\n };\n\n return coords;\n}\n\n// understands how to append custom cursors to the DOM\n// accepts a mouse event, a DOM element, a cursorStyle, and pixel offsets as arguments\nfunction appendCustomCursor(_event, target, cursorStyle) {\n var offsetX = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Constants.SVG_OFFSET;\n var offsetY = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : Constants.SVG_OFFSET;\n\n var cursor = document.getElementById(\"cursor\");\n var mouse = getMouseCoordinates(_event, target);\n\n if (cursor === null) {\n var newCursor = document.createElement(\"span\");\n newCursor.setAttribute(\"id\", \"cursor\");\n newCursor.setAttribute(\"style\", \"position: absolute; top: \" + (mouse.y + \"px\") + \"; left: \" + (mouse.x + \"px\") + \"; width: 28px; height: 28px; background: \" + cursorStyle + \"; cursor: none; z-index: 10; pointer-events: none; transform: translate(\" + offsetX + \"px, \" + offsetY + \"px)\");\n target.appendChild(newCursor);\n } else if (cursor.style.background === cursorStyle) {\n updateCursorPosition(_event, target);\n } else {\n cursor.style.background = cursorStyle;\n updateCursorPosition(_event, target);\n }\n}\n\n// understands how to remove the custom cursor from the DOM\nfunction removeCustomCursor() {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.parentNode.removeChild(cursor);\n }\n}\n\n// understands how to change the position of the custom cursor on the page\n// accepts a mouse event and a DOM element as arguments\nfunction updateCursorPosition(_event, target) {\n var cursor = document.getElementById(\"cursor\");\n var mouse = getMouseCoordinates(_event, target);\n\n if (cursor !== null) {\n cursor.style.top = \"\" + (mouse.y + \"px\");\n cursor.style.left = \"\" + (mouse.x + \"px\");\n }\n}\n\nvar ShapeBuilder = function (_DrawEngine) {\n _inherits(ShapeBuilder, _DrawEngine);\n\n function ShapeBuilder() {\n _classCallCheck(this, ShapeBuilder);\n\n return _possibleConstructorReturn(this, (ShapeBuilder.__proto__ || Object.getPrototypeOf(ShapeBuilder)).apply(this, arguments));\n }\n\n _createClass(ShapeBuilder, [{\n key: \"_mousedownCB\",\n value: function _mousedownCB(event) {\n if (!inCanvas(this._drawCanvas, event.clientX, event.clientY)) {\n return;\n }\n\n this.timer = performance.now();\n\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var i = -1;\n var selectedShape = null;\n var selectedInfo = null;\n for (i = shapes.length - 1; i >= 0; i -= 1) {\n var shapeInfo = this._objects.get(shapes[i]);\n if (shapes[i].selected) {\n selectedShape = this._selectedShapes.get(shapes[i]);\n selectedInfo = shapeInfo;\n var hitInfo = null;\n if (selectedShape && (hitInfo = selectedShape.containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)).hit) {\n if (selectedShape instanceof _vertEditableShape2.default && event.altKey && hitInfo.controlIndex < shapes[i].numVerts) {\n shapes[i].removeVert(hitInfo.controlIndex);\n selectedShape = null;\n } else {\n var localXform = selectedShape.parent.localXform;\n var invLocalXform = _mat2d2.default.clone(localXform);\n _mat2d2.default.invert(invLocalXform, invLocalXform);\n var startObjPos = Point2d.clone(tmpPt2);\n Point2d.transformMat2d(startObjPos, startObjPos, invLocalXform);\n this._dragInfo = Object.assign({\n rotate: Boolean(hitInfo.rotate),\n controlIndex: hitInfo.controlIndex,\n startObjectPos: startObjPos,\n worldToObjectMatrix: invLocalXform,\n startLocalPos: selectedShape.parent.getPosition(),\n startLocalScale: selectedShape.parent.getScale(),\n startLocalRot: selectedShape.parent.getRotation(),\n shapeWidth: selectedShape.parent.width,\n shapeHeight: selectedShape.parent.height\n }, selectedInfo);\n }\n break;\n } else if (shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n selectedShape = shapes[i];\n break;\n }\n }\n // else if (shapeInfo.selectable && shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n // selectedShape = shapes[i]\n // selectedInfo = shapeInfo\n // const selectEventObj = selectShape(selectedShape, shapes, this._selectedShapes, this._selectStyle, this._xformStyle, selectedInfo)\n // this.fire(EventConstants.SELECTION_CHANGED, selectEventObj)\n // break\n // }\n }\n\n if (i < 0 && this._selectedShapes.size) {\n if (this._selectedShapes.size) {\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: getSelectedObjsFromMap(this._selectedShapes),\n selectedShapes: []\n });\n }\n this._dragInfo = null;\n clearSelectedShapes(this._selectedShapes);\n } else if (selectedShape && selectedInfo && (selectedInfo.movable || selectedInfo.rotatable || selectedInfo.scalable)) {\n var canvas = document.querySelector(\"\" + (\"#\" + this._parent.id + \" > canvas\"));\n if (canvas === null) {\n this._parent.addEventListener(\"mouseout\", hideCursor);\n this._parent.addEventListener(\"mouseover\", showCursor);\n } else {\n canvas.addEventListener(\"mouseout\", hideCursorWithPointer);\n canvas.addEventListener(\"mouseover\", showCursorWithPointer);\n }\n if (!this._dragInfo && selectedInfo.movable) {\n this._dragInfo = {\n startLocalPos: selectedShape.getPosition()\n };\n }\n\n if (this._dragInfo) {\n this._dragInfo.shape = selectedShape;\n this._dragInfo.startPos = Point2d.clone(tmpPt1);\n this._dragInfo.startWorldPos = Point2d.clone(tmpPt2);\n this._dragInfo.objectToWorldMatrix = _mat2d2.default.clone(selectedShape.globalXform);\n addEventKeysToSelectedInfo(event, this._dragInfo);\n event.stopImmediatePropagation();\n this.fire(EventConstants.DRAG_BEGIN, {\n shapes: getSelectedObjsFromMap(this._selectedShapes)\n });\n }\n event.preventDefault();\n }\n }\n }, {\n key: \"_mouseupCB\",\n value: function _mouseupCB(event) {\n if (this._dragInfo && this._dragInfo.shape) {\n event.stopImmediatePropagation();\n event.preventDefault();\n var canvas = document.querySelector(\"\" + (\"#\" + this._parent.id + \" > canvas\"));\n if (canvas === null) {\n this._parent.removeEventListener(\"mouseout\", hideCursor);\n this._parent.removeEventListener(\"mouseover\", showCursor);\n } else {\n canvas.removeEventListener(\"mouseout\", hideCursorWithPointer);\n canvas.removeEventListener(\"mouseover\", showCursorWithPointer);\n }\n this._dragInfo = null;\n this.fire(EventConstants.DRAG_END, {\n shapes: getSelectedObjsFromMap(this._selectedShapes)\n });\n } else if (performance.now() - this.timer < Constants.QUICK_CLICK_TIME) {\n // this is a relatively quick click\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var selectedShape = null;\n var selectedInfo = null;\n for (var i = shapes.length - 1; i >= 0; i -= 1) {\n selectedInfo = this._objects.get(shapes[i]);\n if (selectedInfo.selectable && shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n selectedShape = shapes[i];\n break;\n }\n }\n if (selectedShape && !selectedShape.selected) {\n var selectEventObj = _selectShape(selectedShape, shapes, this._selectedShapes, this._selectStyle, this._xformStyle, selectedInfo);\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n }\n }\n }, {\n key: \"_mousemoveCB\",\n value: function _mousemoveCB(event) {\n if (!inCanvas(this._drawCanvas, event.clientX, event.clientY) && !this._dragInfo) {\n return;\n }\n\n if (this._dragInfo && this._dragInfo.shape) {\n updateCursorPosition(event, this._parent);\n addEventKeysToSelectedInfo(event, this._dragInfo);\n transformSelectedShape(this._drawCanvas, event, this._dragInfo, this._camera);\n event.stopImmediatePropagation();\n event.preventDefault();\n } else if (!event.buttons && this._selectedShapes.size) {\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var i = 0;\n var flipy = this._camera.isYFlipped();\n for (i = shapes.length - 1; i >= 0; i -= 1) {\n if (shapes[i].selected) {\n var selectInfo = this._objects.get(shapes[i]);\n var selectedShape = this._selectedShapes.get(shapes[i]);\n var hitInfo = null;\n this._parent.style.cursor = \"none\";\n // forEach not supported on nodelist in IE/Edge\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"none\";\n if (this._parent.childNodes[j].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[j].style.pointerEvents = \"none\";\n }\n }\n if (selectedShape && (hitInfo = selectedShape.containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)).hit) {\n if (selectedShape instanceof _xformShape2.default) {\n if (hitInfo.rotate) {\n var degrees = shapes[i].getRotation();\n if (flipy) {\n degrees *= -1;\n if (hitInfo.controlIndex === 1) {\n degrees -= Constants.RIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 0) {\n degrees += Constants.STRAIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 2) {\n degrees += Constants.RIGHT_ANGLE;\n }\n } else if (hitInfo.controlIndex === 0) {\n degrees -= Constants.RIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 1) {\n degrees += Constants.STRAIGHT_ANGLE;\n } else if (hitInfo.controlIndex === 3) {\n // eslint-disable-line no-magic-numbers\n degrees += Constants.RIGHT_ANGLE;\n }\n appendCustomCursor(event, this._parent, \"\" + rotateSvg.replace(//g, \"\" + degrees));\n } else if (hitInfo.controlIndex < 4) {\n // eslint-disable-line no-magic-numbers\n if (hitInfo.controlIndex === 0 || hitInfo.controlIndex === 3) {\n // eslint-disable-line no-magic-numbers\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + (-shapes[i].getRotation() - Constants.FORTY_FIVE_ANGLE)));\n } else if (hitInfo.controlIndex === 1 || hitInfo.controlIndex === 2) {\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + (-shapes[i].getRotation() + Constants.FORTY_FIVE_ANGLE)));\n }\n } else if (hitInfo.controlIndex % 2 === 0) {\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + -shapes[i].getRotation()));\n } else {\n appendCustomCursor(event, this._parent, \"\" + scaleSvg.replace(//g, \"\" + (-shapes[i].getRotation() + Constants.RIGHT_ANGLE)));\n }\n } else if (selectedShape instanceof _vertEditableShape2.default) {\n this._parent.style.cursor = \"none\";\n // forEach not supported on nodelist in IE/Edge\n for (var _j = 0; _j < this._parent.childNodes.length; _j += 1) {\n this._parent.childNodes[_j].style.cursor = \"none\";\n if (this._parent.childNodes[_j].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[_j].style.pointerEvents = \"none\";\n }\n }\n if (hitInfo.controlIndex >= shapes[i].numVerts) {\n appendCustomCursor(event, this._parent, addSvg, -8, -6); // eslint-disable-line no-magic-numbers\n } else if (event.altKey) {\n appendCustomCursor(event, this._parent, removeSvg, -8, -6); // eslint-disable-line no-magic-numbers\n } else {\n appendCustomCursor(event, this._parent, repositionSvg, Constants.SVG_OFFSET, Constants.SVG_OFFSET);\n }\n }\n event.stopImmediatePropagation();\n event.preventDefault();\n break;\n } else if (shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n if (selectInfo && selectInfo.movable) {\n var cursor = document.getElementById(\"cursor\");\n if (cursor !== null) {\n cursor.parentNode.removeChild(cursor);\n }\n this._parent.style.cursor = \"move\";\n for (var _j2 = 0; _j2 < this._parent.childNodes.length; _j2 += 1) {\n this._parent.childNodes[_j2].style.cursor = \"move\";\n }\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n break;\n }\n }\n }\n\n if (i < 0) {\n removeCustomCursor();\n this._parent.style.cursor = \"default\";\n // forEach not supported on nodelist in IE/Edge\n for (var _j3 = 0; _j3 < this._parent.childNodes.length; _j3 += 1) {\n this._parent.childNodes[_j3].style.cursor = \"default\";\n if (this._parent.childNodes[_j3].nodeName.toLowerCase() !== \"canvas\") {\n this._parent.childNodes[_j3].style.pointerEvents = \"auto\";\n }\n }\n }\n }\n }\n }, {\n key: \"_clickCB\",\n value: function _clickCB() {\n // noop\n }\n }, {\n key: \"_dblclickCB\",\n value: function _dblclickCB(event) {\n if (!inCanvas(this._drawCanvas, event.clientX, event.clientY)) {\n return;\n }\n\n Point2d.set(tmpPt1, event.offsetX, event.offsetY);\n Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix);\n var worldToScreenMatrix = this._camera.worldToScreenMatrix;\n var shapes = this.sortedShapes;\n var i = -1;\n for (i = shapes.length - 1; i >= 0; i -= 1) {\n var shapeInfo = this._objects.get(shapes[i]);\n if (shapeInfo.selectable && shapes[i].containsPoint(tmpPt1, tmpPt2, worldToScreenMatrix, this._drawCtx)) {\n if (shapeInfo.editable && shapes[i] instanceof _polyLine2.default) {\n var selectedShape = shapes[i];\n var doXform = false;\n if (shapes[i].selected) {\n var interactiveShape = this._selectedShapes.get(shapes[i]);\n if (interactiveShape) {\n selectedShape.restore();\n selectedShape.removeChildXform(interactiveShape);\n doXform = !(interactiveShape instanceof _xformShape2.default);\n }\n }\n\n selectedShape.selected = true;\n selectedShape.save();\n var maxZ = shapes[shapes.length - 1].zIndex;\n selectedShape.zIndex = maxZ + 1;\n _basicStyle2.default.copyBasicStyle(this._selectStyle, selectedShape);\n var newSelectShape = null;\n if (doXform) {\n if (shapeInfo.rotatable || shapeInfo.scalable) {\n newSelectShape = new _xformShape2.default(this._xformStyle || defaultXformStyle, shapeInfo);\n selectedShape.addChildXform(newSelectShape);\n }\n } else {\n newSelectShape = new _vertEditableShape2.default(selectedShape, this._xformStyle);\n selectedShape.addChildXform(newSelectShape);\n }\n this._selectedShapes.set(selectedShape, newSelectShape);\n } else if (!shapes[i].selected) {\n var selectEventObj = _selectShape(shapes[i], shapes, this._selectedShapes, this._selectStyle, this._xformStyle, shapeInfo);\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n break;\n }\n }\n\n if (i < 0 && this._selectedShapes.size) {\n if (this._selectedShapes.size) {\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: getSelectedObjsFromMap(this._selectedShapes),\n selectedShapes: []\n });\n }\n this._dragInfo = null;\n clearSelectedShapes(this._selectedShapes);\n } else {\n event.stopImmediatePropagation();\n }\n event.preventDefault();\n }\n }, {\n key: \"_mouseoverCB\",\n value: function _mouseoverCB() {\n // noop\n }\n }, {\n key: \"_mouseoutCB\",\n value: function _mouseoutCB() {\n // noop\n }\n }, {\n key: \"_init\",\n value: function _init(parent, opts) {\n this._activated = opts && opts.enableInteractions;\n _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"_init\", this).call(this, parent, opts, this._activated);\n var myevents = Object.getOwnPropertyNames(EventConstants).map(function (event) {\n return EventConstants[event];\n });\n this.registerEvents(myevents);\n this._dragInfo = null;\n this._selectedShapes = new Map();\n this._selectStyle = new _basicStyle2.default(opts && opts.selectStyle ? opts.selectStyle : {\n fillColor: \"orange\"\n });\n\n this._xformStyle = new _basicStyle2.default(opts && opts.xformStyle ? opts.xformStyle : {\n fillColor: \"white\",\n strokeColor: \"black\",\n strokeWidth: 2\n });\n\n this.timer = 0;\n }\n }, {\n key: \"_renderShapes\",\n value: function _renderShapes(ctx, drawShapes, camera) {\n var _this2 = this;\n\n var worldToScreenMat = camera.worldToScreenMatrix;\n drawShapes.forEach(function (shape) {\n if (shape.visible) {\n shape.render(ctx, worldToScreenMat, _this2._styleState);\n // shape.renderBounds(ctx, worldToScreenMat, boundsStrokeStyle)\n if (shape.selected) {\n var interacShape = _this2._selectedShapes.get(shape);\n if (interacShape) {\n interacShape.render(ctx, worldToScreenMat, _this2._styleState);\n // interacShape.renderBounds(ctx, worldToScreenMat, boundsStrokeStyle)\n }\n }\n }\n });\n }\n }, {\n key: \"selectShape\",\n value: function selectShape(shape) {\n var shapeInfo = this._objects.get(shape);\n if (shapeInfo && shapeInfo.selectable) {\n var selectEventObj = _selectShape(shape, this.sortedShapes, this._selectedShapes, this._selectStyle, this._xformStyle, shapeInfo);\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n }\n }, {\n key: \"clearSelection\",\n value: function clearSelection() {\n if (this._selectedShapes.size) {\n var selectedShapes = getSelectedObjsFromMap(this._selectedShapes);\n clearSelectedShapes(this._selectedShapes);\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: selectedShapes,\n selectedShapes: []\n });\n this._rerenderCb();\n }\n }\n }, {\n key: \"addShape\",\n value: function addShape(shape) {\n var _this3 = this;\n\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var select = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n\n _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"addShape\", this).call(this, shapes);\n shapes.forEach(function (newShape) {\n var shapeInfo = _this3._objects.get(newShape);\n if (shapeInfo) {\n shapeInfo.selectable = opts && typeof opts.selectable !== \"undefined\" ? Boolean(opts.selectable) : true;\n shapeInfo.movable = opts && typeof opts.movable !== \"undefined\" ? Boolean(opts.movable) : true;\n shapeInfo.rotatable = opts && typeof opts.rotatable !== \"undefined\" ? Boolean(opts.rotatable) : true;\n shapeInfo.scalable = opts && typeof opts.scalable !== \"undefined\" ? Boolean(opts.scalable) : true;\n shapeInfo.uniformScaleOnly = opts && typeof opts.uniformScaleOnly !== \"undefined\" ? Boolean(opts.uniformScaleOnly) : false;\n shapeInfo.centerScaleOnly = opts && typeof opts.centerScaleOnly !== \"undefined\" ? Boolean(opts.centerScaleOnly) : false;\n shapeInfo.editable = opts && typeof opts.editable !== \"undefined\" ? Boolean(opts.editable) : true;\n }\n });\n\n if (select) {\n var selectEventObj = {\n unselectedShapes: getSelectedObjsFromMap(this._selectedShapes)\n };\n var selectedShapes = [];\n shapes.forEach(function (newShape) {\n var shapeInfo = _this3._objects.get(newShape);\n if (shapeInfo.selectable) {\n _selectShape(newShape, _this3.sortedShapes, _this3._selectedShapes, _this3._selectStyle, _this3._xformStyle, shapeInfo);\n selectedShapes.push(newShape);\n }\n });\n\n if (selectedShapes.length) {\n selectEventObj.selectedShapes = selectedShapes;\n this.fire(EventConstants.SELECTION_CHANGED, selectEventObj);\n }\n }\n\n return this;\n }\n }, {\n key: \"deleteShape\",\n value: function deleteShape(shape) {\n var shapes = shape;\n if (!Array.isArray(shapes)) {\n shapes = [shape];\n }\n var selectClearedShapes = clearSpecificShapes(this._selectedShapes, shapes);\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: selectClearedShapes,\n selectedShapes: getSelectedObjsFromMap(this._selectedShapes)\n });\n\n removeCustomCursor();\n this._parent.style.cursor = \"default\";\n // forEach not supported on nodelist in IE/Edge\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"default\";\n this._parent.childNodes[j].style.pointerEvents = \"auto\";\n }\n\n return _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"deleteShape\", this).call(this, shapes);\n }\n }, {\n key: \"deleteSelectedShapes\",\n value: function deleteSelectedShapes() {\n var selectedShapes = getSelectedObjsFromMap(this._selectedShapes);\n clearSelectedShapes(this._selectedShapes);\n this.fire(EventConstants.SELECTION_CHANGED, {\n unselectedShapes: selectedShapes,\n selectedShapes: []\n });\n\n removeCustomCursor();\n this._parent.style.cursor = \"default\";\n // forEach not supported on nodelist in IE/Edge\n for (var j = 0; j < this._parent.childNodes.length; j += 1) {\n this._parent.childNodes[j].style.cursor = \"default\";\n this._parent.childNodes[j].style.pointerEvents = \"auto\";\n }\n\n return _get(ShapeBuilder.prototype.__proto__ || Object.getPrototypeOf(ShapeBuilder.prototype), \"deleteShape\", this).call(this, selectedShapes);\n }\n }, {\n key: \"enableInteractions\",\n value: function enableInteractions() {\n this._enableEvents();\n this._activated = true;\n return this;\n }\n }, {\n key: \"disableInteractions\",\n value: function disableInteractions() {\n var clearSelection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (clearSelection) {\n this.clearSelection();\n }\n this._disableEvents();\n this._activated = false;\n return this;\n }\n }, {\n key: \"selectStyle\",\n set: function set(selectStyle) {\n _basicStyle2.default.copyBasicStyle(selectStyle, this._selectStyle);\n },\n get: function get() {\n return this._selectStyle;\n }\n }, {\n key: \"selectedShapes\",\n get: function get() {\n return getSelectedObjsFromMap(this._selectedShapes);\n }\n }, {\n key: \"interactionsEnabled\",\n get: function get() {\n return this._activated;\n }\n }]);\n\n return ShapeBuilder;\n}(_drawEngine2.default);\n\nexports.default = ShapeBuilder;\n\n\nObject.assign(EventConstants, _drawEngine2.default.EventConstants);\nShapeBuilder.EventConstants = EventConstants;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9lbmdpbmUvc2hhcGUtYnVpbGRlci5qcz8yNjg0Il0sIm5hbWVzIjpbIkludGVyYWN0VXRpbHMiLCJQb2ludDJkIiwic2NhbGVTdmciLCJyb3RhdGVTdmciLCJhZGRTdmciLCJyZW1vdmVTdmciLCJyZXBvc2l0aW9uU3ZnIiwiRXZlbnRDb25zdGFudHMiLCJTRUxFQ1RJT05fQ0hBTkdFRCIsIkRSQUdfQkVHSU4iLCJEUkFHX0VORCIsIkNvbnN0YW50cyIsIlNWR19PRkZTRVQiLCJRVUlDS19DTElDS19USU1FIiwiUklHSFRfQU5HTEUiLCJTVFJBSUdIVF9BTkdMRSIsIkZPUlRZX0ZJVkVfQU5HTEUiLCJ0bXBQdDEiLCJjcmVhdGUiLCJ0bXBQdDIiLCJkZWZhdWx0WGZvcm1TdHlsZSIsImZpbGxDb2xvciIsInN0cm9rZUNvbG9yIiwic3Ryb2tlV2lkdGgiLCJpbkNhbnZhcyIsImNhbnZhcyIsIngiLCJ5IiwiZG9tcmVjdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxvY2FsWCIsImxvY2FsWSIsImlzSW5DYW52YXMiLCJsZWZ0IiwiY2xpZW50TGVmdCIsImNsaWVudFdpZHRoIiwidG9wIiwiY2xpZW50VG9wIiwiY2xpZW50SGVpZ2h0IiwiZ2V0TG9jYWxNb3VzZVBvcyIsIm91dCIsImVsZW0iLCJldmVudCIsImNsaWVudFgiLCJjbGllbnRZIiwidHJhbnNmb3JtU2VsZWN0ZWRTaGFwZSIsInNlbGVjdGVkSW5mbyIsImNhbWVyYSIsInRyYW5zZm9ybU1hdDJkIiwic2NyZWVuVG9Xb3JsZE1hdHJpeCIsInNoYXBlIiwidHJhbnNmb3JtWGZvcm1TaGFwZSIsInRyYW5zbGF0ZVZlcnQiLCJ0cmFuc2xhdGVTaGFwZSIsImFkZEV2ZW50S2V5c1RvU2VsZWN0ZWRJbmZvIiwia2V5cyIsImFsdEtleSIsImN0cmxLZXkiLCJzaGlmdEtleSIsIm1ldGFLZXkiLCJnZXRTZWxlY3RlZE9ianNGcm9tTWFwIiwic2VsZWN0aW9uTWFwIiwic2VsZWN0ZWRPYmpzIiwiZm9yRWFjaCIsInN1YnNoYXBlIiwicHVzaCIsInNlbGVjdFNoYXBlIiwic2VsZWN0ZWRTaGFwZSIsInNvcnRlZFNoYXBlcyIsImN1cnJTZWxlY3RlZFNoYXBlcyIsInNlbGVjdFN0eWxlIiwieGZvcm1TdHlsZSIsInNlbGVjdE9wdHMiLCJmaXJlT2JqZWN0IiwidW5zZWxlY3RlZFNoYXBlcyIsImNsZWFyU2VsZWN0ZWRTaGFwZXMiLCJzYXZlIiwibWF4WiIsImxlbmd0aCIsInpJbmRleCIsImNvcHlCYXNpY1N0eWxlIiwic2VsZWN0ZWQiLCJuZXdTZWxlY3RTaGFwZSIsInNjYWxhYmxlIiwicm90YXRhYmxlIiwiYWRkQ2hpbGRYZm9ybSIsInNldCIsInNlbGVjdGVkU2hhcGVzIiwic2VsZWN0ZWRTaGFwZU1hcCIsInJlc3RvcmUiLCJyZW1vdmVDaGlsZFhmb3JtIiwiY2xlYXIiLCJjbGVhclNwZWNpZmljU2hhcGVzIiwic2hhcGVzIiwiY2xlYXJlZFNoYXBlcyIsImdldCIsImRlbGV0ZSIsImhpZGVDdXJzb3IiLCJjdXJzb3IiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwic3R5bGUiLCJkaXNwbGF5Iiwic2hvd0N1cnNvciIsImhpZGVDdXJzb3JXaXRoUG9pbnRlciIsImUiLCJ0YXJnZXQiLCJwYXJlbnROb2RlIiwic2hvd0N1cnNvcldpdGhQb2ludGVyIiwiZ2V0TW91c2VDb29yZGluYXRlcyIsInF1ZXJ5U2VsZWN0b3IiLCJpZCIsImNvb3JkcyIsIm9mZnNldFgiLCJvZmZzZXRMZWZ0Iiwib2Zmc2V0WSIsIm9mZnNldFRvcCIsImFwcGVuZEN1c3RvbUN1cnNvciIsIl9ldmVudCIsImN1cnNvclN0eWxlIiwibW91c2UiLCJuZXdDdXJzb3IiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJiYWNrZ3JvdW5kIiwidXBkYXRlQ3Vyc29yUG9zaXRpb24iLCJyZW1vdmVDdXN0b21DdXJzb3IiLCJyZW1vdmVDaGlsZCIsIlNoYXBlQnVpbGRlciIsIl9kcmF3Q2FudmFzIiwidGltZXIiLCJwZXJmb3JtYW5jZSIsIm5vdyIsIl9jYW1lcmEiLCJ3b3JsZFRvU2NyZWVuTWF0cml4IiwiaSIsInNoYXBlSW5mbyIsIl9vYmplY3RzIiwiX3NlbGVjdGVkU2hhcGVzIiwiaGl0SW5mbyIsImNvbnRhaW5zUG9pbnQiLCJfZHJhd0N0eCIsImhpdCIsImNvbnRyb2xJbmRleCIsIm51bVZlcnRzIiwicmVtb3ZlVmVydCIsImxvY2FsWGZvcm0iLCJwYXJlbnQiLCJpbnZMb2NhbFhmb3JtIiwiY2xvbmUiLCJpbnZlcnQiLCJzdGFydE9ialBvcyIsIl9kcmFnSW5mbyIsIk9iamVjdCIsImFzc2lnbiIsInJvdGF0ZSIsIkJvb2xlYW4iLCJzdGFydE9iamVjdFBvcyIsIndvcmxkVG9PYmplY3RNYXRyaXgiLCJzdGFydExvY2FsUG9zIiwiZ2V0UG9zaXRpb24iLCJzdGFydExvY2FsU2NhbGUiLCJnZXRTY2FsZSIsInN0YXJ0TG9jYWxSb3QiLCJnZXRSb3RhdGlvbiIsInNoYXBlV2lkdGgiLCJ3aWR0aCIsInNoYXBlSGVpZ2h0IiwiaGVpZ2h0Iiwic2l6ZSIsImZpcmUiLCJtb3ZhYmxlIiwiX3BhcmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJzdGFydFBvcyIsInN0YXJ0V29ybGRQb3MiLCJvYmplY3RUb1dvcmxkTWF0cml4IiwiZ2xvYmFsWGZvcm0iLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZWxlY3RhYmxlIiwic2VsZWN0RXZlbnRPYmoiLCJfc2VsZWN0U3R5bGUiLCJfeGZvcm1TdHlsZSIsImJ1dHRvbnMiLCJmbGlweSIsImlzWUZsaXBwZWQiLCJzZWxlY3RJbmZvIiwiaiIsImNoaWxkTm9kZXMiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwicG9pbnRlckV2ZW50cyIsImRlZ3JlZXMiLCJyZXBsYWNlIiwiZWRpdGFibGUiLCJkb1hmb3JtIiwiaW50ZXJhY3RpdmVTaGFwZSIsIm9wdHMiLCJfYWN0aXZhdGVkIiwiZW5hYmxlSW50ZXJhY3Rpb25zIiwibXlldmVudHMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwibWFwIiwicmVnaXN0ZXJFdmVudHMiLCJNYXAiLCJjdHgiLCJkcmF3U2hhcGVzIiwid29ybGRUb1NjcmVlbk1hdCIsInZpc2libGUiLCJyZW5kZXIiLCJfc3R5bGVTdGF0ZSIsImludGVyYWNTaGFwZSIsIl9yZXJlbmRlckNiIiwic2VsZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwibmV3U2hhcGUiLCJ1bmlmb3JtU2NhbGVPbmx5IiwiY2VudGVyU2NhbGVPbmx5Iiwic2VsZWN0Q2xlYXJlZFNoYXBlcyIsIl9lbmFibGVFdmVudHMiLCJjbGVhclNlbGVjdGlvbiIsIl9kaXNhYmxlRXZlbnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBOztJQUFZQSxhOztBQUNaOztJQUFZQyxPOztBQUNaOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQyxXQUFXLG1XQUFqQjs7QUFFQSxJQUFNQyxZQUFZLCtuQkFBbEI7O0FBRUEsSUFBTUMsU0FBUyxra0JBQWY7O0FBRUEsSUFBTUMsWUFBWSwyWkFBbEI7O0FBRUEsSUFBTUMsZ0JBQWdCLHNsQkFBdEI7O0FBRUEsSUFBTUMsaUJBQWlCO0FBQ3JCQyxxQkFBbUIsdUJBREU7QUFFckJDLGNBQVksaUJBRlM7QUFHckJDLFlBQVU7QUFIVyxDQUF2Qjs7QUFNQSxJQUFNQyxZQUFZO0FBQ2hCQyxjQUFZLENBQUMsRUFERztBQUVoQkMsb0JBQWtCLEdBRkY7QUFHaEJDLGVBQWEsRUFIRztBQUloQkMsa0JBQWdCLEdBSkE7QUFLaEJDLG9CQUFrQjtBQUxGLENBQWxCOztBQVFBLElBQU1DLFNBQVNoQixRQUFRaUIsTUFBUixDQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBZjtBQUNBLElBQU1DLFNBQVNsQixRQUFRaUIsTUFBUixDQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBZjs7QUFF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QUFLeEIsVUFBTCxHQUFrQixLQUFsQjtBQUNBLGFBQU8sSUFBUDtBQUNEOzs7c0JBckllbkksVyxFQUFhO0FBQzNCLDJCQUFXVSxjQUFYLENBQTBCVixXQUExQixFQUF1QyxLQUFLa0gsWUFBNUM7QUFDRCxLO3dCQUVpQjtBQUNoQixhQUFPLEtBQUtBLFlBQVo7QUFDRDs7O3dCQUVvQjtBQUNuQixhQUFPNUgsdUJBQXVCLEtBQUsrRSxlQUE1QixDQUFQO0FBQ0Q7Ozt3QkEwR3lCO0FBQ3hCLGFBQU8sS0FBSzhELFVBQVo7QUFDRDs7Ozs7O2tCQWpla0J4RSxZOzs7QUFtZnJCeUIsT0FBT0MsTUFBUCxDQUFjcEosY0FBZCxFQUE4QixxQkFBV0EsY0FBekM7QUFDQTBILGFBQWExSCxjQUFiLEdBQThCQSxjQUE5QiIsImZpbGUiOiIyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIEludGVyYWN0VXRpbHMgZnJvbSBcIi4uL2ludGVyYWN0aW9ucy9pbnRlcmFjdC11dGlsc1wiXG5pbXBvcnQgKiBhcyBQb2ludDJkIGZyb20gXCIuLi9jb3JlL3BvaW50MmRcIlxuaW1wb3J0IEJhc2ljU3R5bGUgZnJvbSBcIi4uL3N0eWxlL2Jhc2ljLXN0eWxlXCJcbmltcG9ydCBEcmF3RW5naW5lIGZyb20gXCIuL2RyYXctZW5naW5lXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQgUG9seUxpbmUgZnJvbSBcIi4uL3NoYXBlcy9wb2x5LWxpbmVcIlxuaW1wb3J0IFZlcnRFZGl0YWJsZVNoYXBlIGZyb20gXCIuLi9pbnRlcmFjdGlvbnMvdmVydC1lZGl0YWJsZS1zaGFwZVwiXG5pbXBvcnQgWGZvcm1TaGFwZSBmcm9tIFwiLi4vaW50ZXJhY3Rpb25zL3hmb3JtLXNoYXBlXCJcblxuY29uc3Qgc2NhbGVTdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCclM0UlM0NnIHRyYW5zZm9ybT0ncm90YXRlKDxkZWdyZWVzPiwyNCwyNCknJTNFJTNDcG9seWdvbiBzdHlsZT0nZmlsbDolMjNmZmZmZmY7JyBwb2ludHM9JzE2LDIwIDE2LDEyIDQsMjQgMTYsMzYgMTYsMjggMzIsMjggMzIsMzYgNDQsMjQgMzIsMTIgMzIsMjAgJy8lM0UlM0Nwb2x5Z29uIHBvaW50cz0nMTQsMjIgMTQsMTcgNywyNCAxNCwzMSAxNCwyNiAzNCwyNiAzNCwzMSA0MSwyNCAzNCwxNyAzNCwyMiAnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRVxcXCIpIG5vLXJlcGVhdFwiXG5cbmNvbnN0IHJvdGF0ZVN2ZyA9IFwidXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDQ4IDQ4JyUzRSUzQ2cgdHJhbnNmb3JtPSdyb3RhdGUoPGRlZ3JlZXM+LDI0LDI0KSclM0UlM0NwYXRoIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIGQ9J00yNS45LDRDMTYuNiw0LDguOCwxMS4yLDcuNCwyMC44SDYuN0gzLjNsMS42LDIuOWwzLjgsNy4xbDEuOCwzLjNsMS44LTMuM2wzLjgtNy4xbDEuNi0yLjloLTMuM2gtMC4xIGMxLjMtNS43LDYuMS05LjksMTEuNy05LjljOCwwLDEyLjEsNC40LDEyLjEsMTMuMWMwLDcuMi01LjQsMTMuMS0xMi4xLDEzLjFoLTJ2MlY0MnYyaDJjMTAuNCwwLDE4LjgtOSwxOC44LTIwIEM0NC43LDExLjcsMzcuNSw0LDI1LjksNEwyNS45LDR6Jy8lM0UlM0NwYXRoIGQ9J00yNS45LDZjMTAuNSwwLDE2LjgsNi43LDE2LjgsMThjMCw5LjktNy41LDE4LTE2LjgsMTh2LTIuOWM3LjgsMCwxNC4xLTYuOCwxNC4xLTE1LjFjMC01LjYtMS44LTE1LjEtMTQuMS0xNS4xIGMtNy40LDAtMTMuNCw2LjEtMTQsMTMuOWgyLjRsLTMuOCw3LjFsLTMuOC03LjFoMi41QzkuNywxMy40LDE3LDYsMjUuOSw2Jy8lM0UlM0MvZyUzRSUzQy9zdmclM0VcXFwiKSBuby1yZXBlYXRcIlxuXG5jb25zdCBhZGRTdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCclM0UlM0Nwb2x5Z29uIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIHBvaW50cz0nMzEuMiwyOCAyNC44LDI4IDI0LjgsMzIuOCAyMCwzMi44IDIwLDM5LjIgMjQuOCwzOS4yIDI0LjgsNDQgMzEuMiw0NCAzMS4yLDM5LjIgMzYsMzkuMiAzNiwzMi44IDMxLjIsMzIuOCAnLyUzRSAlM0Nwb2x5Z29uIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZicgcG9pbnRzPScxMiwzMiAxMiw0IDMyLjMsMjQuMyAyMCwyNC4zIDE5LjcsMjQuNiAnLyUzRSUzQ3BvbHlnb24gcG9pbnRzPScxMy44LDguMiAxMy44LDI3LjggMTksMjIuOCAxOS4yLDIyLjUgMjgsMjIuNSAnLyUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMjkuNiwyOS42IDI5LjYsMzQuNCAzNC40LDM0LjQgMzQuNCwzNy42IDI5LjYsMzcuNiAyOS42LDQyLjQgMjYuNCw0Mi40IDI2LjQsMzcuNiAyMS42LDM3LjYgMjEuNiwzNC40IDI2LjQsMzQuNCAyNi40LDI5LjYgMjkuNiwyOS42ICAnLyUzRSUzQy9zdmclM0VcXFwiKSBuby1yZXBlYXRcIlxuXG5jb25zdCByZW1vdmVTdmcgPSBcInVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCclM0UlM0NyZWN0IHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIHg9JzIwJyB5PSczMi44JyB3aWR0aD0nMTYnIGhlaWdodD0nNi40Jy8lM0UlM0Nwb2x5Z29uICBzdHlsZT0nZmlsbDolMjNmZmZmZmY7JyBwb2ludHM9JzEyLDMyIDEyLDQgMzIuMywyNC4zIDIwLDI0LjMgMTkuNywyNC42ICcvJTNFJTNDcG9seWdvbiBwb2ludHM9JzEzLjgsOC4yIDEzLjgsMjcuOCAxOSwyMi44IDE5LjIsMjIuNSAyOCwyMi41ICcvJTNFJTNDcG9seWxpbmUgcG9pbnRzPSczNC40LDM0LjQgMzQuNCwzNy42IDIxLjYsMzcuNiAyMS42LDM0LjQgJy8lM0UlM0Mvc3ZnJTNFXFxcIikgbm8tcmVwZWF0XCJcblxuY29uc3QgcmVwb3NpdGlvblN2ZyA9IFwidXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDQ4IDQ4JyUzRSUzQ3BhdGggc3R5bGU9J2ZpbGw6JTIzZmZmZmZmOycgZD0nTTI0LDE3LjVjLTMuNiwwLTYuNSwyLjktNi41LDYuNXMyLjksNi41LDYuNSw2LjVzNi41LTIuOSw2LjUtNi41UzI3LjYsMTcuNSwyNCwxNy41TDI0LDE3LjV6Jy8lM0UlM0NwYXRoIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZjsnIGQ9J00yNCw0TDQsMjRsMjAsMjBsMjAtMjBMMjQsNHogTTMxLjUsMzEuNWgtMTV2LTE1aDE1VjMxLjV6Jy8lM0UlM0Nwb2x5Z29uIHBvaW50cz0nMTcsMzQgMjQsNDAuNSAzMSwzNCAgJy8lM0UlM0Nwb2x5Z29uIHBvaW50cz0nMzEsMTQgMjQsNy41IDE3LDE0ICAgICAnLyUzRSUzQ3BvbHlnb24gcG9pbnRzPScxNCwxNyA3LjUsMjQgMTQsMzEgICAnLyUzRSUzQ3BvbHlnb24gcG9pbnRzPSczNCwzMSA0MC41LDI0IDM0LDE3ICAgICcvJTNFJTNDcGF0aCBkPSdNMjQsMjBjMi4yLDAsNCwxLjgsNCw0cy0xLjgsNC00LDRzLTQtMS44LTQtNFMyMS44LDIwLDI0LDIwJy8lM0UlM0Mvc3ZnJTNFXFxcIikgbm8tcmVwZWF0XCJcblxuY29uc3QgRXZlbnRDb25zdGFudHMgPSB7XG4gIFNFTEVDVElPTl9DSEFOR0VEOiBcImRyYXc6c2VsZWN0aW9uQ2hhbmdlZFwiLFxuICBEUkFHX0JFR0lOOiBcImRyYXc6ZHJhZzpiZWdpblwiLFxuICBEUkFHX0VORDogXCJkcmF3OmRyYWc6ZW5kXCJcbn1cblxuY29uc3QgQ29uc3RhbnRzID0ge1xuICBTVkdfT0ZGU0VUOiAtMTQsXG4gIFFVSUNLX0NMSUNLX1RJTUU6IDUwMCxcbiAgUklHSFRfQU5HTEU6IDkwLFxuICBTVFJBSUdIVF9BTkdMRTogMTgwLFxuICBGT1JUWV9GSVZFX0FOR0xFOiA0NVxufVxuXG5jb25zdCB0bXBQdDEgPSBQb2ludDJkLmNyZWF0ZSgwLCAwKVxuY29uc3QgdG1wUHQyID0gUG9pbnQyZC5jcmVhdGUoMCwgMClcblxuY29uc3QgZGVmYXVsdFhmb3JtU3R5bGUgPSB7XG4gIGZpbGxDb2xvcjogXCJ3aGl0ZVwiLFxuICBzdHJva2VDb2xvcjogXCJibGFja1wiLFxuICBzdHJva2VXaWR0aDogMlxufVxuXG5mdW5jdGlvbiBpbkNhbnZhcyhjYW52YXMsIHgsIHkpIHtcbiAgY29uc3QgZG9tcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICBsZXQgbG9jYWxYID0gMFxuICBsZXQgbG9jYWxZID0gMFxuICBjb25zdCBpc0luQ2FudmFzID0gKChsb2NhbFggPSB4IC0gZG9tcmVjdC5sZWZ0IC0gY2FudmFzLmNsaWVudExlZnQpID49IDAgJiYgbG9jYWxYIDw9IGNhbnZhcy5jbGllbnRXaWR0aCAmJiAobG9jYWxZID0geSAtIGRvbXJlY3QudG9wIC0gY2FudmFzLmNsaWVudFRvcCkgPj0gMCAmJiBsb2NhbFkgPD0gY2FudmFzLmNsaWVudEhlaWdodClcbiAgcmV0dXJuIGlzSW5DYW52YXNcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYWxNb3VzZVBvcyhvdXQsIGVsZW0sIGV2ZW50KSB7XG4gIGNvbnN0IGRvbXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gIG91dFswXSA9IGV2ZW50LmNsaWVudFggLSBkb21yZWN0LmxlZnQgLSBlbGVtLmNsaWVudExlZnRcbiAgb3V0WzFdID0gZXZlbnQuY2xpZW50WSAtIGRvbXJlY3QudG9wIC0gZWxlbS5jbGllbnRUb3Bcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtU2VsZWN0ZWRTaGFwZShjYW52YXMsIGV2ZW50LCBzZWxlY3RlZEluZm8sIGNhbWVyYSkge1xuICBnZXRMb2NhbE1vdXNlUG9zKHRtcFB0MSwgY2FudmFzLCBldmVudClcbiAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0bXBQdDIsIHRtcFB0MSwgY2FtZXJhLnNjcmVlblRvV29ybGRNYXRyaXgpXG4gIGNvbnN0IHNoYXBlID0gc2VsZWN0ZWRJbmZvLnNoYXBlXG4gIGlmIChzaGFwZSBpbnN0YW5jZW9mIFhmb3JtU2hhcGUpIHtcbiAgICBJbnRlcmFjdFV0aWxzLnRyYW5zZm9ybVhmb3JtU2hhcGUoc2hhcGUsIHNlbGVjdGVkSW5mbywgdG1wUHQxLCB0bXBQdDIsIGNhbWVyYSlcbiAgfSBlbHNlIGlmIChzaGFwZSBpbnN0YW5jZW9mIFZlcnRFZGl0YWJsZVNoYXBlKSB7XG4gICAgSW50ZXJhY3RVdGlscy50cmFuc2xhdGVWZXJ0KHNoYXBlLCBzZWxlY3RlZEluZm8sIHRtcFB0MSwgdG1wUHQyLCBjYW1lcmEpXG4gIH0gZWxzZSB7XG4gICAgSW50ZXJhY3RVdGlscy50cmFuc2xhdGVTaGFwZShzaGFwZSwgc2VsZWN0ZWRJbmZvLCB0bXBQdDEsIHRtcFB0MiwgY2FtZXJhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50S2V5c1RvU2VsZWN0ZWRJbmZvKGV2ZW50LCBzZWxlY3RlZEluZm8pIHtcbiAgc2VsZWN0ZWRJbmZvLmtleXMgPSB7XG4gICAgYWx0S2V5OiBldmVudC5hbHRLZXksXG4gICAgY3RybEtleTogZXZlbnQuY3RybEtleSxcbiAgICBzaGlmdEtleTogZXZlbnQuc2hpZnRLZXksXG4gICAgbWV0YUtleTogZXZlbnQubWV0YUtleVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAoc2VsZWN0aW9uTWFwKSB7XG4gIGNvbnN0IHNlbGVjdGVkT2JqcyA9IFtdXG4gIHNlbGVjdGlvbk1hcC5mb3JFYWNoKChzdWJzaGFwZSwgc2hhcGUpID0+IHtcbiAgICBzZWxlY3RlZE9ianMucHVzaChzaGFwZSlcbiAgfSlcbiAgcmV0dXJuIHNlbGVjdGVkT2Jqc1xufVxuXG5mdW5jdGlvbiBzZWxlY3RTaGFwZShzZWxlY3RlZFNoYXBlLCBzb3J0ZWRTaGFwZXMsIGN1cnJTZWxlY3RlZFNoYXBlcywgc2VsZWN0U3R5bGUsIHhmb3JtU3R5bGUsIHNlbGVjdE9wdHMpIHtcbiAgY29uc3QgZmlyZU9iamVjdCA9IHtcbiAgICB1bnNlbGVjdGVkU2hhcGVzOiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKGN1cnJTZWxlY3RlZFNoYXBlcylcbiAgfVxuICBjbGVhclNlbGVjdGVkU2hhcGVzKGN1cnJTZWxlY3RlZFNoYXBlcylcbiAgc2VsZWN0ZWRTaGFwZS5zYXZlKClcbiAgY29uc3QgbWF4WiA9IHNvcnRlZFNoYXBlc1tzb3J0ZWRTaGFwZXMubGVuZ3RoIC0gMV0uekluZGV4XG4gIHNlbGVjdGVkU2hhcGUuekluZGV4ID0gbWF4WiArIDFcbiAgQmFzaWNTdHlsZS5jb3B5QmFzaWNTdHlsZShzZWxlY3RTdHlsZSwgc2VsZWN0ZWRTaGFwZSlcbiAgc2VsZWN0ZWRTaGFwZS5zZWxlY3RlZCA9IHRydWVcbiAgICAvLyBjb25zdCBkaW1lbnNpb25zID0gc2VsZWN0ZWRTaGFwZS5nZXREaW1lbnNpb25zKClcblxuICBsZXQgbmV3U2VsZWN0U2hhcGUgPSBudWxsXG4gIGlmIChzZWxlY3RPcHRzLnNjYWxhYmxlIHx8IHNlbGVjdE9wdHMucm90YXRhYmxlKSB7XG4gICAgbmV3U2VsZWN0U2hhcGUgPSBuZXcgWGZvcm1TaGFwZSh4Zm9ybVN0eWxlIHx8IGRlZmF1bHRYZm9ybVN0eWxlLCBzZWxlY3RPcHRzKVxuICAgIHNlbGVjdGVkU2hhcGUuYWRkQ2hpbGRYZm9ybShuZXdTZWxlY3RTaGFwZSlcbiAgfVxuICBjdXJyU2VsZWN0ZWRTaGFwZXMuc2V0KHNlbGVjdGVkU2hhcGUsIG5ld1NlbGVjdFNoYXBlKVxuXG4gIGZpcmVPYmplY3Quc2VsZWN0ZWRTaGFwZXMgPSBbc2VsZWN0ZWRTaGFwZV1cbiAgcmV0dXJuIGZpcmVPYmplY3Rcbn1cblxuZnVuY3Rpb24gY2xlYXJTZWxlY3RlZFNoYXBlcyhzZWxlY3RlZFNoYXBlTWFwKSB7XG4gIHNlbGVjdGVkU2hhcGVNYXAuZm9yRWFjaCgoc2VsZWN0ZWRTaGFwZSwgc2hhcGUpID0+IHtcbiAgICBzaGFwZS5yZXN0b3JlKClcbiAgICBzaGFwZS5zZWxlY3RlZCA9IGZhbHNlXG4gICAgc2hhcGUucmVtb3ZlQ2hpbGRYZm9ybShzZWxlY3RlZFNoYXBlKVxuICB9KVxuICBzZWxlY3RlZFNoYXBlTWFwLmNsZWFyKClcbn1cblxuZnVuY3Rpb24gY2xlYXJTcGVjaWZpY1NoYXBlcyhzZWxlY3RlZFNoYXBlTWFwLCBzaGFwZXMpIHtcbiAgY29uc3QgY2xlYXJlZFNoYXBlcyA9IFtdXG4gIHNoYXBlcy5mb3JFYWNoKHNoYXBlID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZFNoYXBlID0gc2VsZWN0ZWRTaGFwZU1hcC5nZXQoc2hhcGUpXG4gICAgc2hhcGUucmVzdG9yZSgpXG4gICAgc2hhcGUuc2VsZWN0ZWQgPSBmYWxzZVxuICAgIHNoYXBlLnJlbW92ZUNoaWxkWGZvcm0oc2VsZWN0ZWRTaGFwZSlcbiAgICBzZWxlY3RlZFNoYXBlTWFwLmRlbGV0ZShzaGFwZSlcbiAgICBjbGVhcmVkU2hhcGVzLnB1c2goc2hhcGUpXG4gIH0pXG4gIHJldHVybiBjbGVhcmVkU2hhcGVzXG59XG5cbmNvbnN0IGhpZGVDdXJzb3IgPSAoKSA9PiB7XG4gIGNvbnN0IGN1cnNvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3Vyc29yXCIpXG4gIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICBjdXJzb3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG4gIH1cbn1cblxuY29uc3Qgc2hvd0N1cnNvciA9ICgpID0+IHtcbiAgY29uc3QgY3Vyc29yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJzb3JcIilcbiAgaWYgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgIGN1cnNvci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiXG4gIH1cbn1cblxuY29uc3QgaGlkZUN1cnNvcldpdGhQb2ludGVyID0gKGUpID0+IHtcbiAgZS50YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5jdXJzb3IgPSBcImRlZmF1bHRcIlxuICBoaWRlQ3Vyc29yKClcbn1cblxuY29uc3Qgc2hvd0N1cnNvcldpdGhQb2ludGVyID0gKGUpID0+IHtcbiAgZS50YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5jdXJzb3IgPSBcIm5vbmVcIlxuICBzaG93Q3Vyc29yKClcbn1cblxuLy8gdW5kZXJzdGFuZHMgaG93IHRvIHJldHVybiBtb3VzZSBjb29yZGluYXRlcyBhcyBhbiBvYmplY3QgaW4gdGhlIGZvcm1hdCB7eDogPFgtQ09PUkQ+LCB5OiA8WS1DT09SRD59XG4vLyBhY2NlcHRzIGEgbW91c2UgZXZlbnQgYW5kIGEgRE9NIGVsZW1lbnQgYXMgYXJndW1lbnRzXG5mdW5jdGlvbiBnZXRNb3VzZUNvb3JkaW5hdGVzKGUsIHRhcmdldCkge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAke2AjJHt0YXJnZXQuaWR9IGNhbnZhc2B9YClcblxuICBjb25zdCBjb29yZHMgPSB7XG4gICAgeDogZS5vZmZzZXRYICsgY2FudmFzLm9mZnNldExlZnQsXG4gICAgeTogZS5vZmZzZXRZICsgY2FudmFzLm9mZnNldFRvcFxuICB9XG5cbiAgcmV0dXJuIGNvb3Jkc1xufVxuXG4vLyB1bmRlcnN0YW5kcyBob3cgdG8gYXBwZW5kIGN1c3RvbSBjdXJzb3JzIHRvIHRoZSBET01cbi8vIGFjY2VwdHMgYSBtb3VzZSBldmVudCwgYSBET00gZWxlbWVudCwgYSBjdXJzb3JTdHlsZSwgYW5kIHBpeGVsIG9mZnNldHMgYXMgYXJndW1lbnRzXG5mdW5jdGlvbiBhcHBlbmRDdXN0b21DdXJzb3IoX2V2ZW50LCB0YXJnZXQsIGN1cnNvclN0eWxlLCBvZmZzZXRYID0gQ29uc3RhbnRzLlNWR19PRkZTRVQsIG9mZnNldFkgPSBDb25zdGFudHMuU1ZHX09GRlNFVCkge1xuICBjb25zdCBjdXJzb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImN1cnNvclwiKVxuICBjb25zdCBtb3VzZSA9IGdldE1vdXNlQ29vcmRpbmF0ZXMoX2V2ZW50LCB0YXJnZXQpXG5cbiAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgIGNvbnN0IG5ld0N1cnNvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpXG4gICAgbmV3Q3Vyc29yLnNldEF0dHJpYnV0ZShcImlkXCIsIFwiY3Vyc29yXCIpXG4gICAgbmV3Q3Vyc29yLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIGBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogJHtgJHttb3VzZS55fXB4YH07IGxlZnQ6ICR7YCR7bW91c2UueH1weGB9OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4OyBiYWNrZ3JvdW5kOiAke2N1cnNvclN0eWxlfTsgY3Vyc29yOiBub25lOyB6LWluZGV4OiAxMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKCR7b2Zmc2V0WH1weCwgJHtvZmZzZXRZfXB4KWApXG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5ld0N1cnNvcilcbiAgfSBlbHNlIGlmIChjdXJzb3Iuc3R5bGUuYmFja2dyb3VuZCA9PT0gY3Vyc29yU3R5bGUpIHtcbiAgICB1cGRhdGVDdXJzb3JQb3NpdGlvbihfZXZlbnQsIHRhcmdldClcbiAgfSBlbHNlIHtcbiAgICBjdXJzb3Iuc3R5bGUuYmFja2dyb3VuZCA9IGN1cnNvclN0eWxlXG4gICAgdXBkYXRlQ3Vyc29yUG9zaXRpb24oX2V2ZW50LCB0YXJnZXQpXG4gIH1cbn1cblxuLy8gdW5kZXJzdGFuZHMgaG93IHRvIHJlbW92ZSB0aGUgY3VzdG9tIGN1cnNvciBmcm9tIHRoZSBET01cbmZ1bmN0aW9uIHJlbW92ZUN1c3RvbUN1cnNvcigpIHtcbiAgY29uc3QgY3Vyc29yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJzb3JcIilcbiAgaWYgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgIGN1cnNvci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGN1cnNvcilcbiAgfVxufVxuXG4vLyB1bmRlcnN0YW5kcyBob3cgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VzdG9tIGN1cnNvciBvbiB0aGUgcGFnZVxuLy8gYWNjZXB0cyBhIG1vdXNlIGV2ZW50IGFuZCBhIERPTSBlbGVtZW50IGFzIGFyZ3VtZW50c1xuZnVuY3Rpb24gdXBkYXRlQ3Vyc29yUG9zaXRpb24oX2V2ZW50LCB0YXJnZXQpIHtcbiAgY29uc3QgY3Vyc29yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJzb3JcIilcbiAgY29uc3QgbW91c2UgPSBnZXRNb3VzZUNvb3JkaW5hdGVzKF9ldmVudCwgdGFyZ2V0KVxuXG4gIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7YCR7bW91c2UueX1weGB9YFxuICAgIGN1cnNvci5zdHlsZS5sZWZ0ID0gYCR7YCR7bW91c2UueH1weGB9YFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXBlQnVpbGRlciBleHRlbmRzIERyYXdFbmdpbmUge1xuICBfbW91c2Vkb3duQ0IoZXZlbnQpIHtcbiAgICBpZiAoIWluQ2FudmFzKHRoaXMuX2RyYXdDYW52YXMsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnRpbWVyID0gcGVyZm9ybWFuY2Uubm93KClcblxuICAgIFBvaW50MmQuc2V0KHRtcFB0MSwgZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSlcbiAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcFB0MiwgdG1wUHQxLCB0aGlzLl9jYW1lcmEuc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgICBjb25zdCB3b3JsZFRvU2NyZWVuTWF0cml4ID0gdGhpcy5fY2FtZXJhLndvcmxkVG9TY3JlZW5NYXRyaXhcbiAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnNvcnRlZFNoYXBlc1xuICAgIGxldCBpID0gLTFcbiAgICBsZXQgc2VsZWN0ZWRTaGFwZSA9IG51bGxcbiAgICBsZXQgc2VsZWN0ZWRJbmZvID0gbnVsbFxuICAgIGZvciAoaSA9IHNoYXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3Qgc2hhcGVJbmZvID0gdGhpcy5fb2JqZWN0cy5nZXQoc2hhcGVzW2ldKVxuICAgICAgaWYgKHNoYXBlc1tpXS5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFNoYXBlID0gdGhpcy5fc2VsZWN0ZWRTaGFwZXMuZ2V0KHNoYXBlc1tpXSlcbiAgICAgICAgc2VsZWN0ZWRJbmZvID0gc2hhcGVJbmZvXG4gICAgICAgIGxldCBoaXRJbmZvID0gbnVsbFxuICAgICAgICBpZiAoc2VsZWN0ZWRTaGFwZSAmJiAoaGl0SW5mbyA9IHNlbGVjdGVkU2hhcGUuY29udGFpbnNQb2ludCh0bXBQdDEsIHRtcFB0Miwgd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fZHJhd0N0eCkpLmhpdCkge1xuICAgICAgICAgIGlmIChzZWxlY3RlZFNoYXBlIGluc3RhbmNlb2YgVmVydEVkaXRhYmxlU2hhcGUgJiYgZXZlbnQuYWx0S2V5ICYmIGhpdEluZm8uY29udHJvbEluZGV4IDwgc2hhcGVzW2ldLm51bVZlcnRzKSB7XG4gICAgICAgICAgICBzaGFwZXNbaV0ucmVtb3ZlVmVydChoaXRJbmZvLmNvbnRyb2xJbmRleClcbiAgICAgICAgICAgIHNlbGVjdGVkU2hhcGUgPSBudWxsXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsWGZvcm0gPSBzZWxlY3RlZFNoYXBlLnBhcmVudC5sb2NhbFhmb3JtXG4gICAgICAgICAgICBjb25zdCBpbnZMb2NhbFhmb3JtID0gTWF0MmQuY2xvbmUobG9jYWxYZm9ybSlcbiAgICAgICAgICAgIE1hdDJkLmludmVydChpbnZMb2NhbFhmb3JtLCBpbnZMb2NhbFhmb3JtKVxuICAgICAgICAgICAgY29uc3Qgc3RhcnRPYmpQb3MgPSBQb2ludDJkLmNsb25lKHRtcFB0MilcbiAgICAgICAgICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQoc3RhcnRPYmpQb3MsIHN0YXJ0T2JqUG9zLCBpbnZMb2NhbFhmb3JtKVxuICAgICAgICAgICAgdGhpcy5fZHJhZ0luZm8gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgcm90YXRlOiBCb29sZWFuKGhpdEluZm8ucm90YXRlKSxcbiAgICAgICAgICAgICAgY29udHJvbEluZGV4OiBoaXRJbmZvLmNvbnRyb2xJbmRleCxcbiAgICAgICAgICAgICAgc3RhcnRPYmplY3RQb3M6IHN0YXJ0T2JqUG9zLFxuICAgICAgICAgICAgICB3b3JsZFRvT2JqZWN0TWF0cml4OiBpbnZMb2NhbFhmb3JtLFxuICAgICAgICAgICAgICBzdGFydExvY2FsUG9zOiBzZWxlY3RlZFNoYXBlLnBhcmVudC5nZXRQb3NpdGlvbigpLFxuICAgICAgICAgICAgICBzdGFydExvY2FsU2NhbGU6IHNlbGVjdGVkU2hhcGUucGFyZW50LmdldFNjYWxlKCksXG4gICAgICAgICAgICAgIHN0YXJ0TG9jYWxSb3Q6IHNlbGVjdGVkU2hhcGUucGFyZW50LmdldFJvdGF0aW9uKCksXG4gICAgICAgICAgICAgIHNoYXBlV2lkdGg6IHNlbGVjdGVkU2hhcGUucGFyZW50LndpZHRoLFxuICAgICAgICAgICAgICBzaGFwZUhlaWdodDogc2VsZWN0ZWRTaGFwZS5wYXJlbnQuaGVpZ2h0XG4gICAgICAgICAgICB9LCBzZWxlY3RlZEluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVzW2ldLmNvbnRhaW5zUG9pbnQodG1wUHQxLCB0bXBQdDIsIHdvcmxkVG9TY3JlZW5NYXRyaXgsIHRoaXMuX2RyYXdDdHgpKSB7XG4gICAgICAgICAgc2VsZWN0ZWRTaGFwZSA9IHNoYXBlc1tpXVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGVsc2UgaWYgKHNoYXBlSW5mby5zZWxlY3RhYmxlICYmIHNoYXBlc1tpXS5jb250YWluc1BvaW50KHRtcFB0MSwgdG1wUHQyLCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLl9kcmF3Q3R4KSkge1xuICAgICAgLy8gICBzZWxlY3RlZFNoYXBlID0gc2hhcGVzW2ldXG4gICAgICAvLyAgIHNlbGVjdGVkSW5mbyA9IHNoYXBlSW5mb1xuICAgICAgLy8gICBjb25zdCBzZWxlY3RFdmVudE9iaiA9IHNlbGVjdFNoYXBlKHNlbGVjdGVkU2hhcGUsIHNoYXBlcywgdGhpcy5fc2VsZWN0ZWRTaGFwZXMsIHRoaXMuX3NlbGVjdFN0eWxlLCB0aGlzLl94Zm9ybVN0eWxlLCBzZWxlY3RlZEluZm8pXG4gICAgICAvLyAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5TRUxFQ1RJT05fQ0hBTkdFRCwgc2VsZWN0RXZlbnRPYmopXG4gICAgICAvLyAgIGJyZWFrXG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgaWYgKGkgPCAwICYmIHRoaXMuX3NlbGVjdGVkU2hhcGVzLnNpemUpIHtcbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFNoYXBlcy5zaXplKSB7XG4gICAgICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5TRUxFQ1RJT05fQ0hBTkdFRCwge1xuICAgICAgICAgIHVuc2VsZWN0ZWRTaGFwZXM6IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAodGhpcy5fc2VsZWN0ZWRTaGFwZXMpLFxuICAgICAgICAgIHNlbGVjdGVkU2hhcGVzOiBbXVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5fZHJhZ0luZm8gPSBudWxsXG4gICAgICBjbGVhclNlbGVjdGVkU2hhcGVzKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRTaGFwZSAmJiBzZWxlY3RlZEluZm8gJiYgKHNlbGVjdGVkSW5mby5tb3ZhYmxlIHx8IHNlbGVjdGVkSW5mby5yb3RhdGFibGUgfHwgc2VsZWN0ZWRJbmZvLnNjYWxhYmxlKSkge1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgJHtgIyR7dGhpcy5fcGFyZW50LmlkfSA+IGNhbnZhc2B9YClcbiAgICAgIGlmIChjYW52YXMgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCBoaWRlQ3Vyc29yKVxuICAgICAgICB0aGlzLl9wYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBzaG93Q3Vyc29yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCBoaWRlQ3Vyc29yV2l0aFBvaW50ZXIpXG4gICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIHNob3dDdXJzb3JXaXRoUG9pbnRlcilcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fZHJhZ0luZm8gJiYgc2VsZWN0ZWRJbmZvLm1vdmFibGUpIHtcbiAgICAgICAgdGhpcy5fZHJhZ0luZm8gPSB7XG4gICAgICAgICAgc3RhcnRMb2NhbFBvczogc2VsZWN0ZWRTaGFwZS5nZXRQb3NpdGlvbigpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2RyYWdJbmZvKSB7XG4gICAgICAgIHRoaXMuX2RyYWdJbmZvLnNoYXBlID0gc2VsZWN0ZWRTaGFwZVxuICAgICAgICB0aGlzLl9kcmFnSW5mby5zdGFydFBvcyA9IFBvaW50MmQuY2xvbmUodG1wUHQxKVxuICAgICAgICB0aGlzLl9kcmFnSW5mby5zdGFydFdvcmxkUG9zID0gUG9pbnQyZC5jbG9uZSh0bXBQdDIpXG4gICAgICAgIHRoaXMuX2RyYWdJbmZvLm9iamVjdFRvV29ybGRNYXRyaXggPSBNYXQyZC5jbG9uZShzZWxlY3RlZFNoYXBlLmdsb2JhbFhmb3JtKVxuICAgICAgICBhZGRFdmVudEtleXNUb1NlbGVjdGVkSW5mbyhldmVudCwgdGhpcy5fZHJhZ0luZm8pXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5EUkFHX0JFR0lOLCB7XG4gICAgICAgICAgc2hhcGVzOiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cbiAgfVxuXG4gIF9tb3VzZXVwQ0IoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZHJhZ0luZm8gJiYgdGhpcy5fZHJhZ0luZm8uc2hhcGUpIHtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAke2AjJHt0aGlzLl9wYXJlbnQuaWR9ID4gY2FudmFzYH1gKVxuICAgICAgaWYgKGNhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIGhpZGVDdXJzb3IpXG4gICAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIHNob3dDdXJzb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIGhpZGVDdXJzb3JXaXRoUG9pbnRlcilcbiAgICAgICAgY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgc2hvd0N1cnNvcldpdGhQb2ludGVyKVxuICAgICAgfVxuICAgICAgdGhpcy5fZHJhZ0luZm8gPSBudWxsXG4gICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuRFJBR19FTkQsIHtcbiAgICAgICAgc2hhcGVzOiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy50aW1lciA8IENvbnN0YW50cy5RVUlDS19DTElDS19USU1FKSB7XG4gICAgICAvLyB0aGlzIGlzIGEgcmVsYXRpdmVseSBxdWljayBjbGlja1xuICAgICAgUG9pbnQyZC5zZXQodG1wUHQxLCBldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKVxuICAgICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0bXBQdDIsIHRtcFB0MSwgdGhpcy5fY2FtZXJhLnNjcmVlblRvV29ybGRNYXRyaXgpXG4gICAgICBjb25zdCB3b3JsZFRvU2NyZWVuTWF0cml4ID0gdGhpcy5fY2FtZXJhLndvcmxkVG9TY3JlZW5NYXRyaXhcbiAgICAgIGNvbnN0IHNoYXBlcyA9IHRoaXMuc29ydGVkU2hhcGVzXG4gICAgICBsZXQgc2VsZWN0ZWRTaGFwZSA9IG51bGxcbiAgICAgIGxldCBzZWxlY3RlZEluZm8gPSBudWxsXG4gICAgICBmb3IgKGxldCBpID0gc2hhcGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgIHNlbGVjdGVkSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KHNoYXBlc1tpXSlcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5mby5zZWxlY3RhYmxlICYmIHNoYXBlc1tpXS5jb250YWluc1BvaW50KHRtcFB0MSwgdG1wUHQyLCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLl9kcmF3Q3R4KSkge1xuICAgICAgICAgIHNlbGVjdGVkU2hhcGUgPSBzaGFwZXNbaV1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2VsZWN0ZWRTaGFwZSAmJiAhc2VsZWN0ZWRTaGFwZS5zZWxlY3RlZCkge1xuICAgICAgICBjb25zdCBzZWxlY3RFdmVudE9iaiA9IHNlbGVjdFNoYXBlKHNlbGVjdGVkU2hhcGUsIHNoYXBlcywgdGhpcy5fc2VsZWN0ZWRTaGFwZXMsIHRoaXMuX3NlbGVjdFN0eWxlLCB0aGlzLl94Zm9ybVN0eWxlLCBzZWxlY3RlZEluZm8pXG4gICAgICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5TRUxFQ1RJT05fQ0hBTkdFRCwgc2VsZWN0RXZlbnRPYmopXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX21vdXNlbW92ZUNCKGV2ZW50KSB7XG4gICAgaWYgKCEoaW5DYW52YXModGhpcy5fZHJhd0NhbnZhcywgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpICYmICF0aGlzLl9kcmFnSW5mbykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RyYWdJbmZvICYmIHRoaXMuX2RyYWdJbmZvLnNoYXBlKSB7XG4gICAgICB1cGRhdGVDdXJzb3JQb3NpdGlvbihldmVudCwgdGhpcy5fcGFyZW50KVxuICAgICAgYWRkRXZlbnRLZXlzVG9TZWxlY3RlZEluZm8oZXZlbnQsIHRoaXMuX2RyYWdJbmZvKVxuICAgICAgdHJhbnNmb3JtU2VsZWN0ZWRTaGFwZSh0aGlzLl9kcmF3Q2FudmFzLCBldmVudCwgdGhpcy5fZHJhZ0luZm8sIHRoaXMuX2NhbWVyYSlcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfSBlbHNlIGlmICghZXZlbnQuYnV0dG9ucyAmJiB0aGlzLl9zZWxlY3RlZFNoYXBlcy5zaXplKSB7XG4gICAgICBQb2ludDJkLnNldCh0bXBQdDEsIGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpXG4gICAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHRtcFB0MiwgdG1wUHQxLCB0aGlzLl9jYW1lcmEuc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgICAgIGNvbnN0IHdvcmxkVG9TY3JlZW5NYXRyaXggPSB0aGlzLl9jYW1lcmEud29ybGRUb1NjcmVlbk1hdHJpeFxuICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5zb3J0ZWRTaGFwZXNcbiAgICAgIGxldCBpID0gMFxuICAgICAgY29uc3QgZmxpcHkgPSB0aGlzLl9jYW1lcmEuaXNZRmxpcHBlZCgpXG4gICAgICBmb3IgKGkgPSBzaGFwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgaWYgKHNoYXBlc1tpXS5zZWxlY3RlZCkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdEluZm8gPSB0aGlzLl9vYmplY3RzLmdldChzaGFwZXNbaV0pXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaGFwZSA9IHRoaXMuX3NlbGVjdGVkU2hhcGVzLmdldChzaGFwZXNbaV0pXG4gICAgICAgICAgbGV0IGhpdEluZm8gPSBudWxsXG4gICAgICAgICAgdGhpcy5fcGFyZW50LnN0eWxlLmN1cnNvciA9IFwibm9uZVwiXG4gICAgICAgICAgLy8gZm9yRWFjaCBub3Qgc3VwcG9ydGVkIG9uIG5vZGVsaXN0IGluIElFL0VkZ2VcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5jdXJzb3IgPSBcIm5vbmVcIlxuICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiY2FudmFzXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWxlY3RlZFNoYXBlICYmIChoaXRJbmZvID0gc2VsZWN0ZWRTaGFwZS5jb250YWluc1BvaW50KHRtcFB0MSwgdG1wUHQyLCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLl9kcmF3Q3R4KSkuaGl0KSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRTaGFwZSBpbnN0YW5jZW9mIFhmb3JtU2hhcGUpIHtcbiAgICAgICAgICAgICAgaWYgKGhpdEluZm8ucm90YXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlZ3JlZXMgPSBzaGFwZXNbaV0uZ2V0Um90YXRpb24oKVxuICAgICAgICAgICAgICAgIGlmIChmbGlweSkge1xuICAgICAgICAgICAgICAgICAgZGVncmVlcyAqPSAtMVxuICAgICAgICAgICAgICAgICAgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZ3JlZXMgLT0gQ29uc3RhbnRzLlJJR0hUX0FOR0xFXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZ3JlZXMgKz0gQ29uc3RhbnRzLlNUUkFJR0hUX0FOR0xFXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZ3JlZXMgKz0gQ29uc3RhbnRzLlJJR0hUX0FOR0xFXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgZGVncmVlcyAtPSBDb25zdGFudHMuUklHSFRfQU5HTEVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICBkZWdyZWVzICs9IENvbnN0YW50cy5TVFJBSUdIVF9BTkdMRVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGl0SW5mby5jb250cm9sSW5kZXggPT09IDMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICAgICAgICBkZWdyZWVzICs9IENvbnN0YW50cy5SSUdIVF9BTkdMRVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcHBlbmRDdXN0b21DdXJzb3IoZXZlbnQsIHRoaXMuX3BhcmVudCwgYCR7cm90YXRlU3ZnLnJlcGxhY2UoLzxkZWdyZWVzPi9nLCBgJHtkZWdyZWVzfWApfWApXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGl0SW5mby5jb250cm9sSW5kZXggPCA0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgICAgIGlmIChoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMCB8fCBoaXRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICAgICAgICAgIGFwcGVuZEN1c3RvbUN1cnNvcihldmVudCwgdGhpcy5fcGFyZW50LCBgJHtzY2FsZVN2Zy5yZXBsYWNlKC88ZGVncmVlcz4vZywgYCR7LXNoYXBlc1tpXS5nZXRSb3RhdGlvbigpIC0gQ29uc3RhbnRzLkZPUlRZX0ZJVkVfQU5HTEV9YCl9YClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID09PSAxIHx8IGhpdEluZm8uY29udHJvbEluZGV4ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICBhcHBlbmRDdXN0b21DdXJzb3IoZXZlbnQsIHRoaXMuX3BhcmVudCwgYCR7c2NhbGVTdmcucmVwbGFjZSgvPGRlZ3JlZXM+L2csIGAkey1zaGFwZXNbaV0uZ2V0Um90YXRpb24oKSArIENvbnN0YW50cy5GT1JUWV9GSVZFX0FOR0xFfWApfWApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFwcGVuZEN1c3RvbUN1cnNvcihldmVudCwgdGhpcy5fcGFyZW50LCBgJHtzY2FsZVN2Zy5yZXBsYWNlKC88ZGVncmVlcz4vZywgYCR7LXNoYXBlc1tpXS5nZXRSb3RhdGlvbigpfWApfWApXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kQ3VzdG9tQ3Vyc29yKGV2ZW50LCB0aGlzLl9wYXJlbnQsIGAke3NjYWxlU3ZnLnJlcGxhY2UoLzxkZWdyZWVzPi9nLCBgJHstc2hhcGVzW2ldLmdldFJvdGF0aW9uKCkgKyBDb25zdGFudHMuUklHSFRfQU5HTEV9YCl9YClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFNoYXBlIGluc3RhbmNlb2YgVmVydEVkaXRhYmxlU2hhcGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LnN0eWxlLmN1cnNvciA9IFwibm9uZVwiXG4gICAgICAgICAgICAgIC8vIGZvckVhY2ggbm90IHN1cHBvcnRlZCBvbiBub2RlbGlzdCBpbiBJRS9FZGdlXG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5jdXJzb3IgPSBcIm5vbmVcIlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhpdEluZm8uY29udHJvbEluZGV4ID49IHNoYXBlc1tpXS5udW1WZXJ0cykge1xuICAgICAgICAgICAgICAgIGFwcGVuZEN1c3RvbUN1cnNvcihldmVudCwgdGhpcy5fcGFyZW50LCBhZGRTdmcsIC04LCAtNikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kQ3VzdG9tQ3Vyc29yKGV2ZW50LCB0aGlzLl9wYXJlbnQsIHJlbW92ZVN2ZywgLTgsIC02KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcHBlbmRDdXN0b21DdXJzb3IoZXZlbnQsIHRoaXMuX3BhcmVudCwgcmVwb3NpdGlvblN2ZywgQ29uc3RhbnRzLlNWR19PRkZTRVQsIENvbnN0YW50cy5TVkdfT0ZGU0VUKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlc1tpXS5jb250YWluc1BvaW50KHRtcFB0MSwgdG1wUHQyLCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLl9kcmF3Q3R4KSkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdEluZm8gJiYgc2VsZWN0SW5mby5tb3ZhYmxlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3Vyc29yXCIpXG4gICAgICAgICAgICAgIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjdXJzb3IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdXJzb3IpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LnN0eWxlLmN1cnNvciA9IFwibW92ZVwiXG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5jdXJzb3IgPSBcIm1vdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICByZW1vdmVDdXN0b21DdXJzb3IoKVxuICAgICAgICB0aGlzLl9wYXJlbnQuc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCJcbiAgICAgICAgLy8gZm9yRWFjaCBub3Qgc3VwcG9ydGVkIG9uIG5vZGVsaXN0IGluIElFL0VkZ2VcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiXG4gICAgICAgICAgaWYgKHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiY2FudmFzXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jbGlja0NCKCkge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIF9kYmxjbGlja0NCKGV2ZW50KSB7XG4gICAgaWYgKCFpbkNhbnZhcyh0aGlzLl9kcmF3Q2FudmFzLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgUG9pbnQyZC5zZXQodG1wUHQxLCBldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKVxuICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQodG1wUHQyLCB0bXBQdDEsIHRoaXMuX2NhbWVyYS5zY3JlZW5Ub1dvcmxkTWF0cml4KVxuICAgIGNvbnN0IHdvcmxkVG9TY3JlZW5NYXRyaXggPSB0aGlzLl9jYW1lcmEud29ybGRUb1NjcmVlbk1hdHJpeFxuICAgIGNvbnN0IHNoYXBlcyA9IHRoaXMuc29ydGVkU2hhcGVzXG4gICAgbGV0IGkgPSAtMVxuICAgIGZvciAoaSA9IHNoYXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3Qgc2hhcGVJbmZvID0gdGhpcy5fb2JqZWN0cy5nZXQoc2hhcGVzW2ldKVxuICAgICAgaWYgKHNoYXBlSW5mby5zZWxlY3RhYmxlICYmIHNoYXBlc1tpXS5jb250YWluc1BvaW50KHRtcFB0MSwgdG1wUHQyLCB3b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLl9kcmF3Q3R4KSkge1xuICAgICAgICBpZiAoc2hhcGVJbmZvLmVkaXRhYmxlICYmIHNoYXBlc1tpXSBpbnN0YW5jZW9mIFBvbHlMaW5lKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaGFwZSA9IHNoYXBlc1tpXVxuICAgICAgICAgIGxldCBkb1hmb3JtID0gZmFsc2VcbiAgICAgICAgICBpZiAoc2hhcGVzW2ldLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZVNoYXBlID0gdGhpcy5fc2VsZWN0ZWRTaGFwZXMuZ2V0KHNoYXBlc1tpXSlcbiAgICAgICAgICAgIGlmIChpbnRlcmFjdGl2ZVNoYXBlKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkU2hhcGUucmVzdG9yZSgpXG4gICAgICAgICAgICAgIHNlbGVjdGVkU2hhcGUucmVtb3ZlQ2hpbGRYZm9ybShpbnRlcmFjdGl2ZVNoYXBlKVxuICAgICAgICAgICAgICBkb1hmb3JtID0gIShpbnRlcmFjdGl2ZVNoYXBlIGluc3RhbmNlb2YgWGZvcm1TaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxlY3RlZFNoYXBlLnNlbGVjdGVkID0gdHJ1ZVxuICAgICAgICAgIHNlbGVjdGVkU2hhcGUuc2F2ZSgpXG4gICAgICAgICAgY29uc3QgbWF4WiA9IHNoYXBlc1tzaGFwZXMubGVuZ3RoIC0gMV0uekluZGV4XG4gICAgICAgICAgc2VsZWN0ZWRTaGFwZS56SW5kZXggPSBtYXhaICsgMVxuICAgICAgICAgIEJhc2ljU3R5bGUuY29weUJhc2ljU3R5bGUodGhpcy5fc2VsZWN0U3R5bGUsIHNlbGVjdGVkU2hhcGUpXG4gICAgICAgICAgbGV0IG5ld1NlbGVjdFNoYXBlID0gbnVsbFxuICAgICAgICAgIGlmIChkb1hmb3JtKSB7XG4gICAgICAgICAgICBpZiAoc2hhcGVJbmZvLnJvdGF0YWJsZSB8fCBzaGFwZUluZm8uc2NhbGFibGUpIHtcbiAgICAgICAgICAgICAgbmV3U2VsZWN0U2hhcGUgPSBuZXcgWGZvcm1TaGFwZSh0aGlzLl94Zm9ybVN0eWxlIHx8IGRlZmF1bHRYZm9ybVN0eWxlLCBzaGFwZUluZm8pXG4gICAgICAgICAgICAgIHNlbGVjdGVkU2hhcGUuYWRkQ2hpbGRYZm9ybShuZXdTZWxlY3RTaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3U2VsZWN0U2hhcGUgPSBuZXcgVmVydEVkaXRhYmxlU2hhcGUoc2VsZWN0ZWRTaGFwZSwgdGhpcy5feGZvcm1TdHlsZSlcbiAgICAgICAgICAgIHNlbGVjdGVkU2hhcGUuYWRkQ2hpbGRYZm9ybShuZXdTZWxlY3RTaGFwZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTaGFwZXMuc2V0KHNlbGVjdGVkU2hhcGUsIG5ld1NlbGVjdFNoYXBlKVxuICAgICAgICB9IGVsc2UgaWYgKCFzaGFwZXNbaV0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RFdmVudE9iaiA9IHNlbGVjdFNoYXBlKHNoYXBlc1tpXSwgc2hhcGVzLCB0aGlzLl9zZWxlY3RlZFNoYXBlcywgdGhpcy5fc2VsZWN0U3R5bGUsIHRoaXMuX3hmb3JtU3R5bGUsIHNoYXBlSW5mbylcbiAgICAgICAgICB0aGlzLmZpcmUoRXZlbnRDb25zdGFudHMuU0VMRUNUSU9OX0NIQU5HRUQsIHNlbGVjdEV2ZW50T2JqKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGkgPCAwICYmIHRoaXMuX3NlbGVjdGVkU2hhcGVzLnNpemUpIHtcbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFNoYXBlcy5zaXplKSB7XG4gICAgICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5TRUxFQ1RJT05fQ0hBTkdFRCwge1xuICAgICAgICAgIHVuc2VsZWN0ZWRTaGFwZXM6IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAodGhpcy5fc2VsZWN0ZWRTaGFwZXMpLFxuICAgICAgICAgIHNlbGVjdGVkU2hhcGVzOiBbXVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5fZHJhZ0luZm8gPSBudWxsXG4gICAgICBjbGVhclNlbGVjdGVkU2hhcGVzKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBfbW91c2VvdmVyQ0IoKSB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgX21vdXNlb3V0Q0IoKSB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgX2luaXQocGFyZW50LCBvcHRzKSB7XG4gICAgdGhpcy5fYWN0aXZhdGVkID0gKG9wdHMgJiYgb3B0cy5lbmFibGVJbnRlcmFjdGlvbnMpXG4gICAgc3VwZXIuX2luaXQocGFyZW50LCBvcHRzLCB0aGlzLl9hY3RpdmF0ZWQpXG4gICAgY29uc3QgbXlldmVudHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhFdmVudENvbnN0YW50cykubWFwKGV2ZW50ID0+IEV2ZW50Q29uc3RhbnRzW2V2ZW50XSlcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRzKG15ZXZlbnRzKVxuICAgIHRoaXMuX2RyYWdJbmZvID0gbnVsbFxuICAgIHRoaXMuX3NlbGVjdGVkU2hhcGVzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fc2VsZWN0U3R5bGUgPSBuZXcgQmFzaWNTdHlsZSgob3B0cyAmJiBvcHRzLnNlbGVjdFN0eWxlID8gb3B0cy5zZWxlY3RTdHlsZSA6IHtcbiAgICAgIGZpbGxDb2xvcjogXCJvcmFuZ2VcIlxuICAgIH0pKVxuXG4gICAgdGhpcy5feGZvcm1TdHlsZSA9IG5ldyBCYXNpY1N0eWxlKChvcHRzICYmIG9wdHMueGZvcm1TdHlsZSA/IG9wdHMueGZvcm1TdHlsZSA6IHtcbiAgICAgIGZpbGxDb2xvcjogXCJ3aGl0ZVwiLFxuICAgICAgc3Ryb2tlQ29sb3I6IFwiYmxhY2tcIixcbiAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgfSkpXG5cbiAgICB0aGlzLnRpbWVyID0gMFxuICB9XG5cbiAgX3JlbmRlclNoYXBlcyhjdHgsIGRyYXdTaGFwZXMsIGNhbWVyYSkge1xuICAgIGNvbnN0IHdvcmxkVG9TY3JlZW5NYXQgPSBjYW1lcmEud29ybGRUb1NjcmVlbk1hdHJpeFxuICAgIGRyYXdTaGFwZXMuZm9yRWFjaChzaGFwZSA9PiB7XG4gICAgICBpZiAoc2hhcGUudmlzaWJsZSkge1xuICAgICAgICBzaGFwZS5yZW5kZXIoY3R4LCB3b3JsZFRvU2NyZWVuTWF0LCB0aGlzLl9zdHlsZVN0YXRlKVxuICAgICAgICAvLyBzaGFwZS5yZW5kZXJCb3VuZHMoY3R4LCB3b3JsZFRvU2NyZWVuTWF0LCBib3VuZHNTdHJva2VTdHlsZSlcbiAgICAgICAgaWYgKHNoYXBlLnNlbGVjdGVkKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJhY1NoYXBlID0gdGhpcy5fc2VsZWN0ZWRTaGFwZXMuZ2V0KHNoYXBlKVxuICAgICAgICAgIGlmIChpbnRlcmFjU2hhcGUpIHtcbiAgICAgICAgICAgIGludGVyYWNTaGFwZS5yZW5kZXIoY3R4LCB3b3JsZFRvU2NyZWVuTWF0LCB0aGlzLl9zdHlsZVN0YXRlKVxuICAgICAgICAgICAgLy8gaW50ZXJhY1NoYXBlLnJlbmRlckJvdW5kcyhjdHgsIHdvcmxkVG9TY3JlZW5NYXQsIGJvdW5kc1N0cm9rZVN0eWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzZXQgc2VsZWN0U3R5bGUoc2VsZWN0U3R5bGUpIHtcbiAgICBCYXNpY1N0eWxlLmNvcHlCYXNpY1N0eWxlKHNlbGVjdFN0eWxlLCB0aGlzLl9zZWxlY3RTdHlsZSlcbiAgfVxuXG4gIGdldCBzZWxlY3RTdHlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0U3R5bGVcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFNoYXBlcygpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRPYmpzRnJvbU1hcCh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgfVxuXG4gIHNlbGVjdFNoYXBlKHNoYXBlKSB7XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gdGhpcy5fb2JqZWN0cy5nZXQoc2hhcGUpXG4gICAgaWYgKHNoYXBlSW5mbyAmJiBzaGFwZUluZm8uc2VsZWN0YWJsZSkge1xuICAgICAgY29uc3Qgc2VsZWN0RXZlbnRPYmogPSBzZWxlY3RTaGFwZShzaGFwZSwgdGhpcy5zb3J0ZWRTaGFwZXMsIHRoaXMuX3NlbGVjdGVkU2hhcGVzLCB0aGlzLl9zZWxlY3RTdHlsZSwgdGhpcy5feGZvcm1TdHlsZSwgc2hhcGVJbmZvKVxuICAgICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCBzZWxlY3RFdmVudE9iailcbiAgICB9XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRTaGFwZXMuc2l6ZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRTaGFwZXMgPSBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgICAgY2xlYXJTZWxlY3RlZFNoYXBlcyh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5TRUxFQ1RJT05fQ0hBTkdFRCwge1xuICAgICAgICB1bnNlbGVjdGVkU2hhcGVzOiBzZWxlY3RlZFNoYXBlcyxcbiAgICAgICAgc2VsZWN0ZWRTaGFwZXM6IFtdXG4gICAgICB9KVxuICAgICAgdGhpcy5fcmVyZW5kZXJDYigpXG4gICAgfVxuICB9XG5cbiAgYWRkU2hhcGUoc2hhcGUsIG9wdHMgPSBudWxsLCBzZWxlY3QgPSBmYWxzZSkge1xuICAgIGxldCBzaGFwZXMgPSBzaGFwZVxuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGFwZXMpKSB7XG4gICAgICBzaGFwZXMgPSBbc2hhcGVdXG4gICAgfVxuXG4gICAgc3VwZXIuYWRkU2hhcGUoc2hhcGVzKVxuICAgIHNoYXBlcy5mb3JFYWNoKG5ld1NoYXBlID0+IHtcbiAgICAgIGNvbnN0IHNoYXBlSW5mbyA9IHRoaXMuX29iamVjdHMuZ2V0KG5ld1NoYXBlKVxuICAgICAgaWYgKHNoYXBlSW5mbykge1xuICAgICAgICBzaGFwZUluZm8uc2VsZWN0YWJsZSA9IChvcHRzICYmIHR5cGVvZiBvcHRzLnNlbGVjdGFibGUgIT09IFwidW5kZWZpbmVkXCIgPyBCb29sZWFuKG9wdHMuc2VsZWN0YWJsZSkgOiB0cnVlKVxuICAgICAgICBzaGFwZUluZm8ubW92YWJsZSA9IChvcHRzICYmIHR5cGVvZiBvcHRzLm1vdmFibGUgIT09IFwidW5kZWZpbmVkXCIgPyBCb29sZWFuKG9wdHMubW92YWJsZSkgOiB0cnVlKVxuICAgICAgICBzaGFwZUluZm8ucm90YXRhYmxlID0gKG9wdHMgJiYgdHlwZW9mIG9wdHMucm90YXRhYmxlICE9PSBcInVuZGVmaW5lZFwiID8gQm9vbGVhbihvcHRzLnJvdGF0YWJsZSkgOiB0cnVlKVxuICAgICAgICBzaGFwZUluZm8uc2NhbGFibGUgPSAob3B0cyAmJiB0eXBlb2Ygb3B0cy5zY2FsYWJsZSAhPT0gXCJ1bmRlZmluZWRcIiA/IEJvb2xlYW4ob3B0cy5zY2FsYWJsZSkgOiB0cnVlKVxuICAgICAgICBzaGFwZUluZm8udW5pZm9ybVNjYWxlT25seSA9IChvcHRzICYmIHR5cGVvZiBvcHRzLnVuaWZvcm1TY2FsZU9ubHkgIT09IFwidW5kZWZpbmVkXCIgPyBCb29sZWFuKG9wdHMudW5pZm9ybVNjYWxlT25seSkgOiBmYWxzZSlcbiAgICAgICAgc2hhcGVJbmZvLmNlbnRlclNjYWxlT25seSA9IChvcHRzICYmIHR5cGVvZiBvcHRzLmNlbnRlclNjYWxlT25seSAhPT0gXCJ1bmRlZmluZWRcIiA/IEJvb2xlYW4ob3B0cy5jZW50ZXJTY2FsZU9ubHkpIDogZmFsc2UpXG4gICAgICAgIHNoYXBlSW5mby5lZGl0YWJsZSA9IChvcHRzICYmIHR5cGVvZiBvcHRzLmVkaXRhYmxlICE9PSBcInVuZGVmaW5lZFwiID8gQm9vbGVhbihvcHRzLmVkaXRhYmxlKSA6IHRydWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdEV2ZW50T2JqID0ge1xuICAgICAgICB1bnNlbGVjdGVkU2hhcGVzOiBnZXRTZWxlY3RlZE9ianNGcm9tTWFwKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0ZWRTaGFwZXMgPSBbXVxuICAgICAgc2hhcGVzLmZvckVhY2gobmV3U2hhcGUgPT4ge1xuICAgICAgICBjb25zdCBzaGFwZUluZm8gPSB0aGlzLl9vYmplY3RzLmdldChuZXdTaGFwZSlcbiAgICAgICAgaWYgKHNoYXBlSW5mby5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgc2VsZWN0U2hhcGUobmV3U2hhcGUsIHRoaXMuc29ydGVkU2hhcGVzLCB0aGlzLl9zZWxlY3RlZFNoYXBlcywgdGhpcy5fc2VsZWN0U3R5bGUsIHRoaXMuX3hmb3JtU3R5bGUsIHNoYXBlSW5mbylcbiAgICAgICAgICBzZWxlY3RlZFNoYXBlcy5wdXNoKG5ld1NoYXBlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoc2VsZWN0ZWRTaGFwZXMubGVuZ3RoKSB7XG4gICAgICAgIHNlbGVjdEV2ZW50T2JqLnNlbGVjdGVkU2hhcGVzID0gc2VsZWN0ZWRTaGFwZXNcbiAgICAgICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCBzZWxlY3RFdmVudE9iailcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICBkZWxldGVTaGFwZShzaGFwZSkge1xuICAgIGxldCBzaGFwZXMgPSBzaGFwZVxuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGFwZXMpKSB7XG4gICAgICBzaGFwZXMgPSBbc2hhcGVdXG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdENsZWFyZWRTaGFwZXMgPSBjbGVhclNwZWNpZmljU2hhcGVzKHRoaXMuX3NlbGVjdGVkU2hhcGVzLCBzaGFwZXMpXG4gICAgdGhpcy5maXJlKEV2ZW50Q29uc3RhbnRzLlNFTEVDVElPTl9DSEFOR0VELCB7XG4gICAgICB1bnNlbGVjdGVkU2hhcGVzOiBzZWxlY3RDbGVhcmVkU2hhcGVzLFxuICAgICAgc2VsZWN0ZWRTaGFwZXM6IGdldFNlbGVjdGVkT2Jqc0Zyb21NYXAodGhpcy5fc2VsZWN0ZWRTaGFwZXMpXG4gICAgfSlcblxuICAgIHJlbW92ZUN1c3RvbUN1cnNvcigpXG4gICAgdGhpcy5fcGFyZW50LnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiXG4gICAgLy8gZm9yRWFjaCBub3Qgc3VwcG9ydGVkIG9uIG5vZGVsaXN0IGluIElFL0VkZ2VcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5jdXJzb3IgPSBcImRlZmF1bHRcIlxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXNbal0uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiXG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmRlbGV0ZVNoYXBlKHNoYXBlcylcbiAgfVxuXG4gIGRlbGV0ZVNlbGVjdGVkU2hhcGVzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkU2hhcGVzID0gZ2V0U2VsZWN0ZWRPYmpzRnJvbU1hcCh0aGlzLl9zZWxlY3RlZFNoYXBlcylcbiAgICBjbGVhclNlbGVjdGVkU2hhcGVzKHRoaXMuX3NlbGVjdGVkU2hhcGVzKVxuICAgIHRoaXMuZmlyZShFdmVudENvbnN0YW50cy5TRUxFQ1RJT05fQ0hBTkdFRCwge1xuICAgICAgdW5zZWxlY3RlZFNoYXBlczogc2VsZWN0ZWRTaGFwZXMsXG4gICAgICBzZWxlY3RlZFNoYXBlczogW11cbiAgICB9KVxuXG4gICAgcmVtb3ZlQ3VzdG9tQ3Vyc29yKClcbiAgICB0aGlzLl9wYXJlbnQuc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCJcbiAgICAvLyBmb3JFYWNoIG5vdCBzdXBwb3J0ZWQgb24gbm9kZWxpc3QgaW4gSUUvRWRnZVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5jaGlsZE5vZGVzW2pdLnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiXG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGROb2Rlc1tqXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCJcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZGVsZXRlU2hhcGUoc2VsZWN0ZWRTaGFwZXMpXG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25zRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGVkXG4gIH1cblxuICBlbmFibGVJbnRlcmFjdGlvbnMoKSB7XG4gICAgdGhpcy5fZW5hYmxlRXZlbnRzKClcbiAgICB0aGlzLl9hY3RpdmF0ZWQgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGRpc2FibGVJbnRlcmFjdGlvbnMoY2xlYXJTZWxlY3Rpb24gPSB0cnVlKSB7XG4gICAgaWYgKGNsZWFyU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKClcbiAgICB9XG4gICAgdGhpcy5fZGlzYWJsZUV2ZW50cygpXG4gICAgdGhpcy5fYWN0aXZhdGVkID0gZmFsc2VcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oRXZlbnRDb25zdGFudHMsIERyYXdFbmdpbmUuRXZlbnRDb25zdGFudHMpXG5TaGFwZUJ1aWxkZXIuRXZlbnRDb25zdGFudHMgPSBFdmVudENvbnN0YW50c1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vZW5naW5lL3NoYXBlLWJ1aWxkZXIuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _baseShape = __webpack_require__(6);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _math = __webpack_require__(5);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} CircleOptions\n * @property {number} [radius=10] Radius of the circle in world-space coordinates\n */\n\n/**\n * @class Shape class describing a circle\n * @extends {BaseShape}\n */\nvar Circle = function (_BaseShape) {\n _inherits(Circle, _BaseShape);\n\n /**\n * Creates a new Circle shape\n * @param {CircleOptions} [opts]\n * @return {Circle}\n */\n function Circle(opts) {\n _classCallCheck(this, Circle);\n\n var _this = _possibleConstructorReturn(this, (Circle.__proto__ || Object.getPrototypeOf(Circle)).call(this, opts));\n\n _this._radius = 10;\n if (typeof opts.radius !== \"undefined\") {\n _this.radius = opts.radius;\n }\n AABox2d.initCenterExtents(_this._aabox, [0, 0], [_this._radius, _this._radius]);\n return _this;\n }\n\n /**\n * Sets the radius of the circle\n * @param {number} radius Radius of circle in world-space coordinates\n * @return {Circle} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If radius is not a valid number\n */\n\n\n _createClass(Circle, [{\n key: \"getDimensions\",\n\n\n /**\n * Gets the untransformed width/height of the circle\n * @return {Vec2d} Width/height of the circle, untransformed\n */\n value: function getDimensions() {\n var diameter = this.radius * 2;\n return [diameter, diameter];\n }\n\n /**\n * Gets the untransformed width of the circle\n * @return {number}\n */\n\n }, {\n key: \"_updateAABox\",\n\n\n /**\n * Called when the bounding box requires updating\n * @private\n * @override\n */\n value: function _updateAABox() {\n if (this._geomDirty || this._boundsOutOfDate) {\n var pos = this._pos;\n var scale = this._scale;\n var rot = _math2.default.DEG_TO_RAD * this._rotDeg;\n var cossqr = _math2.default.pow(_math2.default.cos(rot), 2);\n var sinsqr = _math2.default.pow(_math2.default.sin(rot), 2);\n var asqr = _math2.default.pow(scale[0] * this._radius, 2);\n var bsqr = _math2.default.pow(scale[1] * this._radius, 2);\n var A = _math2.default.sqrt(bsqr * sinsqr + asqr * cossqr);\n var B = _math2.default.sqrt(asqr * sinsqr + bsqr * cossqr);\n AABox2d.initCenterExtents(this._aabox, pos, [A, B]);\n this._geomDirty = false;\n this._boundsOutOfDate = false;\n }\n }\n\n /**\n * Draws the circle using a 2d rendering context. Called by the BaseShape\n * class\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @override\n */\n\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n ctx.arc(0, 0, this._radius, 0, _math2.default.TWO_PI, false);\n }\n\n /**\n * Called to convert the shape to a serializable JSON object\n * @return {object}\n * @override\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"Circle\", // NOTE: this much match the name of the class\n radius: this.radius\n }, _get(Circle.prototype.__proto__ || Object.getPrototypeOf(Circle.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"radius\",\n set: function set(radius) {\n if (typeof radius !== \"number\") {\n throw new Error(\"Radius must be a number\");\n }\n\n if (radius !== this._radius) {\n var prev = this._radius;\n this._radius = radius;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"radius\",\n prevVal: prev,\n currVal: this._radius\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current radius of the circle\n * @return {number}\n */\n ,\n get: function get() {\n return this._radius;\n }\n }, {\n key: \"width\",\n get: function get() {\n return this.radius * 2;\n }\n\n /**\n * Gets the untransformed height of the circle\n * @return {number}\n */\n\n }, {\n key: \"height\",\n get: function get() {\n return this.radius * 2;\n }\n }]);\n\n return Circle;\n}(_baseShape2.default);\n\nexports.default = Circle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvY2lyY2xlLmpzP2FkOWQiXSwibmFtZXMiOlsiQUFCb3gyZCIsIkNpcmNsZSIsIm9wdHMiLCJfcmFkaXVzIiwicmFkaXVzIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJkaWFtZXRlciIsIl9nZW9tRGlydHkiLCJfYm91bmRzT3V0T2ZEYXRlIiwicG9zIiwiX3BvcyIsInNjYWxlIiwiX3NjYWxlIiwicm90IiwiTWF0aCIsIkRFR19UT19SQUQiLCJfcm90RGVnIiwiY29zc3FyIiwicG93IiwiY29zIiwic2luc3FyIiwic2luIiwiYXNxciIsImJzcXIiLCJBIiwic3FydCIsIkIiLCJjdHgiLCJhcmMiLCJUV09fUEkiLCJPYmplY3QiLCJhc3NpZ24iLCJ0eXBlIiwiRXJyb3IiLCJwcmV2IiwiZmlyZSIsImF0dHIiLCJwcmV2VmFsIiwiY3VyclZhbCIsIkJhc2VTaGFwZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFFQTs7SUFBWUEsTzs7QUFDWjs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBOzs7O0lBSXFCQyxNOzs7QUFDbkI7Ozs7O0FBS0Esa0JBQVlDLElBQVosRUFBa0I7QUFBQTs7QUFBQSxnSEFDVkEsSUFEVTs7QUFFaEIsVUFBS0MsT0FBTCxHQUFlLEVBQWY7QUFDQSxRQUFJLE9BQU9ELEtBQUtFLE1BQVosS0FBdUIsV0FBM0IsRUFBd0M7QUFDdEMsWUFBS0EsTUFBTCxHQUFjRixLQUFLRSxNQUFuQjtBQUNEO0FBQ0RKLFlBQVFLLGlCQUFSLENBQTBCLE1BQUtDLE1BQS9CLEVBQXVDLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBdkMsRUFBK0MsQ0FBQyxNQUFLSCxPQUFOLEVBQWUsTUFBS0EsT0FBcEIsQ0FBL0M7QUFOZ0I7QUFPakI7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7QUFtQ0E7Ozs7b0NBSWdCO0FBQ2QsVUFBTUksV0FBVyxLQUFLSCxNQUFMLEdBQWMsQ0FBL0I7QUFDQSxhQUFPLENBQUNHLFFBQUQsRUFBV0EsUUFBWCxDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OztBQWdCQTs7Ozs7bUNBS2U7QUFDYixVQUFJLEtBQUtDLFVBQUwsSUFBbUIsS0FBS0MsZ0JBQTVCLEVBQThDO0FBQzVDLFlBQU1DLE1BQU0sS0FBS0MsSUFBakI7QUFDQSxZQUFNQyxRQUFRLEtBQUtDLE1BQW5CO0FBQ0EsWUFBTUMsTUFBTUMsZUFBS0MsVUFBTCxHQUFrQixLQUFLQyxPQUFuQztBQUNBLFlBQU1DLFNBQVNILGVBQUtJLEdBQUwsQ0FBU0osZUFBS0ssR0FBTCxDQUFTTixHQUFULENBQVQsRUFBd0IsQ0FBeEIsQ0FBZjtBQUNBLFlBQU1PLFNBQVNOLGVBQUtJLEdBQUwsQ0FBU0osZUFBS08sR0FBTCxDQUFTUixHQUFULENBQVQsRUFBd0IsQ0FBeEIsQ0FBZjtBQUNBLFlBQU1TLE9BQU9SLGVBQUtJLEdBQUwsQ0FBU1AsTUFBTSxDQUFOLElBQVcsS0FBS1QsT0FBekIsRUFBa0MsQ0FBbEMsQ0FBYjtBQUNBLFlBQU1xQixPQUFPVCxlQUFLSSxHQUFMLENBQVNQLE1BQU0sQ0FBTixJQUFXLEtBQUtULE9BQXpCLEVBQWtDLENBQWxDLENBQWI7QUFDQSxZQUFNc0IsSUFBSVYsZUFBS1csSUFBTCxDQUFVRixPQUFPSCxNQUFQLEdBQWdCRSxPQUFPTCxNQUFqQyxDQUFWO0FBQ0EsWUFBTVMsSUFBSVosZUFBS1csSUFBTCxDQUFVSCxPQUFPRixNQUFQLEdBQWdCRyxPQUFPTixNQUFqQyxDQUFWO0FBQ0FsQixnQkFBUUssaUJBQVIsQ0FBMEIsS0FBS0MsTUFBL0IsRUFBdUNJLEdBQXZDLEVBQTRDLENBQUNlLENBQUQsRUFBSUUsQ0FBSixDQUE1QztBQUNBLGFBQUtuQixVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsYUFBS0MsZ0JBQUwsR0FBd0IsS0FBeEI7QUFDRDtBQUNGOztBQUVEOzs7Ozs7Ozs7MEJBTU1tQixHLEVBQUs7QUFDVEEsVUFBSUMsR0FBSixDQUFRLENBQVIsRUFBVyxDQUFYLEVBQWMsS0FBSzFCLE9BQW5CLEVBQTRCLENBQTVCLEVBQStCWSxlQUFLZSxNQUFwQyxFQUE0QyxLQUE1QztBQUNEOztBQUVEOzs7Ozs7Ozs2QkFLUztBQUNQLGFBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNuQkMsY0FBTSxRQURhLEVBQ0g7QUFDaEI3QixnQkFBUSxLQUFLQTtBQUZNLE9BQWQseUdBQVA7QUFJRDs7O3NCQS9GVUEsTSxFQUFRO0FBQ2pCLFVBQUksT0FBT0EsTUFBUCxLQUFrQixRQUF0QixFQUFnQztBQUM5QixjQUFNLElBQUk4QixLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEOztBQUVELFVBQUk5QixXQUFXLEtBQUtELE9BQXBCLEVBQTZCO0FBQzNCLFlBQU1nQyxPQUFPLEtBQUtoQyxPQUFsQjtBQUNBLGFBQUtBLE9BQUwsR0FBZUMsTUFBZjtBQUNBLGFBQUtJLFVBQUwsR0FBa0IsSUFBbEIsQ0FIMkIsQ0FHSjs7QUFFdkIsYUFBSzRCLElBQUwsQ0FBVSxjQUFWLEVBQTBCO0FBQ3hCQyxnQkFBTSxRQURrQjtBQUV4QkMsbUJBQVNILElBRmU7QUFHeEJJLG1CQUFTLEtBQUtwQztBQUhVLFNBQTFCO0FBS0Q7O0FBRUQsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7O3dCQUlhO0FBQ1gsYUFBTyxLQUFLQSxPQUFaO0FBQ0Q7Ozt3QkFlVztBQUNWLGFBQU8sS0FBS0MsTUFBTCxHQUFjLENBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7d0JBSWE7QUFDWCxhQUFPLEtBQUtBLE1BQUwsR0FBYyxDQUFyQjtBQUNEOzs7O0VBekVpQ29DLG1COztrQkFBZnZDLE0iLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuLi9jb3JlL2FhYm94MmRcIlxuaW1wb3J0IEJhc2VTaGFwZSBmcm9tIFwiLi9iYXNlLXNoYXBlLmpzXCJcbmltcG9ydCBNYXRoIGZyb20gXCIuLi9tYXRoL21hdGhcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENpcmNsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmFkaXVzPTEwXSBSYWRpdXMgb2YgdGhlIGNpcmNsZSBpbiB3b3JsZC1zcGFjZSBjb29yZGluYXRlc1xuICovXG5cbi8qKlxuICogQGNsYXNzIFNoYXBlIGNsYXNzIGRlc2NyaWJpbmcgYSBjaXJjbGVcbiAqIEBleHRlbmRzIHtCYXNlU2hhcGV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmNsZSBleHRlbmRzIEJhc2VTaGFwZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENpcmNsZSBzaGFwZVxuICAgKiBAcGFyYW0gIHtDaXJjbGVPcHRpb25zfSBbb3B0c11cbiAgICogQHJldHVybiB7Q2lyY2xlfVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpcy5fcmFkaXVzID0gMTBcbiAgICBpZiAodHlwZW9mIG9wdHMucmFkaXVzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnJhZGl1cyA9IG9wdHMucmFkaXVzXG4gICAgfVxuICAgIEFBQm94MmQuaW5pdENlbnRlckV4dGVudHModGhpcy5fYWFib3gsIFswLCAwXSwgW3RoaXMuX3JhZGl1cywgdGhpcy5fcmFkaXVzXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZVxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHJhZGl1cyBSYWRpdXMgb2YgY2lyY2xlIGluIHdvcmxkLXNwYWNlIGNvb3JkaW5hdGVzXG4gICAqIEByZXR1cm4ge0NpcmNsZX0gICAgICAgIHRoaXNcbiAgICogQGZpcmVzIHtTaGFwZSNnZW9tQ2hhbmdlZH1cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHJhZGl1cyBpcyBub3QgYSB2YWxpZCBudW1iZXJcbiAgICovXG4gIHNldCByYWRpdXMocmFkaXVzKSB7XG4gICAgaWYgKHR5cGVvZiByYWRpdXMgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhZGl1cyBtdXN0IGJlIGEgbnVtYmVyXCIpXG4gICAgfVxuXG4gICAgaWYgKHJhZGl1cyAhPT0gdGhpcy5fcmFkaXVzKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5fcmFkaXVzXG4gICAgICB0aGlzLl9yYWRpdXMgPSByYWRpdXNcbiAgICAgIHRoaXMuX2dlb21EaXJ0eSA9IHRydWUgLy8gZGlydHkgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBmaXJpbmcgZXZlbnRcblxuICAgICAgdGhpcy5maXJlKFwiY2hhbmdlZDpnZW9tXCIsIHtcbiAgICAgICAgYXR0cjogXCJyYWRpdXNcIixcbiAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgY3VyclZhbDogdGhpcy5fcmFkaXVzXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCByYWRpdXMgb2YgdGhlIGNpcmNsZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcmFkaXVzKCkge1xuICAgIHJldHVybiB0aGlzLl9yYWRpdXNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bnRyYW5zZm9ybWVkIHdpZHRoL2hlaWdodCBvZiB0aGUgY2lyY2xlXG4gICAqIEByZXR1cm4ge1ZlYzJkfSBXaWR0aC9oZWlnaHQgb2YgdGhlIGNpcmNsZSwgdW50cmFuc2Zvcm1lZFxuICAgKi9cbiAgZ2V0RGltZW5zaW9ucygpIHtcbiAgICBjb25zdCBkaWFtZXRlciA9IHRoaXMucmFkaXVzICogMlxuICAgIHJldHVybiBbZGlhbWV0ZXIsIGRpYW1ldGVyXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVudHJhbnNmb3JtZWQgd2lkdGggb2YgdGhlIGNpcmNsZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaXVzICogMlxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVudHJhbnNmb3JtZWQgaGVpZ2h0IG9mIHRoZSBjaXJjbGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5yYWRpdXMgKiAyXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJvdW5kaW5nIGJveCByZXF1aXJlcyB1cGRhdGluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF91cGRhdGVBQUJveCgpIHtcbiAgICBpZiAodGhpcy5fZ2VvbURpcnR5IHx8IHRoaXMuX2JvdW5kc091dE9mRGF0ZSkge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zXG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWxlXG4gICAgICBjb25zdCByb3QgPSBNYXRoLkRFR19UT19SQUQgKiB0aGlzLl9yb3REZWdcbiAgICAgIGNvbnN0IGNvc3NxciA9IE1hdGgucG93KE1hdGguY29zKHJvdCksIDIpXG4gICAgICBjb25zdCBzaW5zcXIgPSBNYXRoLnBvdyhNYXRoLnNpbihyb3QpLCAyKVxuICAgICAgY29uc3QgYXNxciA9IE1hdGgucG93KHNjYWxlWzBdICogdGhpcy5fcmFkaXVzLCAyKVxuICAgICAgY29uc3QgYnNxciA9IE1hdGgucG93KHNjYWxlWzFdICogdGhpcy5fcmFkaXVzLCAyKVxuICAgICAgY29uc3QgQSA9IE1hdGguc3FydChic3FyICogc2luc3FyICsgYXNxciAqIGNvc3NxcilcbiAgICAgIGNvbnN0IEIgPSBNYXRoLnNxcnQoYXNxciAqIHNpbnNxciArIGJzcXIgKiBjb3NzcXIpXG4gICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKHRoaXMuX2FhYm94LCBwb3MsIFtBLCBCXSlcbiAgICAgIHRoaXMuX2dlb21EaXJ0eSA9IGZhbHNlXG4gICAgICB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgY2lyY2xlIHVzaW5nIGEgMmQgcmVuZGVyaW5nIGNvbnRleHQuIENhbGxlZCBieSB0aGUgQmFzZVNoYXBlXG4gICAqIGNsYXNzXG4gICAqIEBwYXJhbSAge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyZH0gY3R4IDJkIHJlbmRlcmluZyBjb250ZXh0XG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgX2RyYXcoY3R4KSB7XG4gICAgY3R4LmFyYygwLCAwLCB0aGlzLl9yYWRpdXMsIDAsIE1hdGguVFdPX1BJLCBmYWxzZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgdG8gY29udmVydCB0aGUgc2hhcGUgdG8gYSBzZXJpYWxpemFibGUgSlNPTiBvYmplY3RcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICB0eXBlOiBcIkNpcmNsZVwiLCAvLyBOT1RFOiB0aGlzIG11Y2ggbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGNsYXNzXG4gICAgICByYWRpdXM6IHRoaXMucmFkaXVzXG4gICAgfSwgc3VwZXIudG9KU09OKCkpXG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2hhcGVzL2NpcmNsZS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 24 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.transformXformShape = transformXformShape;\nexports.translateShape = translateShape;\nexports.translateVert = translateVert;\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _mat2d = __webpack_require__(5);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _vec2d = __webpack_require__(10);\n\nvar _vec2d2 = _interopRequireDefault(_vec2d);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction rotateOBBox(shape, parentShape, selectedInfo, screenPos, worldPos) {\n var pt = [0, 0];\n var scale = [0, 0];\n _mat2d2.default.svd(pt, scale, null, selectedInfo.objectToWorldMatrix);\n var startDir = [0, 0];\n Point2d.sub(startDir, selectedInfo.startWorldPos, pt);\n _vec2d2.default.normalize(startDir, startDir);\n var dir = pt;\n Point2d.sub(dir, worldPos, pt);\n _vec2d2.default.normalize(dir, dir);\n var angle = _vec2d2.default.angle(startDir, dir);\n\n if (selectedInfo.keys.shiftKey) {\n angle = Math.round(angle / Math.QUATER_PI) * Math.QUATER_PI;\n }\n\n // if (!camera.isYFlipped()) {\n // angle *= -1\n // }\n\n parentShape.setRotation(selectedInfo.startLocalRot + Math.RAD_TO_DEG * angle);\n}\n\nfunction transformXformShape(shape, selectedInfo, screenPos, worldPos, camera) {\n var parentShape = shape.parent;\n var objPos = [0, 0];\n var deltaPos = [0, 0];\n var deltaDims = [0, 0];\n\n if (selectedInfo.rotate) {\n rotateOBBox(shape, parentShape, selectedInfo, screenPos, worldPos, camera);\n return;\n }\n\n var uniformScale = selectedInfo.keys.shiftKey || selectedInfo.uniformScaleOnly;\n var centerScale = selectedInfo.keys.altKey || selectedInfo.centerScaleOnly;\n\n // get the position of the shape at start of transform\n var pt = [0, 0];\n _mat2d2.default.svd(pt, null, null, selectedInfo.objectToWorldMatrix);\n\n // get the mouse delta in world space\n _vec2d2.default.sub(deltaPos, worldPos, selectedInfo.startWorldPos);\n\n if (uniformScale && selectedInfo.controlIndex < 4) {\n var xAxisDir = [selectedInfo.objectToWorldMatrix[0], selectedInfo.objectToWorldMatrix[1]];\n var yAxisDir = [selectedInfo.objectToWorldMatrix[2], selectedInfo.objectToWorldMatrix[3]];\n var diagDir = [0, 0];\n\n if (selectedInfo.controlIndex < 2) {\n _vec2d2.default.negate(xAxisDir, xAxisDir);\n }\n if (selectedInfo.controlIndex % 2 === 0) {\n _vec2d2.default.negate(yAxisDir, yAxisDir);\n }\n\n _vec2d2.default.normalize(xAxisDir, xAxisDir);\n _vec2d2.default.normalize(yAxisDir, yAxisDir);\n\n _vec2d2.default.add(diagDir, xAxisDir, yAxisDir);\n _vec2d2.default.normalize(diagDir, diagDir);\n\n var cross = _vec2d2.default.cross2d(deltaPos, diagDir);\n var axisToUse = null;\n if (selectedInfo.controlIndex === 0 || selectedInfo.controlIndex === 3) {\n axisToUse = yAxisDir;\n if (cross < 0) {\n axisToUse = xAxisDir;\n }\n } else {\n axisToUse = xAxisDir;\n if (cross < 0) {\n axisToUse = yAxisDir;\n }\n }\n var mindist = _vec2d2.default.dot(deltaPos, axisToUse);\n mindist = Math.sign(mindist) * Math.sqrt(2 * mindist * mindist);\n _vec2d2.default.scale(deltaPos, diagDir, mindist);\n Point2d.addVec2(worldPos, selectedInfo.startWorldPos, deltaPos);\n }\n\n // first convert world point to object space\n Point2d.copy(objPos, worldPos);\n Point2d.transformMat2d(objPos, objPos, selectedInfo.worldToObjectMatrix);\n\n // get the mouse delta in object space and multipy by the\n // scale of the selected object at the start of the transform\n // to get the scale delta in object space\n _vec2d2.default.sub(deltaDims, objPos, selectedInfo.startObjectPos);\n\n Point2d.copy(pt, selectedInfo.startLocalPos);\n\n // now determine the transform direction depending\n // on which control vertex of the object-oriented bounds\n // was selected\n var xScale = 0;\n var yScale = 0;\n if (selectedInfo.controlIndex < 4) {\n // dragging a corner vertex\n xScale = selectedInfo.controlIndex < 2 ? -1 : 1;\n yScale = selectedInfo.controlIndex % 2 === 0 ? -1 : 1;\n\n // can translate based on the mouse delta in world space\n // This is done to offset the scale, which is done at\n // the shape's center. This ultimately acts as a pivot\n // for the transformation. Only do this if the alt key\n // isn't pressed\n if (!centerScale) {\n Point2d.addVec2(pt, pt, _vec2d2.default.scale(deltaPos, deltaPos, 0.5));\n }\n\n parentShape.setPosition(pt);\n } else {\n // dragging a side vertex, which means we only scale in\n // one dimension, rather than 2. So we need to figure\n // out that direction based on the orientation of the\n // shape\n var idx = selectedInfo.controlIndex - 4;\n var axisDir = [0, 0];\n if (idx % 2 === 0) {\n // scaling in the object's X direction\n _vec2d2.default.set(axisDir, selectedInfo.objectToWorldMatrix[0], selectedInfo.objectToWorldMatrix[1]);\n yScale = 0;\n xScale = idx < 2 ? -1 : 1;\n if (uniformScale) {\n yScale = xScale;\n deltaDims[1] = deltaDims[0];\n }\n } else {\n // scaling in the object's Y direction\n _vec2d2.default.set(axisDir, selectedInfo.objectToWorldMatrix[2], selectedInfo.objectToWorldMatrix[3]);\n xScale = 0;\n yScale = idx < 2 ? -1 : 1;\n if (uniformScale) {\n xScale = yScale;\n deltaDims[0] = deltaDims[1];\n }\n }\n\n // now find the pivot offset for the axis-aligned scale\n if (!centerScale) {\n _vec2d2.default.normalize(axisDir, axisDir);\n _vec2d2.default.scale(axisDir, axisDir, _vec2d2.default.dot(deltaPos, axisDir));\n Point2d.addVec2(pt, pt, _vec2d2.default.scale(axisDir, axisDir, 0.5));\n }\n\n parentShape.setPosition(pt);\n }\n\n if (centerScale) {\n xScale *= 2;\n yScale *= 2;\n }\n\n // perform the scale\n parentShape.setScale([selectedInfo.startLocalScale[0] * (1 + xScale * deltaDims[0] / selectedInfo.shapeWidth), selectedInfo.startLocalScale[1] * (1 + yScale * deltaDims[1] / selectedInfo.shapeHeight)]);\n}\n\nfunction translateShape(shape, selectedInfo, screenPos, worldPos, camera) {\n var diff = [0, 0];\n var pt = [0, 0];\n _mat2d2.default.svd(pt, null, null, selectedInfo.objectToWorldMatrix);\n if (selectedInfo.keys.shiftKey) {\n Point2d.sub(diff, screenPos, selectedInfo.startPos);\n var angle = Math.atan2(diff[1], diff[0]);\n angle = Math.round(angle / Math.QUATER_PI) * Math.QUATER_PI;\n var transformDir = [Math.cos(angle), Math.sin(angle)];\n _vec2d2.default.scale(diff, transformDir, _vec2d2.default.dot(diff, transformDir));\n _vec2d2.default.transformMat2(diff, diff, camera.screenToWorldMatrix);\n } else {\n _vec2d2.default.sub(diff, worldPos, selectedInfo.startWorldPos);\n }\n Point2d.addVec2(pt, selectedInfo.startLocalPos, diff);\n\n shape.setPosition(pt);\n}\n\nfunction translateVert(shape, selectedInfo, screenPos, worldPos) {\n var parentShape = shape.parent;\n\n // get the position of the shape at start of transform\n // const pt = [0, 0]\n // Mat2d.svd(pt, null, null, selectedInfo.objectToWorldMatrix)\n\n // get the mouse delta in world space\n // Vec2d.sub(deltaPos, worldPos, selectedInfo.startWorldPos)\n\n // first convert world point to object space\n // Point2d.copy(objPos, worldPos)\n // Point2d.transformMat2d(objPos, objPos, selectedInfo.worldToObjectMatrix)\n\n // get the diff\n // const diff = objPos\n // Point2d.sub(diff, objPos, selectedInfo.startObjectPos)\n\n var numVerts = parentShape.numVerts;\n if (selectedInfo.controlIndex >= numVerts) {\n var idx1 = Math.min(selectedInfo.controlIndex - numVerts, numVerts - 1);\n var idx2 = idx1 === numVerts - 1 ? 0 : idx1 + 1;\n var pt = [0, 0];\n var pt1 = [0, 0];\n var pt2 = [0, 0];\n var vec = [0, 0];\n var verts = parentShape.vertsRef;\n var xform = parentShape.globalXform;\n Point2d.transformMat2d(pt1, verts[idx1], xform);\n Point2d.transformMat2d(pt2, verts[idx2], xform);\n Point2d.sub(vec, pt2, pt1);\n _vec2d2.default.scale(vec, vec, 0.5);\n Point2d.addVec2(pt, pt1, vec);\n selectedInfo.controlIndex = parentShape.insertVert(idx1 + 1, pt);\n } else {\n parentShape.setVertPosition(selectedInfo.controlIndex, worldPos);\n }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmFjdGlvbnMvaW50ZXJhY3QtdXRpbHMuanM/NzE0YiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm1YZm9ybVNoYXBlIiwidHJhbnNsYXRlU2hhcGUiLCJ0cmFuc2xhdGVWZXJ0IiwiUG9pbnQyZCIsInJvdGF0ZU9CQm94Iiwic2hhcGUiLCJwYXJlbnRTaGFwZSIsInNlbGVjdGVkSW5mbyIsInNjcmVlblBvcyIsIndvcmxkUG9zIiwicHQiLCJzY2FsZSIsInN2ZCIsIm9iamVjdFRvV29ybGRNYXRyaXgiLCJzdGFydERpciIsInN1YiIsInN0YXJ0V29ybGRQb3MiLCJub3JtYWxpemUiLCJkaXIiLCJhbmdsZSIsImtleXMiLCJzaGlmdEtleSIsIk1hdGgiLCJyb3VuZCIsIlFVQVRFUl9QSSIsInNldFJvdGF0aW9uIiwic3RhcnRMb2NhbFJvdCIsIlJBRF9UT19ERUciLCJjYW1lcmEiLCJwYXJlbnQiLCJvYmpQb3MiLCJkZWx0YVBvcyIsImRlbHRhRGltcyIsInJvdGF0ZSIsInVuaWZvcm1TY2FsZSIsInVuaWZvcm1TY2FsZU9ubHkiLCJjZW50ZXJTY2FsZSIsImFsdEtleSIsImNlbnRlclNjYWxlT25seSIsImNvbnRyb2xJbmRleCIsInhBeGlzRGlyIiwieUF4aXNEaXIiLCJkaWFnRGlyIiwibmVnYXRlIiwiYWRkIiwiY3Jvc3MiLCJjcm9zczJkIiwiYXhpc1RvVXNlIiwibWluZGlzdCIsImRvdCIsInNpZ24iLCJzcXJ0IiwiYWRkVmVjMiIsImNvcHkiLCJ0cmFuc2Zvcm1NYXQyZCIsIndvcmxkVG9PYmplY3RNYXRyaXgiLCJzdGFydE9iamVjdFBvcyIsInN0YXJ0TG9jYWxQb3MiLCJ4U2NhbGUiLCJ5U2NhbGUiLCJzZXRQb3NpdGlvbiIsImlkeCIsImF4aXNEaXIiLCJzZXQiLCJzZXRTY2FsZSIsInN0YXJ0TG9jYWxTY2FsZSIsInNoYXBlV2lkdGgiLCJzaGFwZUhlaWdodCIsImRpZmYiLCJzdGFydFBvcyIsImF0YW4yIiwidHJhbnNmb3JtRGlyIiwiY29zIiwic2luIiwidHJhbnNmb3JtTWF0MiIsInNjcmVlblRvV29ybGRNYXRyaXgiLCJudW1WZXJ0cyIsImlkeDEiLCJtaW4iLCJpZHgyIiwicHQxIiwicHQyIiwidmVjIiwidmVydHMiLCJ2ZXJ0c1JlZiIsInhmb3JtIiwiZ2xvYmFsWGZvcm0iLCJpbnNlcnRWZXJ0Iiwic2V0VmVydFBvc2l0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOzs7OztRQTZCZ0JBLG1CLEdBQUFBLG1CO1FBdUlBQyxjLEdBQUFBLGM7UUFtQkFDLGEsR0FBQUEsYTs7QUFyTGhCOztJQUFZQyxPOztBQUNaOzs7O0FBQ0E7Ozs7Ozs7O0FBRUEsU0FBU0MsV0FBVCxDQUFxQkMsS0FBckIsRUFBNEJDLFdBQTVCLEVBQXlDQyxZQUF6QyxFQUF1REMsU0FBdkQsRUFBa0VDLFFBQWxFLEVBQTRFO0FBQzFFLE1BQU1DLEtBQUssQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFYO0FBQ0EsTUFBTUMsUUFBUSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWQ7QUFDQSxrQkFBTUMsR0FBTixDQUFVRixFQUFWLEVBQWNDLEtBQWQsRUFBcUIsSUFBckIsRUFBMkJKLGFBQWFNLG1CQUF4QztBQUNBLE1BQU1DLFdBQVcsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFqQjtBQUNBWCxVQUFRWSxHQUFSLENBQVlELFFBQVosRUFBc0JQLGFBQWFTLGFBQW5DLEVBQWtETixFQUFsRDtBQUNBLGtCQUFNTyxTQUFOLENBQWdCSCxRQUFoQixFQUEwQkEsUUFBMUI7QUFDQSxNQUFNSSxNQUFNUixFQUFaO0FBQ0FQLFVBQVFZLEdBQVIsQ0FBWUcsR0FBWixFQUFpQlQsUUFBakIsRUFBMkJDLEVBQTNCO0FBQ0Esa0JBQU1PLFNBQU4sQ0FBZ0JDLEdBQWhCLEVBQXFCQSxHQUFyQjtBQUNBLE1BQUlDLFFBQVEsZ0JBQU1BLEtBQU4sQ0FBWUwsUUFBWixFQUFzQkksR0FBdEIsQ0FBWjs7QUFFQSxNQUFJWCxhQUFhYSxJQUFiLENBQWtCQyxRQUF0QixFQUFn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TUcsT0FBUUYsU0FBU0QsV0FBVyxDQUFwQixHQUF3QixDQUF4QixHQUE0QkMsT0FBTyxDQUFqRDtBQUNBLFFBQU1uRSxLQUFLLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBWDtBQUNBLFFBQU1zRSxNQUFNLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBWjtBQUNBLFFBQU1DLE1BQU0sQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFaO0FBQ0EsUUFBTUMsTUFBTSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQVo7QUFDQSxRQUFNQyxRQUFRN0UsWUFBWThFLFFBQTFCO0FBQ0EsUUFBTUMsUUFBUS9FLFlBQVlnRixXQUExQjtBQUNBbkYsWUFBUW1ELGNBQVIsQ0FBdUIwQixHQUF2QixFQUE0QkcsTUFBTU4sSUFBTixDQUE1QixFQUF5Q1EsS0FBekM7QUFDQWxGLFlBQVFtRCxjQUFSLENBQXVCMkIsR0FBdkIsRUFBNEJFLE1BQU1KLElBQU4sQ0FBNUIsRUFBeUNNLEtBQXpDO0FBQ0FsRixZQUFRWSxHQUFSLENBQVltRSxHQUFaLEVBQWlCRCxHQUFqQixFQUFzQkQsR0FBdEI7QUFDQSxvQkFBTXJFLEtBQU4sQ0FBWXVFLEdBQVosRUFBaUJBLEdBQWpCLEVBQXNCLEdBQXRCO0FBQ0EvRSxZQUFRaUQsT0FBUixDQUFnQjFDLEVBQWhCLEVBQW9Cc0UsR0FBcEIsRUFBeUJFLEdBQXpCO0FBQ0EzRSxpQkFBYWdDLFlBQWIsR0FBNEJqQyxZQUFZaUYsVUFBWixDQUF1QlYsT0FBTyxDQUE5QixFQUFpQ25FLEVBQWpDLENBQTVCO0FBQ0QsR0FmRCxNQWVPO0FBQ0xKLGdCQUFZa0YsZUFBWixDQUE0QmpGLGFBQWFnQyxZQUF6QyxFQUF1RDlCLFFBQXZEO0FBQ0Q7QUFDRiIsImZpbGUiOiIyNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLW1hZ2ljLW51bWJlcnMgKi9cblwidXNlIHN0cmljdFwiXG5cbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQgTWF0MmQgZnJvbSBcIi4uL2NvcmUvbWF0MmRcIlxuaW1wb3J0IFZlYzJkIGZyb20gXCIuLi9jb3JlL3ZlYzJkXCJcblxuZnVuY3Rpb24gcm90YXRlT0JCb3goc2hhcGUsIHBhcmVudFNoYXBlLCBzZWxlY3RlZEluZm8sIHNjcmVlblBvcywgd29ybGRQb3MpIHtcbiAgY29uc3QgcHQgPSBbMCwgMF1cbiAgY29uc3Qgc2NhbGUgPSBbMCwgMF1cbiAgTWF0MmQuc3ZkKHB0LCBzY2FsZSwgbnVsbCwgc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXgpXG4gIGNvbnN0IHN0YXJ0RGlyID0gWzAsIDBdXG4gIFBvaW50MmQuc3ViKHN0YXJ0RGlyLCBzZWxlY3RlZEluZm8uc3RhcnRXb3JsZFBvcywgcHQpXG4gIFZlYzJkLm5vcm1hbGl6ZShzdGFydERpciwgc3RhcnREaXIpXG4gIGNvbnN0IGRpciA9IHB0XG4gIFBvaW50MmQuc3ViKGRpciwgd29ybGRQb3MsIHB0KVxuICBWZWMyZC5ub3JtYWxpemUoZGlyLCBkaXIpXG4gIGxldCBhbmdsZSA9IFZlYzJkLmFuZ2xlKHN0YXJ0RGlyLCBkaXIpXG5cbiAgaWYgKHNlbGVjdGVkSW5mby5rZXlzLnNoaWZ0S2V5KSB7XG4gICAgYW5nbGUgPSBNYXRoLnJvdW5kKGFuZ2xlIC8gTWF0aC5RVUFURVJfUEkpICogTWF0aC5RVUFURVJfUElcbiAgfVxuXG4gIC8vIGlmICghY2FtZXJhLmlzWUZsaXBwZWQoKSkge1xuICAvLyAgIGFuZ2xlICo9IC0xXG4gIC8vIH1cblxuICBwYXJlbnRTaGFwZS5zZXRSb3RhdGlvbihzZWxlY3RlZEluZm8uc3RhcnRMb2NhbFJvdCArIE1hdGguUkFEX1RPX0RFRyAqIGFuZ2xlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtWGZvcm1TaGFwZShzaGFwZSwgc2VsZWN0ZWRJbmZvLCBzY3JlZW5Qb3MsIHdvcmxkUG9zLCBjYW1lcmEpIHtcbiAgY29uc3QgcGFyZW50U2hhcGUgPSBzaGFwZS5wYXJlbnRcbiAgY29uc3Qgb2JqUG9zID0gWzAsIDBdXG4gIGNvbnN0IGRlbHRhUG9zID0gWzAsIDBdXG4gIGNvbnN0IGRlbHRhRGltcyA9IFswLCAwXVxuXG4gIGlmIChzZWxlY3RlZEluZm8ucm90YXRlKSB7XG4gICAgcm90YXRlT0JCb3goc2hhcGUsIHBhcmVudFNoYXBlLCBzZWxlY3RlZEluZm8sIHNjcmVlblBvcywgd29ybGRQb3MsIGNhbWVyYSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVuaWZvcm1TY2FsZSA9IChzZWxlY3RlZEluZm8ua2V5cy5zaGlmdEtleSB8fCBzZWxlY3RlZEluZm8udW5pZm9ybVNjYWxlT25seSlcbiAgY29uc3QgY2VudGVyU2NhbGUgPSAoc2VsZWN0ZWRJbmZvLmtleXMuYWx0S2V5IHx8IHNlbGVjdGVkSW5mby5jZW50ZXJTY2FsZU9ubHkpXG5cbiAgLy8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2hhcGUgYXQgc3RhcnQgb2YgdHJhbnNmb3JtXG4gIGNvbnN0IHB0ID0gWzAsIDBdXG4gIE1hdDJkLnN2ZChwdCwgbnVsbCwgbnVsbCwgc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXgpXG5cbiAgLy8gZ2V0IHRoZSBtb3VzZSBkZWx0YSBpbiB3b3JsZCBzcGFjZVxuICBWZWMyZC5zdWIoZGVsdGFQb3MsIHdvcmxkUG9zLCBzZWxlY3RlZEluZm8uc3RhcnRXb3JsZFBvcylcblxuICBpZiAodW5pZm9ybVNjYWxlICYmIHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggPCA0KSB7XG4gICAgY29uc3QgeEF4aXNEaXIgPSBbc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXhbMF0sIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4WzFdXVxuICAgIGNvbnN0IHlBeGlzRGlyID0gW3NlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4WzJdLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeFszXV1cbiAgICBjb25zdCBkaWFnRGlyID0gWzAsIDBdXG5cbiAgICBpZiAoc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA8IDIpIHtcbiAgICAgIFZlYzJkLm5lZ2F0ZSh4QXhpc0RpciwgeEF4aXNEaXIpXG4gICAgfVxuICAgIGlmIChzZWxlY3RlZEluZm8uY29udHJvbEluZGV4ICUgMiA9PT0gMCkge1xuICAgICAgVmVjMmQubmVnYXRlKHlBeGlzRGlyLCB5QXhpc0RpcilcbiAgICB9XG5cbiAgICBWZWMyZC5ub3JtYWxpemUoeEF4aXNEaXIsIHhBeGlzRGlyKVxuICAgIFZlYzJkLm5vcm1hbGl6ZSh5QXhpc0RpciwgeUF4aXNEaXIpXG5cbiAgICBWZWMyZC5hZGQoZGlhZ0RpciwgeEF4aXNEaXIsIHlBeGlzRGlyKVxuICAgIFZlYzJkLm5vcm1hbGl6ZShkaWFnRGlyLCBkaWFnRGlyKVxuXG4gICAgY29uc3QgY3Jvc3MgPSBWZWMyZC5jcm9zczJkKGRlbHRhUG9zLCBkaWFnRGlyKVxuICAgIGxldCBheGlzVG9Vc2UgPSBudWxsXG4gICAgaWYgKHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggPT09IDAgfHwgc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA9PT0gMykge1xuICAgICAgYXhpc1RvVXNlID0geUF4aXNEaXJcbiAgICAgIGlmIChjcm9zcyA8IDApIHtcbiAgICAgICAgYXhpc1RvVXNlID0geEF4aXNEaXJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXhpc1RvVXNlID0geEF4aXNEaXJcbiAgICAgIGlmIChjcm9zcyA8IDApIHtcbiAgICAgICAgYXhpc1RvVXNlID0geUF4aXNEaXJcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1pbmRpc3QgPSBWZWMyZC5kb3QoZGVsdGFQb3MsIGF4aXNUb1VzZSlcbiAgICBtaW5kaXN0ID0gTWF0aC5zaWduKG1pbmRpc3QpICogTWF0aC5zcXJ0KDIgKiBtaW5kaXN0ICogbWluZGlzdClcbiAgICBWZWMyZC5zY2FsZShkZWx0YVBvcywgZGlhZ0RpciwgbWluZGlzdClcbiAgICBQb2ludDJkLmFkZFZlYzIod29ybGRQb3MsIHNlbGVjdGVkSW5mby5zdGFydFdvcmxkUG9zLCBkZWx0YVBvcylcbiAgfVxuXG4gIC8vIGZpcnN0IGNvbnZlcnQgd29ybGQgcG9pbnQgdG8gb2JqZWN0IHNwYWNlXG4gIFBvaW50MmQuY29weShvYmpQb3MsIHdvcmxkUG9zKVxuICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKG9ialBvcywgb2JqUG9zLCBzZWxlY3RlZEluZm8ud29ybGRUb09iamVjdE1hdHJpeClcblxuICAvLyBnZXQgdGhlIG1vdXNlIGRlbHRhIGluIG9iamVjdCBzcGFjZSBhbmQgbXVsdGlweSBieSB0aGVcbiAgLy8gc2NhbGUgb2YgdGhlIHNlbGVjdGVkIG9iamVjdCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRyYW5zZm9ybVxuICAvLyB0byBnZXQgdGhlIHNjYWxlIGRlbHRhIGluIG9iamVjdCBzcGFjZVxuICBWZWMyZC5zdWIoZGVsdGFEaW1zLCBvYmpQb3MsIHNlbGVjdGVkSW5mby5zdGFydE9iamVjdFBvcylcblxuICBQb2ludDJkLmNvcHkocHQsIHNlbGVjdGVkSW5mby5zdGFydExvY2FsUG9zKVxuXG4gIC8vIG5vdyBkZXRlcm1pbmUgdGhlIHRyYW5zZm9ybSBkaXJlY3Rpb24gZGVwZW5kaW5nXG4gIC8vIG9uIHdoaWNoIGNvbnRyb2wgdmVydGV4IG9mIHRoZSBvYmplY3Qtb3JpZW50ZWQgYm91bmRzXG4gIC8vIHdhcyBzZWxlY3RlZFxuICBsZXQgeFNjYWxlID0gMFxuICBsZXQgeVNjYWxlID0gMFxuICBpZiAoc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA8IDQpIHtcbiAgICAvLyBkcmFnZ2luZyBhIGNvcm5lciB2ZXJ0ZXhcbiAgICB4U2NhbGUgPSAoc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA8IDIgPyAtMSA6IDEpXG4gICAgeVNjYWxlID0gKHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggJSAyID09PSAwID8gLTEgOiAxKVxuXG4gICAgLy8gY2FuIHRyYW5zbGF0ZSBiYXNlZCBvbiB0aGUgbW91c2UgZGVsdGEgaW4gd29ybGQgc3BhY2VcbiAgICAvLyBUaGlzIGlzIGRvbmUgdG8gb2Zmc2V0IHRoZSBzY2FsZSwgd2hpY2ggaXMgZG9uZSBhdFxuICAgIC8vIHRoZSBzaGFwZSdzIGNlbnRlci4gVGhpcyB1bHRpbWF0ZWx5IGFjdHMgYXMgYSBwaXZvdFxuICAgIC8vIGZvciB0aGUgdHJhbnNmb3JtYXRpb24uIE9ubHkgZG8gdGhpcyBpZiB0aGUgYWx0IGtleVxuICAgIC8vIGlzbid0IHByZXNzZWRcbiAgICBpZiAoIWNlbnRlclNjYWxlKSB7XG4gICAgICBQb2ludDJkLmFkZFZlYzIocHQsIHB0LCBWZWMyZC5zY2FsZShkZWx0YVBvcywgZGVsdGFQb3MsIDAuNSkpXG4gICAgfVxuXG4gICAgcGFyZW50U2hhcGUuc2V0UG9zaXRpb24ocHQpXG4gIH0gZWxzZSB7XG4gICAgLy8gZHJhZ2dpbmcgYSBzaWRlIHZlcnRleCwgd2hpY2ggbWVhbnMgd2Ugb25seSBzY2FsZSBpblxuICAgIC8vIG9uZSBkaW1lbnNpb24sIHJhdGhlciB0aGFuIDIuIFNvIHdlIG5lZWQgdG8gZmlndXJlXG4gICAgLy8gb3V0IHRoYXQgZGlyZWN0aW9uIGJhc2VkIG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGVcbiAgICAvLyBzaGFwZVxuICAgIGNvbnN0IGlkeCA9IHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggLSA0XG4gICAgY29uc3QgYXhpc0RpciA9IFswLCAwXVxuICAgIGlmIChpZHggJSAyID09PSAwKSB7XG4gICAgICAvLyBzY2FsaW5nIGluIHRoZSBvYmplY3QncyBYIGRpcmVjdGlvblxuICAgICAgVmVjMmQuc2V0KGF4aXNEaXIsIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4WzBdLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeFsxXSlcbiAgICAgIHlTY2FsZSA9IDBcbiAgICAgIHhTY2FsZSA9IChpZHggPCAyID8gLTEgOiAxKVxuICAgICAgaWYgKHVuaWZvcm1TY2FsZSkge1xuICAgICAgICB5U2NhbGUgPSB4U2NhbGVcbiAgICAgICAgZGVsdGFEaW1zWzFdID0gZGVsdGFEaW1zWzBdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNjYWxpbmcgaW4gdGhlIG9iamVjdCdzIFkgZGlyZWN0aW9uXG4gICAgICBWZWMyZC5zZXQoYXhpc0Rpciwgc2VsZWN0ZWRJbmZvLm9iamVjdFRvV29ybGRNYXRyaXhbMl0sIHNlbGVjdGVkSW5mby5vYmplY3RUb1dvcmxkTWF0cml4WzNdKVxuICAgICAgeFNjYWxlID0gMFxuICAgICAgeVNjYWxlID0gKGlkeCA8IDIgPyAtMSA6IDEpXG4gICAgICBpZiAodW5pZm9ybVNjYWxlKSB7XG4gICAgICAgIHhTY2FsZSA9IHlTY2FsZVxuICAgICAgICBkZWx0YURpbXNbMF0gPSBkZWx0YURpbXNbMV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBub3cgZmluZCB0aGUgcGl2b3Qgb2Zmc2V0IGZvciB0aGUgYXhpcy1hbGlnbmVkIHNjYWxlXG4gICAgaWYgKCFjZW50ZXJTY2FsZSkge1xuICAgICAgVmVjMmQubm9ybWFsaXplKGF4aXNEaXIsIGF4aXNEaXIpXG4gICAgICBWZWMyZC5zY2FsZShheGlzRGlyLCBheGlzRGlyLCBWZWMyZC5kb3QoZGVsdGFQb3MsIGF4aXNEaXIpKVxuICAgICAgUG9pbnQyZC5hZGRWZWMyKHB0LCBwdCwgVmVjMmQuc2NhbGUoYXhpc0RpciwgYXhpc0RpciwgMC41KSlcbiAgICB9XG5cbiAgICBwYXJlbnRTaGFwZS5zZXRQb3NpdGlvbihwdClcbiAgfVxuXG4gIGlmIChjZW50ZXJTY2FsZSkge1xuICAgIHhTY2FsZSAqPSAyXG4gICAgeVNjYWxlICo9IDJcbiAgfVxuXG4gIC8vIHBlcmZvcm0gdGhlIHNjYWxlXG4gIHBhcmVudFNoYXBlLnNldFNjYWxlKFtzZWxlY3RlZEluZm8uc3RhcnRMb2NhbFNjYWxlWzBdICogKDEgKyB4U2NhbGUgKiBkZWx0YURpbXNbMF0gLyBzZWxlY3RlZEluZm8uc2hhcGVXaWR0aCksIHNlbGVjdGVkSW5mby5zdGFydExvY2FsU2NhbGVbMV0gKiAoMSArIHlTY2FsZSAqIGRlbHRhRGltc1sxXSAvIHNlbGVjdGVkSW5mby5zaGFwZUhlaWdodCldKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlU2hhcGUoc2hhcGUsIHNlbGVjdGVkSW5mbywgc2NyZWVuUG9zLCB3b3JsZFBvcywgY2FtZXJhKSB7XG4gIGNvbnN0IGRpZmYgPSBbMCwgMF1cbiAgY29uc3QgcHQgPSBbMCwgMF1cbiAgTWF0MmQuc3ZkKHB0LCBudWxsLCBudWxsLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeClcbiAgaWYgKHNlbGVjdGVkSW5mby5rZXlzLnNoaWZ0S2V5KSB7XG4gICAgUG9pbnQyZC5zdWIoZGlmZiwgc2NyZWVuUG9zLCBzZWxlY3RlZEluZm8uc3RhcnRQb3MpXG4gICAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMihkaWZmWzFdLCBkaWZmWzBdKVxuICAgIGFuZ2xlID0gTWF0aC5yb3VuZChhbmdsZSAvIE1hdGguUVVBVEVSX1BJKSAqIE1hdGguUVVBVEVSX1BJXG4gICAgY29uc3QgdHJhbnNmb3JtRGlyID0gW01hdGguY29zKGFuZ2xlKSwgTWF0aC5zaW4oYW5nbGUpXVxuICAgIFZlYzJkLnNjYWxlKGRpZmYsIHRyYW5zZm9ybURpciwgVmVjMmQuZG90KGRpZmYsIHRyYW5zZm9ybURpcikpXG4gICAgVmVjMmQudHJhbnNmb3JtTWF0MihkaWZmLCBkaWZmLCBjYW1lcmEuc2NyZWVuVG9Xb3JsZE1hdHJpeClcbiAgfSBlbHNlIHtcbiAgICBWZWMyZC5zdWIoZGlmZiwgd29ybGRQb3MsIHNlbGVjdGVkSW5mby5zdGFydFdvcmxkUG9zKVxuICB9XG4gIFBvaW50MmQuYWRkVmVjMihwdCwgc2VsZWN0ZWRJbmZvLnN0YXJ0TG9jYWxQb3MsIGRpZmYpXG5cbiAgc2hhcGUuc2V0UG9zaXRpb24ocHQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVWZXJ0KHNoYXBlLCBzZWxlY3RlZEluZm8sIHNjcmVlblBvcywgd29ybGRQb3MpIHtcbiAgY29uc3QgcGFyZW50U2hhcGUgPSBzaGFwZS5wYXJlbnRcblxuICAvLyBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzaGFwZSBhdCBzdGFydCBvZiB0cmFuc2Zvcm1cbiAgLy8gY29uc3QgcHQgPSBbMCwgMF1cbiAgLy8gTWF0MmQuc3ZkKHB0LCBudWxsLCBudWxsLCBzZWxlY3RlZEluZm8ub2JqZWN0VG9Xb3JsZE1hdHJpeClcblxuICAvLyBnZXQgdGhlIG1vdXNlIGRlbHRhIGluIHdvcmxkIHNwYWNlXG4gIC8vIFZlYzJkLnN1YihkZWx0YVBvcywgd29ybGRQb3MsIHNlbGVjdGVkSW5mby5zdGFydFdvcmxkUG9zKVxuXG4gIC8vIGZpcnN0IGNvbnZlcnQgd29ybGQgcG9pbnQgdG8gb2JqZWN0IHNwYWNlXG4gIC8vIFBvaW50MmQuY29weShvYmpQb3MsIHdvcmxkUG9zKVxuICAvLyBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKG9ialBvcywgb2JqUG9zLCBzZWxlY3RlZEluZm8ud29ybGRUb09iamVjdE1hdHJpeClcblxuICAvLyBnZXQgdGhlIGRpZmZcbiAgLy8gY29uc3QgZGlmZiA9IG9ialBvc1xuICAvLyBQb2ludDJkLnN1YihkaWZmLCBvYmpQb3MsIHNlbGVjdGVkSW5mby5zdGFydE9iamVjdFBvcylcblxuICBjb25zdCBudW1WZXJ0cyA9IHBhcmVudFNoYXBlLm51bVZlcnRzXG4gIGlmIChzZWxlY3RlZEluZm8uY29udHJvbEluZGV4ID49IG51bVZlcnRzKSB7XG4gICAgY29uc3QgaWR4MSA9IE1hdGgubWluKHNlbGVjdGVkSW5mby5jb250cm9sSW5kZXggLSBudW1WZXJ0cywgbnVtVmVydHMgLSAxKVxuICAgIGNvbnN0IGlkeDIgPSAoaWR4MSA9PT0gbnVtVmVydHMgLSAxID8gMCA6IGlkeDEgKyAxKVxuICAgIGNvbnN0IHB0ID0gWzAsIDBdXG4gICAgY29uc3QgcHQxID0gWzAsIDBdXG4gICAgY29uc3QgcHQyID0gWzAsIDBdXG4gICAgY29uc3QgdmVjID0gWzAsIDBdXG4gICAgY29uc3QgdmVydHMgPSBwYXJlbnRTaGFwZS52ZXJ0c1JlZlxuICAgIGNvbnN0IHhmb3JtID0gcGFyZW50U2hhcGUuZ2xvYmFsWGZvcm1cbiAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKHB0MSwgdmVydHNbaWR4MV0sIHhmb3JtKVxuICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQocHQyLCB2ZXJ0c1tpZHgyXSwgeGZvcm0pXG4gICAgUG9pbnQyZC5zdWIodmVjLCBwdDIsIHB0MSlcbiAgICBWZWMyZC5zY2FsZSh2ZWMsIHZlYywgMC41KVxuICAgIFBvaW50MmQuYWRkVmVjMihwdCwgcHQxLCB2ZWMpXG4gICAgc2VsZWN0ZWRJbmZvLmNvbnRyb2xJbmRleCA9IHBhcmVudFNoYXBlLmluc2VydFZlcnQoaWR4MSArIDEsIHB0KVxuICB9IGVsc2Uge1xuICAgIHBhcmVudFNoYXBlLnNldFZlcnRQb3NpdGlvbihzZWxlY3RlZEluZm8uY29udHJvbEluZGV4LCB3b3JsZFBvcylcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaW50ZXJhY3Rpb25zL2ludGVyYWN0LXV0aWxzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _baseShape = __webpack_require__(6);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _mat2d = __webpack_require__(4);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _math = __webpack_require__(5);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} PointOptions\n * @property {number} [size=5] Size of the point in pixels\n */\n\n/**\n * @class Point shape class. A point differs from a circle in that\n * a point's size is defined in screen/pixel space whereas\n * a circle is defined in world space.\n * @extends {BaseShape}\n */\nvar Point = function (_BaseShape) {\n _inherits(Point, _BaseShape);\n\n /**\n * Creates a new point shape\n * @param {PointOptions} [opts]\n * @return {Point}\n */\n function Point(opts) {\n _classCallCheck(this, Point);\n\n var _this = _possibleConstructorReturn(this, (Point.__proto__ || Object.getPrototypeOf(Point)).call(this, opts));\n\n _this._size = 5;\n if (typeof opts.size !== \"undefined\") {\n _this.size = opts.size;\n }\n AABox2d.initCenterExtents(_this._aabox, [0, 0], [_this._radius, _this._radius]);\n _this.translate(opts.x || 0, opts.y || 0);\n return _this;\n }\n\n /**\n * Sets the size of the point\n * @param {nuber} size Size of the point in pixels\n * @return {Pixel} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If size is not a valid number\n */\n\n\n _createClass(Point, [{\n key: \"_updateAABox\",\n\n\n /**\n * Called when the bounding box requires updating\n * @private\n * @override\n */\n value: function _updateAABox() {\n if (this._geomDirty || this._boundsOutOfDate) {\n var pos = this._pos;\n var scale = this._scale;\n var rot = _math2.default.DEG_TO_RAD * this._rotDeg;\n var cossqr = _math2.default.pow(_math2.default.cos(rot), 2);\n var sinsqr = _math2.default.pow(_math2.default.sin(rot), 2);\n var asqr = _math2.default.pow(scale[0] * this._size, 2);\n var bsqr = _math2.default.pow(scale[1] * this._size, 2);\n var A = _math2.default.sqrt(bsqr * sinsqr + asqr * cossqr);\n var B = _math2.default.sqrt(asqr * sinsqr + bsqr * cossqr);\n AABox2d.initCenterExtents(this._aabox, pos, [A, B]);\n this._geomDirty = false;\n this._boundsOutOfDate = false;\n }\n }\n\n /**\n * Draws the point using a 2d rendering context. Called by the BaseShape\n * class\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @override\n */\n\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n var pos = [0, 0];\n _mat2d2.default.svd(pos, null, null, this._fullXform);\n ctx.arc(pos[0], pos[1], this._size, 0, _math2.default.TWO_PI, false);\n }\n\n /**\n * Called to convert the shape to a serializable JSON object\n * @return {object}\n * @override\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"Point\", // NOTE: this much match the name of the class\n size: this.size\n }, _get(Point.prototype.__proto__ || Object.getPrototypeOf(Point.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"size\",\n set: function set(size) {\n if (typeof size !== \"number\") {\n throw new Error(\"Radius must be a number\");\n }\n\n if (size !== this._size) {\n var prev = this._size;\n this._size = size;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"size\",\n prevVal: prev,\n currVal: this._size\n });\n }\n }\n\n /**\n * Gets the current size of the point\n * @return {number}\n */\n ,\n get: function get() {\n return this._size;\n }\n }]);\n\n return Point;\n}(_baseShape2.default);\n\nexports.default = Point;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcG9pbnQuanM/OWY2OSJdLCJuYW1lcyI6WyJBQUJveDJkIiwiUG9pbnQiLCJvcHRzIiwiX3NpemUiLCJzaXplIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJfcmFkaXVzIiwidHJhbnNsYXRlIiwieCIsInkiLCJfZ2VvbURpcnR5IiwiX2JvdW5kc091dE9mRGF0ZSIsInBvcyIsIl9wb3MiLCJzY2FsZSIsIl9zY2FsZSIsInJvdCIsIk1hdGgiLCJERUdfVE9fUkFEIiwiX3JvdERlZyIsImNvc3NxciIsInBvdyIsImNvcyIsInNpbnNxciIsInNpbiIsImFzcXIiLCJic3FyIiwiQSIsInNxcnQiLCJCIiwiY3R4Iiwic2V0VHJhbnNmb3JtIiwiTWF0MmQiLCJzdmQiLCJfZnVsbFhmb3JtIiwiYXJjIiwiVFdPX1BJIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZSIsIkVycm9yIiwicHJldiIsImZpcmUiLCJhdHRyIiwicHJldlZhbCIsImN1cnJWYWwiLCJCYXNlU2hhcGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBRUE7O0lBQVlBLE87O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBOzs7Ozs7SUFNcUJDLEs7OztBQUNuQjs7Ozs7QUFLQSxpQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUFBLDhHQUNWQSxJQURVOztBQUVoQixVQUFLQyxLQUFMLEdBQWEsQ0FBYjtBQUNBLFFBQUksT0FBT0QsS0FBS0UsSUFBWixLQUFxQixXQUF6QixFQUFzQztBQUNwQyxZQUFLQSxJQUFMLEdBQVlGLEtBQUtFLElBQWpCO0FBQ0Q7QUFDREosWUFBUUssaUJBQVIsQ0FBMEIsTUFBS0MsTUFBL0IsRUFBdUMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUF2QyxFQUErQyxDQUFDLE1BQUtDLE9BQU4sRUFBZSxNQUFLQSxPQUFwQixDQUEvQztBQUNBLFVBQUtDLFNBQUwsQ0FBZU4sS0FBS08sQ0FBTCxJQUFVLENBQXpCLEVBQTRCUCxLQUFLUSxDQUFMLElBQVUsQ0FBdEM7QUFQZ0I7QUFRakI7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7QUFpQ0E7Ozs7O21DQUtlO0FBQ2IsVUFBSSxLQUFLQyxVQUFMLElBQW1CLEtBQUtDLGdCQUE1QixFQUE4QztBQUM1QyxZQUFNQyxNQUFNLEtBQUtDLElBQWpCO0FBQ0EsWUFBTUMsUUFBUSxLQUFLQyxNQUFuQjtBQUNBLFlBQU1DLE1BQU1DLGVBQUtDLFVBQUwsR0FBa0IsS0FBS0MsT0FBbkM7QUFDQSxZQUFNQyxTQUFTSCxlQUFLSSxHQUFMLENBQVNKLGVBQUtLLEdBQUwsQ0FBU04sR0FBVCxDQUFULEVBQXdCLENBQXhCLENBQWY7QUFDQSxZQUFNTyxTQUFTTixlQUFLSSxHQUFMLENBQVNKLGVBQUtPLEdBQUwsQ0FBU1IsR0FBVCxDQUFULEVBQXdCLENBQXhCLENBQWY7QUFDQSxZQUFNUyxPQUFPUixlQUFLSSxHQUFMLENBQVNQLE1BQU0sQ0FBTixJQUFXLEtBQUtaLEtBQXpCLEVBQWdDLENBQWhDLENBQWI7QUFDQSxZQUFNd0IsT0FBT1QsZUFBS0ksR0FBTCxDQUFTUCxNQUFNLENBQU4sSUFBVyxLQUFLWixLQUF6QixFQUFnQyxDQUFoQyxDQUFiO0FBQ0EsWUFBTXlCLElBQUlWLGVBQUtXLElBQUwsQ0FBVUYsT0FBT0gsTUFBUCxHQUFnQkUsT0FBT0wsTUFBakMsQ0FBVjtBQUNBLFlBQU1TLElBQUlaLGVBQUtXLElBQUwsQ0FBVUgsT0FBT0YsTUFBUCxHQUFnQkcsT0FBT04sTUFBakMsQ0FBVjtBQUNBckIsZ0JBQVFLLGlCQUFSLENBQTBCLEtBQUtDLE1BQS9CLEVBQXVDTyxHQUF2QyxFQUE0QyxDQUFDZSxDQUFELEVBQUlFLENBQUosQ0FBNUM7QUFDQSxhQUFLbkIsVUFBTCxHQUFrQixLQUFsQjtBQUNBLGFBQUtDLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7OzBCQU1NbUIsRyxFQUFLO0FBQ1RBLFVBQUlDLFlBQUosQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsRUFBNkIsQ0FBN0IsRUFBZ0MsQ0FBaEM7QUFDQSxVQUFNbkIsTUFBTSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQVo7QUFDQW9CLHNCQUFNQyxHQUFOLENBQVVyQixHQUFWLEVBQWUsSUFBZixFQUFxQixJQUFyQixFQUEyQixLQUFLc0IsVUFBaEM7QUFDQUosVUFBSUssR0FBSixDQUFRdkIsSUFBSSxDQUFKLENBQVIsRUFBZ0JBLElBQUksQ0FBSixDQUFoQixFQUF3QixLQUFLVixLQUE3QixFQUFvQyxDQUFwQyxFQUF1Q2UsZUFBS21CLE1BQTVDLEVBQW9ELEtBQXBEO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OzZCQUtTO0FBQ1AsYUFBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxjQUFNLE9BRGEsRUFDSjtBQUNmcEMsY0FBTSxLQUFLQTtBQUZRLE9BQWQsdUdBQVA7QUFJRDs7O3NCQXZFUUEsSSxFQUFNO0FBQ2IsVUFBSSxPQUFPQSxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzVCLGNBQU0sSUFBSXFDLEtBQUosQ0FBVSx5QkFBVixDQUFOO0FBQ0Q7O0FBRUQsVUFBSXJDLFNBQVMsS0FBS0QsS0FBbEIsRUFBeUI7QUFDdkIsWUFBTXVDLE9BQU8sS0FBS3ZDLEtBQWxCO0FBQ0EsYUFBS0EsS0FBTCxHQUFhQyxJQUFiO0FBQ0EsYUFBS08sVUFBTCxHQUFrQixJQUFsQixDQUh1QixDQUdBOztBQUV2QixhQUFLZ0MsSUFBTCxDQUFVLGNBQVYsRUFBMEI7QUFDeEJDLGdCQUFNLE1BRGtCO0FBRXhCQyxtQkFBU0gsSUFGZTtBQUd4QkksbUJBQVMsS0FBSzNDO0FBSFUsU0FBMUI7QUFLRDtBQUNGOztBQUVEOzs7Ozt3QkFJVztBQUNULGFBQU8sS0FBS0EsS0FBWjtBQUNEOzs7O0VBL0NnQzRDLG1COztrQkFBZDlDLEsiLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuLi9jb3JlL2FhYm94MmRcIlxuaW1wb3J0IEJhc2VTaGFwZSBmcm9tIFwiLi9iYXNlLXNoYXBlLmpzXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb2ludE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2l6ZT01XSBTaXplIG9mIHRoZSBwb2ludCBpbiBwaXhlbHNcbiAqL1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludCBzaGFwZSBjbGFzcy4gQSBwb2ludCBkaWZmZXJzIGZyb20gYSBjaXJjbGUgaW4gdGhhdFxuICogICAgICAgIGEgcG9pbnQncyBzaXplIGlzIGRlZmluZWQgaW4gc2NyZWVuL3BpeGVsIHNwYWNlIHdoZXJlYXNcbiAqICAgICAgICBhIGNpcmNsZSBpcyBkZWZpbmVkIGluIHdvcmxkIHNwYWNlLlxuICogQGV4dGVuZHMge0Jhc2VTaGFwZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9pbnQgZXh0ZW5kcyBCYXNlU2hhcGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwb2ludCBzaGFwZVxuICAgKiBAcGFyYW0gIHtQb2ludE9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJuIHtQb2ludH1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX3NpemUgPSA1XG4gICAgaWYgKHR5cGVvZiBvcHRzLnNpemUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxuICAgIH1cbiAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKHRoaXMuX2FhYm94LCBbMCwgMF0sIFt0aGlzLl9yYWRpdXMsIHRoaXMuX3JhZGl1c10pXG4gICAgdGhpcy50cmFuc2xhdGUob3B0cy54IHx8IDAsIG9wdHMueSB8fCAwKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHBvaW50XG4gICAqIEBwYXJhbSAge251YmVyfSBzaXplIFNpemUgb2YgdGhlIHBvaW50IGluIHBpeGVsc1xuICAgKiBAcmV0dXJuIHtQaXhlbH0gICAgICB0aGlzXG4gICAqIEBmaXJlcyB7U2hhcGUjZ2VvbUNoYW5nZWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzaXplIGlzIG5vdCBhIHZhbGlkIG51bWJlclxuICAgKi9cbiAgc2V0IHNpemUoc2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFkaXVzIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSAhPT0gdGhpcy5fc2l6ZSkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3NpemVcbiAgICAgIHRoaXMuX3NpemUgPSBzaXplXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlIC8vIGRpcnR5IG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgZmlyaW5nIGV2ZW50XG5cbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbVwiLCB7XG4gICAgICAgIGF0dHI6IFwic2l6ZVwiLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiB0aGlzLl9zaXplXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHBvaW50XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJvdW5kaW5nIGJveCByZXF1aXJlcyB1cGRhdGluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF91cGRhdGVBQUJveCgpIHtcbiAgICBpZiAodGhpcy5fZ2VvbURpcnR5IHx8IHRoaXMuX2JvdW5kc091dE9mRGF0ZSkge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zXG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWxlXG4gICAgICBjb25zdCByb3QgPSBNYXRoLkRFR19UT19SQUQgKiB0aGlzLl9yb3REZWdcbiAgICAgIGNvbnN0IGNvc3NxciA9IE1hdGgucG93KE1hdGguY29zKHJvdCksIDIpXG4gICAgICBjb25zdCBzaW5zcXIgPSBNYXRoLnBvdyhNYXRoLnNpbihyb3QpLCAyKVxuICAgICAgY29uc3QgYXNxciA9IE1hdGgucG93KHNjYWxlWzBdICogdGhpcy5fc2l6ZSwgMilcbiAgICAgIGNvbnN0IGJzcXIgPSBNYXRoLnBvdyhzY2FsZVsxXSAqIHRoaXMuX3NpemUsIDIpXG4gICAgICBjb25zdCBBID0gTWF0aC5zcXJ0KGJzcXIgKiBzaW5zcXIgKyBhc3FyICogY29zc3FyKVxuICAgICAgY29uc3QgQiA9IE1hdGguc3FydChhc3FyICogc2luc3FyICsgYnNxciAqIGNvc3NxcilcbiAgICAgIEFBQm94MmQuaW5pdENlbnRlckV4dGVudHModGhpcy5fYWFib3gsIHBvcywgW0EsIEJdKVxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gZmFsc2VcbiAgICAgIHRoaXMuX2JvdW5kc091dE9mRGF0ZSA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSBwb2ludCB1c2luZyBhIDJkIHJlbmRlcmluZyBjb250ZXh0LiBDYWxsZWQgYnkgdGhlIEJhc2VTaGFwZVxuICAgKiBjbGFzc1xuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MmR9IGN0eCAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF9kcmF3KGN0eCkge1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBjb25zdCBwb3MgPSBbMCwgMF1cbiAgICBNYXQyZC5zdmQocG9zLCBudWxsLCBudWxsLCB0aGlzLl9mdWxsWGZvcm0pXG4gICAgY3R4LmFyYyhwb3NbMF0sIHBvc1sxXSwgdGhpcy5fc2l6ZSwgMCwgTWF0aC5UV09fUEksIGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB0byBjb252ZXJ0IHRoZSBzaGFwZSB0byBhIHNlcmlhbGl6YWJsZSBKU09OIG9iamVjdFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgIHR5cGU6IFwiUG9pbnRcIiwgLy8gTk9URTogdGhpcyBtdWNoIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBjbGFzc1xuICAgICAgc2l6ZTogdGhpcy5zaXplXG4gICAgfSwgc3VwZXIudG9KU09OKCkpXG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2hhcGVzL3BvaW50LmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 25 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("/* eslint-disable no-magic-numbers */\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _glMatrix = __webpack_require__(1);\n\nvar _baseShape = __webpack_require__(7);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar VertEditableShape = function (_BaseShape) {\n _inherits(VertEditableShape, _BaseShape);\n\n function VertEditableShape(baseVertShape, opts) {\n _classCallCheck(this, VertEditableShape);\n\n var _this = _possibleConstructorReturn(this, (VertEditableShape.__proto__ || Object.getPrototypeOf(VertEditableShape)).call(this, opts));\n\n _this._baseVertShape = baseVertShape;\n _this._vertRadius = 4;\n _this._transformedVerts = [];\n _this._baseaabox = AABox2d.create();\n _this._worldToScreenMatrix = _glMatrix.mat2d.create();\n return _this;\n }\n\n _createClass(VertEditableShape, [{\n key: \"_updateAABox\",\n value: function _updateAABox(worldToScreenMatrix) {\n var aabox = this._baseVertShape.aabox;\n if (!AABox2d.equals(aabox, this._baseaabox) || !_glMatrix.mat2d.equals(worldToScreenMatrix, this._worldToScreenMatrix)) {\n AABox2d.copy(this._baseaabox, aabox);\n _glMatrix.mat2d.copy(this._worldToScreenMatrix, worldToScreenMatrix);\n AABox2d.transformMat2d(this._aabox, this._baseaabox, this._worldToScreenMatrix);\n var pad = this._vertRadius + this.strokeWidth;\n AABox2d.expand(this._aabox, this._aabox, [pad, pad]);\n }\n }\n }, {\n key: \"containsPoint\",\n value: function containsPoint(screenPt, worldPt, worldToScreenMatrix, ctx) {\n // Should we update here, or is it safe to\n // say that this is stateful, meaning a render\n // should have been performed beforehand which\n // would've updated its state\n var rtnObj = {\n hit: false,\n controlIndex: -1\n };\n\n this._updateAABox(worldToScreenMatrix);\n if (this.visible && AABox2d.containsPt(this._aabox, screenPt)) {\n var aabox = AABox2d.create();\n var pad = this._vertRadius + this.strokeWidth / 2;\n var extents = [pad, pad];\n\n var i = 0;\n for (i = 0; i < this._transformedVerts.length; i += 1) {\n AABox2d.initCenterExtents(aabox, this._transformedVerts[i], extents);\n if (AABox2d.containsPt(aabox, screenPt)) {\n rtnObj.hit = true;\n rtnObj.controlIndex = i;\n break;\n }\n }\n\n if (!rtnObj.hit) {\n var tmpPt = [0, 0];\n var tmpVec = [0, 0];\n var radius = ctx.lineWidth * 1.5;\n _glMatrix.vec2.set(extents, radius, radius);\n for (i = 0; i < this._transformedVerts.length - 1; i += 1) {\n Point2d.sub(tmpVec, this._transformedVerts[i + 1], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n AABox2d.initCenterExtents(aabox, tmpPt, extents);\n if (AABox2d.containsPt(aabox, screenPt)) {\n rtnObj.hit = true;\n rtnObj.controlIndex = this._transformedVerts.length + i;\n break;\n }\n }\n\n if (i > 0 && i === this._transformedVerts.length - 1) {\n Point2d.sub(tmpVec, this._transformedVerts[0], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n AABox2d.initCenterExtents(aabox, tmpPt, extents);\n if (AABox2d.containsPt(aabox, screenPt)) {\n rtnObj.hit = true;\n rtnObj.controlIndex = this._transformedVerts.length + i;\n }\n }\n }\n }\n\n return rtnObj;\n }\n }, {\n key: \"renderBounds\",\n value: function renderBounds(ctx, worldToScreenMatrix, boundsStrokeStyle) {\n // we're storing our AABox in screen space here, so worldToScreenMatrix is\n // unused\n this._updateAABox(worldToScreenMatrix);\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n boundsStrokeStyle.setStrokeCtx(ctx);\n var center = [0, 0];\n var extents = [0, 0];\n AABox2d.getCenter(center, this._aabox);\n AABox2d.getExtents(extents, this._aabox);\n ctx.beginPath();\n ctx.rect(center[0] - extents[0], center[1] - extents[1], extents[0] * 2, extents[1] * 2);\n ctx.stroke();\n ctx.restore();\n }\n }, {\n key: \"render\",\n value: function render(ctx) {\n var _this2 = this;\n\n ctx.save();\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n var objToScreenMatrix = this._baseVertShape._fullXform;\n var verts = this._baseVertShape.vertsRef;\n this._transformedVerts = new Array(verts.length);\n var tmpPt = [0, 0];\n var tmpVec = [0, 0];\n\n ctx.beginPath();\n var i = 0;\n this._transformedVerts[i] = [0, 0];\n Point2d.transformMat2d(this._transformedVerts[i], verts[i], objToScreenMatrix);\n\n var radius = Math.max(ctx.lineWidth * 1.5, 2.5);\n for (i = 0; i < verts.length - 1; i += 1) {\n this._transformedVerts[i + 1] = [0, 0];\n Point2d.transformMat2d(this._transformedVerts[i + 1], verts[i + 1], objToScreenMatrix);\n Point2d.sub(tmpVec, this._transformedVerts[i + 1], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n\n ctx.moveTo(tmpPt[0] + radius, tmpPt[1]);\n ctx.arc(tmpPt[0], tmpPt[1], radius, 0, Math.TWO_PI);\n }\n\n if (i > 0) {\n Point2d.sub(tmpVec, this._transformedVerts[0], this._transformedVerts[i]);\n _glMatrix.vec2.scale(tmpVec, tmpVec, 0.5);\n Point2d.addVec2(tmpPt, this._transformedVerts[i], tmpVec);\n ctx.moveTo(tmpPt[0] + radius, tmpPt[1]);\n ctx.arc(tmpPt[0], tmpPt[1], radius, 0, Math.TWO_PI);\n\n // TODO(croot): Is this appropriate? Can the fill/stroke style\n // be cross compatible? What about gradients/patterns?\n // We can probably safely assume no gradients/patterns at\n // this point\n ctx.fillStyle = ctx.strokeStyle;\n ctx.fill();\n }\n\n ctx.beginPath();\n\n this._transformedVerts.forEach(function (vert) {\n ctx.moveTo(vert[0] + _this2._vertRadius, vert[1]);\n ctx.arc(vert[0], vert[1], _this2._vertRadius, 0, Math.TWO_PI);\n });\n\n if (this.isFillVisible()) {\n this.setFillCtx(ctx);\n ctx.fill();\n }\n\n if (this.isStrokeVisible()) {\n this.setStrokeCtx(ctx);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }]);\n\n return VertEditableShape;\n}(_baseShape2.default);\n\nexports.default = VertEditableShape;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmFjdGlvbnMvdmVydC1lZGl0YWJsZS1zaGFwZS5qcz80ZWQzIl0sIm5hbWVzIjpbIkFBQm94MmQiLCJQb2ludDJkIiwiVmVydEVkaXRhYmxlU2hhcGUiLCJiYXNlVmVydFNoYXBlIiwib3B0cyIsIl9iYXNlVmVydFNoYXBlIiwiX3ZlcnRSYWRpdXMiLCJfdHJhbnNmb3JtZWRWZXJ0cyIsIl9iYXNlYWFib3giLCJjcmVhdGUiLCJfd29ybGRUb1NjcmVlbk1hdHJpeCIsIndvcmxkVG9TY3JlZW5NYXRyaXgiLCJhYWJveCIsImVxdWFscyIsImNvcHkiLCJ0cmFuc2Zvcm1NYXQyZCIsIl9hYWJveCIsInBhZCIsInN0cm9rZVdpZHRoIiwiZXhwYW5kIiwic2NyZWVuUHQiLCJ3b3JsZFB0IiwiY3R4IiwicnRuT2JqIiwiaGl0IiwiY29udHJvbEluZGV4IiwiX3VwZGF0ZUFBQm94IiwidmlzaWJsZSIsImNvbnRhaW5zUHQiLCJleHRlbnRzIiwiaSIsImxlbmd0aCIsImluaXRDZW50ZXJFeHRlbnRzIiwidG1wUHQiLCJ0bXBWZWMiLCJyYWRpdXMiLCJsaW5lV2lkdGgiLCJzZXQiLCJzdWIiLCJzY2FsZSIsImFkZFZlYzIiLCJib3VuZHNTdHJva2VTdHlsZSIsInNhdmUiLCJzZXRUcmFuc2Zvcm0iLCJzZXRTdHJva2VDdHgiLCJjZW50ZXIiLCJnZXRDZW50ZXIiLCJnZXRFeHRlbnRzIiwiYmVnaW5QYXRoIiwicmVjdCIsInN0cm9rZSIsInJlc3RvcmUiLCJvYmpUb1NjcmVlbk1hdHJpeCIsIl9mdWxsWGZvcm0iLCJ2ZXJ0cyIsInZlcnRzUmVmIiwiQXJyYXkiLCJNYXRoIiwibWF4IiwibW92ZVRvIiwiYXJjIiwiVFdPX1BJIiwiZmlsbFN0eWxlIiwic3Ryb2tlU3R5bGUiLCJmaWxsIiwiZm9yRWFjaCIsInZlcnQiLCJpc0ZpbGxWaXNpYmxlIiwic2V0RmlsbEN0eCIsImlzU3Ryb2tlVmlzaWJsZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFD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QUkwQixTQUFKOztBQUVBLFdBQUt6QyxpQkFBTCxDQUF1QjBELE9BQXZCLENBQStCLGdCQUFRO0FBQ3JDM0MsWUFBSXFDLE1BQUosQ0FBV08sS0FBSyxDQUFMLElBQVUsT0FBSzVELFdBQTFCLEVBQXVDNEQsS0FBSyxDQUFMLENBQXZDO0FBQ0E1QyxZQUFJc0MsR0FBSixDQUFRTSxLQUFLLENBQUwsQ0FBUixFQUFpQkEsS0FBSyxDQUFMLENBQWpCLEVBQTBCLE9BQUs1RCxXQUEvQixFQUE0QyxDQUE1QyxFQUErQ21ELEtBQUtJLE1BQXBEO0FBQ0QsT0FIRDs7QUFLQSxVQUFJLEtBQUtNLGFBQUwsRUFBSixFQUEwQjtBQUN4QixhQUFLQyxVQUFMLENBQWdCOUMsR0FBaEI7QUFDQUEsWUFBSTBDLElBQUo7QUFDRDs7QUFFRCxVQUFJLEtBQUtLLGVBQUwsRUFBSixFQUE0QjtBQUMxQixhQUFLekIsWUFBTCxDQUFrQnRCLEdBQWxCO0FBQ0FBLFlBQUk0QixNQUFKO0FBQ0Q7O0FBRUQ1QixVQUFJNkIsT0FBSjtBQUNEOzs7Ozs7a0JBN0prQmpELGlCIiwiZmlsZSI6IjI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCAqIGFzIFBvaW50MmQgZnJvbSBcIi4uL2NvcmUvcG9pbnQyZFwiXG5pbXBvcnQge21hdDJkIGFzIE1hdDJkLCB2ZWMyIGFzIFZlYzJkfSBmcm9tIFwiZ2wtbWF0cml4XCJcbmltcG9ydCBCYXNlU2hhcGUgZnJvbSBcIi4uL3NoYXBlcy9iYXNlLXNoYXBlXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydEVkaXRhYmxlU2hhcGUgZXh0ZW5kcyBCYXNlU2hhcGUge1xuICBjb25zdHJ1Y3RvcihiYXNlVmVydFNoYXBlLCBvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl9iYXNlVmVydFNoYXBlID0gYmFzZVZlcnRTaGFwZVxuICAgIHRoaXMuX3ZlcnRSYWRpdXMgPSA0XG4gICAgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0cyA9IFtdXG4gICAgdGhpcy5fYmFzZWFhYm94ID0gQUFCb3gyZC5jcmVhdGUoKVxuICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5NYXRyaXggPSBNYXQyZC5jcmVhdGUoKVxuICB9XG5cbiAgX3VwZGF0ZUFBQm94KHdvcmxkVG9TY3JlZW5NYXRyaXgpIHtcbiAgICBjb25zdCBhYWJveCA9IHRoaXMuX2Jhc2VWZXJ0U2hhcGUuYWFib3hcbiAgICBpZiAoIUFBQm94MmQuZXF1YWxzKGFhYm94LCB0aGlzLl9iYXNlYWFib3gpIHx8ICFNYXQyZC5lcXVhbHMod29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeCkpIHtcbiAgICAgIEFBQm94MmQuY29weSh0aGlzLl9iYXNlYWFib3gsIGFhYm94KVxuICAgICAgTWF0MmQuY29weSh0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4LCB3b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgICAgQUFCb3gyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl9hYWJveCwgdGhpcy5fYmFzZWFhYm94LCB0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgICAgY29uc3QgcGFkID0gdGhpcy5fdmVydFJhZGl1cyArIHRoaXMuc3Ryb2tlV2lkdGhcbiAgICAgIEFBQm94MmQuZXhwYW5kKHRoaXMuX2FhYm94LCB0aGlzLl9hYWJveCwgW3BhZCwgcGFkXSlcbiAgICB9XG4gIH1cblxuICBjb250YWluc1BvaW50KHNjcmVlblB0LCB3b3JsZFB0LCB3b3JsZFRvU2NyZWVuTWF0cml4LCBjdHgpIHtcbiAgICAvLyBTaG91bGQgd2UgdXBkYXRlIGhlcmUsIG9yIGlzIGl0IHNhZmUgdG9cbiAgICAvLyBzYXkgdGhhdCB0aGlzIGlzIHN0YXRlZnVsLCBtZWFuaW5nIGEgcmVuZGVyXG4gICAgLy8gc2hvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgYmVmb3JlaGFuZCB3aGljaFxuICAgIC8vIHdvdWxkJ3ZlIHVwZGF0ZWQgaXRzIHN0YXRlXG4gICAgY29uc3QgcnRuT2JqID0ge1xuICAgICAgaGl0OiBmYWxzZSxcbiAgICAgIGNvbnRyb2xJbmRleDogLTFcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVBQUJveCh3b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgIGlmICh0aGlzLnZpc2libGUgJiYgQUFCb3gyZC5jb250YWluc1B0KHRoaXMuX2FhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgIGNvbnN0IGFhYm94ID0gQUFCb3gyZC5jcmVhdGUoKVxuICAgICAgY29uc3QgcGFkID0gdGhpcy5fdmVydFJhZGl1cyArIHRoaXMuc3Ryb2tlV2lkdGggLyAyXG4gICAgICBjb25zdCBleHRlbnRzID0gW3BhZCwgcGFkXVxuXG4gICAgICBsZXQgaSA9IDBcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIEFBQm94MmQuaW5pdENlbnRlckV4dGVudHMoYWFib3gsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0sIGV4dGVudHMpXG4gICAgICAgIGlmIChBQUJveDJkLmNvbnRhaW5zUHQoYWFib3gsIHNjcmVlblB0KSkge1xuICAgICAgICAgIHJ0bk9iai5oaXQgPSB0cnVlXG4gICAgICAgICAgcnRuT2JqLmNvbnRyb2xJbmRleCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcnRuT2JqLmhpdCkge1xuICAgICAgICBjb25zdCB0bXBQdCA9IFswLCAwXVxuICAgICAgICBjb25zdCB0bXBWZWMgPSBbMCwgMF1cbiAgICAgICAgY29uc3QgcmFkaXVzID0gY3R4LmxpbmVXaWR0aCAqIDEuNVxuICAgICAgICBWZWMyZC5zZXQoZXh0ZW50cywgcmFkaXVzLCByYWRpdXMpXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgICAgICAgIFBvaW50MmQuc3ViKHRtcFZlYywgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpICsgMV0sIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0pXG4gICAgICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgICAgICBQb2ludDJkLmFkZFZlYzIodG1wUHQsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0sIHRtcFZlYylcbiAgICAgICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKGFhYm94LCB0bXBQdCwgZXh0ZW50cylcbiAgICAgICAgICBpZiAoQUFCb3gyZC5jb250YWluc1B0KGFhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgICAgICAgIHJ0bk9iai5oaXQgPSB0cnVlXG4gICAgICAgICAgICBydG5PYmouY29udHJvbEluZGV4ID0gdGhpcy5fdHJhbnNmb3JtZWRWZXJ0cy5sZW5ndGggKyBpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpID4gMCAmJiBpID09PSB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBQb2ludDJkLnN1Yih0bXBWZWMsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbMF0sIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0pXG4gICAgICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgICAgICBQb2ludDJkLmFkZFZlYzIodG1wUHQsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaV0sIHRtcFZlYylcbiAgICAgICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKGFhYm94LCB0bXBQdCwgZXh0ZW50cylcbiAgICAgICAgICBpZiAoQUFCb3gyZC5jb250YWluc1B0KGFhYm94LCBzY3JlZW5QdCkpIHtcbiAgICAgICAgICAgIHJ0bk9iai5oaXQgPSB0cnVlXG4gICAgICAgICAgICBydG5PYmouY29udHJvbEluZGV4ID0gdGhpcy5fdHJhbnNmb3JtZWRWZXJ0cy5sZW5ndGggKyBpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ0bk9ialxuICB9XG5cbiAgcmVuZGVyQm91bmRzKGN0eCwgd29ybGRUb1NjcmVlbk1hdHJpeCwgYm91bmRzU3Ryb2tlU3R5bGUpIHtcbiAgICAvLyB3ZSdyZSBzdG9yaW5nIG91ciBBQUJveCBpbiBzY3JlZW4gc3BhY2UgaGVyZSwgc28gd29ybGRUb1NjcmVlbk1hdHJpeCBpc1xuICAgIC8vIHVudXNlZFxuICAgIHRoaXMuX3VwZGF0ZUFBQm94KHdvcmxkVG9TY3JlZW5NYXRyaXgpXG4gICAgY3R4LnNhdmUoKVxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBib3VuZHNTdHJva2VTdHlsZS5zZXRTdHJva2VDdHgoY3R4KVxuICAgIGNvbnN0IGNlbnRlciA9IFswLCAwXVxuICAgIGNvbnN0IGV4dGVudHMgPSBbMCwgMF1cbiAgICBBQUJveDJkLmdldENlbnRlcihjZW50ZXIsIHRoaXMuX2FhYm94KVxuICAgIEFBQm94MmQuZ2V0RXh0ZW50cyhleHRlbnRzLCB0aGlzLl9hYWJveClcbiAgICBjdHguYmVnaW5QYXRoKClcbiAgICBjdHgucmVjdChjZW50ZXJbMF0gLSBleHRlbnRzWzBdLCBjZW50ZXJbMV0gLSBleHRlbnRzWzFdLCBleHRlbnRzWzBdICogMiwgZXh0ZW50c1sxXSAqIDIpXG4gICAgY3R4LnN0cm9rZSgpXG4gICAgY3R4LnJlc3RvcmUoKVxuICB9XG5cbiAgcmVuZGVyKGN0eCkge1xuICAgIGN0eC5zYXZlKClcblxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBjb25zdCBvYmpUb1NjcmVlbk1hdHJpeCA9IHRoaXMuX2Jhc2VWZXJ0U2hhcGUuX2Z1bGxYZm9ybVxuICAgIGNvbnN0IHZlcnRzID0gdGhpcy5fYmFzZVZlcnRTaGFwZS52ZXJ0c1JlZlxuICAgIHRoaXMuX3RyYW5zZm9ybWVkVmVydHMgPSBuZXcgQXJyYXkodmVydHMubGVuZ3RoKVxuICAgIGNvbnN0IHRtcFB0ID0gWzAsIDBdXG4gICAgY29uc3QgdG1wVmVjID0gWzAsIDBdXG5cbiAgICBjdHguYmVnaW5QYXRoKClcbiAgICBsZXQgaSA9IDBcbiAgICB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldID0gWzAsIDBdXG4gICAgUG9pbnQyZC50cmFuc2Zvcm1NYXQyZCh0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldLCB2ZXJ0c1tpXSwgb2JqVG9TY3JlZW5NYXRyaXgpXG5cbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1heChjdHgubGluZVdpZHRoICogMS41LCAyLjUpXG4gICAgZm9yIChpID0gMDsgaSA8IHZlcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpICsgMV0gPSBbMCwgMF1cbiAgICAgIFBvaW50MmQudHJhbnNmb3JtTWF0MmQodGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpICsgMV0sIHZlcnRzW2kgKyAxXSwgb2JqVG9TY3JlZW5NYXRyaXgpXG4gICAgICBQb2ludDJkLnN1Yih0bXBWZWMsIHRoaXMuX3RyYW5zZm9ybWVkVmVydHNbaSArIDFdLCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldKVxuICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgIFBvaW50MmQuYWRkVmVjMih0bXBQdCwgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpXSwgdG1wVmVjKVxuXG4gICAgICBjdHgubW92ZVRvKHRtcFB0WzBdICsgcmFkaXVzLCB0bXBQdFsxXSlcbiAgICAgIGN0eC5hcmModG1wUHRbMF0sIHRtcFB0WzFdLCByYWRpdXMsIDAsIE1hdGguVFdPX1BJKVxuICAgIH1cblxuICAgIGlmIChpID4gMCkge1xuICAgICAgUG9pbnQyZC5zdWIodG1wVmVjLCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzWzBdLCB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzW2ldKVxuICAgICAgVmVjMmQuc2NhbGUodG1wVmVjLCB0bXBWZWMsIDAuNSlcbiAgICAgIFBvaW50MmQuYWRkVmVjMih0bXBQdCwgdGhpcy5fdHJhbnNmb3JtZWRWZXJ0c1tpXSwgdG1wVmVjKVxuICAgICAgY3R4Lm1vdmVUbyh0bXBQdFswXSArIHJhZGl1cywgdG1wUHRbMV0pXG4gICAgICBjdHguYXJjKHRtcFB0WzBdLCB0bXBQdFsxXSwgcmFkaXVzLCAwLCBNYXRoLlRXT19QSSlcblxuICAgICAgLy8gVE9ETyhjcm9vdCk6IElzIHRoaXMgYXBwcm9wcmlhdGU/IENhbiB0aGUgZmlsbC9zdHJva2Ugc3R5bGVcbiAgICAgIC8vIGJlIGNyb3NzIGNvbXBhdGlibGU/IFdoYXQgYWJvdXQgZ3JhZGllbnRzL3BhdHRlcm5zP1xuICAgICAgLy8gV2UgY2FuIHByb2JhYmx5IHNhZmVseSBhc3N1bWUgbm8gZ3JhZGllbnRzL3BhdHRlcm5zIGF0XG4gICAgICAvLyB0aGlzIHBvaW50XG4gICAgICBjdHguZmlsbFN0eWxlID0gY3R4LnN0cm9rZVN0eWxlXG4gICAgICBjdHguZmlsbCgpXG4gICAgfVxuXG4gICAgY3R4LmJlZ2luUGF0aCgpXG5cbiAgICB0aGlzLl90cmFuc2Zvcm1lZFZlcnRzLmZvckVhY2godmVydCA9PiB7XG4gICAgICBjdHgubW92ZVRvKHZlcnRbMF0gKyB0aGlzLl92ZXJ0UmFkaXVzLCB2ZXJ0WzFdKVxuICAgICAgY3R4LmFyYyh2ZXJ0WzBdLCB2ZXJ0WzFdLCB0aGlzLl92ZXJ0UmFkaXVzLCAwLCBNYXRoLlRXT19QSSlcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuaXNGaWxsVmlzaWJsZSgpKSB7XG4gICAgICB0aGlzLnNldEZpbGxDdHgoY3R4KVxuICAgICAgY3R4LmZpbGwoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3Ryb2tlVmlzaWJsZSgpKSB7XG4gICAgICB0aGlzLnNldFN0cm9rZUN0eChjdHgpXG4gICAgICBjdHguc3Ryb2tlKClcbiAgICB9XG5cbiAgICBjdHgucmVzdG9yZSgpXG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2ludGVyYWN0aW9ucy92ZXJ0LWVkaXRhYmxlLXNoYXBlLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _polyLine = __webpack_require__(10);\n\nvar _polyLine2 = _interopRequireDefault(_polyLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Constants = {\n MINIMUM_POINTS: 3\n};\n\nvar Poly = function (_PolyLine) {\n _inherits(Poly, _PolyLine);\n\n function Poly(opts) {\n _classCallCheck(this, Poly);\n\n var _this = _possibleConstructorReturn(this, (Poly.__proto__ || Object.getPrototypeOf(Poly)).call(this, opts));\n\n if (_this._verts.length < Constants.MINIMUM_POINTS) {\n throw new Error(\"Poly shapes must be initialized with an array of 2d points and contain at least 3 points\");\n }\n return _this;\n }\n\n _createClass(Poly, [{\n key: \"removeVert\",\n value: function removeVert(vertIndex) {\n if (this._verts.length < Constants.MINIMUM_POINTS) {\n throw new Error(\"Cannot remove vertex \" + vertIndex + \". It would result in a poly with < 3 points. A poly must contain at least 3 points.\");\n }\n\n _get(Poly.prototype.__proto__ || Object.getPrototypeOf(Poly.prototype), \"removeVert\", this).call(this, vertIndex);\n }\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n var rtn = false;\n if (this._verts.length >= Constants.MINIMUM_POINTS) {\n ctx.moveTo(this._verts[0][0], this._verts[0][1]);\n for (var i = 1; i < this._verts.length; i += 1) {\n ctx.lineTo(this._verts[i][0], this._verts[i][1]);\n }\n ctx.closePath();\n rtn = true;\n }\n return rtn;\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign(_get(Poly.prototype.__proto__ || Object.getPrototypeOf(Poly.prototype), \"toJSON\", this).call(this), {\n type: \"Poly\" // NOTE: this much match the name of the class\n // This is also supplied after the super.toJSON()\n // so that this type overrides the parent class's\n // type\n });\n }\n }]);\n\n return Poly;\n}(_polyLine2.default);\n\nexports.default = Poly;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcG9seS5qcz8zNmZiIl0sIm5hbWVzIjpbIkNvbnN0YW50cyIsIk1JTklNVU1fUE9JTlRTIiwiUG9seSIsIm9wdHMiLCJfdmVydHMiLCJsZW5ndGgiLCJFcnJvciIsInZlcnRJbmRleCIsImN0eCIsInJ0biIsIm1vdmVUbyIsImkiLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJPYmplY3QiLCJhc3NpZ24iLCJ0eXBlIiwiUG9seUxpbmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLFlBQVk7QUFDaEJDLGtCQUFnQjtBQURBLENBQWxCOztJQUlxQkMsSTs7O0FBQ25CLGdCQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQUEsNEdBQ1ZBLElBRFU7O0FBRWhCLFFBQUksTUFBS0MsTUFBTCxDQUFZQyxNQUFaLEdBQXFCTCxVQUFVQyxjQUFuQyxFQUFtRDtBQUNqRCxZQUFNLElBQUlLLEtBQUosQ0FBVSwwRkFBVixDQUFOO0FBQ0Q7QUFKZTtBQUtqQjs7OzsrQkFFVUMsUyxFQUFXO0FBQ3BCLFVBQUksS0FBS0gsTUFBTCxDQUFZQyxNQUFaLEdBQXFCTCxVQUFVQyxjQUFuQyxFQUFtRDtBQUNqRCxjQUFNLElBQUlLLEtBQUosMkJBQWtDQyxTQUFsQyx5RkFBTjtBQUNEOztBQUVELDZHQUFpQkEsU0FBakI7QUFDRDs7OzBCQUdLQyxHLEVBQUs7QUFDVCxVQUFJQyxNQUFNLEtBQVY7QUFDQSxVQUFJLEtBQUtMLE1BQUwsQ0FBWUMsTUFBWixJQUFzQkwsVUFBVUMsY0FBcEMsRUFBb0Q7QUFDbERPLFlBQUlFLE1BQUosQ0FBVyxLQUFLTixNQUFMLENBQVksQ0FBWixFQUFlLENBQWYsQ0FBWCxFQUE4QixLQUFLQSxNQUFMLENBQVksQ0FBWixFQUFlLENBQWYsQ0FBOUI7QUFDQSxhQUFLLElBQUlPLElBQUksQ0FBYixFQUFnQkEsSUFBSSxLQUFLUCxNQUFMLENBQVlDLE1BQWhDLEVBQXdDTSxLQUFLLENBQTdDLEVBQWdEO0FBQzlDSCxjQUFJSSxNQUFKLENBQVcsS0FBS1IsTUFBTCxDQUFZTyxDQUFaLEVBQWUsQ0FBZixDQUFYLEVBQThCLEtBQUtQLE1BQUwsQ0FBWU8sQ0FBWixFQUFlLENBQWYsQ0FBOUI7QUFDRDtBQUNESCxZQUFJSyxTQUFKO0FBQ0FKLGNBQU0sSUFBTjtBQUNEO0FBQ0QsYUFBT0EsR0FBUDtBQUNEOzs7NkJBRVE7QUFDUCxhQUFPSyxPQUFPQyxNQUFQLHFHQUE4QjtBQUNuQ0MsY0FBTSxNQUQ2QixDQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUpzQixPQUE5QixDQUFQO0FBTUQ7Ozs7RUFyQytCQyxrQjs7a0JBQWJmLEkiLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgUG9seUxpbmUgZnJvbSBcIi4vcG9seS1saW5lXCJcblxuY29uc3QgQ29uc3RhbnRzID0ge1xuICBNSU5JTVVNX1BPSU5UUzogM1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2x5IGV4dGVuZHMgUG9seUxpbmUge1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICBpZiAodGhpcy5fdmVydHMubGVuZ3RoIDwgQ29uc3RhbnRzLk1JTklNVU1fUE9JTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb2x5IHNoYXBlcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYW4gYXJyYXkgb2YgMmQgcG9pbnRzIGFuZCBjb250YWluIGF0IGxlYXN0IDMgcG9pbnRzXCIpXG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlVmVydCh2ZXJ0SW5kZXgpIHtcbiAgICBpZiAodGhpcy5fdmVydHMubGVuZ3RoIDwgQ29uc3RhbnRzLk1JTklNVU1fUE9JTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZW1vdmUgdmVydGV4ICR7dmVydEluZGV4fS4gSXQgd291bGQgcmVzdWx0IGluIGEgcG9seSB3aXRoIDwgMyBwb2ludHMuIEEgcG9seSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMyBwb2ludHMuYClcbiAgICB9XG5cbiAgICBzdXBlci5yZW1vdmVWZXJ0KHZlcnRJbmRleClcbiAgfVxuXG5cbiAgX2RyYXcoY3R4KSB7XG4gICAgbGV0IHJ0biA9IGZhbHNlXG4gICAgaWYgKHRoaXMuX3ZlcnRzLmxlbmd0aCA+PSBDb25zdGFudHMuTUlOSU1VTV9QT0lOVFMpIHtcbiAgICAgIGN0eC5tb3ZlVG8odGhpcy5fdmVydHNbMF1bMF0sIHRoaXMuX3ZlcnRzWzBdWzFdKVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl92ZXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjdHgubGluZVRvKHRoaXMuX3ZlcnRzW2ldWzBdLCB0aGlzLl92ZXJ0c1tpXVsxXSlcbiAgICAgIH1cbiAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgcnRuID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3VwZXIudG9KU09OKCksIHtcbiAgICAgIHR5cGU6IFwiUG9seVwiIC8vIE5PVEU6IHRoaXMgbXVjaCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFsc28gc3VwcGxpZWQgYWZ0ZXIgdGhlIHN1cGVyLnRvSlNPTigpXG4gICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGlzIHR5cGUgb3ZlcnJpZGVzIHRoZSBwYXJlbnQgY2xhc3Mnc1xuICAgICAgICAgICAgICAgICAgIC8vIHR5cGVcbiAgICB9KVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zaGFwZXMvcG9seS5qcyJdLCJzb3VyY2VSb290IjoiIn0="); -/***/ }, +/***/ }), /* 26 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _point2d = __webpack_require__(4);\n\nvar Point2d = _interopRequireWildcard(_point2d);\n\nvar _transform2d = __webpack_require__(12);\n\nvar _mat2d = __webpack_require__(5);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _rect = __webpack_require__(16);\n\nvar _rect2 = _interopRequireDefault(_rect);\n\nvar _vec2d = __webpack_require__(10);\n\nvar _vec2d2 = _interopRequireDefault(_vec2d);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Constants = {\n SIDES: 4\n};\n\nfunction drawOBBoxModifierRect(ctx, pt, objToScreenMat, modifierSize, modifierHalfSize, modifierRotation, scale) {\n Point2d.transformMat2d(pt, pt, objToScreenMat);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.translate(pt[0], pt[1]);\n ctx.rotate(modifierRotation[1]);\n ctx.scale(scale[0], scale[1]);\n ctx.rotate(modifierRotation[0]);\n ctx.translate(-pt[0], -pt[1]);\n ctx.rect(pt[0] - modifierHalfSize, pt[1] - modifierHalfSize, modifierSize, modifierSize);\n\n // ctx.moveTo(pt[0], pt[1])\n // ctx.lineTo(pt[0], pt[1] + 20)\n // ctx.moveTo(pt[0], pt[1])\n // ctx.lineTo(pt[0] + 20, pt[1])\n\n // ctx.font = \"24px serif\"\n // ctx.fillText(text, pt[0], pt[1])\n}\n\nfunction isPointInOBBoxModifierRect(screenPt, modifierPt, objToScreenMat, modifierMat, halfBoxSz, boxSz, padBoxSz, padBoxRadius, xScale, yScale) {\n var hit = false;\n var rotate = false;\n Point2d.transformMat2d(modifierPt, modifierPt, objToScreenMat);\n if (Point2d.distance(modifierPt, screenPt) <= padBoxRadius) {\n _vec2d2.default.negate(modifierPt, modifierPt);\n modifierMat[4] = modifierMat[0] * modifierPt[0] + modifierMat[2] * modifierPt[1];\n modifierMat[5] = modifierMat[1] * modifierPt[0] + modifierMat[3] * modifierPt[1];\n\n var x = 0;\n var y = 0;\n Point2d.transformMat2d(modifierPt, screenPt, modifierMat);\n if (Math.abs(modifierPt[0]) <= halfBoxSz && Math.abs(modifierPt[1]) <= halfBoxSz || Boolean(xScale) && Boolean(yScale) && (rotate = (x = xScale * modifierPt[0]) > -halfBoxSz && x <= padBoxSz && (y = yScale * modifierPt[1]) > -halfBoxSz && y <= padBoxSz)) {\n hit = true;\n }\n }\n return {\n hit: hit,\n rotate: rotate\n };\n}\n\nvar XformShape = function (_Rect) {\n _inherits(XformShape, _Rect);\n\n function XformShape(opts) {\n var selectOpts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n scalable: true,\n rotatable: true\n };\n\n _classCallCheck(this, XformShape);\n\n var _this = _possibleConstructorReturn(this, (XformShape.__proto__ || Object.getPrototypeOf(XformShape)).call(this, opts));\n\n _this._interactiveBoxSize = 8;\n _this._interactiveBoxPadding = 10;\n if (opts && typeof opts.vertexSize !== \"undefined\") {\n _this._interactiveBoxSize = opts.vertexSize;\n }\n\n _this._scalable = true;\n _this._rotatable = true;\n if (selectOpts) {\n if (typeof selectOpts.scalable !== \"undefined\") {\n _this._scalable = Boolean(selectOpts.scalable);\n }\n\n if (typeof selectOpts.rotatable !== \"undefined\") {\n _this._rotatable = Boolean(selectOpts.rotatable);\n }\n }\n return _this;\n }\n\n _createClass(XformShape, [{\n key: \"containsPoint\",\n value: function containsPoint(screenPt) {\n // Should we update here, or is it safe to\n // say that this is stateful, meaning a render\n // should have been performed beforehand which\n // would've updated its state\n var rtnObj = {\n hit: false,\n rotate: false,\n controlIndex: -1\n };\n\n var aabox = this.aabox;\n if ((this._rotatable || this._scalable) && this.visible && AABox2d.containsPt(aabox, screenPt)) {\n var scale = [0, 0];\n var rot = [0, 0];\n _mat2d2.default.svd(null, scale, rot, this._fullXform);\n var mat = _mat2d2.default.create();\n\n scale[0] = scale[0] < 0 ? -1 : 1;\n scale[1] = scale[1] < 0 ? -1 : 1;\n\n if (scale[0] * scale[1] > 0) {\n _vec2d2.default.negate(rot, rot);\n }\n\n _mat2d2.default.rotate(mat, mat, rot[1]);\n _mat2d2.default.scale(mat, mat, scale);\n _mat2d2.default.rotate(mat, mat, rot[0]);\n\n var boxPadding = this._rotatable ? this._interactiveBoxPadding : 0;\n var halfBoxSz = this._interactiveBoxSize / 2;\n var halfWidth = this.width / 2;\n var halfHeight = this.height / 2;\n var pt = [0, 0];\n var padSz = halfBoxSz + boxPadding;\n var padRadius = Math.sqrt(2 * padSz * padSz);\n var xScale = 0;\n var yScale = 0;\n\n for (var i = 0; i < Constants.SIDES; i += 1) {\n xScale = i < 2 ? -1 : 1;\n yScale = i % 2 === 0 ? -1 : 1;\n Point2d.set(pt, xScale * halfWidth, yScale * halfHeight);\n rtnObj = isPointInOBBoxModifierRect(screenPt, pt, this._fullXform, mat, halfBoxSz, this._interactiveBoxSize, padSz, padRadius, xScale, yScale, scale);\n if (rtnObj.hit) {\n rtnObj.controlIndex = i;\n break;\n }\n }\n\n if (!rtnObj.hit && this._scalable) {\n for (var _i = 0; _i < Constants.SIDES; _i += 1) {\n xScale = _i % 2 === 0 ? _i < 2 ? -1 : 1 : 0;\n yScale = _i % 2 === 0 ? 0 : _i < 2 ? -1 : 1;\n Point2d.set(pt, xScale * halfWidth, yScale * halfHeight);\n rtnObj = isPointInOBBoxModifierRect(screenPt, pt, this._fullXform, mat, halfBoxSz, this._interactiveBoxSize, padSz, padRadius, xScale, yScale, scale);\n if (rtnObj.hit) {\n rtnObj.controlIndex = _i + Constants.SIDES;\n break;\n }\n }\n }\n\n if (rtnObj.rotate && !this._rotatable) {\n rtnObj.rotate = false;\n } else if (!rtnObj.rotate && !this._scalable) {\n rtnObj.rotate = true;\n }\n }\n\n return rtnObj;\n }\n }, {\n key: \"_updatelocalxform\",\n value: function _updatelocalxform(force) {\n if (this._lxformDirty || force) {\n var pos = Point2d.clone(this._pos);\n Point2d.addVec2(pos, pos, this._parent.pivotRef);\n (0, _transform2d.buildXformMatrix)(this._localXform, this._rotDeg, this._scale, pos, this._pivot);\n if (this._localXformUpdated) {\n this._localXformUpdated();\n }\n this._lxformDirty = false;\n }\n }\n }, {\n key: \"_updateglobalxform\",\n value: function _updateglobalxform() {\n if (this._lxformDirty || this._xformDirty) {\n this._updatelocalxform(true);\n if (this._parent) {\n _mat2d2.default.multiply(this._globalXform, this._parent.globalXform, this._localXform);\n } else {\n _mat2d2.default.copy(this._globalXform, this._localXform);\n }\n if (this._globalXformUpdated) {\n this._globalXformUpdated();\n }\n this._xformDirty = false;\n }\n }\n }, {\n key: \"_updateAABox\",\n value: function _updateAABox() {\n var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (force || this._geomDirty || this._boundsOutOfDate) {\n var boxPadding = this._rotatable ? this._interactiveBoxPadding : 0;\n var padding = boxPadding + this._interactiveBoxSize / 2;\n AABox2d.initCenterExtents(this._aabox, [0, 0], [this.width / 2, this.height / 2]);\n AABox2d.transformMat2d(this._aabox, this._aabox, this._fullXform);\n AABox2d.expand(this._aabox, this._aabox, [padding, padding]);\n this._aaboxUpdated = true;\n this._geomDirty = this._boundsOutOfDate = false;\n }\n }\n }, {\n key: \"renderBounds\",\n value: function renderBounds(ctx, worldToScreenMatrix, boundsStrokeStyle) {\n // we're storing our AABox in screen space here, so worldToScreenMatrix is\n // unused\n var aabox = this.aabox;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n boundsStrokeStyle.setStrokeCtx(ctx);\n var center = [0, 0];\n var extents = [0, 0];\n AABox2d.getCenter(center, aabox);\n AABox2d.getExtents(extents, aabox);\n ctx.beginPath();\n ctx.rect(center[0] - extents[0], center[1] - extents[1], extents[0] * 2, extents[1] * 2);\n ctx.stroke();\n ctx.restore();\n }\n }, {\n key: \"render\",\n value: function render(ctx, worldToScreenMatrix, styleState) {\n if (!this.parent || typeof this.parent.width === \"undefined\" || this.parent.height === \"undefined\") {\n return;\n }\n\n this._aaboxUpdated = false;\n // do not fill the primary rectangle\n _get(XformShape.prototype.__proto__ || Object.getPrototypeOf(XformShape.prototype), \"render\", this).call(this, ctx, worldToScreenMatrix, styleState, false);\n if (!this._aaboxUpdated) {\n this._updateAABox(true);\n }\n\n var scale = [0, 0];\n var rot = [0, 0];\n _mat2d2.default.svd(null, scale, rot, this._fullXform);\n scale[0] = scale[0] < 0 ? -1 : 1;\n scale[1] = scale[1] < 0 ? -1 : 1;\n\n var halfBoxSz = this._interactiveBoxSize / 2;\n var halfWidth = this.width / 2;\n var halfHeight = this.height / 2;\n var pt = [halfWidth, halfHeight];\n\n ctx.save();\n\n ctx.beginPath();\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"3\");\n\n Point2d.set(pt, halfWidth, -halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"2\");\n\n Point2d.set(pt, -halfWidth, -halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"0\");\n\n Point2d.set(pt, -halfWidth, halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale, \"1\");\n\n if (this._scalable) {\n Point2d.set(pt, 0, halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n\n Point2d.set(pt, 0, -halfHeight);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n\n Point2d.set(pt, halfWidth, 0);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n\n Point2d.set(pt, -halfWidth, 0);\n drawOBBoxModifierRect(ctx, pt, this._fullXform, this._interactiveBoxSize, halfBoxSz, rot, scale);\n }\n\n if (this.isFillVisible()) {\n styleState.setFillStyle(ctx, this);\n ctx.fill();\n }\n\n if (this.isStrokeVisible()) {\n styleState.setStrokeStyle(ctx, this);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }, {\n key: \"width\",\n get: function get() {\n return this.parent && this.parent.width !== \"undefined\" ? this.parent.width : 0;\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.parent && this.parent.height !== \"undefined\" ? this.parent.height : 0;\n }\n }]);\n\n return XformShape;\n}(_rect2.default);\n\nexports.default = XformShape;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmFjdGlvbnMveGZvcm0tc2hhcGUuanM/MmU2MyJdLCJuYW1lcyI6WyJBQUJveDJkIiwiUG9pbnQyZCIsIkNvbnN0YW50cyIsIlNJREVTIiwiZHJhd09CQm94TW9kaWZpZXJSZWN0IiwiY3R4IiwicHQiLCJvYmpUb1NjcmVlbk1hdCIsIm1vZGlmaWVyU2l6ZSIsIm1vZGlmaWVySGFsZlNpemUiLCJtb2RpZmllclJvdGF0aW9uIiwic2NhbGUiLCJ0cmFuc2Zvcm1NYXQyZCIsInNldFRyYW5zZm9ybSIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsInJlY3QiLCJpc1BvaW50SW5PQkJveE1vZGlmaWVyUmVjdCIsInNjcmVlblB0IiwibW9kaWZpZXJQdCIsIm1vZGlmaWVyTWF0IiwiaGFsZkJveFN6IiwiYm94U3oiLCJwYWRCb3hTeiIsInBhZEJveFJhZGl1cyIsInhTY2FsZSIsInlTY2FsZSIsImhpdCIsImRpc3RhbmNlIiwibmVnYXRlIiwieCIsInkiLCJNYXRoIiwiYWJzIiwiQm9vbGVhbiIsIlhmb3JtU2hhcGUiLCJvcHRzIiwic2VsZWN0T3B0cyIsInNjYWxhYmxlIiwicm90YXRhYmxlIiwiX2ludGVyYWN0aXZlQm94U2l6ZSIsIl9pbnRlcmFjdGl2ZUJveFBhZGRpbmciLCJ2ZXJ0ZXhTaXplIiwiX3NjYWxhYmxlIiwiX3JvdGF0YWJsZSIsInJ0bk9iaiIsImNvbnRyb2xJbmRleCIsImFhYm94IiwidmlzaWJsZSIsImNvbnRhaW5zUHQiLCJyb3QiLCJzdmQiLCJfZnVsbFhmb3JtIiwibWF0IiwiY3JlYXRlIiwiYm94UGFkZGluZyIsImhhbGZXaWR0aCIsIndpZHRoIiwiaGFsZkhlaWdodCIsImhlaWdodCIsInBhZFN6IiwicGFkUmFkaXVzIiwic3FydCIsImkiLCJzZXQiLCJmb3JjZSIsIl9seGZvcm1EaXJ0eSIsInBvcyIsImNsb25lIiwiX3BvcyIsImFkZFZlYzIiLCJfcGFyZW50IiwicGl2b3RSZWYiLCJfbG9jYWxYZm9ybSIsIl9yb3REZWciLCJfc2NhbGUiLCJfcGl2b3QiLCJfbG9jYWxYZm9ybVVwZGF0ZWQiLCJfeGZvcm1EaXJ0eSIsIl91cGRhdGVsb2NhbHhmb3JtIiwibXVsdGlwbHkiLCJfZ2xvYmFsWGZvcm0iLCJnbG9iYWxYZm9ybSIsImNvcHkiLCJfZ2xvYmFsWGZvcm1VcGRhdGVkIiwiX2dlb21EaXJ0eSIsIl9ib3VuZHNPdXRPZkRhdGUiLCJwYWRkaW5nIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJleHBhbmQiLCJfYWFib3hVcGRhdGVkIiwid29ybGRUb1NjcmVlbk1hdHJpeCIsImJvdW5kc1N0cm9rZVN0eWxlIiwic2F2ZSIsInNldFN0cm9rZUN0eCIsImNlbnRlciIsImV4dGVudHMiLCJnZXRDZW50ZXIiLCJnZXRFeHRlbnRzIiwiYmVnaW5QYXRoIiwic3Ryb2tlIiwicmVzdG9yZSIsInN0eWxlU3RhdGUiLCJwYXJlbnQiLCJfdXBkYXRlQUFCb3giLCJpc0ZpbGxWaXNpYmxlIiwic2V0RmlsbFN0eWxlIiwiZmlsbCIsImlzU3Ryb2tlVmlzaWJsZSIsInNldFN0cm9rZVN0eWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBOztJQUFZQSxPOztBQUNaOztJQUFZQyxPOztBQUNaOztBQUdBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQyxZQUFZO0FBQ2hCQyxTQUFPO0FBRFMsQ0FBbEI7O0FBSUEsU0FBU0MscUJBQVQsQ0FBK0JDLEdBQS9CLEVBQW9DQyxFQUFwQyxFQUF3Q0MsY0FBeEMsRUFBd0RDLFlBQXhELEVBQXNFQyxnQkFBdEUsRUFBd0ZDLGdCQUF4RixFQUEwR0MsS0FBMUcsRUFBaUg7QUFDL0dWLFVBQVFXLGNBQVIsQ0FBdUJOLEVBQXZCLEVBQTJCQSxFQUEzQixFQUErQkMsY0FBL0I7QUFDQUYsTUFBSVEsWUFBSixDQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQixDQUExQixFQUE2QixDQUE3QixFQUFnQyxDQUFoQztBQUNB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RUFBNEI7QUFDMUJOLG1CQUFXTyxjQUFYLENBQTBCekcsR0FBMUIsRUFBK0IsSUFBL0I7QUFDQUEsWUFBSVEsWUFBSixDQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQixDQUExQixFQUE2QixDQUE3QixFQUFnQyxDQUFoQztBQUNBUixZQUFJZ0csTUFBSjtBQUNEOztBQUVEaEcsVUFBSWlHLE9BQUo7QUFDRDs7O3dCQXhGVztBQUNWLGFBQVEsS0FBS0UsTUFBTCxJQUFlLEtBQUtBLE1BQUwsQ0FBWS9DLEtBQVosS0FBc0IsV0FBckMsR0FBbUQsS0FBSytDLE1BQUwsQ0FBWS9DLEtBQS9ELEdBQXVFLENBQS9FO0FBQ0Q7Ozt3QkFFWTtBQUNYLGFBQVEsS0FBSytDLE1BQUwsSUFBZSxLQUFLQSxNQUFMLENBQVk3QyxNQUFaLEtBQXVCLFdBQXRDLEdBQW9ELEtBQUs2QyxNQUFMLENBQVk3QyxNQUFoRSxHQUF5RSxDQUFqRjtBQUNEOzs7Ozs7a0JBaEprQnhCLFUiLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuLi9jb3JlL2FhYm94MmRcIlxuaW1wb3J0ICogYXMgUG9pbnQyZCBmcm9tIFwiLi4vY29yZS9wb2ludDJkXCJcbmltcG9ydCB7XG4gIGJ1aWxkWGZvcm1NYXRyaXhcbn0gZnJvbSBcIi4uL3NoYXBlcy90cmFuc2Zvcm0yZFwiXG5pbXBvcnQgTWF0MmQgZnJvbSBcIi4uL2NvcmUvbWF0MmRcIlxuaW1wb3J0IFJlY3QgZnJvbSBcIi4uL3NoYXBlcy9yZWN0XCJcbmltcG9ydCBWZWMyZCBmcm9tIFwiLi4vY29yZS92ZWMyZFwiXG5cbmNvbnN0IENvbnN0YW50cyA9IHtcbiAgU0lERVM6IDRcbn1cblxuZnVuY3Rpb24gZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIG9ialRvU2NyZWVuTWF0LCBtb2RpZmllclNpemUsIG1vZGlmaWVySGFsZlNpemUsIG1vZGlmaWVyUm90YXRpb24sIHNjYWxlKSB7XG4gIFBvaW50MmQudHJhbnNmb3JtTWF0MmQocHQsIHB0LCBvYmpUb1NjcmVlbk1hdClcbiAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICBjdHgudHJhbnNsYXRlKHB0WzBdLCBwdFsxXSlcbiAgY3R4LnJvdGF0ZShtb2RpZmllclJvdGF0aW9uWzFdKVxuICBjdHguc2NhbGUoc2NhbGVbMF0sIHNjYWxlWzFdKVxuICBjdHgucm90YXRlKG1vZGlmaWVyUm90YXRpb25bMF0pXG4gIGN0eC50cmFuc2xhdGUoLXB0WzBdLCAtcHRbMV0pXG4gIGN0eC5yZWN0KHB0WzBdIC0gbW9kaWZpZXJIYWxmU2l6ZSwgcHRbMV0gLSBtb2RpZmllckhhbGZTaXplLCBtb2RpZmllclNpemUsIG1vZGlmaWVyU2l6ZSlcblxuICAvLyBjdHgubW92ZVRvKHB0WzBdLCBwdFsxXSlcbiAgLy8gY3R4LmxpbmVUbyhwdFswXSwgcHRbMV0gKyAyMClcbiAgLy8gY3R4Lm1vdmVUbyhwdFswXSwgcHRbMV0pXG4gIC8vIGN0eC5saW5lVG8ocHRbMF0gKyAyMCwgcHRbMV0pXG5cbiAgLy8gY3R4LmZvbnQgPSBcIjI0cHggc2VyaWZcIlxuICAvLyBjdHguZmlsbFRleHQodGV4dCwgcHRbMF0sIHB0WzFdKVxufVxuXG5mdW5jdGlvbiBpc1BvaW50SW5PQkJveE1vZGlmaWVyUmVjdChzY3JlZW5QdCwgbW9kaWZpZXJQdCwgb2JqVG9TY3JlZW5NYXQsIG1vZGlmaWVyTWF0LCBoYWxmQm94U3osIGJveFN6LCBwYWRCb3hTeiwgcGFkQm94UmFkaXVzLCB4U2NhbGUsIHlTY2FsZSkge1xuICBsZXQgaGl0ID0gZmFsc2VcbiAgbGV0IHJvdGF0ZSA9IGZhbHNlXG4gIFBvaW50MmQudHJhbnNmb3JtTWF0MmQobW9kaWZpZXJQdCwgbW9kaWZpZXJQdCwgb2JqVG9TY3JlZW5NYXQpXG4gIGlmIChQb2ludDJkLmRpc3RhbmNlKG1vZGlmaWVyUHQsIHNjcmVlblB0KSA8PSBwYWRCb3hSYWRpdXMpIHtcbiAgICBWZWMyZC5uZWdhdGUobW9kaWZpZXJQdCwgbW9kaWZpZXJQdClcbiAgICBtb2RpZmllck1hdFs0XSA9IG1vZGlmaWVyTWF0WzBdICogbW9kaWZpZXJQdFswXSArIG1vZGlmaWVyTWF0WzJdICogbW9kaWZpZXJQdFsxXVxuICAgIG1vZGlmaWVyTWF0WzVdID0gbW9kaWZpZXJNYXRbMV0gKiBtb2RpZmllclB0WzBdICsgbW9kaWZpZXJNYXRbM10gKiBtb2RpZmllclB0WzFdXG5cbiAgICBsZXQgeCA9IDBcbiAgICBsZXQgeSA9IDBcbiAgICBQb2ludDJkLnRyYW5zZm9ybU1hdDJkKG1vZGlmaWVyUHQsIHNjcmVlblB0LCBtb2RpZmllck1hdClcbiAgICBpZiAoKE1hdGguYWJzKG1vZGlmaWVyUHRbMF0pIDw9IGhhbGZCb3hTeiAmJiBNYXRoLmFicyhtb2RpZmllclB0WzFdKSA8PSBoYWxmQm94U3opIHx8XG4gICAgICAoQm9vbGVhbih4U2NhbGUpICYmIEJvb2xlYW4oeVNjYWxlKSAmJlxuICAgICAgICAocm90YXRlID0gKCh4ID0geFNjYWxlICogbW9kaWZpZXJQdFswXSkgPiAtaGFsZkJveFN6ICYmIHggPD0gcGFkQm94U3ogJiZcbiAgICAgICAgICAoeSA9IHlTY2FsZSAqIG1vZGlmaWVyUHRbMV0pID4gLWhhbGZCb3hTeiAmJiB5IDw9IHBhZEJveFN6KSkpKSB7XG4gICAgICBoaXQgPSB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgaGl0LFxuICAgIHJvdGF0ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFhmb3JtU2hhcGUgZXh0ZW5kcyBSZWN0IHtcbiAgY29uc3RydWN0b3Iob3B0cywgc2VsZWN0T3B0cyA9IHtcbiAgICBzY2FsYWJsZTogdHJ1ZSxcbiAgICByb3RhdGFibGU6IHRydWVcbiAgfSkge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplID0gOFxuICAgIHRoaXMuX2ludGVyYWN0aXZlQm94UGFkZGluZyA9IDEwXG4gICAgaWYgKG9wdHMgJiYgdHlwZW9mIG9wdHMudmVydGV4U2l6ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplID0gb3B0cy52ZXJ0ZXhTaXplXG4gICAgfVxuXG4gICAgdGhpcy5fc2NhbGFibGUgPSB0cnVlXG4gICAgdGhpcy5fcm90YXRhYmxlID0gdHJ1ZVxuICAgIGlmIChzZWxlY3RPcHRzKSB7XG4gICAgICBpZiAodHlwZW9mIHNlbGVjdE9wdHMuc2NhbGFibGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5fc2NhbGFibGUgPSBCb29sZWFuKHNlbGVjdE9wdHMuc2NhbGFibGUpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0T3B0cy5yb3RhdGFibGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhpcy5fcm90YXRhYmxlID0gQm9vbGVhbihzZWxlY3RPcHRzLnJvdGF0YWJsZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb250YWluc1BvaW50KHNjcmVlblB0KSB7XG4gICAgLy8gU2hvdWxkIHdlIHVwZGF0ZSBoZXJlLCBvciBpcyBpdCBzYWZlIHRvXG4gICAgLy8gc2F5IHRoYXQgdGhpcyBpcyBzdGF0ZWZ1bCwgbWVhbmluZyBhIHJlbmRlclxuICAgIC8vIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIGJlZm9yZWhhbmQgd2hpY2hcbiAgICAvLyB3b3VsZCd2ZSB1cGRhdGVkIGl0cyBzdGF0ZVxuICAgIGxldCBydG5PYmogPSB7XG4gICAgICBoaXQ6IGZhbHNlLFxuICAgICAgcm90YXRlOiBmYWxzZSxcbiAgICAgIGNvbnRyb2xJbmRleDogLTFcbiAgICB9XG5cbiAgICBjb25zdCBhYWJveCA9IHRoaXMuYWFib3hcbiAgICBpZiAoKHRoaXMuX3JvdGF0YWJsZSB8fCB0aGlzLl9zY2FsYWJsZSkgJiYgdGhpcy52aXNpYmxlICYmIEFBQm94MmQuY29udGFpbnNQdChhYWJveCwgc2NyZWVuUHQpKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IFswLCAwXVxuICAgICAgY29uc3Qgcm90ID0gWzAsIDBdXG4gICAgICBNYXQyZC5zdmQobnVsbCwgc2NhbGUsIHJvdCwgdGhpcy5fZnVsbFhmb3JtKVxuICAgICAgY29uc3QgbWF0ID0gTWF0MmQuY3JlYXRlKClcblxuICAgICAgc2NhbGVbMF0gPSAoc2NhbGVbMF0gPCAwID8gLTEgOiAxKVxuICAgICAgc2NhbGVbMV0gPSAoc2NhbGVbMV0gPCAwID8gLTEgOiAxKVxuXG4gICAgICBpZiAoc2NhbGVbMF0gKiBzY2FsZVsxXSA+IDApIHtcbiAgICAgICAgVmVjMmQubmVnYXRlKHJvdCwgcm90KVxuICAgICAgfVxuXG4gICAgICBNYXQyZC5yb3RhdGUobWF0LCBtYXQsIHJvdFsxXSlcbiAgICAgIE1hdDJkLnNjYWxlKG1hdCwgbWF0LCBzY2FsZSlcbiAgICAgIE1hdDJkLnJvdGF0ZShtYXQsIG1hdCwgcm90WzBdKVxuXG4gICAgICBjb25zdCBib3hQYWRkaW5nID0gKHRoaXMuX3JvdGF0YWJsZSA/IHRoaXMuX2ludGVyYWN0aXZlQm94UGFkZGluZyA6IDApXG4gICAgICBjb25zdCBoYWxmQm94U3ogPSB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUgLyAyXG4gICAgICBjb25zdCBoYWxmV2lkdGggPSB0aGlzLndpZHRoIC8gMlxuICAgICAgY29uc3QgaGFsZkhlaWdodCA9IHRoaXMuaGVpZ2h0IC8gMlxuICAgICAgY29uc3QgcHQgPSBbMCwgMF1cbiAgICAgIGNvbnN0IHBhZFN6ID0gaGFsZkJveFN6ICsgYm94UGFkZGluZ1xuICAgICAgY29uc3QgcGFkUmFkaXVzID0gTWF0aC5zcXJ0KDIgKiBwYWRTeiAqIHBhZFN6KVxuICAgICAgbGV0IHhTY2FsZSA9IDBcbiAgICAgIGxldCB5U2NhbGUgPSAwXG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ29uc3RhbnRzLlNJREVTOyBpICs9IDEpIHtcbiAgICAgICAgeFNjYWxlID0gKGkgPCAyID8gLTEgOiAxKVxuICAgICAgICB5U2NhbGUgPSAoaSAlIDIgPT09IDAgPyAtMSA6IDEpXG4gICAgICAgIFBvaW50MmQuc2V0KHB0LCB4U2NhbGUgKiBoYWxmV2lkdGgsIHlTY2FsZSAqIGhhbGZIZWlnaHQpXG4gICAgICAgIHJ0bk9iaiA9IGlzUG9pbnRJbk9CQm94TW9kaWZpZXJSZWN0KHNjcmVlblB0LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCBtYXQsIGhhbGZCb3hTeiwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBwYWRTeiwgcGFkUmFkaXVzLCB4U2NhbGUsIHlTY2FsZSwgc2NhbGUpXG4gICAgICAgIGlmIChydG5PYmouaGl0KSB7XG4gICAgICAgICAgcnRuT2JqLmNvbnRyb2xJbmRleCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcnRuT2JqLmhpdCAmJiB0aGlzLl9zY2FsYWJsZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENvbnN0YW50cy5TSURFUzsgaSArPSAxKSB7XG4gICAgICAgICAgeFNjYWxlID0gKGkgJSAyID09PSAwID8gKGkgPCAyID8gLTEgOiAxKSA6IDApXG4gICAgICAgICAgeVNjYWxlID0gKGkgJSAyID09PSAwID8gMCA6IChpIDwgMiA/IC0xIDogMSkpXG4gICAgICAgICAgUG9pbnQyZC5zZXQocHQsIHhTY2FsZSAqIGhhbGZXaWR0aCwgeVNjYWxlICogaGFsZkhlaWdodClcbiAgICAgICAgICBydG5PYmogPSBpc1BvaW50SW5PQkJveE1vZGlmaWVyUmVjdChzY3JlZW5QdCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgbWF0LCBoYWxmQm94U3osIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSwgcGFkU3osIHBhZFJhZGl1cywgeFNjYWxlLCB5U2NhbGUsIHNjYWxlKVxuICAgICAgICAgIGlmIChydG5PYmouaGl0KSB7XG4gICAgICAgICAgICBydG5PYmouY29udHJvbEluZGV4ID0gaSArIENvbnN0YW50cy5TSURFU1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJ0bk9iai5yb3RhdGUgJiYgIXRoaXMuX3JvdGF0YWJsZSkge1xuICAgICAgICBydG5PYmoucm90YXRlID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoIXJ0bk9iai5yb3RhdGUgJiYgIXRoaXMuX3NjYWxhYmxlKSB7XG4gICAgICAgIHJ0bk9iai5yb3RhdGUgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ0bk9ialxuICB9XG5cbiAgX3VwZGF0ZWxvY2FseGZvcm0oZm9yY2UpIHtcbiAgICBpZiAodGhpcy5fbHhmb3JtRGlydHkgfHwgZm9yY2UpIHtcbiAgICAgIGNvbnN0IHBvcyA9IFBvaW50MmQuY2xvbmUodGhpcy5fcG9zKVxuICAgICAgUG9pbnQyZC5hZGRWZWMyKHBvcywgcG9zLCB0aGlzLl9wYXJlbnQucGl2b3RSZWYpXG4gICAgICBidWlsZFhmb3JtTWF0cml4KHRoaXMuX2xvY2FsWGZvcm0sIHRoaXMuX3JvdERlZywgdGhpcy5fc2NhbGUsIHBvcywgdGhpcy5fcGl2b3QpXG4gICAgICBpZiAodGhpcy5fbG9jYWxYZm9ybVVwZGF0ZWQpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxYZm9ybVVwZGF0ZWQoKVxuICAgICAgfVxuICAgICAgdGhpcy5fbHhmb3JtRGlydHkgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVnbG9iYWx4Zm9ybSgpIHtcbiAgICBpZiAodGhpcy5fbHhmb3JtRGlydHkgfHwgdGhpcy5feGZvcm1EaXJ0eSkge1xuICAgICAgdGhpcy5fdXBkYXRlbG9jYWx4Zm9ybSh0cnVlKVxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgICBNYXQyZC5tdWx0aXBseSh0aGlzLl9nbG9iYWxYZm9ybSwgdGhpcy5fcGFyZW50Lmdsb2JhbFhmb3JtLCB0aGlzLl9sb2NhbFhmb3JtKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTWF0MmQuY29weSh0aGlzLl9nbG9iYWxYZm9ybSwgdGhpcy5fbG9jYWxYZm9ybSlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9nbG9iYWxYZm9ybVVwZGF0ZWQpIHtcbiAgICAgICAgdGhpcy5fZ2xvYmFsWGZvcm1VcGRhdGVkKClcbiAgICAgIH1cbiAgICAgIHRoaXMuX3hmb3JtRGlydHkgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG5cbiAgX3VwZGF0ZUFBQm94KGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoZm9yY2UgfHwgdGhpcy5fZ2VvbURpcnR5IHx8IHRoaXMuX2JvdW5kc091dE9mRGF0ZSkge1xuICAgICAgY29uc3QgYm94UGFkZGluZyA9ICh0aGlzLl9yb3RhdGFibGUgPyB0aGlzLl9pbnRlcmFjdGl2ZUJveFBhZGRpbmcgOiAwKVxuICAgICAgY29uc3QgcGFkZGluZyA9IGJveFBhZGRpbmcgKyB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUgLyAyXG4gICAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKHRoaXMuX2FhYm94LCBbMCwgMF0sIFt0aGlzLndpZHRoIC8gMiwgdGhpcy5oZWlnaHQgLyAyXSlcbiAgICAgIEFBQm94MmQudHJhbnNmb3JtTWF0MmQodGhpcy5fYWFib3gsIHRoaXMuX2FhYm94LCB0aGlzLl9mdWxsWGZvcm0pXG4gICAgICBBQUJveDJkLmV4cGFuZCh0aGlzLl9hYWJveCwgdGhpcy5fYWFib3gsIFtwYWRkaW5nLCBwYWRkaW5nXSlcbiAgICAgIHRoaXMuX2FhYm94VXBkYXRlZCA9IHRydWVcbiAgICAgIHRoaXMuX2dlb21EaXJ0eSA9IHRoaXMuX2JvdW5kc091dE9mRGF0ZSA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQud2lkdGggIT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLnBhcmVudC53aWR0aCA6IDApXG4gIH1cblxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuaGVpZ2h0ICE9PSBcInVuZGVmaW5lZFwiID8gdGhpcy5wYXJlbnQuaGVpZ2h0IDogMClcbiAgfVxuXG4gIHJlbmRlckJvdW5kcyhjdHgsIHdvcmxkVG9TY3JlZW5NYXRyaXgsIGJvdW5kc1N0cm9rZVN0eWxlKSB7XG4gICAgLy8gd2UncmUgc3RvcmluZyBvdXIgQUFCb3ggaW4gc2NyZWVuIHNwYWNlIGhlcmUsIHNvIHdvcmxkVG9TY3JlZW5NYXRyaXggaXNcbiAgICAvLyB1bnVzZWRcbiAgICBjb25zdCBhYWJveCA9IHRoaXMuYWFib3hcbiAgICBjdHguc2F2ZSgpXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIGJvdW5kc1N0cm9rZVN0eWxlLnNldFN0cm9rZUN0eChjdHgpXG4gICAgY29uc3QgY2VudGVyID0gWzAsIDBdXG4gICAgY29uc3QgZXh0ZW50cyA9IFswLCAwXVxuICAgIEFBQm94MmQuZ2V0Q2VudGVyKGNlbnRlciwgYWFib3gpXG4gICAgQUFCb3gyZC5nZXRFeHRlbnRzKGV4dGVudHMsIGFhYm94KVxuICAgIGN0eC5iZWdpblBhdGgoKVxuICAgIGN0eC5yZWN0KGNlbnRlclswXSAtIGV4dGVudHNbMF0sIGNlbnRlclsxXSAtIGV4dGVudHNbMV0sIGV4dGVudHNbMF0gKiAyLCBleHRlbnRzWzFdICogMilcbiAgICBjdHguc3Ryb2tlKClcbiAgICBjdHgucmVzdG9yZSgpXG4gIH1cblxuICByZW5kZXIoY3R4LCB3b3JsZFRvU2NyZWVuTWF0cml4LCBzdHlsZVN0YXRlKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCB8fCB0eXBlb2YgdGhpcy5wYXJlbnQud2lkdGggPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5wYXJlbnQuaGVpZ2h0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hYWJveFVwZGF0ZWQgPSBmYWxzZVxuICAgIC8vIGRvIG5vdCBmaWxsIHRoZSBwcmltYXJ5IHJlY3RhbmdsZVxuICAgIHN1cGVyLnJlbmRlcihjdHgsIHdvcmxkVG9TY3JlZW5NYXRyaXgsIHN0eWxlU3RhdGUsIGZhbHNlKVxuICAgIGlmICghdGhpcy5fYWFib3hVcGRhdGVkKSB7XG4gICAgICB0aGlzLl91cGRhdGVBQUJveCh0cnVlKVxuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlID0gWzAsIDBdXG4gICAgY29uc3Qgcm90ID0gWzAsIDBdXG4gICAgTWF0MmQuc3ZkKG51bGwsIHNjYWxlLCByb3QsIHRoaXMuX2Z1bGxYZm9ybSlcbiAgICBzY2FsZVswXSA9IChzY2FsZVswXSA8IDAgPyAtMSA6IDEpXG4gICAgc2NhbGVbMV0gPSAoc2NhbGVbMV0gPCAwID8gLTEgOiAxKVxuXG4gICAgY29uc3QgaGFsZkJveFN6ID0gdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplIC8gMlxuICAgIGNvbnN0IGhhbGZXaWR0aCA9IHRoaXMud2lkdGggLyAyXG4gICAgY29uc3QgaGFsZkhlaWdodCA9IHRoaXMuaGVpZ2h0IC8gMlxuICAgIGNvbnN0IHB0ID0gW2hhbGZXaWR0aCwgaGFsZkhlaWdodF1cblxuICAgIGN0eC5zYXZlKClcblxuICAgIGN0eC5iZWdpblBhdGgoKVxuICAgIGRyYXdPQkJveE1vZGlmaWVyUmVjdChjdHgsIHB0LCB0aGlzLl9mdWxsWGZvcm0sIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSwgaGFsZkJveFN6LCByb3QsIHNjYWxlLCBcIjNcIilcblxuICAgIFBvaW50MmQuc2V0KHB0LCBoYWxmV2lkdGgsIC1oYWxmSGVpZ2h0KVxuICAgIGRyYXdPQkJveE1vZGlmaWVyUmVjdChjdHgsIHB0LCB0aGlzLl9mdWxsWGZvcm0sIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSwgaGFsZkJveFN6LCByb3QsIHNjYWxlLCBcIjJcIilcblxuICAgIFBvaW50MmQuc2V0KHB0LCAtaGFsZldpZHRoLCAtaGFsZkhlaWdodClcbiAgICBkcmF3T0JCb3hNb2RpZmllclJlY3QoY3R4LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUsIGhhbGZCb3hTeiwgcm90LCBzY2FsZSwgXCIwXCIpXG5cbiAgICBQb2ludDJkLnNldChwdCwgLWhhbGZXaWR0aCwgaGFsZkhlaWdodClcbiAgICBkcmF3T0JCb3hNb2RpZmllclJlY3QoY3R4LCBwdCwgdGhpcy5fZnVsbFhmb3JtLCB0aGlzLl9pbnRlcmFjdGl2ZUJveFNpemUsIGhhbGZCb3hTeiwgcm90LCBzY2FsZSwgXCIxXCIpXG5cbiAgICBpZiAodGhpcy5fc2NhbGFibGUpIHtcbiAgICAgIFBvaW50MmQuc2V0KHB0LCAwLCBoYWxmSGVpZ2h0KVxuICAgICAgZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBoYWxmQm94U3osIHJvdCwgc2NhbGUpXG5cbiAgICAgIFBvaW50MmQuc2V0KHB0LCAwLCAtaGFsZkhlaWdodClcbiAgICAgIGRyYXdPQkJveE1vZGlmaWVyUmVjdChjdHgsIHB0LCB0aGlzLl9mdWxsWGZvcm0sIHRoaXMuX2ludGVyYWN0aXZlQm94U2l6ZSwgaGFsZkJveFN6LCByb3QsIHNjYWxlKVxuXG4gICAgICBQb2ludDJkLnNldChwdCwgaGFsZldpZHRoLCAwKVxuICAgICAgZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBoYWxmQm94U3osIHJvdCwgc2NhbGUpXG5cbiAgICAgIFBvaW50MmQuc2V0KHB0LCAtaGFsZldpZHRoLCAwKVxuICAgICAgZHJhd09CQm94TW9kaWZpZXJSZWN0KGN0eCwgcHQsIHRoaXMuX2Z1bGxYZm9ybSwgdGhpcy5faW50ZXJhY3RpdmVCb3hTaXplLCBoYWxmQm94U3osIHJvdCwgc2NhbGUpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNGaWxsVmlzaWJsZSgpKSB7XG4gICAgICBzdHlsZVN0YXRlLnNldEZpbGxTdHlsZShjdHgsIHRoaXMpXG4gICAgICBjdHguZmlsbCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTdHJva2VWaXNpYmxlKCkpIHtcbiAgICAgIHN0eWxlU3RhdGUuc2V0U3Ryb2tlU3R5bGUoY3R4LCB0aGlzKVxuICAgICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgY3R4LnN0cm9rZSgpXG4gICAgfVxuXG4gICAgY3R4LnJlc3RvcmUoKVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9pbnRlcmFjdGlvbnMveGZvcm0tc2hhcGUuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("/* eslint-disable func-names */\n\"use strict\";\n\n/**\n * Gets the pixel ratio of a specific HTML canvas 2d context\n * @param {CanvasRenderingContext2D} canvasCtx\n * @return {number} pixel ratio of the canvas 2d context\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getPixelRatio = getPixelRatio;\nexports.makeCanvasAutoHighDPI = makeCanvasAutoHighDPI;\nfunction getPixelRatio(canvasCtx) {\n var backingStore = canvasCtx.backingStorePixelRatio || canvasCtx.webkitBackingStorePixelRatio || canvasCtx.mozBackingStorePixelRatio || canvasCtx.msBackingStorePixelRatio || canvasCtx.oBackingStorePixelRatio || canvasCtx.backingStorePixelRatio || 1;\n\n return (window.devicePixelRatio || 1) / backingStore;\n}\n\n/**\n * Wraps certain canvas 2d context APIs to handle\n * displays with high per-pixel ratios. This is useful\n * so that the API can be called with screen-space coordinates\n * and the wrappers modify the arguments of those APIs to properly\n * handle displays with high pixel densities\n * @param {CanvasRenderingContext2D} canvasCtx\n * @return {number} pixel ratio of the wrapped canvas context\n */\nfunction makeCanvasAutoHighDPI(canvasCtx) {\n var pixelRatio = getPixelRatio(canvasCtx);\n\n if (pixelRatio === 1) {\n return 1;\n }\n\n var allRatioArgs = [\"fillRect\", \"clearRect\", \"strokeRect\",\n // \"moveTo\",\n // \"lineTo\",\n // \"arcTo\",\n // \"bezierCurveTo\",\n \"isPointInPath\", \"isPointInStroke\"\n // \"quadraticCurveTo\",\n // \"rect\",\n // \"translate\",\n // \"createRadialGradient\",\n // \"createLinearGradient\"\n ];\n\n allRatioArgs.forEach(function (funcName) {\n canvasCtx[funcName] = function (_super) {\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args = args.map(function (a) {\n return a * pixelRatio;\n });\n\n return _super.apply(this, args);\n };\n }(canvasCtx[funcName]);\n });\n\n // const ratioArgsByIndex = {\n // arc: [0, 1, 2]\n // }\n\n // Object.getOwnPropertyNames(ratioArgsByIndex).forEach(funcName => {\n // const value = ratioArgsByIndex[funcName]\n // canvasCtx[funcName] = (function(_super) {\n // return function(...args) {\n // let i = 0\n // let len = 0\n // for (i = 0, len = value.length; i < len; i += 1) {\n // args[value[i]] *= pixelRatio\n // }\n // return _super.apply(this, args)\n // }\n // })(canvasCtx[funcName])\n // })\n\n // // Stroke lineWidth adjustment\n // canvasCtx.stroke = (function(_super) {\n // return function(...args) {\n // this.lineWidth *= pixelRatio\n // _super.apply(this, args)\n // this.lineWidth /= pixelRatio\n // }\n // })(canvasCtx.stroke)\n\n // // Text\n // //\n // canvasCtx.fillText = (function(_super) {\n // return function(...args) {\n // args[1] *= pixelRatio // x\n // args[2] *= pixelRatio // y\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m * pixelRatio) + u\n // }\n // )\n\n // _super.apply(this, args)\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m / pixelRatio) + u\n // }\n // )\n // }\n // })(canvasCtx.fillText)\n\n // canvasCtx.strokeText = (function(_super) {\n // return function(...args) {\n // args[1] *= pixelRatio // x\n // args[2] *= pixelRatio // y\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m * pixelRatio) + u\n // }\n // )\n\n // _super.apply(this, args)\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m / pixelRatio) + u\n // }\n // )\n // }\n // })(canvasCtx.strokeText)\n\n\n var setTransformArgs = [pixelRatio, 0, 0, pixelRatio, 0, 0];\n canvasCtx.setTransform = function (_super) {\n return function () {\n _super.apply(this, setTransformArgs);\n this.transform.apply(this, arguments);\n };\n }(canvasCtx.setTransform);\n\n return pixelRatio;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL2NhbnZhcy11dGlscy5qcz84MjExIl0sIm5hbWVzIjpbImdldFBpeGVsUmF0aW8iLCJtYWtlQ2FudmFzQXV0b0hpZ2hEUEkiLCJjYW52YXNDdHgiLCJiYWNraW5nU3RvcmUiLCJiYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwid2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyIsIm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJtc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJvQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJwaXhlbFJhdGlvIiwiYWxsUmF0aW9BcmdzIiwiZm9yRWFjaCIsImZ1bmNOYW1lIiwiX3N1cGVyIiwiYXJncyIsIm1hcCIsImEiLCJhcHBseSIsInNldFRyYW5zZm9ybUFyZ3MiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztRQUtnQkEsYSxHQUFBQSxhO1FBb0JBQyxxQixHQUFBQSxxQjtBQXBCVCxTQUFTRCxhQUFULENBQXVCRSxTQUF2QixFQUFrQztBQUN2QyxNQUFNQyxlQUFlRCxVQUFVRSxzQkFBVixJQUNuQkYsVUFBVUcsNEJBRFMsSUFFbkJILFVBQVVJLHlCQUZTLElBR25CSixVQUFVSyx3QkFIUyxJQUluQkwsVUFBVU0sdUJBSlMsSUFLbkJOLFVBQVVFLHNCQUxTLElBS2lCLENBTHRDOztBQU9BLFNBQU8sQ0FBQ0ssT0FBT0MsZ0JBQVAsSUFBMkIsQ0FBNUIsSUFBaUNQLFlBQXhDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OztBQVNPLFNBQVNGLHFCQUFULENBQStCQyxTQUEvQixFQUEwQztBQUMvQyxNQUFNUyxhQUFhWCxjQUFjRSxTQUFkLENBQW5COztBQUVBLE1BQUlTLGVBQWUsQ0FBbkIsRUFBc0I7QUFDcEIsV0FBTyxDQUFQO0FBQ0Q7O0FBRUQsTUFBTUMsZUFBZSxDQUNuQixVQURtQixFQUVuQixXQUZtQixFQUduQixZQUhtQjtBQUluQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQVJtQixFQVNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkbUIsR0FBckI7O0FBaUJBQSxlQUFhQyxPQUFiLENBQXFCLG9CQUFZO0FBQy9CWCxjQUFVWSxRQUFWLElBQXVCLFVBQVNDLE1BQVQsRUFBaUI7QUFDdEMsYUFBTyxZQUFrQjtBQUFBLDBDQUFOQyxJQUFNO0FBQU5BLGNBQU07QUFBQTs7QUFDdkJBLGVBQU9BLEtBQUtDLEdBQUwsQ0FBUyxVQUFDQyxDQUFEO0FBQUEsaUJBQU9BLElBQUlQLFVBQVg7QUFBQSxTQUFULENBQVA7O0FBRUEsZUFBT0ksT0FBT0ksS0FBUCxDQUFhLElBQWIsRUFBbUJILElBQW5CLENBQVA7QUFDRCxPQUpEO0FBS0QsS0FOcUIsQ0FNbkJkLFVBQVVZLFFBQVYsQ0FObUIsQ0FBdEI7QUFPRCxHQVJEOztBQVVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsTUFBTU0sbUJBQW1CLENBQUNULFVBQUQsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CQSxVQUFuQixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxDQUF6QjtBQUNBVCxZQUFVbUIsWUFBVixHQUEwQixVQUFTTixNQUFULEVBQWlCO0FBQ3pDLFdBQU8sWUFBa0I7QUFDdkJBLGFBQU9JLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxnQkFBbkI7QUFDQSxXQUFLRSxTQUFMO0FBQ0QsS0FIRDtBQUlELEdBTHdCLENBS3RCcEIsVUFBVW1CLFlBTFksQ0FBekI7O0FBT0EsU0FBT1YsVUFBUDtBQUNEIiwiZmlsZSI6IjI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgZnVuYy1uYW1lcyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuLyoqXG4gKiBHZXRzIHRoZSBwaXhlbCByYXRpbyBvZiBhIHNwZWNpZmljIEhUTUwgY2FudmFzIDJkIGNvbnRleHRcbiAqIEBwYXJhbSAge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY2FudmFzQ3R4XG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgICBwaXhlbCByYXRpbyBvZiB0aGUgY2FudmFzIDJkIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBpeGVsUmF0aW8oY2FudmFzQ3R4KSB7XG4gIGNvbnN0IGJhY2tpbmdTdG9yZSA9IGNhbnZhc0N0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY2FudmFzQ3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjYW52YXNDdHgubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNhbnZhc0N0eC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjYW52YXNDdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjYW52YXNDdHguYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCAxXG5cbiAgcmV0dXJuICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIGJhY2tpbmdTdG9yZVxufVxuXG4vKipcbiAqIFdyYXBzIGNlcnRhaW4gY2FudmFzIDJkIGNvbnRleHQgQVBJcyB0byBoYW5kbGVcbiAqIGRpc3BsYXlzIHdpdGggaGlnaCBwZXItcGl4ZWwgcmF0aW9zLiBUaGlzIGlzIHVzZWZ1bFxuICogc28gdGhhdCB0aGUgQVBJIGNhbiBiZSBjYWxsZWQgd2l0aCBzY3JlZW4tc3BhY2UgY29vcmRpbmF0ZXNcbiAqIGFuZCB0aGUgd3JhcHBlcnMgbW9kaWZ5IHRoZSBhcmd1bWVudHMgb2YgdGhvc2UgQVBJcyB0byBwcm9wZXJseVxuICogaGFuZGxlIGRpc3BsYXlzIHdpdGggaGlnaCBwaXhlbCBkZW5zaXRpZXNcbiAqIEBwYXJhbSAge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY2FudmFzQ3R4XG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgICBwaXhlbCByYXRpbyBvZiB0aGUgd3JhcHBlZCBjYW52YXMgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNhbnZhc0F1dG9IaWdoRFBJKGNhbnZhc0N0eCkge1xuICBjb25zdCBwaXhlbFJhdGlvID0gZ2V0UGl4ZWxSYXRpbyhjYW52YXNDdHgpXG5cbiAgaWYgKHBpeGVsUmF0aW8gPT09IDEpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgY29uc3QgYWxsUmF0aW9BcmdzID0gW1xuICAgIFwiZmlsbFJlY3RcIixcbiAgICBcImNsZWFyUmVjdFwiLFxuICAgIFwic3Ryb2tlUmVjdFwiLFxuICAgIC8vIFwibW92ZVRvXCIsXG4gICAgLy8gXCJsaW5lVG9cIixcbiAgICAvLyBcImFyY1RvXCIsXG4gICAgLy8gXCJiZXppZXJDdXJ2ZVRvXCIsXG4gICAgXCJpc1BvaW50SW5QYXRoXCIsXG4gICAgXCJpc1BvaW50SW5TdHJva2VcIlxuICAgIC8vIFwicXVhZHJhdGljQ3VydmVUb1wiLFxuICAgIC8vIFwicmVjdFwiLFxuICAgIC8vIFwidHJhbnNsYXRlXCIsXG4gICAgLy8gXCJjcmVhdGVSYWRpYWxHcmFkaWVudFwiLFxuICAgIC8vIFwiY3JlYXRlTGluZWFyR3JhZGllbnRcIlxuICBdXG5cbiAgYWxsUmF0aW9BcmdzLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAgIGNhbnZhc0N0eFtmdW5jTmFtZV0gPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICBhcmdzID0gYXJncy5tYXAoKGEpID0+IGEgKiBwaXhlbFJhdGlvKVxuXG4gICAgICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgICAgIH1cbiAgICB9KShjYW52YXNDdHhbZnVuY05hbWVdKVxuICB9KVxuXG4gIC8vIGNvbnN0IHJhdGlvQXJnc0J5SW5kZXggPSB7XG4gIC8vICAgYXJjOiBbMCwgMSwgMl1cbiAgLy8gfVxuXG4gIC8vIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJhdGlvQXJnc0J5SW5kZXgpLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAvLyAgIGNvbnN0IHZhbHVlID0gcmF0aW9BcmdzQnlJbmRleFtmdW5jTmFtZV1cbiAgLy8gICBjYW52YXNDdHhbZnVuY05hbWVdID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAvLyAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgLy8gICAgICAgbGV0IGkgPSAwXG4gIC8vICAgICAgIGxldCBsZW4gPSAwXG4gIC8vICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gIC8vICAgICAgICAgYXJnc1t2YWx1ZVtpXV0gKj0gcGl4ZWxSYXRpb1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgLy8gICAgIH1cbiAgLy8gICB9KShjYW52YXNDdHhbZnVuY05hbWVdKVxuICAvLyB9KVxuXG4gIC8vIC8vIFN0cm9rZSBsaW5lV2lkdGggYWRqdXN0bWVudFxuICAvLyBjYW52YXNDdHguc3Ryb2tlID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAvLyAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gIC8vICAgICB0aGlzLmxpbmVXaWR0aCAqPSBwaXhlbFJhdGlvXG4gIC8vICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgLy8gICAgIHRoaXMubGluZVdpZHRoIC89IHBpeGVsUmF0aW9cbiAgLy8gICB9XG4gIC8vIH0pKGNhbnZhc0N0eC5zdHJva2UpXG5cbiAgLy8gLy8gVGV4dFxuICAvLyAvL1xuICAvLyBjYW52YXNDdHguZmlsbFRleHQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gIC8vICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgLy8gICAgIGFyZ3NbMV0gKj0gcGl4ZWxSYXRpbyAvLyB4XG4gIC8vICAgICBhcmdzWzJdICo9IHBpeGVsUmF0aW8gLy8geVxuXG4gIC8vICAgICB0aGlzLmZvbnQgPSB0aGlzLmZvbnQucmVwbGFjZShcbiAgLy8gICAgICAgLyhcXGQrKShweHxlbXxyZW18cHQpL2csXG4gIC8vICAgICAgIGZ1bmN0aW9uKHcsIG0sIHUpIHtcbiAgLy8gICAgICAgICByZXR1cm4gKG0gKiBwaXhlbFJhdGlvKSArIHVcbiAgLy8gICAgICAgfVxuICAvLyAgICAgKVxuXG4gIC8vICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcblxuICAvLyAgICAgdGhpcy5mb250ID0gdGhpcy5mb250LnJlcGxhY2UoXG4gIC8vICAgICAgIC8oXFxkKykocHh8ZW18cmVtfHB0KS9nLFxuICAvLyAgICAgICBmdW5jdGlvbih3LCBtLCB1KSB7XG4gIC8vICAgICAgICAgcmV0dXJuIChtIC8gcGl4ZWxSYXRpbykgKyB1XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIClcbiAgLy8gICB9XG4gIC8vIH0pKGNhbnZhc0N0eC5maWxsVGV4dClcblxuICAvLyBjYW52YXNDdHguc3Ryb2tlVGV4dCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgLy8gICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAvLyAgICAgYXJnc1sxXSAqPSBwaXhlbFJhdGlvIC8vIHhcbiAgLy8gICAgIGFyZ3NbMl0gKj0gcGl4ZWxSYXRpbyAvLyB5XG5cbiAgLy8gICAgIHRoaXMuZm9udCA9IHRoaXMuZm9udC5yZXBsYWNlKFxuICAvLyAgICAgICAvKFxcZCspKHB4fGVtfHJlbXxwdCkvZyxcbiAgLy8gICAgICAgZnVuY3Rpb24odywgbSwgdSkge1xuICAvLyAgICAgICAgIHJldHVybiAobSAqIHBpeGVsUmF0aW8pICsgdVxuICAvLyAgICAgICB9XG4gIC8vICAgICApXG5cbiAgLy8gICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuXG4gIC8vICAgICB0aGlzLmZvbnQgPSB0aGlzLmZvbnQucmVwbGFjZShcbiAgLy8gICAgICAgLyhcXGQrKShweHxlbXxyZW18cHQpL2csXG4gIC8vICAgICAgIGZ1bmN0aW9uKHcsIG0sIHUpIHtcbiAgLy8gICAgICAgICByZXR1cm4gKG0gLyBwaXhlbFJhdGlvKSArIHVcbiAgLy8gICAgICAgfVxuICAvLyAgICAgKVxuICAvLyAgIH1cbiAgLy8gfSkoY2FudmFzQ3R4LnN0cm9rZVRleHQpXG5cblxuICBjb25zdCBzZXRUcmFuc2Zvcm1BcmdzID0gW3BpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDBdXG4gIGNhbnZhc0N0eC5zZXRUcmFuc2Zvcm0gPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBzZXRUcmFuc2Zvcm1BcmdzKVxuICAgICAgdGhpcy50cmFuc2Zvcm0oLi4uYXJncylcbiAgICB9XG4gIH0pKGNhbnZhc0N0eC5zZXRUcmFuc2Zvcm0pXG5cbiAgcmV0dXJuIHBpeGVsUmF0aW9cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3V0aWwvY2FudmFzLXV0aWxzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 27 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _baseShape = __webpack_require__(7);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _math = __webpack_require__(6);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} CircleOptions\n * @property {number} [radius=10] Radius of the circle in world-space coordinates\n */\n\n/**\n * @class Shape class describing a circle\n * @extends {BaseShape}\n */\nvar Circle = function (_BaseShape) {\n _inherits(Circle, _BaseShape);\n\n /**\n * Creates a new Circle shape\n * @param {CircleOptions} [opts]\n * @return {Circle}\n */\n function Circle(opts) {\n _classCallCheck(this, Circle);\n\n var _this = _possibleConstructorReturn(this, (Circle.__proto__ || Object.getPrototypeOf(Circle)).call(this, opts));\n\n _this._radius = 10;\n if (typeof opts.radius !== \"undefined\") {\n _this.radius = opts.radius;\n }\n AABox2d.initCenterExtents(_this._aabox, [0, 0], [_this._radius, _this._radius]);\n return _this;\n }\n\n /**\n * Sets the radius of the circle\n * @param {number} radius Radius of circle in world-space coordinates\n * @return {Circle} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If radius is not a valid number\n */\n\n\n _createClass(Circle, [{\n key: \"getDimensions\",\n\n\n /**\n * Gets the untransformed width/height of the circle\n * @return {Vec2d} Width/height of the circle, untransformed\n */\n value: function getDimensions() {\n var diameter = this.radius * 2;\n return [diameter, diameter];\n }\n\n /**\n * Gets the untransformed width of the circle\n * @return {number}\n */\n\n }, {\n key: \"_updateAABox\",\n\n\n /**\n * Called when the bounding box requires updating\n * @private\n * @override\n */\n value: function _updateAABox() {\n if (this._geomDirty || this._boundsOutOfDate) {\n var pos = this._pos;\n var scale = this._scale;\n var rot = _math2.default.DEG_TO_RAD * this._rotDeg;\n var cossqr = _math2.default.pow(_math2.default.cos(rot), 2);\n var sinsqr = _math2.default.pow(_math2.default.sin(rot), 2);\n var asqr = _math2.default.pow(scale[0] * this._radius, 2);\n var bsqr = _math2.default.pow(scale[1] * this._radius, 2);\n var A = _math2.default.sqrt(bsqr * sinsqr + asqr * cossqr);\n var B = _math2.default.sqrt(asqr * sinsqr + bsqr * cossqr);\n AABox2d.initCenterExtents(this._aabox, pos, [A, B]);\n this._geomDirty = false;\n this._boundsOutOfDate = false;\n }\n }\n\n /**\n * Draws the circle using a 2d rendering context. Called by the BaseShape\n * class\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @override\n */\n\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n ctx.arc(0, 0, this._radius, 0, _math2.default.TWO_PI, false);\n }\n\n /**\n * Called to convert the shape to a serializable JSON object\n * @return {object}\n * @override\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"Circle\", // NOTE: this much match the name of the class\n radius: this.radius\n }, _get(Circle.prototype.__proto__ || Object.getPrototypeOf(Circle.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"radius\",\n set: function set(radius) {\n if (typeof radius !== \"number\") {\n throw new Error(\"Radius must be a number\");\n }\n\n if (radius !== this._radius) {\n var prev = this._radius;\n this._radius = radius;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"radius\",\n prevVal: prev,\n currVal: this._radius\n });\n }\n\n return this;\n }\n\n /**\n * Gets the current radius of the circle\n * @return {number}\n */\n ,\n get: function get() {\n return this._radius;\n }\n }, {\n key: \"width\",\n get: function get() {\n return this.radius * 2;\n }\n\n /**\n * Gets the untransformed height of the circle\n * @return {number}\n */\n\n }, {\n key: \"height\",\n get: function get() {\n return this.radius * 2;\n }\n }]);\n\n return Circle;\n}(_baseShape2.default);\n\nexports.default = Circle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvY2lyY2xlLmpzP2FkOWQiXSwibmFtZXMiOlsiQUFCb3gyZCIsIkNpcmNsZSIsIm9wdHMiLCJfcmFkaXVzIiwicmFkaXVzIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJkaWFtZXRlciIsIl9nZW9tRGlydHkiLCJfYm91bmRzT3V0T2ZEYXRlIiwicG9zIiwiX3BvcyIsInNjYWxlIiwiX3NjYWxlIiwicm90IiwiREVHX1RPX1JBRCIsIl9yb3REZWciLCJjb3NzcXIiLCJwb3ciLCJjb3MiLCJzaW5zcXIiLCJzaW4iLCJhc3FyIiwiYnNxciIsIkEiLCJzcXJ0IiwiQiIsImN0eCIsImFyYyIsIlRXT19QSSIsIk9iamVjdCIsImFzc2lnbiIsInR5cGUiLCJFcnJvciIsInByZXYiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBOztJQUFZQSxPOztBQUNaOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0E7Ozs7SUFJcUJDLE07OztBQUNuQjs7Ozs7QUFLQSxrQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUFBLGdIQUNWQSxJQURVOztBQUVoQixVQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLFFBQUksT0FBT0QsS0FBS0UsTUFBWixLQUF1QixXQUEzQixFQUF3QztBQUN0QyxZQUFLQSxNQUFMLEdBQWNGLEtBQUtFLE1BQW5CO0FBQ0Q7QUFDREosWUFBUUssaUJBQVIsQ0FBMEIsTUFBS0MsTUFBL0IsRUFBdUMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUF2QyxFQUErQyxDQUFDLE1BQUtILE9BQU4sRUFBZSxNQUFLQSxPQUFwQixDQUEvQztBQU5nQjtBQU9qQjs7QUFFRDs7Ozs7Ozs7Ozs7OztBQW1DQTs7OztvQ0FJZ0I7QUFDZCxVQUFNSSxXQUFXLEtBQUtILE1BQUwsR0FBYyxDQUEvQjtBQUNBLGFBQU8sQ0FBQ0csUUFBRCxFQUFXQSxRQUFYLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O0FBZ0JBOzs7OzttQ0FLZTtBQUNiLFVBQUksS0FBS0MsVUFBTCxJQUFtQixLQUFLQyxnQkFBNUIsRUFBOEM7QUFDNUMsWUFBTUMsTUFBTSxLQUFLQyxJQUFqQjtBQUNBLFlBQU1DLFFBQVEsS0FBS0MsTUFBbkI7QUFDQSxZQUFNQyxNQUFNLGVBQUtDLFVBQUwsR0FBa0IsS0FBS0MsT0FBbkM7QUFDQSxZQUFNQyxTQUFTLGVBQUtDLEdBQUwsQ0FBUyxlQUFLQyxHQUFMLENBQVNMLEdBQVQsQ0FBVCxFQUF3QixDQUF4QixDQUFmO0FBQ0EsWUFBTU0sU0FBUyxlQUFLRixHQUFMLENBQVMsZUFBS0csR0FBTCxDQUFTUCxHQUFULENBQVQsRUFBd0IsQ0FBeEIsQ0FBZjtBQUNBLFlBQU1RLE9BQU8sZUFBS0osR0FBTCxDQUFTTixNQUFNLENBQU4sSUFBVyxLQUFLVCxPQUF6QixFQUFrQyxDQUFsQyxDQUFiO0FBQ0EsWUFBTW9CLE9BQU8sZUFBS0wsR0FBTCxDQUFTTixNQUFNLENBQU4sSUFBVyxLQUFLVCxPQUF6QixFQUFrQyxDQUFsQyxDQUFiO0FBQ0EsWUFBTXFCLElBQUksZUFBS0MsSUFBTCxDQUFVRixPQUFPSCxNQUFQLEdBQWdCRSxPQUFPTCxNQUFqQyxDQUFWO0FBQ0EsWUFBTVMsSUFBSSxlQUFLRCxJQUFMLENBQVVILE9BQU9GLE1BQVAsR0FBZ0JHLE9BQU9OLE1BQWpDLENBQVY7QUFDQWpCLGdCQUFRSyxpQkFBUixDQUEwQixLQUFLQyxNQUEvQixFQUF1Q0ksR0FBdkMsRUFBNEMsQ0FBQ2MsQ0FBRCxFQUFJRSxDQUFKLENBQTVDO0FBQ0EsYUFBS2xCLFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxhQUFLQyxnQkFBTCxHQUF3QixLQUF4QjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7OzswQkFNTWtCLEcsRUFBSztBQUNUQSxVQUFJQyxHQUFKLENBQVEsQ0FBUixFQUFXLENBQVgsRUFBYyxLQUFLekIsT0FBbkIsRUFBNEIsQ0FBNUIsRUFBK0IsZUFBSzBCLE1BQXBDLEVBQTRDLEtBQTVDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OzZCQUtTO0FBQ1AsYUFBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxjQUFNLFFBRGEsRUFDSDtBQUNoQjVCLGdCQUFRLEtBQUtBO0FBRk0sT0FBZCx5R0FBUDtBQUlEOzs7c0JBL0ZVQSxNLEVBQVE7QUFDakIsVUFBSSxPQUFPQSxNQUFQLEtBQWtCLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSTZCLEtBQUosQ0FBVSx5QkFBVixDQUFOO0FBQ0Q7O0FBRUQsVUFBSTdCLFdBQVcsS0FBS0QsT0FBcEIsRUFBNkI7QUFDM0IsWUFBTStCLE9BQU8sS0FBSy9CLE9BQWxCO0FBQ0EsYUFBS0EsT0FBTCxHQUFlQyxNQUFmO0FBQ0EsYUFBS0ksVUFBTCxHQUFrQixJQUFsQixDQUgyQixDQUdKOztBQUV2QixhQUFLMkIsSUFBTCxDQUFVLGNBQVYsRUFBMEI7QUFDeEJDLGdCQUFNLFFBRGtCO0FBRXhCQyxtQkFBU0gsSUFGZTtBQUd4QkksbUJBQVMsS0FBS25DO0FBSFUsU0FBMUI7QUFLRDs7QUFFRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7d0JBSWE7QUFDWCxhQUFPLEtBQUtBLE9BQVo7QUFDRDs7O3dCQWVXO0FBQ1YsYUFBTyxLQUFLQyxNQUFMLEdBQWMsQ0FBckI7QUFDRDs7QUFFRDs7Ozs7Ozt3QkFJYTtBQUNYLGFBQU8sS0FBS0EsTUFBTCxHQUFjLENBQXJCO0FBQ0Q7Ozs7OztrQkF6RWtCSCxNIiwiZmlsZSI6IjI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCBCYXNlU2hhcGUgZnJvbSBcIi4vYmFzZS1zaGFwZS5qc1wiXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDaXJjbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3JhZGl1cz0xMF0gUmFkaXVzIG9mIHRoZSBjaXJjbGUgaW4gd29ybGQtc3BhY2UgY29vcmRpbmF0ZXNcbiAqL1xuXG4vKipcbiAqIEBjbGFzcyBTaGFwZSBjbGFzcyBkZXNjcmliaW5nIGEgY2lyY2xlXG4gKiBAZXh0ZW5kcyB7QmFzZVNoYXBlfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaXJjbGUgZXh0ZW5kcyBCYXNlU2hhcGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDaXJjbGUgc2hhcGVcbiAgICogQHBhcmFtICB7Q2lyY2xlT3B0aW9uc30gW29wdHNdXG4gICAqIEByZXR1cm4ge0NpcmNsZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX3JhZGl1cyA9IDEwXG4gICAgaWYgKHR5cGVvZiBvcHRzLnJhZGl1cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5yYWRpdXMgPSBvcHRzLnJhZGl1c1xuICAgIH1cbiAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKHRoaXMuX2FhYm94LCBbMCwgMF0sIFt0aGlzLl9yYWRpdXMsIHRoaXMuX3JhZGl1c10pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgICogQHBhcmFtICB7bnVtYmVyfSByYWRpdXMgUmFkaXVzIG9mIGNpcmNsZSBpbiB3b3JsZC1zcGFjZSBjb29yZGluYXRlc1xuICAgKiBAcmV0dXJuIHtDaXJjbGV9ICAgICAgICB0aGlzXG4gICAqIEBmaXJlcyB7U2hhcGUjZ2VvbUNoYW5nZWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiByYWRpdXMgaXMgbm90IGEgdmFsaWQgbnVtYmVyXG4gICAqL1xuICBzZXQgcmFkaXVzKHJhZGl1cykge1xuICAgIGlmICh0eXBlb2YgcmFkaXVzICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYWRpdXMgbXVzdCBiZSBhIG51bWJlclwiKVxuICAgIH1cblxuICAgIGlmIChyYWRpdXMgIT09IHRoaXMuX3JhZGl1cykge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3JhZGl1c1xuICAgICAgdGhpcy5fcmFkaXVzID0gcmFkaXVzXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlIC8vIGRpcnR5IG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgZmlyaW5nIGV2ZW50XG5cbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbVwiLCB7XG4gICAgICAgIGF0dHI6IFwicmFkaXVzXCIsXG4gICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgIGN1cnJWYWw6IHRoaXMuX3JhZGl1c1xuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHJhZGl1cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmFkaXVzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdW50cmFuc2Zvcm1lZCB3aWR0aC9oZWlnaHQgb2YgdGhlIGNpcmNsZVxuICAgKiBAcmV0dXJuIHtWZWMyZH0gV2lkdGgvaGVpZ2h0IG9mIHRoZSBjaXJjbGUsIHVudHJhbnNmb3JtZWRcbiAgICovXG4gIGdldERpbWVuc2lvbnMoKSB7XG4gICAgY29uc3QgZGlhbWV0ZXIgPSB0aGlzLnJhZGl1cyAqIDJcbiAgICByZXR1cm4gW2RpYW1ldGVyLCBkaWFtZXRlcl1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bnRyYW5zZm9ybWVkIHdpZHRoIG9mIHRoZSBjaXJjbGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnJhZGl1cyAqIDJcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bnRyYW5zZm9ybWVkIGhlaWdodCBvZiB0aGUgY2lyY2xlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaXVzICogMlxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBib3VuZGluZyBib3ggcmVxdWlyZXMgdXBkYXRpbmdcbiAgICogQHByaXZhdGVcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBfdXBkYXRlQUFCb3goKSB7XG4gICAgaWYgKHRoaXMuX2dlb21EaXJ0eSB8fCB0aGlzLl9ib3VuZHNPdXRPZkRhdGUpIHtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX3Bvc1xuICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLl9zY2FsZVxuICAgICAgY29uc3Qgcm90ID0gTWF0aC5ERUdfVE9fUkFEICogdGhpcy5fcm90RGVnXG4gICAgICBjb25zdCBjb3NzcXIgPSBNYXRoLnBvdyhNYXRoLmNvcyhyb3QpLCAyKVxuICAgICAgY29uc3Qgc2luc3FyID0gTWF0aC5wb3coTWF0aC5zaW4ocm90KSwgMilcbiAgICAgIGNvbnN0IGFzcXIgPSBNYXRoLnBvdyhzY2FsZVswXSAqIHRoaXMuX3JhZGl1cywgMilcbiAgICAgIGNvbnN0IGJzcXIgPSBNYXRoLnBvdyhzY2FsZVsxXSAqIHRoaXMuX3JhZGl1cywgMilcbiAgICAgIGNvbnN0IEEgPSBNYXRoLnNxcnQoYnNxciAqIHNpbnNxciArIGFzcXIgKiBjb3NzcXIpXG4gICAgICBjb25zdCBCID0gTWF0aC5zcXJ0KGFzcXIgKiBzaW5zcXIgKyBic3FyICogY29zc3FyKVxuICAgICAgQUFCb3gyZC5pbml0Q2VudGVyRXh0ZW50cyh0aGlzLl9hYWJveCwgcG9zLCBbQSwgQl0pXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSBmYWxzZVxuICAgICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIGNpcmNsZSB1c2luZyBhIDJkIHJlbmRlcmluZyBjb250ZXh0LiBDYWxsZWQgYnkgdGhlIEJhc2VTaGFwZVxuICAgKiBjbGFzc1xuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MmR9IGN0eCAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF9kcmF3KGN0eCkge1xuICAgIGN0eC5hcmMoMCwgMCwgdGhpcy5fcmFkaXVzLCAwLCBNYXRoLlRXT19QSSwgZmFsc2UpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgdGhlIHNoYXBlIHRvIGEgc2VyaWFsaXphYmxlIEpTT04gb2JqZWN0XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgdHlwZTogXCJDaXJjbGVcIiwgLy8gTk9URTogdGhpcyBtdWNoIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBjbGFzc1xuICAgICAgcmFkaXVzOiB0aGlzLnJhZGl1c1xuICAgIH0sIHN1cGVyLnRvSlNPTigpKVxuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NoYXBlcy9jaXJjbGUuanMiXSwic291cmNlUm9vdCI6IiJ9"); + eval("\"use strict\";\n\n/**\n * Binds a this arg to a list of different function names.\n * This is most widely used to bind a this to member functions\n * that are used as callbacks in some fashion\n * @param {string[]} funcNames array of member function names that are part of thisArg\n * @param {Object} thisArg object to bind\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.bindAll = bindAll;\nfunction bindAll(funcNames, thisArg) {\n funcNames.forEach(function (funcName) {\n if (!thisArg[funcName]) {\n return;\n }\n thisArg[funcName] = thisArg[funcName].bind(thisArg);\n });\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL3V0aWxzLmpzPzMxMzEiXSwibmFtZXMiOlsiYmluZEFsbCIsImZ1bmNOYW1lcyIsInRoaXNBcmciLCJmb3JFYWNoIiwiZnVuY05hbWUiLCJiaW5kIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTs7Ozs7Ozs7Ozs7UUFPZ0JBLE8sR0FBQUEsTztBQUFULFNBQVNBLE9BQVQsQ0FBaUJDLFNBQWpCLEVBQTRCQyxPQUE1QixFQUFxQztBQUMxQ0QsWUFBVUUsT0FBVixDQUFrQixvQkFBWTtBQUM1QixRQUFJLENBQUNELFFBQVFFLFFBQVIsQ0FBTCxFQUF3QjtBQUN0QjtBQUNEO0FBQ0RGLFlBQVFFLFFBQVIsSUFBb0JGLFFBQVFFLFFBQVIsRUFBa0JDLElBQWxCLENBQXVCSCxPQUF2QixDQUFwQjtBQUNELEdBTEQ7QUFNRCIsImZpbGUiOiIyNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbi8qKlxuICogQmluZHMgYSB0aGlzIGFyZyB0byBhIGxpc3Qgb2YgZGlmZmVyZW50IGZ1bmN0aW9uIG5hbWVzLlxuICogVGhpcyBpcyBtb3N0IHdpZGVseSB1c2VkIHRvIGJpbmQgYSB0aGlzIHRvIG1lbWJlciBmdW5jdGlvbnNcbiAqIHRoYXQgYXJlIHVzZWQgYXMgY2FsbGJhY2tzIGluIHNvbWUgZmFzaGlvblxuICogQHBhcmFtICB7c3RyaW5nW119IGZ1bmNOYW1lcyBhcnJheSBvZiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzQXJnXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRoaXNBcmcgICBvYmplY3QgdG8gYmluZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEFsbChmdW5jTmFtZXMsIHRoaXNBcmcpIHtcbiAgZnVuY05hbWVzLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAgIGlmICghdGhpc0FyZ1tmdW5jTmFtZV0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzQXJnW2Z1bmNOYW1lXSA9IHRoaXNBcmdbZnVuY05hbWVdLmJpbmQodGhpc0FyZylcbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3V0aWwvdXRpbHMuanMiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 28 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _baseShape = __webpack_require__(7);\n\nvar _baseShape2 = _interopRequireDefault(_baseShape);\n\nvar _mat2d = __webpack_require__(5);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _math = __webpack_require__(6);\n\nvar _math2 = _interopRequireDefault(_math);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @typedef {object} PointOptions\n * @property {number} [size=5] Size of the point in pixels\n */\n\n/**\n * @class Point shape class. A point differs from a circle in that\n * a point's size is defined in screen/pixel space whereas\n * a circle is defined in world space.\n * @extends {BaseShape}\n */\nvar Point = function (_BaseShape) {\n _inherits(Point, _BaseShape);\n\n /**\n * Creates a new point shape\n * @param {PointOptions} [opts]\n * @return {Point}\n */\n function Point(opts) {\n _classCallCheck(this, Point);\n\n var _this = _possibleConstructorReturn(this, (Point.__proto__ || Object.getPrototypeOf(Point)).call(this, opts));\n\n _this._size = 5;\n if (typeof opts.size !== \"undefined\") {\n _this.size = opts.size;\n }\n AABox2d.initCenterExtents(_this._aabox, [0, 0], [_this._radius, _this._radius]);\n _this.translate(opts.x || 0, opts.y || 0);\n return _this;\n }\n\n /**\n * Sets the size of the point\n * @param {nuber} size Size of the point in pixels\n * @return {Pixel} this\n * @fires {Shape#geomChanged}\n * @throws {Error} If size is not a valid number\n */\n\n\n _createClass(Point, [{\n key: \"_updateAABox\",\n\n\n /**\n * Called when the bounding box requires updating\n * @private\n * @override\n */\n value: function _updateAABox() {\n if (this._geomDirty || this._boundsOutOfDate) {\n var pos = this._pos;\n var scale = this._scale;\n var rot = _math2.default.DEG_TO_RAD * this._rotDeg;\n var cossqr = _math2.default.pow(_math2.default.cos(rot), 2);\n var sinsqr = _math2.default.pow(_math2.default.sin(rot), 2);\n var asqr = _math2.default.pow(scale[0] * this._size, 2);\n var bsqr = _math2.default.pow(scale[1] * this._size, 2);\n var A = _math2.default.sqrt(bsqr * sinsqr + asqr * cossqr);\n var B = _math2.default.sqrt(asqr * sinsqr + bsqr * cossqr);\n AABox2d.initCenterExtents(this._aabox, pos, [A, B]);\n this._geomDirty = false;\n this._boundsOutOfDate = false;\n }\n }\n\n /**\n * Draws the point using a 2d rendering context. Called by the BaseShape\n * class\n * @param {CanvasRenderingContext2d} ctx 2d rendering context\n * @override\n */\n\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n var pos = [0, 0];\n _mat2d2.default.svd(pos, null, null, this._fullXform);\n ctx.arc(pos[0], pos[1], this._size, 0, _math2.default.TWO_PI, false);\n }\n\n /**\n * Called to convert the shape to a serializable JSON object\n * @return {object}\n * @override\n */\n\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign({\n type: \"Point\", // NOTE: this much match the name of the class\n size: this.size\n }, _get(Point.prototype.__proto__ || Object.getPrototypeOf(Point.prototype), \"toJSON\", this).call(this));\n }\n }, {\n key: \"size\",\n set: function set(size) {\n if (typeof size !== \"number\") {\n throw new Error(\"Radius must be a number\");\n }\n\n if (size !== this._size) {\n var prev = this._size;\n this._size = size;\n this._geomDirty = true; // dirty needs to be set before firing event\n\n this.fire(\"changed:geom\", {\n attr: \"size\",\n prevVal: prev,\n currVal: this._size\n });\n }\n }\n\n /**\n * Gets the current size of the point\n * @return {number}\n */\n ,\n get: function get() {\n return this._size;\n }\n }]);\n\n return Point;\n}(_baseShape2.default);\n\nexports.default = Point;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcG9pbnQuanM/OWY2OSJdLCJuYW1lcyI6WyJBQUJveDJkIiwiUG9pbnQiLCJvcHRzIiwiX3NpemUiLCJzaXplIiwiaW5pdENlbnRlckV4dGVudHMiLCJfYWFib3giLCJfcmFkaXVzIiwidHJhbnNsYXRlIiwieCIsInkiLCJfZ2VvbURpcnR5IiwiX2JvdW5kc091dE9mRGF0ZSIsInBvcyIsIl9wb3MiLCJzY2FsZSIsIl9zY2FsZSIsInJvdCIsIkRFR19UT19SQUQiLCJfcm90RGVnIiwiY29zc3FyIiwicG93IiwiY29zIiwic2luc3FyIiwic2luIiwiYXNxciIsImJzcXIiLCJBIiwic3FydCIsIkIiLCJjdHgiLCJzZXRUcmFuc2Zvcm0iLCJzdmQiLCJfZnVsbFhmb3JtIiwiYXJjIiwiVFdPX1BJIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZSIsIkVycm9yIiwicHJldiIsImZpcmUiLCJhdHRyIiwicHJldlZhbCIsImN1cnJWYWwiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBRUE7O0lBQVlBLE87O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBOzs7Ozs7SUFNcUJDLEs7OztBQUNuQjs7Ozs7QUFLQSxpQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUFBLDhHQUNWQSxJQURVOztBQUVoQixVQUFLQyxLQUFMLEdBQWEsQ0FBYjtBQUNBLFFBQUksT0FBT0QsS0FBS0UsSUFBWixLQUFxQixXQUF6QixFQUFzQztBQUNwQyxZQUFLQSxJQUFMLEdBQVlGLEtBQUtFLElBQWpCO0FBQ0Q7QUFDREosWUFBUUssaUJBQVIsQ0FBMEIsTUFBS0MsTUFBL0IsRUFBdUMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUF2QyxFQUErQyxDQUFDLE1BQUtDLE9BQU4sRUFBZSxNQUFLQSxPQUFwQixDQUEvQztBQUNBLFVBQUtDLFNBQUwsQ0FBZU4sS0FBS08sQ0FBTCxJQUFVLENBQXpCLEVBQTRCUCxLQUFLUSxDQUFMLElBQVUsQ0FBdEM7QUFQZ0I7QUFRakI7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7QUFpQ0E7Ozs7O21DQUtlO0FBQ2IsVUFBSSxLQUFLQyxVQUFMLElBQW1CLEtBQUtDLGdCQUE1QixFQUE4QztBQUM1QyxZQUFNQyxNQUFNLEtBQUtDLElBQWpCO0FBQ0EsWUFBTUMsUUFBUSxLQUFLQyxNQUFuQjtBQUNBLFlBQU1DLE1BQU0sZUFBS0MsVUFBTCxHQUFrQixLQUFLQyxPQUFuQztBQUNBLFlBQU1DLFNBQVMsZUFBS0MsR0FBTCxDQUFTLGVBQUtDLEdBQUwsQ0FBU0wsR0FBVCxDQUFULEVBQXdCLENBQXhCLENBQWY7QUFDQSxZQUFNTSxTQUFTLGVBQUtGLEdBQUwsQ0FBUyxlQUFLRyxHQUFMLENBQVNQLEdBQVQsQ0FBVCxFQUF3QixDQUF4QixDQUFmO0FBQ0EsWUFBTVEsT0FBTyxlQUFLSixHQUFMLENBQVNOLE1BQU0sQ0FBTixJQUFXLEtBQUtaLEtBQXpCLEVBQWdDLENBQWhDLENBQWI7QUFDQSxZQUFNdUIsT0FBTyxlQUFLTCxHQUFMLENBQVNOLE1BQU0sQ0FBTixJQUFXLEtBQUtaLEtBQXpCLEVBQWdDLENBQWhDLENBQWI7QUFDQSxZQUFNd0IsSUFBSSxlQUFLQyxJQUFMLENBQVVGLE9BQU9ILE1BQVAsR0FBZ0JFLE9BQU9MLE1BQWpDLENBQVY7QUFDQSxZQUFNUyxJQUFJLGVBQUtELElBQUwsQ0FBVUgsT0FBT0YsTUFBUCxHQUFnQkcsT0FBT04sTUFBakMsQ0FBVjtBQUNBcEIsZ0JBQVFLLGlCQUFSLENBQTBCLEtBQUtDLE1BQS9CLEVBQXVDTyxHQUF2QyxFQUE0QyxDQUFDYyxDQUFELEVBQUlFLENBQUosQ0FBNUM7QUFDQSxhQUFLbEIsVUFBTCxHQUFrQixLQUFsQjtBQUNBLGFBQUtDLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7OzBCQU1Na0IsRyxFQUFLO0FBQ1RBLFVBQUlDLFlBQUosQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsRUFBNkIsQ0FBN0IsRUFBZ0MsQ0FBaEM7QUFDQSxVQUFNbEIsTUFBTSxDQUFDLENBQUQsRUFBSSxDQUFKLENBQVo7QUFDQSxzQkFBTW1CLEdBQU4sQ0FBVW5CLEdBQVYsRUFBZSxJQUFmLEVBQXFCLElBQXJCLEVBQTJCLEtBQUtvQixVQUFoQztBQUNBSCxVQUFJSSxHQUFKLENBQVFyQixJQUFJLENBQUosQ0FBUixFQUFnQkEsSUFBSSxDQUFKLENBQWhCLEVBQXdCLEtBQUtWLEtBQTdCLEVBQW9DLENBQXBDLEVBQXVDLGVBQUtnQyxNQUE1QyxFQUFvRCxLQUFwRDtBQUNEOztBQUVEOzs7Ozs7Ozs2QkFLUztBQUNQLGFBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNuQkMsY0FBTSxPQURhLEVBQ0o7QUFDZmxDLGNBQU0sS0FBS0E7QUFGUSxPQUFkLHVHQUFQO0FBSUQ7OztzQkF2RVFBLEksRUFBTTtBQUNiLFVBQUksT0FBT0EsSUFBUCxLQUFnQixRQUFwQixFQUE4QjtBQUM1QixjQUFNLElBQUltQyxLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEOztBQUVELFVBQUluQyxTQUFTLEtBQUtELEtBQWxCLEVBQXlCO0FBQ3ZCLFlBQU1xQyxPQUFPLEtBQUtyQyxLQUFsQjtBQUNBLGFBQUtBLEtBQUwsR0FBYUMsSUFBYjtBQUNBLGFBQUtPLFVBQUwsR0FBa0IsSUFBbEIsQ0FIdUIsQ0FHQTs7QUFFdkIsYUFBSzhCLElBQUwsQ0FBVSxjQUFWLEVBQTBCO0FBQ3hCQyxnQkFBTSxNQURrQjtBQUV4QkMsbUJBQVNILElBRmU7QUFHeEJJLG1CQUFTLEtBQUt6QztBQUhVLFNBQTFCO0FBS0Q7QUFDRjs7QUFFRDs7Ozs7d0JBSVc7QUFDVCxhQUFPLEtBQUtBLEtBQVo7QUFDRDs7Ozs7O2tCQS9Da0JGLEsiLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuLi9jb3JlL2FhYm94MmRcIlxuaW1wb3J0IEJhc2VTaGFwZSBmcm9tIFwiLi9iYXNlLXNoYXBlLmpzXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQgTWF0aCBmcm9tIFwiLi4vbWF0aC9tYXRoXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb2ludE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2l6ZT01XSBTaXplIG9mIHRoZSBwb2ludCBpbiBwaXhlbHNcbiAqL1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludCBzaGFwZSBjbGFzcy4gQSBwb2ludCBkaWZmZXJzIGZyb20gYSBjaXJjbGUgaW4gdGhhdFxuICogICAgICAgIGEgcG9pbnQncyBzaXplIGlzIGRlZmluZWQgaW4gc2NyZWVuL3BpeGVsIHNwYWNlIHdoZXJlYXNcbiAqICAgICAgICBhIGNpcmNsZSBpcyBkZWZpbmVkIGluIHdvcmxkIHNwYWNlLlxuICogQGV4dGVuZHMge0Jhc2VTaGFwZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9pbnQgZXh0ZW5kcyBCYXNlU2hhcGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwb2ludCBzaGFwZVxuICAgKiBAcGFyYW0gIHtQb2ludE9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJuIHtQb2ludH1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX3NpemUgPSA1XG4gICAgaWYgKHR5cGVvZiBvcHRzLnNpemUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxuICAgIH1cbiAgICBBQUJveDJkLmluaXRDZW50ZXJFeHRlbnRzKHRoaXMuX2FhYm94LCBbMCwgMF0sIFt0aGlzLl9yYWRpdXMsIHRoaXMuX3JhZGl1c10pXG4gICAgdGhpcy50cmFuc2xhdGUob3B0cy54IHx8IDAsIG9wdHMueSB8fCAwKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHBvaW50XG4gICAqIEBwYXJhbSAge251YmVyfSBzaXplIFNpemUgb2YgdGhlIHBvaW50IGluIHBpeGVsc1xuICAgKiBAcmV0dXJuIHtQaXhlbH0gICAgICB0aGlzXG4gICAqIEBmaXJlcyB7U2hhcGUjZ2VvbUNoYW5nZWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzaXplIGlzIG5vdCBhIHZhbGlkIG51bWJlclxuICAgKi9cbiAgc2V0IHNpemUoc2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFkaXVzIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSAhPT0gdGhpcy5fc2l6ZSkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3NpemVcbiAgICAgIHRoaXMuX3NpemUgPSBzaXplXG4gICAgICB0aGlzLl9nZW9tRGlydHkgPSB0cnVlIC8vIGRpcnR5IG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgZmlyaW5nIGV2ZW50XG5cbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWQ6Z2VvbVwiLCB7XG4gICAgICAgIGF0dHI6IFwic2l6ZVwiLFxuICAgICAgICBwcmV2VmFsOiBwcmV2LFxuICAgICAgICBjdXJyVmFsOiB0aGlzLl9zaXplXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHBvaW50XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJvdW5kaW5nIGJveCByZXF1aXJlcyB1cGRhdGluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF91cGRhdGVBQUJveCgpIHtcbiAgICBpZiAodGhpcy5fZ2VvbURpcnR5IHx8IHRoaXMuX2JvdW5kc091dE9mRGF0ZSkge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zXG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWxlXG4gICAgICBjb25zdCByb3QgPSBNYXRoLkRFR19UT19SQUQgKiB0aGlzLl9yb3REZWdcbiAgICAgIGNvbnN0IGNvc3NxciA9IE1hdGgucG93KE1hdGguY29zKHJvdCksIDIpXG4gICAgICBjb25zdCBzaW5zcXIgPSBNYXRoLnBvdyhNYXRoLnNpbihyb3QpLCAyKVxuICAgICAgY29uc3QgYXNxciA9IE1hdGgucG93KHNjYWxlWzBdICogdGhpcy5fc2l6ZSwgMilcbiAgICAgIGNvbnN0IGJzcXIgPSBNYXRoLnBvdyhzY2FsZVsxXSAqIHRoaXMuX3NpemUsIDIpXG4gICAgICBjb25zdCBBID0gTWF0aC5zcXJ0KGJzcXIgKiBzaW5zcXIgKyBhc3FyICogY29zc3FyKVxuICAgICAgY29uc3QgQiA9IE1hdGguc3FydChhc3FyICogc2luc3FyICsgYnNxciAqIGNvc3NxcilcbiAgICAgIEFBQm94MmQuaW5pdENlbnRlckV4dGVudHModGhpcy5fYWFib3gsIHBvcywgW0EsIEJdKVxuICAgICAgdGhpcy5fZ2VvbURpcnR5ID0gZmFsc2VcbiAgICAgIHRoaXMuX2JvdW5kc091dE9mRGF0ZSA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSBwb2ludCB1c2luZyBhIDJkIHJlbmRlcmluZyBjb250ZXh0LiBDYWxsZWQgYnkgdGhlIEJhc2VTaGFwZVxuICAgKiBjbGFzc1xuICAgKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MmR9IGN0eCAyZCByZW5kZXJpbmcgY29udGV4dFxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIF9kcmF3KGN0eCkge1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICBjb25zdCBwb3MgPSBbMCwgMF1cbiAgICBNYXQyZC5zdmQocG9zLCBudWxsLCBudWxsLCB0aGlzLl9mdWxsWGZvcm0pXG4gICAgY3R4LmFyYyhwb3NbMF0sIHBvc1sxXSwgdGhpcy5fc2l6ZSwgMCwgTWF0aC5UV09fUEksIGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB0byBjb252ZXJ0IHRoZSBzaGFwZSB0byBhIHNlcmlhbGl6YWJsZSBKU09OIG9iamVjdFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgIHR5cGU6IFwiUG9pbnRcIiwgLy8gTk9URTogdGhpcyBtdWNoIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBjbGFzc1xuICAgICAgc2l6ZTogdGhpcy5zaXplXG4gICAgfSwgc3VwZXIudG9KU09OKCkpXG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2hhcGVzL3BvaW50LmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _aggregation2 = __webpack_require__(7);\n\nvar _aggregation3 = _interopRequireDefault(_aggregation2);\n\nvar _transform2d = __webpack_require__(11);\n\nvar _eventHandler = __webpack_require__(12);\n\nvar _eventHandler2 = _interopRequireDefault(_eventHandler);\n\nvar _mat2d = __webpack_require__(4);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _glMatrix = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Camera modification event\n * @event EventedCamera#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n/**\n * @class Base camera class for 2d screen projections\n * The base class is used only for the NDC to screen space trasform\n * @extends {EventHandler}\n */\nvar BaseCamera2d = function (_EventHandler) {\n _inherits(BaseCamera2d, _EventHandler);\n\n /**\n * Constructs a new 2d camera\n * @param {AABox2d} viewport Initial camera viewport boundary, in pixels\n * @param {Vec2d} projectionDimensions The width and height of the viewport in world coordinates\n * @param {Boolean} [flipY=false] Whether world y coordinates are flipped, if false\n * the top of the viewport window is smaller in y, and the bottom\n * is larger. If true, the bottom has smaller y coords, and the top\n * larger\n * @return {BaseCamera2d}\n */\n function BaseCamera2d(viewport, projectionDimensions) {\n var flipY = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n _classCallCheck(this, BaseCamera2d);\n\n var _this = _possibleConstructorReturn(this, (BaseCamera2d.__proto__ || Object.getPrototypeOf(BaseCamera2d)).call(this, [\"changed\", \"changed:xform\"]));\n // initialize modify events\n\n\n _this._viewport = AABox2d.clone(viewport);\n _this._projectionDimensions = _glMatrix.vec2.clone(projectionDimensions);\n _this._yflip = flipY;\n\n // stores the NDC space to screen space matrix\n // NDC (normalized device coordinates) is the space\n // where the left edge of the window is -1, the right edge is 1\n // the top edge is -1, and the bottom edge is 1.\n _this._screenMatrix = _mat2d2.default.create();\n\n // this flag is dirty whenever the attributes for the\n // ndc-to-screen projection are modified\n _this._screenDirty = true;\n return _this;\n }\n\n /**\n * Returns true if the world Y coordinates go from negative to positive\n * in a bottom to top fashion in screen space, false otherwise.\n * @return {Boolean}\n */\n\n\n _createClass(BaseCamera2d, [{\n key: \"isYFlipped\",\n value: function isYFlipped() {\n return this._yflip;\n }\n\n /**\n * Sets the camera's screen-space viewport bounds\n * @param {AABox2d} viewport\n * @fires EventedCamera#changed\n * @return {BaseCamera2d}\n */\n\n }, {\n key: \"viewport\",\n set: function set(viewport) {\n if (!AABox2d.equals(viewport, this._viewport)) {\n var prev = AABox2d.clone(this._viewport);\n AABox2d.copy(this._viewport, viewport);\n this._screenDirty = true;\n this._worldToScreenOutdated = true;\n this.fire(\"changed\", {\n attr: \"viewport\",\n prevVal: prev,\n currVal: viewport\n });\n }\n return this;\n }\n\n /**\n * Gets a copy of the camera's current viewport\n * @return {AABox2d}\n */\n ,\n get: function get() {\n return AABox2d.clone(this._viewport);\n }\n\n /**\n * Gets a reference to the camera's current viewport\n * @return {AABox2d}\n * @readOnly\n */\n\n }, {\n key: \"viewportRef\",\n get: function get() {\n return this._viewport;\n }\n\n /**\n * Gets the current NDC to screen space transform matrix\n * @return {Mat2d}\n */\n\n }, {\n key: \"screenMatrix\",\n get: function get() {\n if (this._screenDirty) {\n var center = [0, 0];\n var extents = [0, 0];\n AABox2d.getCenter(center, this._viewport);\n AABox2d.getExtents(extents, this._viewport);\n _mat2d2.default.set(this._screenMatrix, extents[0], 0, 0, extents[1], center[0], center[1]);\n this._worldToScreenOutdated = true;\n this._screenDirty = false;\n }\n return this._screenMatrix;\n }\n }]);\n\n return BaseCamera2d;\n}(_eventHandler2.default);\n\n/**\n * @class Main 2d camera class to manage othographic 2d projections\n * @extends {BaseCamera2d}\n * @mixin {EventedTransform2d}\n */\n\n\nvar Camera2d = function (_aggregation) {\n _inherits(Camera2d, _aggregation);\n\n /**\n * Creates a new Camera2d object\n * @param {AABox2d} viewport The camera's viewport bounds in pixel space\n * @param {Vec2d} projectionDimensions The width/height of the camera's viewport in world coordinates\n * @param {Boolean} flipY True if the direction from negative to positive Y coordinates\n * go from the bottom to top of the window. False means Y coords\n * from negative to positive values go from the top to the bottom\n * @return {Camera2d}\n */\n function Camera2d(viewport, projectionDimensions, flipY) {\n _classCallCheck(this, Camera2d);\n\n var _this2 = _possibleConstructorReturn(this, (Camera2d.__proto__ || Object.getPrototypeOf(Camera2d)).call(this, viewport, projectionDimensions, flipY));\n\n _this2._viewMatrix = _mat2d2.default.create();\n _this2._viewDirty = true;\n _this2._projMatrix = _mat2d2.default.create();\n _this2._projDirty = true;\n return _this2;\n }\n\n /**\n * Sets the projection dimensions of the camera's view. This is the width/height\n * in world space coordiantes of the camera's view.\n * @param {Vec2d} projectionDimensions\n * @return {Camera2d} this\n */\n\n\n _createClass(Camera2d, [{\n key: \"_localXformUpdated\",\n\n\n /**\n * Called when the local transform (does not include parent transforms) of the Transform2d\n * mixin is modified. Used to be notified internally that the view-to-screen space\n * transformation needs updating\n * @private\n */\n value: function _localXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Called when the global matrix (includes parent transforms) of the\n * Transform2d mixin is modified. Used to be notified internally that\n * the view-to-screen space transformation needs updating\n * @private\n */\n\n }, {\n key: \"_globalXformUpdated\",\n value: function _globalXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Gets the transformation matrix from world space to view/camera space\n * @return {Mat2d}\n */\n\n }, {\n key: \"_matricesDirty\",\n\n\n /**\n * Returns true if any of the dirty flags are active\n * @return {Boolean}\n * @private\n */\n value: function _matricesDirty() {\n return this._boundsOutOfDate || this._lxformDirty || this._xformDirty || this._viewDirty || this._projDirty || this._screenDirty;\n }\n\n /**\n * Gets the transformation matrix from world space to screen space.\n * @return {Mat2d}\n */\n\n }, {\n key: \"projectionDimensions\",\n set: function set(projectionDimensions) {\n if (!_glMatrix.vec2.equals(projectionDimensions, this._projectionDimensions)) {\n var prev = _glMatrix.vec2.clone(this._projectionDimensions);\n AABox2d.copy(this._projectionDimensions, projectionDimensions);\n this._viewDirty = true;\n this._projDirty = true;\n // this._yflip = this._projectionDimensions[3] < this._projectionDimensions[1]\n this.fire(\"changed\", {\n attr: \"projectionDimensions\",\n prevVal: prev,\n currVal: projectionDimensions\n });\n }\n return this;\n }\n\n /**\n * Gets a copy of the camera's current projection dimensions\n * @return {Vec2d}\n */\n ,\n get: function get() {\n return _glMatrix.vec2.clone(this._projectionDimensions);\n }\n\n /**\n * Gets a reference to the camera's current projection dimensions\n * @return {Vec2d}\n * @readOnly\n */\n\n }, {\n key: \"projectionDimensionsRef\",\n get: function get() {\n return this._projectionDimensions;\n }\n }, {\n key: \"viewMatrix\",\n get: function get() {\n if (this._viewDirty || this._boundsOutOfDate || this._xformDirty || this._lxformDirty) {\n // the matrix has been marked dirty, so recalculate\n var pos = [0, 0];\n var scale = [0, 0];\n var rot = [0, 0];\n var xform = this.globalXform;\n _mat2d2.default.svd(pos, scale, rot, xform);\n _mat2d2.default.fromTranslation(this._viewMatrix, _glMatrix.vec2.negate(pos, pos));\n _mat2d2.default.rotate(this._viewMatrix, this._viewMatrix, -rot[0]);\n _mat2d2.default.scale(this._viewMatrix, this._viewMatrix, scale);\n _mat2d2.default.rotate(this._viewMatrix, this._viewMatrix, -rot[1]);\n this._worldToScreenOutdated = true;\n this._viewDirty = false;\n }\n return this._viewMatrix;\n }\n\n /**\n * Gets the orthographic projection transformation matrix from\n * view to NDC (normalized device coordinates) space\n * @return {Mat2d}\n */\n\n }, {\n key: \"projMatrix\",\n get: function get() {\n if (this._projDirty) {\n var flip = this._yflip ? -1 : 1;\n _mat2d2.default.set(this._projMatrix, 2.0 / this._projectionDimensions[0], 0, 0, flip * 2.0 / this._projectionDimensions[1], 0, 0);\n this._worldToScreenOutdated = true;\n this._projDirty = false;\n }\n return this._projMatrix;\n }\n }, {\n key: \"worldToScreenMatrix\",\n get: function get() {\n if (!this._worldToScreenMatrix || this._worldToScreenOutdated || this._matricesDirty()) {\n if (!this._worldToScreenMatrix) {\n this._worldToScreenMatrix = _mat2d2.default.create();\n }\n _mat2d2.default.copy(this._worldToScreenMatrix, this.viewMatrix);\n _mat2d2.default.multiply(this._worldToScreenMatrix, this.projMatrix, this._worldToScreenMatrix);\n _mat2d2.default.multiply(this._worldToScreenMatrix, this.screenMatrix, this._worldToScreenMatrix);\n this._worldToScreenOutdated = false;\n this._screenToWorldOutdated = true;\n }\n return this._worldToScreenMatrix;\n }\n\n /**\n * Gets teh transform matrix from screen space to world space.\n * @return {[type]} [description]\n */\n\n }, {\n key: \"screenToWorldMatrix\",\n get: function get() {\n if (!this._screenToWorld || this._screenToWorldOutdated || this._matricesDirty()) {\n if (!this._screenToWorld) {\n this._screenToWorld = _mat2d2.default.create();\n }\n _mat2d2.default.copy(this._screenToWorld, this.worldToScreenMatrix);\n _mat2d2.default.invert(this._screenToWorld, this._screenToWorld);\n this._screenToWorldOutdated = false;\n }\n return this._screenToWorld;\n }\n }]);\n\n return Camera2d;\n}((0, _aggregation3.default)(BaseCamera2d, (0, _transform2d.createEventedTransform2dMixin)(\"changed:xform\")));\n\nexports.default = Camera2d;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92aWV3L2NhbWVyYTJkLmpzP2YyYWUiXSwibmFtZXMiOlsiQUFCb3gyZCIsIkJhc2VDYW1lcmEyZCIsInZpZXdwb3J0IiwicHJvamVjdGlvbkRpbWVuc2lvbnMiLCJmbGlwWSIsIl92aWV3cG9ydCIsImNsb25lIiwiX3Byb2plY3Rpb25EaW1lbnNpb25zIiwiVmVjMmQiLCJfeWZsaXAiLCJfc2NyZWVuTWF0cml4IiwiTWF0MmQiLCJjcmVhdGUiLCJfc2NyZWVuRGlydHkiLCJlcXVhbHMiLCJwcmV2IiwiY29weSIsIl93b3JsZFRvU2NyZWVuT3V0ZGF0ZWQiLCJmaXJlIiwiYXR0ciIsInByZXZWYWwiLCJjdXJyVmFsIiwiY2VudGVyIiwiZXh0ZW50cyIsImdldENlbnRlciIsImdldEV4dGVudHMiLCJzZXQiLCJFdmVudEhhbmRsZXIiLCJDYW1lcmEyZCIsIl92aWV3TWF0cml4IiwiX3ZpZXdEaXJ0eSIsIl9wcm9qTWF0cml4IiwiX3Byb2pEaXJ0eSIsIl9ib3VuZHNPdXRPZkRhdGUiLCJfbHhmb3JtRGlydHkiLCJfeGZvcm1EaXJ0eSIsInBvcyIsInNjYWxlIiwicm90IiwieGZvcm0iLCJnbG9iYWxYZm9ybSIsInN2ZCIsImZyb21UcmFuc2xhdGlvbiIsIm5lZ2F0ZSIsInJvdGF0ZSIsImZsaXAiLCJfd29ybGRUb1NjcmVlbk1hdHJpeCIsIl9tYXRyaWNlc0RpcnR5Iiwidmlld01hdHJpeCIsIm11bHRpcGx5IiwicHJvak1hdHJpeCIsInNjcmVlbk1hdHJpeCIsIl9zY3JlZW5Ub1dvcmxkT3V0ZGF0ZWQiLCJfc2NyZWVuVG9Xb3JsZCIsIndvcmxkVG9TY3JlZW5NYXRyaXgiLCJpbnZlcnQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztBQUVBOztJQUFZQSxPOztBQUNaOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQTs7Ozs7Ozs7O0FBU0E7Ozs7O0lBS01DLFk7OztBQUNKOzs7Ozs7Ozs7O0FBVUEs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QkFBbkMsSUFBNkQsS0FBSzhCLGNBQUwsRUFBakUsRUFBd0Y7QUFDdEYsWUFBSSxDQUFDLEtBQUtELG9CQUFWLEVBQWdDO0FBQzlCLGVBQUtBLG9CQUFMLEdBQTRCbkMsZ0JBQU1DLE1BQU4sRUFBNUI7QUFDRDtBQUNERCx3QkFBTUssSUFBTixDQUFXLEtBQUs4QixvQkFBaEIsRUFBc0MsS0FBS0UsVUFBM0M7QUFDQXJDLHdCQUFNc0MsUUFBTixDQUFlLEtBQUtILG9CQUFwQixFQUEwQyxLQUFLSSxVQUEvQyxFQUEyRCxLQUFLSixvQkFBaEU7QUFDQW5DLHdCQUFNc0MsUUFBTixDQUFlLEtBQUtILG9CQUFwQixFQUEwQyxLQUFLSyxZQUEvQyxFQUE2RCxLQUFLTCxvQkFBbEU7QUFDQSxhQUFLN0Isc0JBQUwsR0FBOEIsS0FBOUI7QUFDQSxhQUFLbUMsc0JBQUwsR0FBOEIsSUFBOUI7QUFDRDtBQUNELGFBQU8sS0FBS04sb0JBQVo7QUFDRDs7QUFFRDs7Ozs7Ozt3QkFJMEI7QUFDeEIsVUFBSSxDQUFDLEtBQUtPLGNBQU4sSUFBd0IsS0FBS0Qsc0JBQTdCLElBQXVELEtBQUtMLGNBQUwsRUFBM0QsRUFBa0Y7QUFDaEYsWUFBSSxDQUFDLEtBQUtNLGNBQVYsRUFBMEI7QUFDeEIsZUFBS0EsY0FBTCxHQUFzQjFDLGdCQUFNQyxNQUFOLEVBQXRCO0FBQ0Q7QUFDREQsd0JBQU1LLElBQU4sQ0FBVyxLQUFLcUMsY0FBaEIsRUFBZ0MsS0FBS0MsbUJBQXJDO0FBQ0EzQyx3QkFBTTRDLE1BQU4sQ0FBYSxLQUFLRixjQUFsQixFQUFrQyxLQUFLQSxjQUF2QztBQUNBLGFBQUtELHNCQUFMLEdBQThCLEtBQTlCO0FBQ0Q7QUFDRCxhQUFPLEtBQUtDLGNBQVo7QUFDRDs7OztFQTlKbUMsMkJBQVlwRCxZQUFaLEVBQ3BDLGdEQUE4QixlQUE5QixDQURvQyxDOztrQkFBakIyQixRIiwiZmlsZSI6IjI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuaW1wb3J0ICogYXMgQUFCb3gyZCBmcm9tIFwiLi4vY29yZS9hYWJveDJkXCJcbmltcG9ydCBhZ2dyZWdhdGlvbiBmcm9tIFwiLi4vdXRpbC9hZ2dyZWdhdGlvblwiXG5pbXBvcnQge2NyZWF0ZUV2ZW50ZWRUcmFuc2Zvcm0yZE1peGlufSBmcm9tIFwiLi4vc2hhcGVzL3RyYW5zZm9ybTJkXCJcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSBcIi4uL3V0aWwvZXZlbnQtaGFuZGxlclwiXG5pbXBvcnQgTWF0MmQgZnJvbSBcIi4uL2NvcmUvbWF0MmRcIlxuaW1wb3J0IHt2ZWMyIGFzIFZlYzJkfSBmcm9tIFwiZ2wtbWF0cml4XCJcblxuLyoqXG4gKiBDYW1lcmEgbW9kaWZpY2F0aW9uIGV2ZW50XG4gKiBAZXZlbnQgRXZlbnRlZENhbWVyYSNjaGFuZ2VkXG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHIgTmFtZSBvZiB0aGUgYXR0cmlidXRlIG1vZGlmaWVkXG4gKiBAcHJvcGVydHkge30gcHJldlZhbCBQcmV2aW91cyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHByaW9yIHRvIG1vZGlmaWNhdGlvblxuICogQHByb3BlcnR5IHt9IGN1cnJWYWwgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBwb3N0IG1vZGlmaWNhdGlvblxuICovXG5cbi8qKlxuICogQGNsYXNzIEJhc2UgY2FtZXJhIGNsYXNzIGZvciAyZCBzY3JlZW4gcHJvamVjdGlvbnNcbiAqICAgICAgICBUaGUgYmFzZSBjbGFzcyBpcyB1c2VkIG9ubHkgZm9yIHRoZSBOREMgdG8gc2NyZWVuIHNwYWNlIHRyYXNmb3JtXG4gKiBAZXh0ZW5kcyB7RXZlbnRIYW5kbGVyfVxuICovXG5jbGFzcyBCYXNlQ2FtZXJhMmQgZXh0ZW5kcyBFdmVudEhhbmRsZXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyAyZCBjYW1lcmFcbiAgICogQHBhcmFtICB7QUFCb3gyZH0gIHZpZXdwb3J0ICAgICAgICAgICBJbml0aWFsIGNhbWVyYSB2aWV3cG9ydCBib3VuZGFyeSwgaW4gcGl4ZWxzXG4gICAqIEBwYXJhbSAge1ZlYzJkfSAgcHJvamVjdGlvbkRpbWVuc2lvbnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0IGluIHdvcmxkIGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IFtmbGlwWT1mYWxzZV0gICAgICAgV2hldGhlciB3b3JsZCB5IGNvb3JkaW5hdGVzIGFyZSBmbGlwcGVkLCBpZiBmYWxzZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IHdpbmRvdyBpcyBzbWFsbGVyIGluIHksIGFuZCB0aGUgYm90dG9tXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyLiBJZiB0cnVlLCB0aGUgYm90dG9tIGhhcyBzbWFsbGVyIHkgY29vcmRzLCBhbmQgdGhlIHRvcFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlclxuICAgKiBAcmV0dXJuIHtCYXNlQ2FtZXJhMmR9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih2aWV3cG9ydCwgcHJvamVjdGlvbkRpbWVuc2lvbnMsIGZsaXBZID0gZmFsc2UpIHtcbiAgICAvLyBpbml0aWFsaXplIG1vZGlmeSBldmVudHNcbiAgICBzdXBlcihbXCJjaGFuZ2VkXCIsIFwiY2hhbmdlZDp4Zm9ybVwiXSlcblxuICAgIHRoaXMuX3ZpZXdwb3J0ID0gQUFCb3gyZC5jbG9uZSh2aWV3cG9ydClcbiAgICB0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9ucyA9IFZlYzJkLmNsb25lKHByb2plY3Rpb25EaW1lbnNpb25zKVxuICAgIHRoaXMuX3lmbGlwID0gZmxpcFlcblxuICAgIC8vIHN0b3JlcyB0aGUgTkRDIHNwYWNlIHRvIHNjcmVlbiBzcGFjZSBtYXRyaXhcbiAgICAvLyBOREMgKG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzKSBpcyB0aGUgc3BhY2VcbiAgICAvLyB3aGVyZSB0aGUgbGVmdCBlZGdlIG9mIHRoZSB3aW5kb3cgaXMgLTEsIHRoZSByaWdodCBlZGdlIGlzIDFcbiAgICAvLyB0aGUgdG9wIGVkZ2UgaXMgLTEsIGFuZCB0aGUgYm90dG9tIGVkZ2UgaXMgMS5cbiAgICB0aGlzLl9zY3JlZW5NYXRyaXggPSBNYXQyZC5jcmVhdGUoKVxuXG4gICAgLy8gdGhpcyBmbGFnIGlzIGRpcnR5IHdoZW5ldmVyIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGVcbiAgICAvLyBuZGMtdG8tc2NyZWVuIHByb2plY3Rpb24gYXJlIG1vZGlmaWVkXG4gICAgdGhpcy5fc2NyZWVuRGlydHkgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3b3JsZCBZIGNvb3JkaW5hdGVzIGdvIGZyb20gbmVnYXRpdmUgdG8gcG9zaXRpdmVcbiAgICogaW4gYSBib3R0b20gdG8gdG9wIGZhc2hpb24gaW4gc2NyZWVuIHNwYWNlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc1lGbGlwcGVkKCkge1xuICAgIHJldHVybiB0aGlzLl95ZmxpcFxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNhbWVyYSdzIHNjcmVlbi1zcGFjZSB2aWV3cG9ydCBib3VuZHNcbiAgICogQHBhcmFtICB7QUFCb3gyZH0gdmlld3BvcnRcbiAgICogQGZpcmVzICBFdmVudGVkQ2FtZXJhI2NoYW5nZWRcbiAgICogQHJldHVybiB7QmFzZUNhbWVyYTJkfVxuICAgKi9cbiAgc2V0IHZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgaWYgKCFBQUJveDJkLmVxdWFscyh2aWV3cG9ydCwgdGhpcy5fdmlld3BvcnQpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gQUFCb3gyZC5jbG9uZSh0aGlzLl92aWV3cG9ydClcbiAgICAgIEFBQm94MmQuY29weSh0aGlzLl92aWV3cG9ydCwgdmlld3BvcnQpXG4gICAgICB0aGlzLl9zY3JlZW5EaXJ0eSA9IHRydWVcbiAgICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCA9IHRydWVcbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWRcIiwge1xuICAgICAgICBhdHRyOiBcInZpZXdwb3J0XCIsXG4gICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgIGN1cnJWYWw6IHZpZXdwb3J0XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb3B5IG9mIHRoZSBjYW1lcmEncyBjdXJyZW50IHZpZXdwb3J0XG4gICAqIEByZXR1cm4ge0FBQm94MmR9XG4gICAqL1xuICBnZXQgdmlld3BvcnQoKSB7XG4gICAgcmV0dXJuIEFBQm94MmQuY2xvbmUodGhpcy5fdmlld3BvcnQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhJ3MgY3VycmVudCB2aWV3cG9ydFxuICAgKiBAcmV0dXJuIHtBQUJveDJkfVxuICAgKiBAcmVhZE9ubHlcbiAgICovXG4gIGdldCB2aWV3cG9ydFJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IE5EQyB0byBzY3JlZW4gc3BhY2UgdHJhbnNmb3JtIG1hdHJpeFxuICAgKiBAcmV0dXJuIHtNYXQyZH1cbiAgICovXG4gIGdldCBzY3JlZW5NYXRyaXgoKSB7XG4gICAgaWYgKHRoaXMuX3NjcmVlbkRpcnR5KSB7XG4gICAgICBjb25zdCBjZW50ZXIgPSBbMCwgMF1cbiAgICAgIGNvbnN0IGV4dGVudHMgPSBbMCwgMF1cbiAgICAgIEFBQm94MmQuZ2V0Q2VudGVyKGNlbnRlciwgdGhpcy5fdmlld3BvcnQpXG4gICAgICBBQUJveDJkLmdldEV4dGVudHMoZXh0ZW50cywgdGhpcy5fdmlld3BvcnQpXG4gICAgICBNYXQyZC5zZXQodGhpcy5fc2NyZWVuTWF0cml4LCBleHRlbnRzWzBdLCAwLCAwLCBleHRlbnRzWzFdLCBjZW50ZXJbMF0sIGNlbnRlclsxXSlcbiAgICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3NjcmVlbkRpcnR5ID0gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NjcmVlbk1hdHJpeFxuICB9XG59XG5cbi8qKlxuICogQGNsYXNzIE1haW4gMmQgY2FtZXJhIGNsYXNzIHRvIG1hbmFnZSBvdGhvZ3JhcGhpYyAyZCBwcm9qZWN0aW9uc1xuICogQGV4dGVuZHMge0Jhc2VDYW1lcmEyZH1cbiAqIEBtaXhpbiB7RXZlbnRlZFRyYW5zZm9ybTJkfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW1lcmEyZCBleHRlbmRzIGFnZ3JlZ2F0aW9uKEJhc2VDYW1lcmEyZCxcbiAgY3JlYXRlRXZlbnRlZFRyYW5zZm9ybTJkTWl4aW4oXCJjaGFuZ2VkOnhmb3JtXCIpKSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ2FtZXJhMmQgb2JqZWN0XG4gICAqIEBwYXJhbSAge0FBQm94MmR9IHZpZXdwb3J0ICAgICAgICAgICAgIFRoZSBjYW1lcmEncyB2aWV3cG9ydCBib3VuZHMgaW4gcGl4ZWwgc3BhY2VcbiAgICogQHBhcmFtICB7VmVjMmR9IHByb2plY3Rpb25EaW1lbnNpb25zIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGNhbWVyYSdzIHZpZXdwb3J0IGluIHdvcmxkIGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IGZsaXBZICAgICAgICAgICAgICBUcnVlIGlmIHRoZSBkaXJlY3Rpb24gZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZSBZIGNvb3JkaW5hdGVzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbyBmcm9tIHRoZSBib3R0b20gdG8gdG9wIG9mIHRoZSB3aW5kb3cuIEZhbHNlIG1lYW5zIFkgY29vcmRzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG5lZ2F0aXZlIHRvIHBvc2l0aXZlIHZhbHVlcyBnbyBmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbVxuICAgKiBAcmV0dXJuIHtDYW1lcmEyZH1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHZpZXdwb3J0LCBwcm9qZWN0aW9uRGltZW5zaW9ucywgZmxpcFkpIHtcbiAgICBzdXBlcih2aWV3cG9ydCwgcHJvamVjdGlvbkRpbWVuc2lvbnMsIGZsaXBZKVxuXG4gICAgdGhpcy5fdmlld01hdHJpeCA9IE1hdDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fdmlld0RpcnR5ID0gdHJ1ZVxuICAgIHRoaXMuX3Byb2pNYXRyaXggPSBNYXQyZC5jcmVhdGUoKVxuICAgIHRoaXMuX3Byb2pEaXJ0eSA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9qZWN0aW9uIGRpbWVuc2lvbnMgb2YgdGhlIGNhbWVyYSdzIHZpZXcuIFRoaXMgaXMgdGhlIHdpZHRoL2hlaWdodFxuICAgKiBpbiB3b3JsZCBzcGFjZSBjb29yZGlhbnRlcyBvZiB0aGUgY2FtZXJhJ3Mgdmlldy5cbiAgICogQHBhcmFtICB7VmVjMmR9IHByb2plY3Rpb25EaW1lbnNpb25zXG4gICAqIEByZXR1cm4ge0NhbWVyYTJkfSB0aGlzXG4gICAqL1xuICBzZXQgcHJvamVjdGlvbkRpbWVuc2lvbnMocHJvamVjdGlvbkRpbWVuc2lvbnMpIHtcbiAgICBpZiAoIVZlYzJkLmVxdWFscyhwcm9qZWN0aW9uRGltZW5zaW9ucywgdGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnMpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gVmVjMmQuY2xvbmUodGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnMpXG4gICAgICBBQUJveDJkLmNvcHkodGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnMsIHByb2plY3Rpb25EaW1lbnNpb25zKVxuICAgICAgdGhpcy5fdmlld0RpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5fcHJvakRpcnR5ID0gdHJ1ZVxuICAgICAgICAvLyB0aGlzLl95ZmxpcCA9IHRoaXMuX3Byb2plY3Rpb25EaW1lbnNpb25zWzNdIDwgdGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnNbMV1cbiAgICAgIHRoaXMuZmlyZShcImNoYW5nZWRcIiwge1xuICAgICAgICBhdHRyOiBcInByb2plY3Rpb25EaW1lbnNpb25zXCIsXG4gICAgICAgIHByZXZWYWw6IHByZXYsXG4gICAgICAgIGN1cnJWYWw6IHByb2plY3Rpb25EaW1lbnNpb25zXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb3B5IG9mIHRoZSBjYW1lcmEncyBjdXJyZW50IHByb2plY3Rpb24gZGltZW5zaW9uc1xuICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICovXG4gIGdldCBwcm9qZWN0aW9uRGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gVmVjMmQuY2xvbmUodGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnMpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhJ3MgY3VycmVudCBwcm9qZWN0aW9uIGRpbWVuc2lvbnNcbiAgICogQHJldHVybiB7VmVjMmR9XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0IHByb2plY3Rpb25EaW1lbnNpb25zUmVmKCkge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBsb2NhbCB0cmFuc2Zvcm0gKGRvZXMgbm90IGluY2x1ZGUgcGFyZW50IHRyYW5zZm9ybXMpIG9mIHRoZSBUcmFuc2Zvcm0yZFxuICAgKiBtaXhpbiBpcyBtb2RpZmllZC4gVXNlZCB0byBiZSBub3RpZmllZCBpbnRlcm5hbGx5IHRoYXQgdGhlIHZpZXctdG8tc2NyZWVuIHNwYWNlXG4gICAqIHRyYW5zZm9ybWF0aW9uIG5lZWRzIHVwZGF0aW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbG9jYWxYZm9ybVVwZGF0ZWQoKSB7XG4gICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBnbG9iYWwgbWF0cml4IChpbmNsdWRlcyBwYXJlbnQgdHJhbnNmb3Jtcykgb2YgdGhlXG4gICAqIFRyYW5zZm9ybTJkIG1peGluIGlzIG1vZGlmaWVkLiBVc2VkIHRvIGJlIG5vdGlmaWVkIGludGVybmFsbHkgdGhhdFxuICAgKiB0aGUgdmlldy10by1zY3JlZW4gc3BhY2UgdHJhbnNmb3JtYXRpb24gbmVlZHMgdXBkYXRpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nbG9iYWxYZm9ybVVwZGF0ZWQoKSB7XG4gICAgdGhpcy5fYm91bmRzT3V0T2ZEYXRlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmcm9tIHdvcmxkIHNwYWNlIHRvIHZpZXcvY2FtZXJhIHNwYWNlXG4gICAqIEByZXR1cm4ge01hdDJkfVxuICAgKi9cbiAgZ2V0IHZpZXdNYXRyaXgoKSB7XG4gICAgaWYgKHRoaXMuX3ZpZXdEaXJ0eSB8fCB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgfHwgdGhpcy5feGZvcm1EaXJ0eSB8fCB0aGlzLl9seGZvcm1EaXJ0eSkge1xuICAgICAgLy8gdGhlIG1hdHJpeCBoYXMgYmVlbiBtYXJrZWQgZGlydHksIHNvIHJlY2FsY3VsYXRlXG4gICAgICBjb25zdCBwb3MgPSBbMCwgMF1cbiAgICAgIGNvbnN0IHNjYWxlID0gWzAsIDBdXG4gICAgICBjb25zdCByb3QgPSBbMCwgMF1cbiAgICAgIGNvbnN0IHhmb3JtID0gdGhpcy5nbG9iYWxYZm9ybVxuICAgICAgTWF0MmQuc3ZkKHBvcywgc2NhbGUsIHJvdCwgeGZvcm0pXG4gICAgICBNYXQyZC5mcm9tVHJhbnNsYXRpb24odGhpcy5fdmlld01hdHJpeCwgVmVjMmQubmVnYXRlKHBvcywgcG9zKSlcbiAgICAgIE1hdDJkLnJvdGF0ZSh0aGlzLl92aWV3TWF0cml4LCB0aGlzLl92aWV3TWF0cml4LCAtcm90WzBdKVxuICAgICAgTWF0MmQuc2NhbGUodGhpcy5fdmlld01hdHJpeCwgdGhpcy5fdmlld01hdHJpeCwgc2NhbGUpXG4gICAgICBNYXQyZC5yb3RhdGUodGhpcy5fdmlld01hdHJpeCwgdGhpcy5fdmlld01hdHJpeCwgLXJvdFsxXSlcbiAgICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3ZpZXdEaXJ0eSA9IGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92aWV3TWF0cml4XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb21cbiAgICogdmlldyB0byBOREMgKG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzKSBzcGFjZVxuICAgKiBAcmV0dXJuIHtNYXQyZH1cbiAgICovXG4gIGdldCBwcm9qTWF0cml4KCkge1xuICAgIGlmICh0aGlzLl9wcm9qRGlydHkpIHtcbiAgICAgIGNvbnN0IGZsaXAgPSAodGhpcy5feWZsaXAgPyAtMSA6IDEpXG4gICAgICBNYXQyZC5zZXQodGhpcy5fcHJvak1hdHJpeCwgMi4wIC8gdGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnNbMF0sIDAsIDAsIGZsaXAgKiAyLjAgLyB0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9uc1sxXSwgMCwgMClcbiAgICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3Byb2pEaXJ0eSA9IGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm9qTWF0cml4XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgZGlydHkgZmxhZ3MgYXJlIGFjdGl2ZVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21hdHJpY2VzRGlydHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JvdW5kc091dE9mRGF0ZSB8fCB0aGlzLl9seGZvcm1EaXJ0eSB8fCB0aGlzLl94Zm9ybURpcnR5IHx8IHRoaXMuX3ZpZXdEaXJ0eSB8fCB0aGlzLl9wcm9qRGlydHkgfHwgdGhpcy5fc2NyZWVuRGlydHlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZnJvbSB3b3JsZCBzcGFjZSB0byBzY3JlZW4gc3BhY2UuXG4gICAqIEByZXR1cm4ge01hdDJkfVxuICAgKi9cbiAgZ2V0IHdvcmxkVG9TY3JlZW5NYXRyaXgoKSB7XG4gICAgaWYgKCF0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4IHx8IHRoaXMuX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCB8fCB0aGlzLl9tYXRyaWNlc0RpcnR5KCkpIHtcbiAgICAgIGlmICghdGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeCkge1xuICAgICAgICB0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4ID0gTWF0MmQuY3JlYXRlKClcbiAgICAgIH1cbiAgICAgIE1hdDJkLmNvcHkodGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy52aWV3TWF0cml4KVxuICAgICAgTWF0MmQubXVsdGlwbHkodGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5wcm9qTWF0cml4LCB0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgICAgTWF0MmQubXVsdGlwbHkodGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeCwgdGhpcy5zY3JlZW5NYXRyaXgsIHRoaXMuX3dvcmxkVG9TY3JlZW5NYXRyaXgpXG4gICAgICB0aGlzLl93b3JsZFRvU2NyZWVuT3V0ZGF0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5fc2NyZWVuVG9Xb3JsZE91dGRhdGVkID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGVoIHRyYW5zZm9ybSBtYXRyaXggZnJvbSBzY3JlZW4gc3BhY2UgdG8gd29ybGQgc3BhY2UuXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgZ2V0IHNjcmVlblRvV29ybGRNYXRyaXgoKSB7XG4gICAgaWYgKCF0aGlzLl9zY3JlZW5Ub1dvcmxkIHx8IHRoaXMuX3NjcmVlblRvV29ybGRPdXRkYXRlZCB8fCB0aGlzLl9tYXRyaWNlc0RpcnR5KCkpIHtcbiAgICAgIGlmICghdGhpcy5fc2NyZWVuVG9Xb3JsZCkge1xuICAgICAgICB0aGlzLl9zY3JlZW5Ub1dvcmxkID0gTWF0MmQuY3JlYXRlKClcbiAgICAgIH1cbiAgICAgIE1hdDJkLmNvcHkodGhpcy5fc2NyZWVuVG9Xb3JsZCwgdGhpcy53b3JsZFRvU2NyZWVuTWF0cml4KVxuICAgICAgTWF0MmQuaW52ZXJ0KHRoaXMuX3NjcmVlblRvV29ybGQsIHRoaXMuX3NjcmVlblRvV29ybGQpXG4gICAgICB0aGlzLl9zY3JlZW5Ub1dvcmxkT3V0ZGF0ZWQgPSBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2NyZWVuVG9Xb3JsZFxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi92aWV3L2NhbWVyYTJkLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, +/***/ }), /* 29 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _polyLine = __webpack_require__(11);\n\nvar _polyLine2 = _interopRequireDefault(_polyLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Constants = {\n MINIMUM_POINTS: 3\n};\n\nvar Poly = function (_PolyLine) {\n _inherits(Poly, _PolyLine);\n\n function Poly(opts) {\n _classCallCheck(this, Poly);\n\n var _this = _possibleConstructorReturn(this, (Poly.__proto__ || Object.getPrototypeOf(Poly)).call(this, opts));\n\n if (_this._verts.length < Constants.MINIMUM_POINTS) {\n throw new Error(\"Poly shapes must be initialized with an array of 2d points and contain at least 3 points\");\n }\n return _this;\n }\n\n _createClass(Poly, [{\n key: \"removeVert\",\n value: function removeVert(vertIndex) {\n if (this._verts.length < Constants.MINIMUM_POINTS) {\n throw new Error(\"Cannot remove vertex \" + vertIndex + \". It would result in a poly with < 3 points. A poly must contain at least 3 points.\");\n }\n\n _get(Poly.prototype.__proto__ || Object.getPrototypeOf(Poly.prototype), \"removeVert\", this).call(this, vertIndex);\n }\n }, {\n key: \"_draw\",\n value: function _draw(ctx) {\n var rtn = false;\n if (this._verts.length >= Constants.MINIMUM_POINTS) {\n ctx.moveTo(this._verts[0][0], this._verts[0][1]);\n for (var i = 1; i < this._verts.length; i += 1) {\n ctx.lineTo(this._verts[i][0], this._verts[i][1]);\n }\n ctx.closePath();\n rtn = true;\n }\n return rtn;\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return Object.assign(_get(Poly.prototype.__proto__ || Object.getPrototypeOf(Poly.prototype), \"toJSON\", this).call(this), {\n type: \"Poly\" // NOTE: this much match the name of the class\n // This is also supplied after the super.toJSON()\n // so that this type overrides the parent class's\n // type\n });\n }\n }]);\n\n return Poly;\n}(_polyLine2.default);\n\nexports.default = Poly;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFwZXMvcG9seS5qcz8zNmZiIl0sIm5hbWVzIjpbIkNvbnN0YW50cyIsIk1JTklNVU1fUE9JTlRTIiwiUG9seSIsIm9wdHMiLCJfdmVydHMiLCJsZW5ndGgiLCJFcnJvciIsInZlcnRJbmRleCIsImN0eCIsInJ0biIsIm1vdmVUbyIsImkiLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJPYmplY3QiLCJhc3NpZ24iLCJ0eXBlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxZQUFZO0FBQ2hCQyxrQkFBZ0I7QUFEQSxDQUFsQjs7SUFJcUJDLEk7OztBQUNuQixnQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUFBLDRHQUNWQSxJQURVOztBQUVoQixRQUFJLE1BQUtDLE1BQUwsQ0FBWUMsTUFBWixHQUFxQkwsVUFBVUMsY0FBbkMsRUFBbUQ7QUFDakQsWUFBTSxJQUFJSyxLQUFKLENBQVUsMEZBQVYsQ0FBTjtBQUNEO0FBSmU7QUFLakI7Ozs7K0JBRVVDLFMsRUFBVztBQUNwQixVQUFJLEtBQUtILE1BQUwsQ0FBWUMsTUFBWixHQUFxQkwsVUFBVUMsY0FBbkMsRUFBbUQ7QUFDakQsY0FBTSxJQUFJSyxLQUFKLDJCQUFrQ0MsU0FBbEMseUZBQU47QUFDRDs7QUFFRCw2R0FBaUJBLFNBQWpCO0FBQ0Q7OzswQkFHS0MsRyxFQUFLO0FBQ1QsVUFBSUMsTUFBTSxLQUFWO0FBQ0EsVUFBSSxLQUFLTCxNQUFMLENBQVlDLE1BQVosSUFBc0JMLFVBQVVDLGNBQXBDLEVBQW9EO0FBQ2xETyxZQUFJRSxNQUFKLENBQVcsS0FBS04sTUFBTCxDQUFZLENBQVosRUFBZSxDQUFmLENBQVgsRUFBOEIsS0FBS0EsTUFBTCxDQUFZLENBQVosRUFBZSxDQUFmLENBQTlCO0FBQ0EsYUFBSyxJQUFJTyxJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS1AsTUFBTCxDQUFZQyxNQUFoQyxFQUF3Q00sS0FBSyxDQUE3QyxFQUFnRDtBQUM5Q0gsY0FBSUksTUFBSixDQUFXLEtBQUtSLE1BQUwsQ0FBWU8sQ0FBWixFQUFlLENBQWYsQ0FBWCxFQUE4QixLQUFLUCxNQUFMLENBQVlPLENBQVosRUFBZSxDQUFmLENBQTlCO0FBQ0Q7QUFDREgsWUFBSUssU0FBSjtBQUNBSixjQUFNLElBQU47QUFDRDtBQUNELGFBQU9BLEdBQVA7QUFDRDs7OzZCQUVRO0FBQ1AsYUFBT0ssT0FBT0MsTUFBUCxxR0FBOEI7QUFDbkNDLGNBQU0sTUFENkIsQ0FDdEI7QUFDQTtBQUNBO0FBQ0E7QUFKc0IsT0FBOUIsQ0FBUDtBQU1EOzs7Ozs7a0JBckNrQmQsSSIsImZpbGUiOiIyOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmltcG9ydCBQb2x5TGluZSBmcm9tIFwiLi9wb2x5LWxpbmVcIlxuXG5jb25zdCBDb25zdGFudHMgPSB7XG4gIE1JTklNVU1fUE9JTlRTOiAzXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbHkgZXh0ZW5kcyBQb2x5TGluZSB7XG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIGlmICh0aGlzLl92ZXJ0cy5sZW5ndGggPCBDb25zdGFudHMuTUlOSU1VTV9QT0lOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvbHkgc2hhcGVzIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBhcnJheSBvZiAyZCBwb2ludHMgYW5kIGNvbnRhaW4gYXQgbGVhc3QgMyBwb2ludHNcIilcbiAgICB9XG4gIH1cblxuICByZW1vdmVWZXJ0KHZlcnRJbmRleCkge1xuICAgIGlmICh0aGlzLl92ZXJ0cy5sZW5ndGggPCBDb25zdGFudHMuTUlOSU1VTV9QT0lOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbW92ZSB2ZXJ0ZXggJHt2ZXJ0SW5kZXh9LiBJdCB3b3VsZCByZXN1bHQgaW4gYSBwb2x5IHdpdGggPCAzIHBvaW50cy4gQSBwb2x5IG11c3QgY29udGFpbiBhdCBsZWFzdCAzIHBvaW50cy5gKVxuICAgIH1cblxuICAgIHN1cGVyLnJlbW92ZVZlcnQodmVydEluZGV4KVxuICB9XG5cblxuICBfZHJhdyhjdHgpIHtcbiAgICBsZXQgcnRuID0gZmFsc2VcbiAgICBpZiAodGhpcy5fdmVydHMubGVuZ3RoID49IENvbnN0YW50cy5NSU5JTVVNX1BPSU5UUykge1xuICAgICAgY3R4Lm1vdmVUbyh0aGlzLl92ZXJ0c1swXVswXSwgdGhpcy5fdmVydHNbMF1bMV0pXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX3ZlcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGN0eC5saW5lVG8odGhpcy5fdmVydHNbaV1bMF0sIHRoaXMuX3ZlcnRzW2ldWzFdKVxuICAgICAgfVxuICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICBydG4gPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBydG5cbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci50b0pTT04oKSwge1xuICAgICAgdHlwZTogXCJQb2x5XCIgLy8gTk9URTogdGhpcyBtdWNoIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBjbGFzc1xuICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYWxzbyBzdXBwbGllZCBhZnRlciB0aGUgc3VwZXIudG9KU09OKClcbiAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoaXMgdHlwZSBvdmVycmlkZXMgdGhlIHBhcmVudCBjbGFzcydzXG4gICAgICAgICAgICAgICAgICAgLy8gdHlwZVxuICAgIH0pXG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NoYXBlcy9wb2x5LmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n;\n(function (root, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof exports === \"object\") {\n module.exports = factory();\n } else {\n root.ResizeSensor = factory();\n }\n}(this, function () {\n\n //Make sure it does not throw in a SSR (Server Side Rendering) situation\n if (typeof window === \"undefined\") {\n return null;\n }\n // Only used for the dirty checking, so the event callback count is limted to max 1 call per fps per sensor.\n // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and\n // would generate too many unnecessary events.\n var requestAnimationFrame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n function (fn) {\n return window.setTimeout(fn, 20);\n };\n\n /**\n * Iterate over each of the provided element(s).\n *\n * @param {HTMLElement|HTMLElement[]} elements\n * @param {Function} callback\n */\n function forEachElement(elements, callback){\n var elementsType = Object.prototype.toString.call(elements);\n var isCollectionTyped = ('[object Array]' === elementsType\n || ('[object NodeList]' === elementsType)\n || ('[object HTMLCollection]' === elementsType)\n || ('[object Object]' === elementsType)\n || ('undefined' !== typeof jQuery && elements instanceof jQuery) //jquery\n || ('undefined' !== typeof Elements && elements instanceof Elements) //mootools\n );\n var i = 0, j = elements.length;\n if (isCollectionTyped) {\n for (; i < j; i++) {\n callback(elements[i]);\n }\n } else {\n callback(elements);\n }\n }\n\n /**\n * Class for dimension change detection.\n *\n * @param {Element|Element[]|Elements|jQuery} element\n * @param {Function} callback\n *\n * @constructor\n */\n var ResizeSensor = function(element, callback) {\n /**\n *\n * @constructor\n */\n function EventQueue() {\n var q = [];\n this.add = function(ev) {\n q.push(ev);\n };\n\n var i, j;\n this.call = function() {\n for (i = 0, j = q.length; i < j; i++) {\n q[i].call();\n }\n };\n\n this.remove = function(ev) {\n var newQueue = [];\n for(i = 0, j = q.length; i < j; i++) {\n if(q[i] !== ev) newQueue.push(q[i]);\n }\n q = newQueue;\n }\n\n this.length = function() {\n return q.length;\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {String} prop\n * @returns {String|Number}\n */\n function getComputedStyle(element, prop) {\n if (element.currentStyle) {\n return element.currentStyle[prop];\n } else if (window.getComputedStyle) {\n return window.getComputedStyle(element, null).getPropertyValue(prop);\n } else {\n return element.style[prop];\n }\n }\n\n /**\n *\n * @param {HTMLElement} element\n * @param {Function} resized\n */\n function attachResizeEvent(element, resized) {\n if (!element.resizedAttached) {\n element.resizedAttached = new EventQueue();\n element.resizedAttached.add(resized);\n } else if (element.resizedAttached) {\n element.resizedAttached.add(resized);\n return;\n }\n\n element.resizeSensor = document.createElement('div');\n element.resizeSensor.className = 'resize-sensor';\n var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';\n var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';\n\n element.resizeSensor.style.cssText = style;\n element.resizeSensor.innerHTML =\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n element.appendChild(element.resizeSensor);\n\n if (getComputedStyle(element, 'position') == 'static') {\n element.style.position = 'relative';\n }\n\n var expand = element.resizeSensor.childNodes[0];\n var expandChild = expand.childNodes[0];\n var shrink = element.resizeSensor.childNodes[1];\n var dirty, rafId, newWidth, newHeight;\n var lastWidth = element.offsetWidth;\n var lastHeight = element.offsetHeight;\n\n var reset = function() {\n expandChild.style.width = '100000px';\n expandChild.style.height = '100000px';\n\n expand.scrollLeft = 100000;\n expand.scrollTop = 100000;\n\n shrink.scrollLeft = 100000;\n shrink.scrollTop = 100000;\n };\n\n reset();\n\n var onResized = function() {\n rafId = 0;\n\n if (!dirty) return;\n\n lastWidth = newWidth;\n lastHeight = newHeight;\n\n if (element.resizedAttached) {\n element.resizedAttached.call();\n }\n };\n\n var onScroll = function() {\n newWidth = element.offsetWidth;\n newHeight = element.offsetHeight;\n dirty = newWidth != lastWidth || newHeight != lastHeight;\n\n if (dirty && !rafId) {\n rafId = requestAnimationFrame(onResized);\n }\n\n reset();\n };\n\n var addEvent = function(el, name, cb) {\n if (el.attachEvent) {\n el.attachEvent('on' + name, cb);\n } else {\n el.addEventListener(name, cb);\n }\n };\n\n addEvent(expand, 'scroll', onScroll);\n addEvent(shrink, 'scroll', onScroll);\n }\n\n forEachElement(element, function(elem){\n attachResizeEvent(elem, callback);\n });\n\n this.detach = function(ev) {\n ResizeSensor.detach(element, ev);\n };\n };\n\n ResizeSensor.detach = function(element, ev) {\n forEachElement(element, function(elem){\n if(elem.resizedAttached && typeof ev == \"function\"){\n elem.resizedAttached.remove(ev);\n if(elem.resizedAttached.length()) return;\n }\n if (elem.resizeSensor) {\n if (elem.contains(elem.resizeSensor)) {\n elem.removeChild(elem.resizeSensor);\n }\n delete elem.resizeSensor;\n delete elem.resizedAttached;\n }\n });\n };\n\n return ResizeSensor;\n\n}));\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9jc3MtZWxlbWVudC1xdWVyaWVzL3NyYy9SZXNpemVTZW5zb3IuanM/MTljOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQkFBMEI7QUFDekMsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0NBQWtDO0FBQ2pELGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CLG1CQUFtQixPQUFPO0FBQzFCLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsU0FBUyxRQUFRLFVBQVUsV0FBVyxrQkFBa0IsYUFBYSxvQkFBb0I7QUFDckksaURBQWlELFNBQVMsUUFBUSxnQkFBZ0I7O0FBRWxGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQSxDQUFDIiwiZmlsZSI6IjI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgTWFyYyBKLiBTY2htaWR0LiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBhdCB0aGUgdG9wLWxldmVsXG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyBkaXN0cmlidXRpb24gYW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWFyY2ovY3NzLWVsZW1lbnQtcXVlcmllcy9ibG9iL21hc3Rlci9MSUNFTlNFLlxuICovXG47XG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5SZXNpemVTZW5zb3IgPSBmYWN0b3J5KCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAvL01ha2Ugc3VyZSBpdCBkb2VzIG5vdCB0aHJvdyBpbiBhIFNTUiAoU2VydmVyIFNpZGUgUmVuZGVyaW5nKSBzaXR1YXRpb25cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gT25seSB1c2VkIGZvciB0aGUgZGlydHkgY2hlY2tpbmcsIHNvIHRoZSBldmVudCBjYWxsYmFjayBjb3VudCBpcyBsaW10ZWQgdG8gbWF4IDEgY2FsbCBwZXIgZnBzIHBlciBzZW5zb3IuXG4gICAgLy8gSW4gY29tYmluYXRpb24gd2l0aCB0aGUgZXZlbnQgYmFzZWQgcmVzaXplIHNlbnNvciB0aGlzIHNhdmVzIGNwdSB0aW1lLCBiZWNhdXNlIHRoZSBzZW5zb3IgaXMgdG9vIGZhc3QgYW5kXG4gICAgLy8gd291bGQgZ2VuZXJhdGUgdG9vIG1hbnkgdW5uZWNlc3NhcnkgZXZlbnRzLlxuICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmbiwgMjApO1xuICAgICAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZSBvdmVyIGVhY2ggb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQocykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fEhUTUxFbGVtZW50W119IGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2hFbGVtZW50KGVsZW1lbnRzLCBjYWxsYmFjayl7XG4gICAgICAgIHZhciBlbGVtZW50c1R5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbWVudHMpO1xuICAgICAgICB2YXIgaXNDb2xsZWN0aW9uVHlwZWQgPSAoJ1tvYmplY3QgQXJyYXldJyA9PT0gZWxlbWVudHNUeXBlXG4gICAgICAgICAgICB8fCAoJ1tvYmplY3QgTm9kZUxpc3RdJyA9PT0gZWxlbWVudHNUeXBlKVxuICAgICAgICAgICAgfHwgKCdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXScgPT09IGVsZW1lbnRzVHlwZSlcbiAgICAgICAgICAgIHx8ICgnW29iamVjdCBPYmplY3RdJyA9PT0gZWxlbWVudHNUeXBlKVxuICAgICAgICAgICAgfHwgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgalF1ZXJ5ICYmIGVsZW1lbnRzIGluc3RhbmNlb2YgalF1ZXJ5KSAvL2pxdWVyeVxuICAgICAgICAgICAgfHwgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgRWxlbWVudHMgJiYgZWxlbWVudHMgaW5zdGFuY2VvZiBFbGVtZW50cykgLy9tb290b29sc1xuICAgICAgICApO1xuICAgICAgICB2YXIgaSA9IDAsIGogPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb25UeXBlZCkge1xuICAgICAgICAgICAgZm9yICg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlbGVtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyBmb3IgZGltZW5zaW9uIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR8RWxlbWVudFtdfEVsZW1lbnRzfGpRdWVyeX0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICB2YXIgUmVzaXplU2Vuc29yID0gZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRXZlbnRRdWV1ZSgpIHtcbiAgICAgICAgICAgIHZhciBxID0gW107XG4gICAgICAgICAgICB0aGlzLmFkZCA9IGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgICAgICAgICAgcS5wdXNoKGV2KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBpLCBqO1xuICAgICAgICAgICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IHEubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHFbaV0uY2FsbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IoaSA9IDAsIGogPSBxLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZihxW2ldICE9PSBldikgbmV3UXVldWUucHVzaChxW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcSA9IG5ld1F1ZXVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBxLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgIHByb3BcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ3xOdW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIHByb3ApIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmN1cnJlbnRTdHlsZVtwcm9wXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICByZXNpemVkXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBhdHRhY2hSZXNpemVFdmVudChlbGVtZW50LCByZXNpemVkKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQucmVzaXplZEF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZXNpemVkQXR0YWNoZWQgPSBuZXcgRXZlbnRRdWV1ZSgpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVzaXplZEF0dGFjaGVkLmFkZChyZXNpemVkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5yZXNpemVkQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlc2l6ZWRBdHRhY2hlZC5hZGQocmVzaXplZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LnJlc2l6ZVNlbnNvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZWxlbWVudC5yZXNpemVTZW5zb3IuY2xhc3NOYW1lID0gJ3Jlc2l6ZS1zZW5zb3InO1xuICAgICAgICAgICAgdmFyIHN0eWxlID0gJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOyByaWdodDogMDsgYm90dG9tOiAwOyBvdmVyZmxvdzogaGlkZGVuOyB6LWluZGV4OiAtMTsgdmlzaWJpbGl0eTogaGlkZGVuOyc7XG4gICAgICAgICAgICB2YXIgc3R5bGVDaGlsZCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHRvcDogMDsgdHJhbnNpdGlvbjogMHM7JztcblxuICAgICAgICAgICAgZWxlbWVudC5yZXNpemVTZW5zb3Iuc3R5bGUuY3NzVGV4dCA9IHN0eWxlO1xuICAgICAgICAgICAgZWxlbWVudC5yZXNpemVTZW5zb3IuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInJlc2l6ZS1zZW5zb3ItZXhwYW5kXCIgc3R5bGU9XCInICsgc3R5bGUgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiJyArIHN0eWxlQ2hpbGQgKyAnXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicmVzaXplLXNlbnNvci1zaHJpbmtcIiBzdHlsZT1cIicgKyBzdHlsZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCInICsgc3R5bGVDaGlsZCArICcgd2lkdGg6IDIwMCU7IGhlaWdodDogMjAwJVwiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50LnJlc2l6ZVNlbnNvcik7XG5cbiAgICAgICAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBleHBhbmQgPSBlbGVtZW50LnJlc2l6ZVNlbnNvci5jaGlsZE5vZGVzWzBdO1xuICAgICAgICAgICAgdmFyIGV4cGFuZENoaWxkID0gZXhwYW5kLmNoaWxkTm9kZXNbMF07XG4gICAgICAgICAgICB2YXIgc2hyaW5rID0gZWxlbWVudC5yZXNpemVTZW5zb3IuY2hpbGROb2Rlc1sxXTtcbiAgICAgICAgICAgIHZhciBkaXJ0eSwgcmFmSWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgbGFzdFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIHZhciBsYXN0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGV4cGFuZENoaWxkLnN0eWxlLndpZHRoID0gJzEwMDAwMHB4JztcbiAgICAgICAgICAgICAgICBleHBhbmRDaGlsZC5zdHlsZS5oZWlnaHQgPSAnMTAwMDAwcHgnO1xuXG4gICAgICAgICAgICAgICAgZXhwYW5kLnNjcm9sbExlZnQgPSAxMDAwMDA7XG4gICAgICAgICAgICAgICAgZXhwYW5kLnNjcm9sbFRvcCA9IDEwMDAwMDtcblxuICAgICAgICAgICAgICAgIHNocmluay5zY3JvbGxMZWZ0ID0gMTAwMDAwO1xuICAgICAgICAgICAgICAgIHNocmluay5zY3JvbGxUb3AgPSAxMDAwMDA7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXNldCgpO1xuXG4gICAgICAgICAgICB2YXIgb25SZXNpemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkaXJ0eSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgbGFzdFdpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICAgICAgbGFzdEhlaWdodCA9IG5ld0hlaWdodDtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnJlc2l6ZWRBdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlc2l6ZWRBdHRhY2hlZC5jYWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIG9uU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGRpcnR5ID0gbmV3V2lkdGggIT0gbGFzdFdpZHRoIHx8IG5ld0hlaWdodCAhPSBsYXN0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGRpcnR5ICYmICFyYWZJZCkge1xuICAgICAgICAgICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShvblJlc2l6ZWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgYWRkRXZlbnQgPSBmdW5jdGlvbihlbCwgbmFtZSwgY2IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuYXR0YWNoRXZlbnQoJ29uJyArIG5hbWUsIGNiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhZGRFdmVudChleHBhbmQsICdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICAgICAgICBhZGRFdmVudChzaHJpbmssICdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoRWxlbWVudChlbGVtZW50LCBmdW5jdGlvbihlbGVtKXtcbiAgICAgICAgICAgIGF0dGFjaFJlc2l6ZUV2ZW50KGVsZW0sIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbihldikge1xuICAgICAgICAgICAgUmVzaXplU2Vuc29yLmRldGFjaChlbGVtZW50LCBldik7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIFJlc2l6ZVNlbnNvci5kZXRhY2ggPSBmdW5jdGlvbihlbGVtZW50LCBldikge1xuICAgICAgICBmb3JFYWNoRWxlbWVudChlbGVtZW50LCBmdW5jdGlvbihlbGVtKXtcbiAgICAgICAgICAgIGlmKGVsZW0ucmVzaXplZEF0dGFjaGVkICYmIHR5cGVvZiBldiA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgICAgICAgICAgIGVsZW0ucmVzaXplZEF0dGFjaGVkLnJlbW92ZShldik7XG4gICAgICAgICAgICAgICAgaWYoZWxlbS5yZXNpemVkQXR0YWNoZWQubGVuZ3RoKCkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLnJlc2l6ZVNlbnNvcikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmNvbnRhaW5zKGVsZW0ucmVzaXplU2Vuc29yKSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNoaWxkKGVsZW0ucmVzaXplU2Vuc29yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVsZW0ucmVzaXplU2Vuc29yO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtLnJlc2l6ZWRBdHRhY2hlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXNpemVTZW5zb3I7XG5cbn0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vY3NzLWVsZW1lbnQtcXVlcmllcy9zcmMvUmVzaXplU2Vuc29yLmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9"); -/***/ }, +/***/ }), /* 30 */ -/***/ function(module, exports) { +/***/ (function(module, exports) { - eval("/* eslint-disable func-names */\n\"use strict\";\n\n/**\n * Gets the pixel ratio of a specific HTML canvas 2d context\n * @param {CanvasRenderingContext2D} canvasCtx\n * @return {number} pixel ratio of the canvas 2d context\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getPixelRatio = getPixelRatio;\nexports.makeCanvasAutoHighDPI = makeCanvasAutoHighDPI;\nfunction getPixelRatio(canvasCtx) {\n var backingStore = canvasCtx.backingStorePixelRatio || canvasCtx.webkitBackingStorePixelRatio || canvasCtx.mozBackingStorePixelRatio || canvasCtx.msBackingStorePixelRatio || canvasCtx.oBackingStorePixelRatio || canvasCtx.backingStorePixelRatio || 1;\n\n return (window.devicePixelRatio || 1) / backingStore;\n}\n\n/**\n * Wraps certain canvas 2d context APIs to handle\n * displays with high per-pixel ratios. This is useful\n * so that the API can be called with screen-space coordinates\n * and the wrappers modify the arguments of those APIs to properly\n * handle displays with high pixel densities\n * @param {CanvasRenderingContext2D} canvasCtx\n * @return {number} pixel ratio of the wrapped canvas context\n */\nfunction makeCanvasAutoHighDPI(canvasCtx) {\n var pixelRatio = getPixelRatio(canvasCtx);\n\n if (pixelRatio === 1) {\n return 1;\n }\n\n var allRatioArgs = [\"fillRect\", \"clearRect\", \"strokeRect\",\n // \"moveTo\",\n // \"lineTo\",\n // \"arcTo\",\n // \"bezierCurveTo\",\n \"isPointInPath\", \"isPointInStroke\"\n // \"quadraticCurveTo\",\n // \"rect\",\n // \"translate\",\n // \"createRadialGradient\",\n // \"createLinearGradient\"\n ];\n\n allRatioArgs.forEach(function (funcName) {\n canvasCtx[funcName] = function (_super) {\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args = args.map(function (a) {\n return a * pixelRatio;\n });\n\n return _super.apply(this, args);\n };\n }(canvasCtx[funcName]);\n });\n\n // const ratioArgsByIndex = {\n // arc: [0, 1, 2]\n // }\n\n // Object.getOwnPropertyNames(ratioArgsByIndex).forEach(funcName => {\n // const value = ratioArgsByIndex[funcName]\n // canvasCtx[funcName] = (function(_super) {\n // return function(...args) {\n // let i = 0\n // let len = 0\n // for (i = 0, len = value.length; i < len; i += 1) {\n // args[value[i]] *= pixelRatio\n // }\n // return _super.apply(this, args)\n // }\n // })(canvasCtx[funcName])\n // })\n\n // // Stroke lineWidth adjustment\n // canvasCtx.stroke = (function(_super) {\n // return function(...args) {\n // this.lineWidth *= pixelRatio\n // _super.apply(this, args)\n // this.lineWidth /= pixelRatio\n // }\n // })(canvasCtx.stroke)\n\n // // Text\n // //\n // canvasCtx.fillText = (function(_super) {\n // return function(...args) {\n // args[1] *= pixelRatio // x\n // args[2] *= pixelRatio // y\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m * pixelRatio) + u\n // }\n // )\n\n // _super.apply(this, args)\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m / pixelRatio) + u\n // }\n // )\n // }\n // })(canvasCtx.fillText)\n\n // canvasCtx.strokeText = (function(_super) {\n // return function(...args) {\n // args[1] *= pixelRatio // x\n // args[2] *= pixelRatio // y\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m * pixelRatio) + u\n // }\n // )\n\n // _super.apply(this, args)\n\n // this.font = this.font.replace(\n // /(\\d+)(px|em|rem|pt)/g,\n // function(w, m, u) {\n // return (m / pixelRatio) + u\n // }\n // )\n // }\n // })(canvasCtx.strokeText)\n\n\n var setTransformArgs = [pixelRatio, 0, 0, pixelRatio, 0, 0];\n canvasCtx.setTransform = function (_super) {\n return function () {\n _super.apply(this, setTransformArgs);\n this.transform.apply(this, arguments);\n };\n }(canvasCtx.setTransform);\n\n return pixelRatio;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL2NhbnZhcy11dGlscy5qcz84MjExIl0sIm5hbWVzIjpbImdldFBpeGVsUmF0aW8iLCJtYWtlQ2FudmFzQXV0b0hpZ2hEUEkiLCJjYW52YXNDdHgiLCJiYWNraW5nU3RvcmUiLCJiYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwid2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyIsIm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJtc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJvQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJwaXhlbFJhdGlvIiwiYWxsUmF0aW9BcmdzIiwiZm9yRWFjaCIsImZ1bmNOYW1lIiwiX3N1cGVyIiwiYXJncyIsIm1hcCIsImEiLCJhcHBseSIsInNldFRyYW5zZm9ybUFyZ3MiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztRQUtnQkEsYSxHQUFBQSxhO1FBb0JBQyxxQixHQUFBQSxxQjtBQXBCVCxTQUFTRCxhQUFULENBQXVCRSxTQUF2QixFQUFrQztBQUN2QyxNQUFNQyxlQUFlRCxVQUFVRSxzQkFBVixJQUNuQkYsVUFBVUcsNEJBRFMsSUFFbkJILFVBQVVJLHlCQUZTLElBR25CSixVQUFVSyx3QkFIUyxJQUluQkwsVUFBVU0sdUJBSlMsSUFLbkJOLFVBQVVFLHNCQUxTLElBS2lCLENBTHRDOztBQU9BLFNBQU8sQ0FBQ0ssT0FBT0MsZ0JBQVAsSUFBMkIsQ0FBNUIsSUFBaUNQLFlBQXhDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OztBQVNPLFNBQVNGLHFCQUFULENBQStCQyxTQUEvQixFQUEwQztBQUMvQyxNQUFNUyxhQUFhWCxjQUFjRSxTQUFkLENBQW5COztBQUVBLE1BQUlTLGVBQWUsQ0FBbkIsRUFBc0I7QUFDcEIsV0FBTyxDQUFQO0FBQ0Q7O0FBRUQsTUFBTUMsZUFBZSxDQUNuQixVQURtQixFQUVuQixXQUZtQixFQUduQixZQUhtQjtBQUluQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQVJtQixFQVNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkbUIsR0FBckI7O0FBaUJBQSxlQUFhQyxPQUFiLENBQXFCLG9CQUFZO0FBQy9CWCxjQUFVWSxRQUFWLElBQXVCLFVBQVNDLE1BQVQsRUFBaUI7QUFDdEMsYUFBTyxZQUFrQjtBQUFBLDBDQUFOQyxJQUFNO0FBQU5BLGNBQU07QUFBQTs7QUFDdkJBLGVBQU9BLEtBQUtDLEdBQUwsQ0FBUyxVQUFDQyxDQUFEO0FBQUEsaUJBQU9BLElBQUlQLFVBQVg7QUFBQSxTQUFULENBQVA7O0FBRUEsZUFBT0ksT0FBT0ksS0FBUCxDQUFhLElBQWIsRUFBbUJILElBQW5CLENBQVA7QUFDRCxPQUpEO0FBS0QsS0FOcUIsQ0FNbkJkLFVBQVVZLFFBQVYsQ0FObUIsQ0FBdEI7QUFPRCxHQVJEOztBQVVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsTUFBTU0sbUJBQW1CLENBQUNULFVBQUQsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CQSxVQUFuQixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxDQUF6QjtBQUNBVCxZQUFVbUIsWUFBVixHQUEwQixVQUFTTixNQUFULEVBQWlCO0FBQ3pDLFdBQU8sWUFBa0I7QUFDdkJBLGFBQU9JLEtBQVAsQ0FBYSxJQUFiLEVBQW1CQyxnQkFBbkI7QUFDQSxXQUFLRSxTQUFMO0FBQ0QsS0FIRDtBQUlELEdBTHdCLENBS3RCcEIsVUFBVW1CLFlBTFksQ0FBekI7O0FBT0EsU0FBT1YsVUFBUDtBQUNEIiwiZmlsZSI6IjMwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgZnVuYy1uYW1lcyAqL1xuXCJ1c2Ugc3RyaWN0XCJcblxuLyoqXG4gKiBHZXRzIHRoZSBwaXhlbCByYXRpbyBvZiBhIHNwZWNpZmljIEhUTUwgY2FudmFzIDJkIGNvbnRleHRcbiAqIEBwYXJhbSAge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY2FudmFzQ3R4XG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgICBwaXhlbCByYXRpbyBvZiB0aGUgY2FudmFzIDJkIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBpeGVsUmF0aW8oY2FudmFzQ3R4KSB7XG4gIGNvbnN0IGJhY2tpbmdTdG9yZSA9IGNhbnZhc0N0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY2FudmFzQ3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjYW52YXNDdHgubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNhbnZhc0N0eC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjYW52YXNDdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjYW52YXNDdHguYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCAxXG5cbiAgcmV0dXJuICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIGJhY2tpbmdTdG9yZVxufVxuXG4vKipcbiAqIFdyYXBzIGNlcnRhaW4gY2FudmFzIDJkIGNvbnRleHQgQVBJcyB0byBoYW5kbGVcbiAqIGRpc3BsYXlzIHdpdGggaGlnaCBwZXItcGl4ZWwgcmF0aW9zLiBUaGlzIGlzIHVzZWZ1bFxuICogc28gdGhhdCB0aGUgQVBJIGNhbiBiZSBjYWxsZWQgd2l0aCBzY3JlZW4tc3BhY2UgY29vcmRpbmF0ZXNcbiAqIGFuZCB0aGUgd3JhcHBlcnMgbW9kaWZ5IHRoZSBhcmd1bWVudHMgb2YgdGhvc2UgQVBJcyB0byBwcm9wZXJseVxuICogaGFuZGxlIGRpc3BsYXlzIHdpdGggaGlnaCBwaXhlbCBkZW5zaXRpZXNcbiAqIEBwYXJhbSAge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY2FudmFzQ3R4XG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgICBwaXhlbCByYXRpbyBvZiB0aGUgd3JhcHBlZCBjYW52YXMgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNhbnZhc0F1dG9IaWdoRFBJKGNhbnZhc0N0eCkge1xuICBjb25zdCBwaXhlbFJhdGlvID0gZ2V0UGl4ZWxSYXRpbyhjYW52YXNDdHgpXG5cbiAgaWYgKHBpeGVsUmF0aW8gPT09IDEpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgY29uc3QgYWxsUmF0aW9BcmdzID0gW1xuICAgIFwiZmlsbFJlY3RcIixcbiAgICBcImNsZWFyUmVjdFwiLFxuICAgIFwic3Ryb2tlUmVjdFwiLFxuICAgIC8vIFwibW92ZVRvXCIsXG4gICAgLy8gXCJsaW5lVG9cIixcbiAgICAvLyBcImFyY1RvXCIsXG4gICAgLy8gXCJiZXppZXJDdXJ2ZVRvXCIsXG4gICAgXCJpc1BvaW50SW5QYXRoXCIsXG4gICAgXCJpc1BvaW50SW5TdHJva2VcIlxuICAgIC8vIFwicXVhZHJhdGljQ3VydmVUb1wiLFxuICAgIC8vIFwicmVjdFwiLFxuICAgIC8vIFwidHJhbnNsYXRlXCIsXG4gICAgLy8gXCJjcmVhdGVSYWRpYWxHcmFkaWVudFwiLFxuICAgIC8vIFwiY3JlYXRlTGluZWFyR3JhZGllbnRcIlxuICBdXG5cbiAgYWxsUmF0aW9BcmdzLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAgIGNhbnZhc0N0eFtmdW5jTmFtZV0gPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICBhcmdzID0gYXJncy5tYXAoKGEpID0+IGEgKiBwaXhlbFJhdGlvKVxuXG4gICAgICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgICAgIH1cbiAgICB9KShjYW52YXNDdHhbZnVuY05hbWVdKVxuICB9KVxuXG4gIC8vIGNvbnN0IHJhdGlvQXJnc0J5SW5kZXggPSB7XG4gIC8vICAgYXJjOiBbMCwgMSwgMl1cbiAgLy8gfVxuXG4gIC8vIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJhdGlvQXJnc0J5SW5kZXgpLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAvLyAgIGNvbnN0IHZhbHVlID0gcmF0aW9BcmdzQnlJbmRleFtmdW5jTmFtZV1cbiAgLy8gICBjYW52YXNDdHhbZnVuY05hbWVdID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAvLyAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgLy8gICAgICAgbGV0IGkgPSAwXG4gIC8vICAgICAgIGxldCBsZW4gPSAwXG4gIC8vICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gIC8vICAgICAgICAgYXJnc1t2YWx1ZVtpXV0gKj0gcGl4ZWxSYXRpb1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgLy8gICAgIH1cbiAgLy8gICB9KShjYW52YXNDdHhbZnVuY05hbWVdKVxuICAvLyB9KVxuXG4gIC8vIC8vIFN0cm9rZSBsaW5lV2lkdGggYWRqdXN0bWVudFxuICAvLyBjYW52YXNDdHguc3Ryb2tlID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAvLyAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gIC8vICAgICB0aGlzLmxpbmVXaWR0aCAqPSBwaXhlbFJhdGlvXG4gIC8vICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgLy8gICAgIHRoaXMubGluZVdpZHRoIC89IHBpeGVsUmF0aW9cbiAgLy8gICB9XG4gIC8vIH0pKGNhbnZhc0N0eC5zdHJva2UpXG5cbiAgLy8gLy8gVGV4dFxuICAvLyAvL1xuICAvLyBjYW52YXNDdHguZmlsbFRleHQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gIC8vICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgLy8gICAgIGFyZ3NbMV0gKj0gcGl4ZWxSYXRpbyAvLyB4XG4gIC8vICAgICBhcmdzWzJdICo9IHBpeGVsUmF0aW8gLy8geVxuXG4gIC8vICAgICB0aGlzLmZvbnQgPSB0aGlzLmZvbnQucmVwbGFjZShcbiAgLy8gICAgICAgLyhcXGQrKShweHxlbXxyZW18cHQpL2csXG4gIC8vICAgICAgIGZ1bmN0aW9uKHcsIG0sIHUpIHtcbiAgLy8gICAgICAgICByZXR1cm4gKG0gKiBwaXhlbFJhdGlvKSArIHVcbiAgLy8gICAgICAgfVxuICAvLyAgICAgKVxuXG4gIC8vICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcblxuICAvLyAgICAgdGhpcy5mb250ID0gdGhpcy5mb250LnJlcGxhY2UoXG4gIC8vICAgICAgIC8oXFxkKykocHh8ZW18cmVtfHB0KS9nLFxuICAvLyAgICAgICBmdW5jdGlvbih3LCBtLCB1KSB7XG4gIC8vICAgICAgICAgcmV0dXJuIChtIC8gcGl4ZWxSYXRpbykgKyB1XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIClcbiAgLy8gICB9XG4gIC8vIH0pKGNhbnZhc0N0eC5maWxsVGV4dClcblxuICAvLyBjYW52YXNDdHguc3Ryb2tlVGV4dCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgLy8gICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAvLyAgICAgYXJnc1sxXSAqPSBwaXhlbFJhdGlvIC8vIHhcbiAgLy8gICAgIGFyZ3NbMl0gKj0gcGl4ZWxSYXRpbyAvLyB5XG5cbiAgLy8gICAgIHRoaXMuZm9udCA9IHRoaXMuZm9udC5yZXBsYWNlKFxuICAvLyAgICAgICAvKFxcZCspKHB4fGVtfHJlbXxwdCkvZyxcbiAgLy8gICAgICAgZnVuY3Rpb24odywgbSwgdSkge1xuICAvLyAgICAgICAgIHJldHVybiAobSAqIHBpeGVsUmF0aW8pICsgdVxuICAvLyAgICAgICB9XG4gIC8vICAgICApXG5cbiAgLy8gICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuXG4gIC8vICAgICB0aGlzLmZvbnQgPSB0aGlzLmZvbnQucmVwbGFjZShcbiAgLy8gICAgICAgLyhcXGQrKShweHxlbXxyZW18cHQpL2csXG4gIC8vICAgICAgIGZ1bmN0aW9uKHcsIG0sIHUpIHtcbiAgLy8gICAgICAgICByZXR1cm4gKG0gLyBwaXhlbFJhdGlvKSArIHVcbiAgLy8gICAgICAgfVxuICAvLyAgICAgKVxuICAvLyAgIH1cbiAgLy8gfSkoY2FudmFzQ3R4LnN0cm9rZVRleHQpXG5cblxuICBjb25zdCBzZXRUcmFuc2Zvcm1BcmdzID0gW3BpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDBdXG4gIGNhbnZhc0N0eC5zZXRUcmFuc2Zvcm0gPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBzZXRUcmFuc2Zvcm1BcmdzKVxuICAgICAgdGhpcy50cmFuc2Zvcm0oLi4uYXJncylcbiAgICB9XG4gIH0pKGNhbnZhc0N0eC5zZXRUcmFuc2Zvcm0pXG5cbiAgcmV0dXJuIHBpeGVsUmF0aW9cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3V0aWwvY2FudmFzLXV0aWxzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("module.exports = {\n\t\"name\": \"@mapd/mapd-draw\",\n\t\"description\": \"A Utility Library for drawing and interacting with shapes using canvas\",\n\t\"version\": \"1.1.0\",\n\t\"homepage\": \"https://omnisci.com\",\n\t\"bugs\": \"https://github.com/omnisci/mapd-draw/issues\",\n\t\"main\": \"dist/mapd-draw.js\",\n\t\"author\": \"MapD Technologies\",\n\t\"license\": \"MIT\",\n\t\"engines\": {\n\t\t\"node\": \">=4.0.0\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/omnisci/mapd-draw.git\"\n\t},\n\t\"dependencies\": {\n\t\t\"gl-matrix\": \"^2.3.2\",\n\t\t\"css-element-queries\": \"^0.4.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"babel-core\": \"^6.10.4\",\n\t\t\"babel-eslint\": \"^10.0.1\",\n\t\t\"babel-loader\": \"^6.2.4\",\n\t\t\"babel-preset-es2015\": \"^6.9.0\",\n\t\t\"babel-preset-stage-0\": \"^6.5.0\",\n\t\t\"babel-register\": \"^6.24.1\",\n\t\t\"chai\": \"^3.5.0\",\n\t\t\"eslint\": \"^3.0.1\",\n\t\t\"eslint-plugin-react\": \"^7.12.4\",\n\t\t\"http-server\": \"^0.11.1\",\n\t\t\"json-loader\": \"0.5.4\",\n\t\t\"mocha\": \"^6.0.2\",\n\t\t\"pre-commit\": \"^1.2.2\",\n\t\t\"webpack\": \"^1.13.1\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"npm run build:prod; npm run build:dev\",\n\t\t\"build:prod\": \"npm run webpack\",\n\t\t\"build:dev\": \"npm run webpack:dev\",\n\t\t\"clean\": \"bash scripts/clean.sh\",\n\t\t\"eslint\": \"eslint -c ./.eslintrc.json\",\n\t\t\"lint-fix\": \"eslint --fix $(find src -name \\\"*.js\\\" ! -name '*.spec.js')\",\n\t\t\"lint\": \"eslint $(find src -name \\\"*.js\\\" ! -name '*.spec.js')\",\n\t\t\"start\": \"npm run build; http-server -p 8080 -o;\",\n\t\t\"watch:dev\": \"node node_modules/webpack/bin/webpack.js --progress --colors --watch --config webpack.dev.config.js\",\n\t\t\"webpack\": \"node node_modules/webpack/bin/webpack.js\",\n\t\t\"webpack:dev\": \"node node_modules/webpack/bin/webpack.js --config webpack.dev.config.js\",\n\t\t\"test\": \"mocha --recursive --require babel-register\"\n\t},\n\t\"pre-commit\": [\n\t\t\"lint\",\n\t\t\"test\"\n\t]\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vcGFja2FnZS5qc29uPzBmYTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsd0JBQXdCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0XCJuYW1lXCI6IFwiQG1hcGQvbWFwZC1kcmF3XCIsXG5cdFwiZGVzY3JpcHRpb25cIjogXCJBIFV0aWxpdHkgTGlicmFyeSBmb3IgZHJhd2luZyBhbmQgaW50ZXJhY3Rpbmcgd2l0aCBzaGFwZXMgdXNpbmcgY2FudmFzXCIsXG5cdFwidmVyc2lvblwiOiBcIjEuMS4wXCIsXG5cdFwiaG9tZXBhZ2VcIjogXCJodHRwczovL29tbmlzY2kuY29tXCIsXG5cdFwiYnVnc1wiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9vbW5pc2NpL21hcGQtZHJhdy9pc3N1ZXNcIixcblx0XCJtYWluXCI6IFwiZGlzdC9tYXBkLWRyYXcuanNcIixcblx0XCJhdXRob3JcIjogXCJNYXBEIFRlY2hub2xvZ2llc1wiLFxuXHRcImxpY2Vuc2VcIjogXCJNSVRcIixcblx0XCJlbmdpbmVzXCI6IHtcblx0XHRcIm5vZGVcIjogXCI+PTQuMC4wXCJcblx0fSxcblx0XCJyZXBvc2l0b3J5XCI6IHtcblx0XHRcInR5cGVcIjogXCJnaXRcIixcblx0XHRcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vb21uaXNjaS9tYXBkLWRyYXcuZ2l0XCJcblx0fSxcblx0XCJkZXBlbmRlbmNpZXNcIjoge1xuXHRcdFwiZ2wtbWF0cml4XCI6IFwiXjIuMy4yXCIsXG5cdFx0XCJjc3MtZWxlbWVudC1xdWVyaWVzXCI6IFwiXjAuNC4wXCJcblx0fSxcblx0XCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuXHRcdFwiYmFiZWwtY29yZVwiOiBcIl42LjEwLjRcIixcblx0XHRcImJhYmVsLWVzbGludFwiOiBcIl4xMC4wLjFcIixcblx0XHRcImJhYmVsLWxvYWRlclwiOiBcIl42LjIuNFwiLFxuXHRcdFwiYmFiZWwtcHJlc2V0LWVzMjAxNVwiOiBcIl42LjkuMFwiLFxuXHRcdFwiYmFiZWwtcHJlc2V0LXN0YWdlLTBcIjogXCJeNi41LjBcIixcblx0XHRcImJhYmVsLXJlZ2lzdGVyXCI6IFwiXjYuMjQuMVwiLFxuXHRcdFwiY2hhaVwiOiBcIl4zLjUuMFwiLFxuXHRcdFwiZXNsaW50XCI6IFwiXjMuMC4xXCIsXG5cdFx0XCJlc2xpbnQtcGx1Z2luLXJlYWN0XCI6IFwiXjcuMTIuNFwiLFxuXHRcdFwiaHR0cC1zZXJ2ZXJcIjogXCJeMC4xMS4xXCIsXG5cdFx0XCJqc29uLWxvYWRlclwiOiBcIjAuNS40XCIsXG5cdFx0XCJtb2NoYVwiOiBcIl42LjAuMlwiLFxuXHRcdFwicHJlLWNvbW1pdFwiOiBcIl4xLjIuMlwiLFxuXHRcdFwid2VicGFja1wiOiBcIl4xLjEzLjFcIlxuXHR9LFxuXHRcInNjcmlwdHNcIjoge1xuXHRcdFwiYnVpbGRcIjogXCJucG0gcnVuIGJ1aWxkOnByb2Q7IG5wbSBydW4gYnVpbGQ6ZGV2XCIsXG5cdFx0XCJidWlsZDpwcm9kXCI6IFwibnBtIHJ1biB3ZWJwYWNrXCIsXG5cdFx0XCJidWlsZDpkZXZcIjogXCJucG0gcnVuIHdlYnBhY2s6ZGV2XCIsXG5cdFx0XCJjbGVhblwiOiBcImJhc2ggc2NyaXB0cy9jbGVhbi5zaFwiLFxuXHRcdFwiZXNsaW50XCI6IFwiZXNsaW50IC1jIC4vLmVzbGludHJjLmpzb25cIixcblx0XHRcImxpbnQtZml4XCI6IFwiZXNsaW50IC0tZml4ICQoZmluZCBzcmMgLW5hbWUgXFxcIiouanNcXFwiICEgLW5hbWUgJyouc3BlYy5qcycpXCIsXG5cdFx0XCJsaW50XCI6IFwiZXNsaW50ICQoZmluZCBzcmMgLW5hbWUgXFxcIiouanNcXFwiICEgLW5hbWUgJyouc3BlYy5qcycpXCIsXG5cdFx0XCJzdGFydFwiOiBcIm5wbSBydW4gYnVpbGQ7IGh0dHAtc2VydmVyIC1wIDgwODAgLW87XCIsXG5cdFx0XCJ3YXRjaDpkZXZcIjogXCJub2RlIG5vZGVfbW9kdWxlcy93ZWJwYWNrL2Jpbi93ZWJwYWNrLmpzIC0tcHJvZ3Jlc3MgLS1jb2xvcnMgLS13YXRjaCAtLWNvbmZpZyB3ZWJwYWNrLmRldi5jb25maWcuanNcIixcblx0XHRcIndlYnBhY2tcIjogXCJub2RlIG5vZGVfbW9kdWxlcy93ZWJwYWNrL2Jpbi93ZWJwYWNrLmpzXCIsXG5cdFx0XCJ3ZWJwYWNrOmRldlwiOiBcIm5vZGUgbm9kZV9tb2R1bGVzL3dlYnBhY2svYmluL3dlYnBhY2suanMgLS1jb25maWcgd2VicGFjay5kZXYuY29uZmlnLmpzXCIsXG5cdFx0XCJ0ZXN0XCI6IFwibW9jaGEgLS1yZWN1cnNpdmUgLS1yZXF1aXJlIGJhYmVsLXJlZ2lzdGVyXCJcblx0fSxcblx0XCJwcmUtY29tbWl0XCI6IFtcblx0XHRcImxpbnRcIixcblx0XHRcInRlc3RcIlxuXHRdXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL3BhY2thZ2UuanNvblxuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ=="); -/***/ }, -/* 31 */ -/***/ function(module, exports) { - - eval("\"use strict\";\n\n/**\n * Binds a this arg to a list of different function names.\n * This is most widely used to bind a this to member functions\n * that are used as callbacks in some fashion\n * @param {string[]} funcNames array of member function names that are part of thisArg\n * @param {Object} thisArg object to bind\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.bindAll = bindAll;\nfunction bindAll(funcNames, thisArg) {\n funcNames.forEach(function (funcName) {\n if (!thisArg[funcName]) {\n return;\n }\n thisArg[funcName] = thisArg[funcName].bind(thisArg);\n });\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL3V0aWxzLmpzPzMxMzEiXSwibmFtZXMiOlsiYmluZEFsbCIsImZ1bmNOYW1lcyIsInRoaXNBcmciLCJmb3JFYWNoIiwiZnVuY05hbWUiLCJiaW5kIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTs7Ozs7Ozs7Ozs7UUFPZ0JBLE8sR0FBQUEsTztBQUFULFNBQVNBLE9BQVQsQ0FBaUJDLFNBQWpCLEVBQTRCQyxPQUE1QixFQUFxQztBQUMxQ0QsWUFBVUUsT0FBVixDQUFrQixvQkFBWTtBQUM1QixRQUFJLENBQUNELFFBQVFFLFFBQVIsQ0FBTCxFQUF3QjtBQUN0QjtBQUNEO0FBQ0RGLFlBQVFFLFFBQVIsSUFBb0JGLFFBQVFFLFFBQVIsRUFBa0JDLElBQWxCLENBQXVCSCxPQUF2QixDQUFwQjtBQUNELEdBTEQ7QUFNRCIsImZpbGUiOiIzMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbi8qKlxuICogQmluZHMgYSB0aGlzIGFyZyB0byBhIGxpc3Qgb2YgZGlmZmVyZW50IGZ1bmN0aW9uIG5hbWVzLlxuICogVGhpcyBpcyBtb3N0IHdpZGVseSB1c2VkIHRvIGJpbmQgYSB0aGlzIHRvIG1lbWJlciBmdW5jdGlvbnNcbiAqIHRoYXQgYXJlIHVzZWQgYXMgY2FsbGJhY2tzIGluIHNvbWUgZmFzaGlvblxuICogQHBhcmFtICB7c3RyaW5nW119IGZ1bmNOYW1lcyBhcnJheSBvZiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzQXJnXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRoaXNBcmcgICBvYmplY3QgdG8gYmluZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEFsbChmdW5jTmFtZXMsIHRoaXNBcmcpIHtcbiAgZnVuY05hbWVzLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAgIGlmICghdGhpc0FyZ1tmdW5jTmFtZV0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzQXJnW2Z1bmNOYW1lXSA9IHRoaXNBcmdbZnVuY05hbWVdLmJpbmQodGhpc0FyZylcbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3V0aWwvdXRpbHMuanMiXSwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 32 */ -/***/ function(module, exports, __webpack_require__) { - - eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _aabox2d = __webpack_require__(2);\n\nvar AABox2d = _interopRequireWildcard(_aabox2d);\n\nvar _aggregation2 = __webpack_require__(8);\n\nvar _aggregation3 = _interopRequireDefault(_aggregation2);\n\nvar _transform2d = __webpack_require__(12);\n\nvar _eventHandler = __webpack_require__(13);\n\nvar _eventHandler2 = _interopRequireDefault(_eventHandler);\n\nvar _mat2d = __webpack_require__(5);\n\nvar _mat2d2 = _interopRequireDefault(_mat2d);\n\nvar _glMatrix = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Camera modification event\n * @event EventedCamera#changed\n * @type {object}\n * @property {string} attr Name of the attribute modified\n * @property {} prevVal Previous value of the attribute prior to modification\n * @property {} currVal Value of the attribute post modification\n */\n\n/**\n * @class Base camera class for 2d screen projections\n * The base class is used only for the NDC to screen space trasform\n * @extends {EventHandler}\n */\nvar BaseCamera2d = function (_EventHandler) {\n _inherits(BaseCamera2d, _EventHandler);\n\n /**\n * Constructs a new 2d camera\n * @param {AABox2d} viewport Initial camera viewport boundary, in pixels\n * @param {Vec2d} projectionDimensions The width and height of the viewport in world coordinates\n * @param {Boolean} [flipY=false] Whether world y coordinates are flipped, if false\n * the top of the viewport window is smaller in y, and the bottom\n * is larger. If true, the bottom has smaller y coords, and the top\n * larger\n * @return {BaseCamera2d}\n */\n function BaseCamera2d(viewport, projectionDimensions) {\n var flipY = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n _classCallCheck(this, BaseCamera2d);\n\n var _this = _possibleConstructorReturn(this, (BaseCamera2d.__proto__ || Object.getPrototypeOf(BaseCamera2d)).call(this, [\"changed\", \"changed:xform\"]));\n // initialize modify events\n\n\n _this._viewport = AABox2d.clone(viewport);\n _this._projectionDimensions = _glMatrix.vec2.clone(projectionDimensions);\n _this._yflip = flipY;\n\n // stores the NDC space to screen space matrix\n // NDC (normalized device coordinates) is the space\n // where the left edge of the window is -1, the right edge is 1\n // the top edge is -1, and the bottom edge is 1.\n _this._screenMatrix = _mat2d2.default.create();\n\n // this flag is dirty whenever the attributes for the\n // ndc-to-screen projection are modified\n _this._screenDirty = true;\n return _this;\n }\n\n /**\n * Returns true if the world Y coordinates go from negative to positive\n * in a bottom to top fashion in screen space, false otherwise.\n * @return {Boolean}\n */\n\n\n _createClass(BaseCamera2d, [{\n key: \"isYFlipped\",\n value: function isYFlipped() {\n return this._yflip;\n }\n\n /**\n * Sets the camera's screen-space viewport bounds\n * @param {AABox2d} viewport\n * @fires EventedCamera#changed\n * @return {BaseCamera2d}\n */\n\n }, {\n key: \"viewport\",\n set: function set(viewport) {\n if (!AABox2d.equals(viewport, this._viewport)) {\n var prev = AABox2d.clone(this._viewport);\n AABox2d.copy(this._viewport, viewport);\n this._screenDirty = true;\n this._worldToScreenOutdated = true;\n this.fire(\"changed\", {\n attr: \"viewport\",\n prevVal: prev,\n currVal: viewport\n });\n }\n return this;\n }\n\n /**\n * Gets a copy of the camera's current viewport\n * @return {AABox2d}\n */\n ,\n get: function get() {\n return AABox2d.clone(this._viewport);\n }\n\n /**\n * Gets a reference to the camera's current viewport\n * @return {AABox2d}\n * @readOnly\n */\n\n }, {\n key: \"viewportRef\",\n get: function get() {\n return this._viewport;\n }\n\n /**\n * Gets the current NDC to screen space transform matrix\n * @return {Mat2d}\n */\n\n }, {\n key: \"screenMatrix\",\n get: function get() {\n if (this._screenDirty) {\n var center = [0, 0];\n var extents = [0, 0];\n AABox2d.getCenter(center, this._viewport);\n AABox2d.getExtents(extents, this._viewport);\n _mat2d2.default.set(this._screenMatrix, extents[0], 0, 0, extents[1], center[0], center[1]);\n this._worldToScreenOutdated = true;\n this._screenDirty = false;\n }\n return this._screenMatrix;\n }\n }]);\n\n return BaseCamera2d;\n}(_eventHandler2.default);\n\n/**\n * @class Main 2d camera class to manage othographic 2d projections\n * @extends {BaseCamera2d}\n * @mixin {EventedTransform2d}\n */\n\n\nvar Camera2d = function (_aggregation) {\n _inherits(Camera2d, _aggregation);\n\n /**\n * Creates a new Camera2d object\n * @param {AABox2d} viewport The camera's viewport bounds in pixel space\n * @param {Vec2d} projectionDimensions The width/height of the camera's viewport in world coordinates\n * @param {Boolean} flipY True if the direction from negative to positive Y coordinates\n * go from the bottom to top of the window. False means Y coords\n * from negative to positive values go from the top to the bottom\n * @return {Camera2d}\n */\n function Camera2d(viewport, projectionDimensions, flipY) {\n _classCallCheck(this, Camera2d);\n\n var _this2 = _possibleConstructorReturn(this, (Camera2d.__proto__ || Object.getPrototypeOf(Camera2d)).call(this, viewport, projectionDimensions, flipY));\n\n _this2._viewMatrix = _mat2d2.default.create();\n _this2._viewDirty = true;\n _this2._projMatrix = _mat2d2.default.create();\n _this2._projDirty = true;\n return _this2;\n }\n\n /**\n * Sets the projection dimensions of the camera's view. This is the width/height\n * in world space coordiantes of the camera's view.\n * @param {Vec2d} projectionDimensions\n * @return {Camera2d} this\n */\n\n\n _createClass(Camera2d, [{\n key: \"_localXformUpdated\",\n\n\n /**\n * Called when the local transform (does not include parent transforms) of the Transform2d\n * mixin is modified. Used to be notified internally that the view-to-screen space\n * transformation needs updating\n * @private\n */\n value: function _localXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Called when the global matrix (includes parent transforms) of the\n * Transform2d mixin is modified. Used to be notified internally that\n * the view-to-screen space transformation needs updating\n * @private\n */\n\n }, {\n key: \"_globalXformUpdated\",\n value: function _globalXformUpdated() {\n this._boundsOutOfDate = true;\n }\n\n /**\n * Gets the transformation matrix from world space to view/camera space\n * @return {Mat2d}\n */\n\n }, {\n key: \"_matricesDirty\",\n\n\n /**\n * Returns true if any of the dirty flags are active\n * @return {Boolean}\n * @private\n */\n value: function _matricesDirty() {\n return this._boundsOutOfDate || this._lxformDirty || this._xformDirty || this._viewDirty || this._projDirty || this._screenDirty;\n }\n\n /**\n * Gets the transformation matrix from world space to screen space.\n * @return {Mat2d}\n */\n\n }, {\n key: \"projectionDimensions\",\n set: function set(projectionDimensions) {\n if (!_glMatrix.vec2.equals(projectionDimensions, this._projectionDimensions)) {\n var prev = _glMatrix.vec2.clone(this._projectionDimensions);\n AABox2d.copy(this._projectionDimensions, projectionDimensions);\n this._viewDirty = true;\n this._projDirty = true;\n // this._yflip = this._projectionDimensions[3] < this._projectionDimensions[1]\n this.fire(\"changed\", {\n attr: \"projectionDimensions\",\n prevVal: prev,\n currVal: projectionDimensions\n });\n }\n return this;\n }\n\n /**\n * Gets a copy of the camera's current projection dimensions\n * @return {Vec2d}\n */\n ,\n get: function get() {\n return _glMatrix.vec2.clone(this._projectionDimensions);\n }\n\n /**\n * Gets a reference to the camera's current projection dimensions\n * @return {Vec2d}\n * @readOnly\n */\n\n }, {\n key: \"projectionDimensionsRef\",\n get: function get() {\n return this._projectionDimensions;\n }\n }, {\n key: \"viewMatrix\",\n get: function get() {\n if (this._viewDirty || this._boundsOutOfDate || this._xformDirty || this._lxformDirty) {\n // the matrix has been marked dirty, so recalculate\n var pos = [0, 0];\n var scale = [0, 0];\n var rot = [0, 0];\n var xform = this.globalXform;\n _mat2d2.default.svd(pos, scale, rot, xform);\n _mat2d2.default.fromTranslation(this._viewMatrix, _glMatrix.vec2.negate(pos, pos));\n _mat2d2.default.rotate(this._viewMatrix, this._viewMatrix, -rot[0]);\n _mat2d2.default.scale(this._viewMatrix, this._viewMatrix, scale);\n _mat2d2.default.rotate(this._viewMatrix, this._viewMatrix, -rot[1]);\n this._worldToScreenOutdated = true;\n this._viewDirty = false;\n }\n return this._viewMatrix;\n }\n\n /**\n * Gets the orthographic projection transformation matrix from\n * view to NDC (normalized device coordinates) space\n * @return {Mat2d}\n */\n\n }, {\n key: \"projMatrix\",\n get: function get() {\n if (this._projDirty) {\n var flip = this._yflip ? -1 : 1;\n _mat2d2.default.set(this._projMatrix, 2.0 / this._projectionDimensions[0], 0, 0, flip * 2.0 / this._projectionDimensions[1], 0, 0);\n this._worldToScreenOutdated = true;\n this._projDirty = false;\n }\n return this._projMatrix;\n }\n }, {\n key: \"worldToScreenMatrix\",\n get: function get() {\n if (!this._worldToScreenMatrix || this._worldToScreenOutdated || this._matricesDirty()) {\n if (!this._worldToScreenMatrix) {\n this._worldToScreenMatrix = _mat2d2.default.create();\n }\n _mat2d2.default.copy(this._worldToScreenMatrix, this.viewMatrix);\n _mat2d2.default.multiply(this._worldToScreenMatrix, this.projMatrix, this._worldToScreenMatrix);\n _mat2d2.default.multiply(this._worldToScreenMatrix, this.screenMatrix, this._worldToScreenMatrix);\n this._worldToScreenOutdated = false;\n this._screenToWorldOutdated = true;\n }\n return this._worldToScreenMatrix;\n }\n\n /**\n * Gets teh transform matrix from screen space to world space.\n * @return {[type]} [description]\n */\n\n }, {\n key: \"screenToWorldMatrix\",\n get: function get() {\n if (!this._screenToWorld || this._screenToWorldOutdated || this._matricesDirty()) {\n if (!this._screenToWorld) {\n this._screenToWorld = _mat2d2.default.create();\n }\n _mat2d2.default.copy(this._screenToWorld, this.worldToScreenMatrix);\n _mat2d2.default.invert(this._screenToWorld, this._screenToWorld);\n this._screenToWorldOutdated = false;\n }\n return this._screenToWorld;\n }\n }]);\n\n return Camera2d;\n}((0, _aggregation3.default)(BaseCamera2d, (0, _transform2d.createEventedTransform2dMixin)(\"changed:xform\")));\n\nexports.default = Camera2d;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi92aWV3L2NhbWVyYTJkLmpzP2YyYWUiXSwibmFtZXMiOlsiQUFCb3gyZCIsIkJhc2VDYW1lcmEyZCIsInZpZXdwb3J0IiwicHJvamVjdGlvbkRpbWVuc2lvbnMiLCJmbGlwWSIsIl92aWV3cG9ydCIsImNsb25lIiwiX3Byb2plY3Rpb25EaW1lbnNpb25zIiwiX3lmbGlwIiwiX3NjcmVlbk1hdHJpeCIsImNyZWF0ZSIsIl9zY3JlZW5EaXJ0eSIsImVxdWFscyIsInByZXYiLCJjb3B5IiwiX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCIsImZpcmUiLCJhdHRyIiwicHJldlZhbCIsImN1cnJWYWwiLCJjZW50ZXIiLCJleHRlbnRzIiwiZ2V0Q2VudGVyIiwiZ2V0RXh0ZW50cyIsInNldCIsIkNhbWVyYTJkIiwiX3ZpZXdNYXRyaXgiLCJfdmlld0RpcnR5IiwiX3Byb2pNYXRyaXgiLCJfcHJvakRpcnR5IiwiX2JvdW5kc091dE9mRGF0ZSIsIl9seGZvcm1EaXJ0eSIsIl94Zm9ybURpcnR5IiwicG9zIiwic2NhbGUiLCJyb3QiLCJ4Zm9ybSIsImdsb2JhbFhmb3JtIiwic3ZkIiwiZnJvbVRyYW5zbGF0aW9uIiwibmVnYXRlIiwicm90YXRlIiwiZmxpcCIsIl93b3JsZFRvU2NyZWVuTWF0cml4IiwiX21hdHJpY2VzRGlydHkiLCJ2aWV3TWF0cml4IiwibXVsdGlwbHkiLCJwcm9qTWF0cml4Iiwic2NyZWVuTWF0cml4IiwiX3NjcmVlblRvV29ybGRPdXRkYXRlZCIsIl9zY3JlZW5Ub1dvcmxkIiwid29ybGRUb1NjcmVlbk1hdHJpeCIsImludmVydCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FBRUE7O0lBQVlBLE87O0FBQ1o7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBOzs7Ozs7Ozs7QUFTQTs7Ozs7SUFLTUMsWTs7O0FBQ0o7Ozs7Ozs7Ozs7QUFVQSx3QkFBWUMsUUFBWixFQUFzQkMsb0JBQXRCLEVBQTJE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QzlCLGVBQUtBLG9CQUFMLEdBQTRCLGdCQUFNakMsTUFBTixFQUE1QjtBQUNEO0FBQ0Qsd0JBQU1JLElBQU4sQ0FBVyxLQUFLNkIsb0JBQWhCLEVBQXNDLEtBQUtFLFVBQTNDO0FBQ0Esd0JBQU1DLFFBQU4sQ0FBZSxLQUFLSCxvQkFBcEIsRUFBMEMsS0FBS0ksVUFBL0MsRUFBMkQsS0FBS0osb0JBQWhFO0FBQ0Esd0JBQU1HLFFBQU4sQ0FBZSxLQUFLSCxvQkFBcEIsRUFBMEMsS0FBS0ssWUFBL0MsRUFBNkQsS0FBS0wsb0JBQWxFO0FBQ0EsYUFBSzVCLHNCQUFMLEdBQThCLEtBQTlCO0FBQ0EsYUFBS2tDLHNCQUFMLEdBQThCLElBQTlCO0FBQ0Q7QUFDRCxhQUFPLEtBQUtOLG9CQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozs7d0JBSTBCO0FBQ3hCLFVBQUksQ0FBQyxLQUFLTyxjQUFOLElBQXdCLEtBQUtELHNCQUE3QixJQUF1RCxLQUFLTCxjQUFMLEVBQTNELEVBQWtGO0FBQ2hGLFlBQUksQ0FBQyxLQUFLTSxjQUFWLEVBQTBCO0FBQ3hCLGVBQUtBLGNBQUwsR0FBc0IsZ0JBQU14QyxNQUFOLEVBQXRCO0FBQ0Q7QUFDRCx3QkFBTUksSUFBTixDQUFXLEtBQUtvQyxjQUFoQixFQUFnQyxLQUFLQyxtQkFBckM7QUFDQSx3QkFBTUMsTUFBTixDQUFhLEtBQUtGLGNBQWxCLEVBQWtDLEtBQUtBLGNBQXZDO0FBQ0EsYUFBS0Qsc0JBQUwsR0FBOEIsS0FBOUI7QUFDRDtBQUNELGFBQU8sS0FBS0MsY0FBWjtBQUNEOzs7O0VBOUptQywyQkFBWWpELFlBQVosRUFDcEMsZ0RBQThCLGVBQTlCLENBRG9DLEM7O2tCQUFqQndCLFEiLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5pbXBvcnQgKiBhcyBBQUJveDJkIGZyb20gXCIuLi9jb3JlL2FhYm94MmRcIlxuaW1wb3J0IGFnZ3JlZ2F0aW9uIGZyb20gXCIuLi91dGlsL2FnZ3JlZ2F0aW9uXCJcbmltcG9ydCB7Y3JlYXRlRXZlbnRlZFRyYW5zZm9ybTJkTWl4aW59IGZyb20gXCIuLi9zaGFwZXMvdHJhbnNmb3JtMmRcIlxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vdXRpbC9ldmVudC1oYW5kbGVyXCJcbmltcG9ydCBNYXQyZCBmcm9tIFwiLi4vY29yZS9tYXQyZFwiXG5pbXBvcnQge3ZlYzIgYXMgVmVjMmR9IGZyb20gXCJnbC1tYXRyaXhcIlxuXG4vKipcbiAqIENhbWVyYSBtb2RpZmljYXRpb24gZXZlbnRcbiAqIEBldmVudCBFdmVudGVkQ2FtZXJhI2NoYW5nZWRcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0ciBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbW9kaWZpZWRcbiAqIEBwcm9wZXJ0eSB7fSBwcmV2VmFsIFByZXZpb3VzIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcHJpb3IgdG8gbW9kaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge30gY3VyclZhbCBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHBvc3QgbW9kaWZpY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2xhc3MgQmFzZSBjYW1lcmEgY2xhc3MgZm9yIDJkIHNjcmVlbiBwcm9qZWN0aW9uc1xuICogICAgICAgIFRoZSBiYXNlIGNsYXNzIGlzIHVzZWQgb25seSBmb3IgdGhlIE5EQyB0byBzY3JlZW4gc3BhY2UgdHJhc2Zvcm1cbiAqIEBleHRlbmRzIHtFdmVudEhhbmRsZXJ9XG4gKi9cbmNsYXNzIEJhc2VDYW1lcmEyZCBleHRlbmRzIEV2ZW50SGFuZGxlciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDJkIGNhbWVyYVxuICAgKiBAcGFyYW0gIHtBQUJveDJkfSAgdmlld3BvcnQgICAgICAgICAgIEluaXRpYWwgY2FtZXJhIHZpZXdwb3J0IGJvdW5kYXJ5LCBpbiBwaXhlbHNcbiAgICogQHBhcmFtICB7VmVjMmR9ICBwcm9qZWN0aW9uRGltZW5zaW9ucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gd29ybGQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAgICAgICBXaGV0aGVyIHdvcmxkIHkgY29vcmRpbmF0ZXMgYXJlIGZsaXBwZWQsIGlmIGZhbHNlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvcCBvZiB0aGUgdmlld3BvcnQgd2luZG93IGlzIHNtYWxsZXIgaW4geSwgYW5kIHRoZSBib3R0b21cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBsYXJnZXIuIElmIHRydWUsIHRoZSBib3R0b20gaGFzIHNtYWxsZXIgeSBjb29yZHMsIGFuZCB0aGUgdG9wXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyXG4gICAqIEByZXR1cm4ge0Jhc2VDYW1lcmEyZH1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHZpZXdwb3J0LCBwcm9qZWN0aW9uRGltZW5zaW9ucywgZmxpcFkgPSBmYWxzZSkge1xuICAgIC8vIGluaXRpYWxpemUgbW9kaWZ5IGV2ZW50c1xuICAgIHN1cGVyKFtcImNoYW5nZWRcIiwgXCJjaGFuZ2VkOnhmb3JtXCJdKVxuXG4gICAgdGhpcy5fdmlld3BvcnQgPSBBQUJveDJkLmNsb25lKHZpZXdwb3J0KVxuICAgIHRoaXMuX3Byb2plY3Rpb25EaW1lbnNpb25zID0gVmVjMmQuY2xvbmUocHJvamVjdGlvbkRpbWVuc2lvbnMpXG4gICAgdGhpcy5feWZsaXAgPSBmbGlwWVxuXG4gICAgLy8gc3RvcmVzIHRoZSBOREMgc3BhY2UgdG8gc2NyZWVuIHNwYWNlIG1hdHJpeFxuICAgIC8vIE5EQyAobm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZXMpIGlzIHRoZSBzcGFjZVxuICAgIC8vIHdoZXJlIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHdpbmRvdyBpcyAtMSwgdGhlIHJpZ2h0IGVkZ2UgaXMgMVxuICAgIC8vIHRoZSB0b3AgZWRnZSBpcyAtMSwgYW5kIHRoZSBib3R0b20gZWRnZSBpcyAxLlxuICAgIHRoaXMuX3NjcmVlbk1hdHJpeCA9IE1hdDJkLmNyZWF0ZSgpXG5cbiAgICAvLyB0aGlzIGZsYWcgaXMgZGlydHkgd2hlbmV2ZXIgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZVxuICAgIC8vIG5kYy10by1zY3JlZW4gcHJvamVjdGlvbiBhcmUgbW9kaWZpZWRcbiAgICB0aGlzLl9zY3JlZW5EaXJ0eSA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdvcmxkIFkgY29vcmRpbmF0ZXMgZ28gZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZVxuICAgKiBpbiBhIGJvdHRvbSB0byB0b3AgZmFzaGlvbiBpbiBzY3JlZW4gc3BhY2UsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzWUZsaXBwZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3lmbGlwXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY2FtZXJhJ3Mgc2NyZWVuLXNwYWNlIHZpZXdwb3J0IGJvdW5kc1xuICAgKiBAcGFyYW0gIHtBQUJveDJkfSB2aWV3cG9ydFxuICAgKiBAZmlyZXMgIEV2ZW50ZWRDYW1lcmEjY2hhbmdlZFxuICAgKiBAcmV0dXJuIHtCYXNlQ2FtZXJhMmR9XG4gICAqL1xuICBzZXQgdmlld3BvcnQodmlld3BvcnQpIHtcbiAgICBpZiAoIUFBQm94MmQuZXF1YWxzKHZpZXdwb3J0LCB0aGlzLl92aWV3cG9ydCkpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBBQUJveDJkLmNsb25lKHRoaXMuX3ZpZXdwb3J0KVxuICAgICAgQUFCb3gyZC5jb3B5KHRoaXMuX3ZpZXdwb3J0LCB2aWV3cG9ydClcbiAgICAgIHRoaXMuX3NjcmVlbkRpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5fd29ybGRUb1NjcmVlbk91dGRhdGVkID0gdHJ1ZVxuICAgICAgdGhpcy5maXJlKFwiY2hhbmdlZFwiLCB7XG4gICAgICAgIGF0dHI6IFwidmlld3BvcnRcIixcbiAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgY3VyclZhbDogdmlld3BvcnRcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvcHkgb2YgdGhlIGNhbWVyYSdzIGN1cnJlbnQgdmlld3BvcnRcbiAgICogQHJldHVybiB7QUFCb3gyZH1cbiAgICovXG4gIGdldCB2aWV3cG9ydCgpIHtcbiAgICByZXR1cm4gQUFCb3gyZC5jbG9uZSh0aGlzLl92aWV3cG9ydClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEncyBjdXJyZW50IHZpZXdwb3J0XG4gICAqIEByZXR1cm4ge0FBQm94MmR9XG4gICAqIEByZWFkT25seVxuICAgKi9cbiAgZ2V0IHZpZXdwb3J0UmVmKCkge1xuICAgIHJldHVybiB0aGlzLl92aWV3cG9ydFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgTkRDIHRvIHNjcmVlbiBzcGFjZSB0cmFuc2Zvcm0gbWF0cml4XG4gICAqIEByZXR1cm4ge01hdDJkfVxuICAgKi9cbiAgZ2V0IHNjcmVlbk1hdHJpeCgpIHtcbiAgICBpZiAodGhpcy5fc2NyZWVuRGlydHkpIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IFswLCAwXVxuICAgICAgY29uc3QgZXh0ZW50cyA9IFswLCAwXVxuICAgICAgQUFCb3gyZC5nZXRDZW50ZXIoY2VudGVyLCB0aGlzLl92aWV3cG9ydClcbiAgICAgIEFBQm94MmQuZ2V0RXh0ZW50cyhleHRlbnRzLCB0aGlzLl92aWV3cG9ydClcbiAgICAgIE1hdDJkLnNldCh0aGlzLl9zY3JlZW5NYXRyaXgsIGV4dGVudHNbMF0sIDAsIDAsIGV4dGVudHNbMV0sIGNlbnRlclswXSwgY2VudGVyWzFdKVxuICAgICAgdGhpcy5fd29ybGRUb1NjcmVlbk91dGRhdGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fc2NyZWVuRGlydHkgPSBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2NyZWVuTWF0cml4XG4gIH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgTWFpbiAyZCBjYW1lcmEgY2xhc3MgdG8gbWFuYWdlIG90aG9ncmFwaGljIDJkIHByb2plY3Rpb25zXG4gKiBAZXh0ZW5kcyB7QmFzZUNhbWVyYTJkfVxuICogQG1peGluIHtFdmVudGVkVHJhbnNmb3JtMmR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbWVyYTJkIGV4dGVuZHMgYWdncmVnYXRpb24oQmFzZUNhbWVyYTJkLFxuICBjcmVhdGVFdmVudGVkVHJhbnNmb3JtMmRNaXhpbihcImNoYW5nZWQ6eGZvcm1cIikpIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDYW1lcmEyZCBvYmplY3RcbiAgICogQHBhcmFtICB7QUFCb3gyZH0gdmlld3BvcnQgICAgICAgICAgICAgVGhlIGNhbWVyYSdzIHZpZXdwb3J0IGJvdW5kcyBpbiBwaXhlbCBzcGFjZVxuICAgKiBAcGFyYW0gIHtWZWMyZH0gcHJvamVjdGlvbkRpbWVuc2lvbnMgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgY2FtZXJhJ3Mgdmlld3BvcnQgaW4gd29ybGQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gZmxpcFkgICAgICAgICAgICAgIFRydWUgaWYgdGhlIGRpcmVjdGlvbiBmcm9tIG5lZ2F0aXZlIHRvIHBvc2l0aXZlIFkgY29vcmRpbmF0ZXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvIGZyb20gdGhlIGJvdHRvbSB0byB0b3Agb2YgdGhlIHdpbmRvdy4gRmFsc2UgbWVhbnMgWSBjb29yZHNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbmVnYXRpdmUgdG8gcG9zaXRpdmUgdmFsdWVzIGdvIGZyb20gdGhlIHRvcCB0byB0aGUgYm90dG9tXG4gICAqIEByZXR1cm4ge0NhbWVyYTJkfVxuICAgKi9cbiAgY29uc3RydWN0b3Iodmlld3BvcnQsIHByb2plY3Rpb25EaW1lbnNpb25zLCBmbGlwWSkge1xuICAgIHN1cGVyKHZpZXdwb3J0LCBwcm9qZWN0aW9uRGltZW5zaW9ucywgZmxpcFkpXG5cbiAgICB0aGlzLl92aWV3TWF0cml4ID0gTWF0MmQuY3JlYXRlKClcbiAgICB0aGlzLl92aWV3RGlydHkgPSB0cnVlXG4gICAgdGhpcy5fcHJvak1hdHJpeCA9IE1hdDJkLmNyZWF0ZSgpXG4gICAgdGhpcy5fcHJvakRpcnR5ID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb24gZGltZW5zaW9ucyBvZiB0aGUgY2FtZXJhJ3Mgdmlldy4gVGhpcyBpcyB0aGUgd2lkdGgvaGVpZ2h0XG4gICAqIGluIHdvcmxkIHNwYWNlIGNvb3JkaWFudGVzIG9mIHRoZSBjYW1lcmEncyB2aWV3LlxuICAgKiBAcGFyYW0gIHtWZWMyZH0gcHJvamVjdGlvbkRpbWVuc2lvbnNcbiAgICogQHJldHVybiB7Q2FtZXJhMmR9IHRoaXNcbiAgICovXG4gIHNldCBwcm9qZWN0aW9uRGltZW5zaW9ucyhwcm9qZWN0aW9uRGltZW5zaW9ucykge1xuICAgIGlmICghVmVjMmQuZXF1YWxzKHByb2plY3Rpb25EaW1lbnNpb25zLCB0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9ucykpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBWZWMyZC5jbG9uZSh0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9ucylcbiAgICAgIEFBQm94MmQuY29weSh0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9ucywgcHJvamVjdGlvbkRpbWVuc2lvbnMpXG4gICAgICB0aGlzLl92aWV3RGlydHkgPSB0cnVlXG4gICAgICB0aGlzLl9wcm9qRGlydHkgPSB0cnVlXG4gICAgICAgIC8vIHRoaXMuX3lmbGlwID0gdGhpcy5fcHJvamVjdGlvbkRpbWVuc2lvbnNbM10gPCB0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9uc1sxXVxuICAgICAgdGhpcy5maXJlKFwiY2hhbmdlZFwiLCB7XG4gICAgICAgIGF0dHI6IFwicHJvamVjdGlvbkRpbWVuc2lvbnNcIixcbiAgICAgICAgcHJldlZhbDogcHJldixcbiAgICAgICAgY3VyclZhbDogcHJvamVjdGlvbkRpbWVuc2lvbnNcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvcHkgb2YgdGhlIGNhbWVyYSdzIGN1cnJlbnQgcHJvamVjdGlvbiBkaW1lbnNpb25zXG4gICAqIEByZXR1cm4ge1ZlYzJkfVxuICAgKi9cbiAgZ2V0IHByb2plY3Rpb25EaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBWZWMyZC5jbG9uZSh0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEncyBjdXJyZW50IHByb2plY3Rpb24gZGltZW5zaW9uc1xuICAgKiBAcmV0dXJuIHtWZWMyZH1cbiAgICogQHJlYWRPbmx5XG4gICAqL1xuICBnZXQgcHJvamVjdGlvbkRpbWVuc2lvbnNSZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb25EaW1lbnNpb25zXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGxvY2FsIHRyYW5zZm9ybSAoZG9lcyBub3QgaW5jbHVkZSBwYXJlbnQgdHJhbnNmb3Jtcykgb2YgdGhlIFRyYW5zZm9ybTJkXG4gICAqIG1peGluIGlzIG1vZGlmaWVkLiBVc2VkIHRvIGJlIG5vdGlmaWVkIGludGVybmFsbHkgdGhhdCB0aGUgdmlldy10by1zY3JlZW4gc3BhY2VcbiAgICogdHJhbnNmb3JtYXRpb24gbmVlZHMgdXBkYXRpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9sb2NhbFhmb3JtVXBkYXRlZCgpIHtcbiAgICB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdsb2JhbCBtYXRyaXggKGluY2x1ZGVzIHBhcmVudCB0cmFuc2Zvcm1zKSBvZiB0aGVcbiAgICogVHJhbnNmb3JtMmQgbWl4aW4gaXMgbW9kaWZpZWQuIFVzZWQgdG8gYmUgbm90aWZpZWQgaW50ZXJuYWxseSB0aGF0XG4gICAqIHRoZSB2aWV3LXRvLXNjcmVlbiBzcGFjZSB0cmFuc2Zvcm1hdGlvbiBuZWVkcyB1cGRhdGluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dsb2JhbFhmb3JtVXBkYXRlZCgpIHtcbiAgICB0aGlzLl9ib3VuZHNPdXRPZkRhdGUgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gd29ybGQgc3BhY2UgdG8gdmlldy9jYW1lcmEgc3BhY2VcbiAgICogQHJldHVybiB7TWF0MmR9XG4gICAqL1xuICBnZXQgdmlld01hdHJpeCgpIHtcbiAgICBpZiAodGhpcy5fdmlld0RpcnR5IHx8IHRoaXMuX2JvdW5kc091dE9mRGF0ZSB8fCB0aGlzLl94Zm9ybURpcnR5IHx8IHRoaXMuX2x4Zm9ybURpcnR5KSB7XG4gICAgICAvLyB0aGUgbWF0cml4IGhhcyBiZWVuIG1hcmtlZCBkaXJ0eSwgc28gcmVjYWxjdWxhdGVcbiAgICAgIGNvbnN0IHBvcyA9IFswLCAwXVxuICAgICAgY29uc3Qgc2NhbGUgPSBbMCwgMF1cbiAgICAgIGNvbnN0IHJvdCA9IFswLCAwXVxuICAgICAgY29uc3QgeGZvcm0gPSB0aGlzLmdsb2JhbFhmb3JtXG4gICAgICBNYXQyZC5zdmQocG9zLCBzY2FsZSwgcm90LCB4Zm9ybSlcbiAgICAgIE1hdDJkLmZyb21UcmFuc2xhdGlvbih0aGlzLl92aWV3TWF0cml4LCBWZWMyZC5uZWdhdGUocG9zLCBwb3MpKVxuICAgICAgTWF0MmQucm90YXRlKHRoaXMuX3ZpZXdNYXRyaXgsIHRoaXMuX3ZpZXdNYXRyaXgsIC1yb3RbMF0pXG4gICAgICBNYXQyZC5zY2FsZSh0aGlzLl92aWV3TWF0cml4LCB0aGlzLl92aWV3TWF0cml4LCBzY2FsZSlcbiAgICAgIE1hdDJkLnJvdGF0ZSh0aGlzLl92aWV3TWF0cml4LCB0aGlzLl92aWV3TWF0cml4LCAtcm90WzFdKVxuICAgICAgdGhpcy5fd29ybGRUb1NjcmVlbk91dGRhdGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fdmlld0RpcnR5ID0gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdNYXRyaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZnJvbVxuICAgKiB2aWV3IHRvIE5EQyAobm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZXMpIHNwYWNlXG4gICAqIEByZXR1cm4ge01hdDJkfVxuICAgKi9cbiAgZ2V0IHByb2pNYXRyaXgoKSB7XG4gICAgaWYgKHRoaXMuX3Byb2pEaXJ0eSkge1xuICAgICAgY29uc3QgZmxpcCA9ICh0aGlzLl95ZmxpcCA/IC0xIDogMSlcbiAgICAgIE1hdDJkLnNldCh0aGlzLl9wcm9qTWF0cml4LCAyLjAgLyB0aGlzLl9wcm9qZWN0aW9uRGltZW5zaW9uc1swXSwgMCwgMCwgZmxpcCAqIDIuMCAvIHRoaXMuX3Byb2plY3Rpb25EaW1lbnNpb25zWzFdLCAwLCAwKVxuICAgICAgdGhpcy5fd29ybGRUb1NjcmVlbk91dGRhdGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcHJvakRpcnR5ID0gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Byb2pNYXRyaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBkaXJ0eSBmbGFncyBhcmUgYWN0aXZlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWF0cmljZXNEaXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYm91bmRzT3V0T2ZEYXRlIHx8IHRoaXMuX2x4Zm9ybURpcnR5IHx8IHRoaXMuX3hmb3JtRGlydHkgfHwgdGhpcy5fdmlld0RpcnR5IHx8IHRoaXMuX3Byb2pEaXJ0eSB8fCB0aGlzLl9zY3JlZW5EaXJ0eVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmcm9tIHdvcmxkIHNwYWNlIHRvIHNjcmVlbiBzcGFjZS5cbiAgICogQHJldHVybiB7TWF0MmR9XG4gICAqL1xuICBnZXQgd29ybGRUb1NjcmVlbk1hdHJpeCgpIHtcbiAgICBpZiAoIXRoaXMuX3dvcmxkVG9TY3JlZW5NYXRyaXggfHwgdGhpcy5fd29ybGRUb1NjcmVlbk91dGRhdGVkIHx8IHRoaXMuX21hdHJpY2VzRGlydHkoKSkge1xuICAgICAgaWYgKCF0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4KSB7XG4gICAgICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5NYXRyaXggPSBNYXQyZC5jcmVhdGUoKVxuICAgICAgfVxuICAgICAgTWF0MmQuY29weSh0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLnZpZXdNYXRyaXgpXG4gICAgICBNYXQyZC5tdWx0aXBseSh0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLnByb2pNYXRyaXgsIHRoaXMuX3dvcmxkVG9TY3JlZW5NYXRyaXgpXG4gICAgICBNYXQyZC5tdWx0aXBseSh0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4LCB0aGlzLnNjcmVlbk1hdHJpeCwgdGhpcy5fd29ybGRUb1NjcmVlbk1hdHJpeClcbiAgICAgIHRoaXMuX3dvcmxkVG9TY3JlZW5PdXRkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLl9zY3JlZW5Ub1dvcmxkT3V0ZGF0ZWQgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93b3JsZFRvU2NyZWVuTWF0cml4XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0ZWggdHJhbnNmb3JtIG1hdHJpeCBmcm9tIHNjcmVlbiBzcGFjZSB0byB3b3JsZCBzcGFjZS5cbiAgICogQHJldHVybiB7W3R5cGVdfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBnZXQgc2NyZWVuVG9Xb3JsZE1hdHJpeCgpIHtcbiAgICBpZiAoIXRoaXMuX3NjcmVlblRvV29ybGQgfHwgdGhpcy5fc2NyZWVuVG9Xb3JsZE91dGRhdGVkIHx8IHRoaXMuX21hdHJpY2VzRGlydHkoKSkge1xuICAgICAgaWYgKCF0aGlzLl9zY3JlZW5Ub1dvcmxkKSB7XG4gICAgICAgIHRoaXMuX3NjcmVlblRvV29ybGQgPSBNYXQyZC5jcmVhdGUoKVxuICAgICAgfVxuICAgICAgTWF0MmQuY29weSh0aGlzLl9zY3JlZW5Ub1dvcmxkLCB0aGlzLndvcmxkVG9TY3JlZW5NYXRyaXgpXG4gICAgICBNYXQyZC5pbnZlcnQodGhpcy5fc2NyZWVuVG9Xb3JsZCwgdGhpcy5fc2NyZWVuVG9Xb3JsZClcbiAgICAgIHRoaXMuX3NjcmVlblRvV29ybGRPdXRkYXRlZCA9IGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zY3JlZW5Ub1dvcmxkXG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3ZpZXcvY2FtZXJhMmQuanMiXSwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { - - eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n;\n(function (root, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof exports === \"object\") {\n module.exports = factory();\n } else {\n root.ResizeSensor = factory();\n }\n}(this, function () {\n\n //Make sure it does not throw in a SSR (Server Side Rendering) situation\n if (typeof window === \"undefined\") {\n return null;\n }\n // Only used for the dirty checking, so the event callback count is limted to max 1 call per fps per sensor.\n // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and\n // would generate too many unnecessary events.\n var requestAnimationFrame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n function (fn) {\n return window.setTimeout(fn, 20);\n };\n\n /**\n * Iterate over each of the provided element(s).\n *\n * @param {HTMLElement|HTMLElement[]} elements\n * @param {Function} callback\n */\n function forEachElement(elements, callback){\n var elementsType = Object.prototype.toString.call(elements);\n var isCollectionTyped = ('[object Array]' === elementsType\n || ('[object NodeList]' === elementsType)\n || ('[object HTMLCollection]' === elementsType)\n || ('[object Object]' === elementsType)\n || ('undefined' !== typeof jQuery && elements instanceof jQuery) //jquery\n || ('undefined' !== typeof Elements && elements instanceof Elements) //mootools\n );\n var i = 0, j = elements.length;\n if (isCollectionTyped) {\n for (; i < j; i++) {\n callback(elements[i]);\n }\n } else {\n callback(elements);\n }\n }\n\n /**\n * Class for dimension change detection.\n *\n * @param {Element|Element[]|Elements|jQuery} element\n * @param {Function} callback\n *\n * @constructor\n */\n var ResizeSensor = function(element, callback) {\n /**\n *\n * @constructor\n */\n function EventQueue() {\n var q = [];\n this.add = function(ev) {\n q.push(ev);\n };\n\n var i, j;\n this.call = function() {\n for (i = 0, j = q.length; i < j; i++) {\n q[i].call();\n }\n };\n\n this.remove = function(ev) {\n var newQueue = [];\n for(i = 0, j = q.length; i < j; i++) {\n if(q[i] !== ev) newQueue.push(q[i]);\n }\n q = newQueue;\n }\n\n this.length = function() {\n return q.length;\n }\n }\n\n /**\n * @param {HTMLElement} element\n * @param {String} prop\n * @returns {String|Number}\n */\n function getComputedStyle(element, prop) {\n if (element.currentStyle) {\n return element.currentStyle[prop];\n } else if (window.getComputedStyle) {\n return window.getComputedStyle(element, null).getPropertyValue(prop);\n } else {\n return element.style[prop];\n }\n }\n\n /**\n *\n * @param {HTMLElement} element\n * @param {Function} resized\n */\n function attachResizeEvent(element, resized) {\n if (!element.resizedAttached) {\n element.resizedAttached = new EventQueue();\n element.resizedAttached.add(resized);\n } else if (element.resizedAttached) {\n element.resizedAttached.add(resized);\n return;\n }\n\n element.resizeSensor = document.createElement('div');\n element.resizeSensor.className = 'resize-sensor';\n var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';\n var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';\n\n element.resizeSensor.style.cssText = style;\n element.resizeSensor.innerHTML =\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n element.appendChild(element.resizeSensor);\n\n if (getComputedStyle(element, 'position') == 'static') {\n element.style.position = 'relative';\n }\n\n var expand = element.resizeSensor.childNodes[0];\n var expandChild = expand.childNodes[0];\n var shrink = element.resizeSensor.childNodes[1];\n var dirty, rafId, newWidth, newHeight;\n var lastWidth = element.offsetWidth;\n var lastHeight = element.offsetHeight;\n\n var reset = function() {\n expandChild.style.width = '100000px';\n expandChild.style.height = '100000px';\n\n expand.scrollLeft = 100000;\n expand.scrollTop = 100000;\n\n shrink.scrollLeft = 100000;\n shrink.scrollTop = 100000;\n };\n\n reset();\n\n var onResized = function() {\n rafId = 0;\n\n if (!dirty) return;\n\n lastWidth = newWidth;\n lastHeight = newHeight;\n\n if (element.resizedAttached) {\n element.resizedAttached.call();\n }\n };\n\n var onScroll = function() {\n newWidth = element.offsetWidth;\n newHeight = element.offsetHeight;\n dirty = newWidth != lastWidth || newHeight != lastHeight;\n\n if (dirty && !rafId) {\n rafId = requestAnimationFrame(onResized);\n }\n\n reset();\n };\n\n var addEvent = function(el, name, cb) {\n if (el.attachEvent) {\n el.attachEvent('on' + name, cb);\n } else {\n el.addEventListener(name, cb);\n }\n };\n\n addEvent(expand, 'scroll', onScroll);\n addEvent(shrink, 'scroll', onScroll);\n }\n\n forEachElement(element, function(elem){\n attachResizeEvent(elem, callback);\n });\n\n this.detach = function(ev) {\n ResizeSensor.detach(element, ev);\n };\n };\n\n ResizeSensor.detach = function(element, ev) {\n forEachElement(element, function(elem){\n if(elem.resizedAttached && typeof ev == \"function\"){\n elem.resizedAttached.remove(ev);\n if(elem.resizedAttached.length()) return;\n }\n if (elem.resizeSensor) {\n if (elem.contains(elem.resizeSensor)) {\n elem.removeChild(elem.resizeSensor);\n }\n delete elem.resizeSensor;\n delete elem.resizedAttached;\n }\n });\n };\n\n return ResizeSensor;\n\n}));\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9jc3MtZWxlbWVudC1xdWVyaWVzL3NyYy9SZXNpemVTZW5zb3IuanM/MTljOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQkFBMEI7QUFDekMsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0NBQWtDO0FBQ2pELGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CLG1CQUFtQixPQUFPO0FBQzFCLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsU0FBUyxRQUFRLFVBQVUsV0FBVyxrQkFBa0IsYUFBYSxvQkFBb0I7QUFDckksaURBQWlELFNBQVMsUUFBUSxnQkFBZ0I7O0FBRWxGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQSxDQUFDIiwiZmlsZSI6IjMzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgTWFyYyBKLiBTY2htaWR0LiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBhdCB0aGUgdG9wLWxldmVsXG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyBkaXN0cmlidXRpb24gYW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWFyY2ovY3NzLWVsZW1lbnQtcXVlcmllcy9ibG9iL21hc3Rlci9MSUNFTlNFLlxuICovXG47XG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5SZXNpemVTZW5zb3IgPSBmYWN0b3J5KCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAvL01ha2Ugc3VyZSBpdCBkb2VzIG5vdCB0aHJvdyBpbiBhIFNTUiAoU2VydmVyIFNpZGUgUmVuZGVyaW5nKSBzaXR1YXRpb25cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gT25seSB1c2VkIGZvciB0aGUgZGlydHkgY2hlY2tpbmcsIHNvIHRoZSBldmVudCBjYWxsYmFjayBjb3VudCBpcyBsaW10ZWQgdG8gbWF4IDEgY2FsbCBwZXIgZnBzIHBlciBzZW5zb3IuXG4gICAgLy8gSW4gY29tYmluYXRpb24gd2l0aCB0aGUgZXZlbnQgYmFzZWQgcmVzaXplIHNlbnNvciB0aGlzIHNhdmVzIGNwdSB0aW1lLCBiZWNhdXNlIHRoZSBzZW5zb3IgaXMgdG9vIGZhc3QgYW5kXG4gICAgLy8gd291bGQgZ2VuZXJhdGUgdG9vIG1hbnkgdW5uZWNlc3NhcnkgZXZlbnRzLlxuICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmbiwgMjApO1xuICAgICAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZSBvdmVyIGVhY2ggb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQocykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fEhUTUxFbGVtZW50W119IGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2hFbGVtZW50KGVsZW1lbnRzLCBjYWxsYmFjayl7XG4gICAgICAgIHZhciBlbGVtZW50c1R5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbWVudHMpO1xuICAgICAgICB2YXIgaXNDb2xsZWN0aW9uVHlwZWQgPSAoJ1tvYmplY3QgQXJyYXldJyA9PT0gZWxlbWVudHNUeXBlXG4gICAgICAgICAgICB8fCAoJ1tvYmplY3QgTm9kZUxpc3RdJyA9PT0gZWxlbWVudHNUeXBlKVxuICAgICAgICAgICAgfHwgKCdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXScgPT09IGVsZW1lbnRzVHlwZSlcbiAgICAgICAgICAgIHx8ICgnW29iamVjdCBPYmplY3RdJyA9PT0gZWxlbWVudHNUeXBlKVxuICAgICAgICAgICAgfHwgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgalF1ZXJ5ICYmIGVsZW1lbnRzIGluc3RhbmNlb2YgalF1ZXJ5KSAvL2pxdWVyeVxuICAgICAgICAgICAgfHwgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgRWxlbWVudHMgJiYgZWxlbWVudHMgaW5zdGFuY2VvZiBFbGVtZW50cykgLy9tb290b29sc1xuICAgICAgICApO1xuICAgICAgICB2YXIgaSA9IDAsIGogPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb25UeXBlZCkge1xuICAgICAgICAgICAgZm9yICg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlbGVtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyBmb3IgZGltZW5zaW9uIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR8RWxlbWVudFtdfEVsZW1lbnRzfGpRdWVyeX0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICB2YXIgUmVzaXplU2Vuc29yID0gZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRXZlbnRRdWV1ZSgpIHtcbiAgICAgICAgICAgIHZhciBxID0gW107XG4gICAgICAgICAgICB0aGlzLmFkZCA9IGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgICAgICAgICAgcS5wdXNoKGV2KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBpLCBqO1xuICAgICAgICAgICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IHEubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHFbaV0uY2FsbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IoaSA9IDAsIGogPSBxLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZihxW2ldICE9PSBldikgbmV3UXVldWUucHVzaChxW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcSA9IG5ld1F1ZXVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBxLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgIHByb3BcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ3xOdW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIHByb3ApIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmN1cnJlbnRTdHlsZVtwcm9wXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICByZXNpemVkXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBhdHRhY2hSZXNpemVFdmVudChlbGVtZW50LCByZXNpemVkKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQucmVzaXplZEF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZXNpemVkQXR0YWNoZWQgPSBuZXcgRXZlbnRRdWV1ZSgpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVzaXplZEF0dGFjaGVkLmFkZChyZXNpemVkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5yZXNpemVkQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlc2l6ZWRBdHRhY2hlZC5hZGQocmVzaXplZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LnJlc2l6ZVNlbnNvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZWxlbWVudC5yZXNpemVTZW5zb3IuY2xhc3NOYW1lID0gJ3Jlc2l6ZS1zZW5zb3InO1xuICAgICAgICAgICAgdmFyIHN0eWxlID0gJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOyByaWdodDogMDsgYm90dG9tOiAwOyBvdmVyZmxvdzogaGlkZGVuOyB6LWluZGV4OiAtMTsgdmlzaWJpbGl0eTogaGlkZGVuOyc7XG4gICAgICAgICAgICB2YXIgc3R5bGVDaGlsZCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHRvcDogMDsgdHJhbnNpdGlvbjogMHM7JztcblxuICAgICAgICAgICAgZWxlbWVudC5yZXNpemVTZW5zb3Iuc3R5bGUuY3NzVGV4dCA9IHN0eWxlO1xuICAgICAgICAgICAgZWxlbWVudC5yZXNpemVTZW5zb3IuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInJlc2l6ZS1zZW5zb3ItZXhwYW5kXCIgc3R5bGU9XCInICsgc3R5bGUgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiJyArIHN0eWxlQ2hpbGQgKyAnXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicmVzaXplLXNlbnNvci1zaHJpbmtcIiBzdHlsZT1cIicgKyBzdHlsZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCInICsgc3R5bGVDaGlsZCArICcgd2lkdGg6IDIwMCU7IGhlaWdodDogMjAwJVwiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50LnJlc2l6ZVNlbnNvcik7XG5cbiAgICAgICAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBleHBhbmQgPSBlbGVtZW50LnJlc2l6ZVNlbnNvci5jaGlsZE5vZGVzWzBdO1xuICAgICAgICAgICAgdmFyIGV4cGFuZENoaWxkID0gZXhwYW5kLmNoaWxkTm9kZXNbMF07XG4gICAgICAgICAgICB2YXIgc2hyaW5rID0gZWxlbWVudC5yZXNpemVTZW5zb3IuY2hpbGROb2Rlc1sxXTtcbiAgICAgICAgICAgIHZhciBkaXJ0eSwgcmFmSWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgbGFzdFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIHZhciBsYXN0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGV4cGFuZENoaWxkLnN0eWxlLndpZHRoID0gJzEwMDAwMHB4JztcbiAgICAgICAgICAgICAgICBleHBhbmRDaGlsZC5zdHlsZS5oZWlnaHQgPSAnMTAwMDAwcHgnO1xuXG4gICAgICAgICAgICAgICAgZXhwYW5kLnNjcm9sbExlZnQgPSAxMDAwMDA7XG4gICAgICAgICAgICAgICAgZXhwYW5kLnNjcm9sbFRvcCA9IDEwMDAwMDtcblxuICAgICAgICAgICAgICAgIHNocmluay5zY3JvbGxMZWZ0ID0gMTAwMDAwO1xuICAgICAgICAgICAgICAgIHNocmluay5zY3JvbGxUb3AgPSAxMDAwMDA7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXNldCgpO1xuXG4gICAgICAgICAgICB2YXIgb25SZXNpemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkaXJ0eSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgbGFzdFdpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICAgICAgbGFzdEhlaWdodCA9IG5ld0hlaWdodDtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnJlc2l6ZWRBdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlc2l6ZWRBdHRhY2hlZC5jYWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIG9uU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGRpcnR5ID0gbmV3V2lkdGggIT0gbGFzdFdpZHRoIHx8IG5ld0hlaWdodCAhPSBsYXN0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGRpcnR5ICYmICFyYWZJZCkge1xuICAgICAgICAgICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShvblJlc2l6ZWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgYWRkRXZlbnQgPSBmdW5jdGlvbihlbCwgbmFtZSwgY2IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuYXR0YWNoRXZlbnQoJ29uJyArIG5hbWUsIGNiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhZGRFdmVudChleHBhbmQsICdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICAgICAgICBhZGRFdmVudChzaHJpbmssICdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoRWxlbWVudChlbGVtZW50LCBmdW5jdGlvbihlbGVtKXtcbiAgICAgICAgICAgIGF0dGFjaFJlc2l6ZUV2ZW50KGVsZW0sIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbihldikge1xuICAgICAgICAgICAgUmVzaXplU2Vuc29yLmRldGFjaChlbGVtZW50LCBldik7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIFJlc2l6ZVNlbnNvci5kZXRhY2ggPSBmdW5jdGlvbihlbGVtZW50LCBldikge1xuICAgICAgICBmb3JFYWNoRWxlbWVudChlbGVtZW50LCBmdW5jdGlvbihlbGVtKXtcbiAgICAgICAgICAgIGlmKGVsZW0ucmVzaXplZEF0dGFjaGVkICYmIHR5cGVvZiBldiA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgICAgICAgICAgIGVsZW0ucmVzaXplZEF0dGFjaGVkLnJlbW92ZShldik7XG4gICAgICAgICAgICAgICAgaWYoZWxlbS5yZXNpemVkQXR0YWNoZWQubGVuZ3RoKCkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLnJlc2l6ZVNlbnNvcikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmNvbnRhaW5zKGVsZW0ucmVzaXplU2Vuc29yKSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNoaWxkKGVsZW0ucmVzaXplU2Vuc29yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVsZW0ucmVzaXplU2Vuc29yO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtLnJlc2l6ZWRBdHRhY2hlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXNpemVTZW5zb3I7XG5cbn0pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vY3NzLWVsZW1lbnQtcXVlcmllcy9zcmMvUmVzaXplU2Vuc29yLmpzXG4vLyBtb2R1bGUgaWQgPSAzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9"); - -/***/ }, -/* 34 */ -/***/ function(module, exports, __webpack_require__) { - - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 2x2 Matrix\n * @name mat2\n */\nvar mat2 = {};\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.create = function() {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {mat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nmat2.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\nmat2.fromValues = function(m00, m01, m10, m11) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = m00;\n out[1] = m01;\n out[2] = m10;\n out[3] = m11;\n return out;\n};\n\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\nmat2.set = function(out, m00, m01, m10, m11) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m10;\n out[3] = m11;\n return out;\n};\n\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a1 = a[1];\n out[1] = a[2];\n out[2] = a1;\n } else {\n out[0] = a[0];\n out[1] = a[2];\n out[2] = a[1];\n out[3] = a[3];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.invert = function(out, a) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n\n // Calculate the determinant\n det = a0 * a3 - a2 * a1;\n\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n \n out[0] = a3 * det;\n out[1] = -a1 * det;\n out[2] = -a2 * det;\n out[3] = a0 * det;\n\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.adjoint = function(out, a) {\n // Caching this value is nessecary if out == a\n var a0 = a[0];\n out[0] = a[3];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a0;\n\n return out;\n};\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {mat2} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2.determinant = function (a) {\n return a[0] * a[3] - a[2] * a[1];\n};\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.multiply = function (out, a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n return out;\n};\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nmat2.mul = mat2.multiply;\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.rotate = function (out, a, rad) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n return out;\n};\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nmat2.scale = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n v0 = v[0], v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.fromRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2} out\n */\nmat2.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n return out;\n}\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {mat2} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2.str = function (a) {\n return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {mat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2.frob = function (a) {\n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2)))\n};\n\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {mat2} L the lower triangular matrix \n * @param {mat2} D the diagonal matrix \n * @param {mat2} U the upper triangular matrix \n * @param {mat2} a the input matrix to factorize\n */\n\nmat2.LDU = function (L, D, U, a) { \n L[2] = a[2]/a[0]; \n U[0] = a[0]; \n U[1] = a[1]; \n U[3] = a[3] - L[2] * U[1]; \n return [L, D, U]; \n}; \n\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n};\n\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\nmat2.sub = mat2.subtract;\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.equals = function (a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\nmat2.multiplyScalar = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n};\n\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\nmat2.multiplyScalarAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n out[3] = a[3] + (b[3] * scale);\n return out;\n};\n\nmodule.exports = mat2;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQyLmpzP2FkNWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFdBQVcs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QUs7QUFDaEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDJ4MiBNYXRyaXhcbiAqIEBuYW1lIG1hdDJcbiAqL1xudmFyIG1hdDIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5tYXQyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MiB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0IEEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xubWF0Mi5mcm9tVmFsdWVzID0gZnVuY3Rpb24obTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IG0wMDtcbiAgICBvdXRbMV0gPSBtMDE7XG4gICAgb3V0WzJdID0gbTEwO1xuICAgIG91dFszXSA9IG0xMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLnNldCA9IGZ1bmN0aW9uKG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gICAgb3V0WzBdID0gbTAwO1xuICAgIG91dFsxXSA9IG0wMTtcbiAgICBvdXRbMl0gPSBtMTA7XG4gICAgb3V0WzNdID0gbTExO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgICBpZiAob3V0ID09PSBhKSB7XG4gICAgICAgIHZhciBhMSA9IGFbMV07XG4gICAgICAgIG91dFsxXSA9IGFbMl07XG4gICAgICAgIG91dFsyXSA9IGExO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07XG4gICAgICAgIG91dFsxXSA9IGFbMl07XG4gICAgICAgIG91dFsyXSA9IGFbMV07XG4gICAgICAgIG91dFszXSA9IGFbM107XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG4gICAgXG4gICAgb3V0WzBdID0gIGEzICogZGV0O1xuICAgIG91dFsxXSA9IC1hMSAqIGRldDtcbiAgICBvdXRbMl0gPSAtYTIgKiBkZXQ7XG4gICAgb3V0WzNdID0gIGEwICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBDYWNoaW5nIHRoaXMgdmFsdWUgaXMgbmVzc2VjYXJ5IGlmIG91dCA9PSBhXG4gICAgdmFyIGEwID0gYVswXTtcbiAgICBvdXRbMF0gPSAgYVszXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSAgYTA7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xubWF0Mi5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsyXSAqIGFbMV07XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdO1xuICAgIHZhciBiMCA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107XG4gICAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gICAgb3V0WzFdID0gYTEgKiBiMCArIGEzICogYjE7XG4gICAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gICAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDIubXVsID0gbWF0Mi5tdWx0aXBseTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MiBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBhMCAqICBjICsgYTIgKiBzO1xuICAgIG91dFsxXSA9IGExICogIGMgKyBhMyAqIHM7XG4gICAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MiBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKiovXG5tYXQyLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTAgKiB2MDtcbiAgICBvdXRbMV0gPSBhMSAqIHYwO1xuICAgIG91dFsyXSA9IGEyICogdjE7XG4gICAgb3V0WzNdID0gYTMgKiB2MTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDIuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0Mi5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmZyb21Sb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBjO1xuICAgIG91dFsxXSA9IHM7XG4gICAgb3V0WzJdID0gLXM7XG4gICAgb3V0WzNdID0gYztcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSB2WzFdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0Mi5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpKSlcbn07XG5cbi8qKlxuICogUmV0dXJucyBMLCBEIGFuZCBVIG1hdHJpY2VzIChMb3dlciB0cmlhbmd1bGFyLCBEaWFnb25hbCBhbmQgVXBwZXIgdHJpYW5ndWxhcikgYnkgZmFjdG9yaXppbmcgdGhlIGlucHV0IG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBMIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBcbiAqIEBwYXJhbSB7bWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4IFxuICogQHBhcmFtIHttYXQyfSBVIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgaW5wdXQgbWF0cml4IHRvIGZhY3Rvcml6ZVxuICovXG5cbm1hdDIuTERVID0gZnVuY3Rpb24gKEwsIEQsIFUsIGEpIHsgXG4gICAgTFsyXSA9IGFbMl0vYVswXTsgXG4gICAgVVswXSA9IGFbMF07IFxuICAgIFVbMV0gPSBhWzFdOyBcbiAgICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdOyBcbiAgICByZXR1cm4gW0wsIEQsIFVdOyAgICAgICBcbn07IFxuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyLnN1YiA9IG1hdDIuc3VidHJhY3Q7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQyLmV4YWN0RXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQyLmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdO1xuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSk7XG59O1xuXG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5U2NhbGFyID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgb3V0WzJdID0gYVsyXSAqIGI7XG4gICAgb3V0WzNdID0gYVszXSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gbWF0MidzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5tdWx0aXBseVNjYWxhckFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICBvdXRbM10gPSBhWzNdICsgKGJbM10gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0MjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvbWF0Mi5qc1xuLy8gbW9kdWxlIGlkID0gMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ=="); - -/***/ }, -/* 35 */ -/***/ function(module, exports, __webpack_require__) { - - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 2x3 Matrix\n * @name mat2d\n * \n * @description \n * A mat2d contains six elements defined as:\n *
\n * [a, c, tx,\n *  b, d, ty]\n * 
\n * This is a short form for the 3x3 matrix:\n *
\n * [a, c, tx,\n *  b, d, ty,\n *  0, 0, 1]\n * 
\n * The last row is ignored so the array is shorter and operations are faster.\n */\nvar mat2d = {};\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.create = function() {\n var out = new glMatrix.ARRAY_TYPE(6);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n};\n\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {mat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(6);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n};\n\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n};\n\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\nmat2d.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n};\n\n/**\n * Create a new mat2d with the given values\n *\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} A new mat2d\n */\nmat2d.fromValues = function(a, b, c, d, tx, ty) {\n var out = new glMatrix.ARRAY_TYPE(6);\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = d;\n out[4] = tx;\n out[5] = ty;\n return out;\n};\n\n/**\n * Set the components of a mat2d to the given values\n *\n * @param {mat2d} out the receiving matrix\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} out\n */\nmat2d.set = function(out, a, b, c, d, tx, ty) {\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = d;\n out[4] = tx;\n out[5] = ty;\n return out;\n};\n\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.invert = function(out, a) {\n var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n atx = a[4], aty = a[5];\n\n var det = aa * ad - ab * ac;\n if(!det){\n return null;\n }\n det = 1.0 / det;\n\n out[0] = ad * det;\n out[1] = -ab * det;\n out[2] = -ac * det;\n out[3] = aa * det;\n out[4] = (ac * aty - ad * atx) * det;\n out[5] = (ab * atx - aa * aty) * det;\n return out;\n};\n\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {mat2d} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2d.determinant = function (a) {\n return a[0] * a[3] - a[1] * a[2];\n};\n\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.multiply = function (out, a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n out[4] = a0 * b4 + a2 * b5 + a4;\n out[5] = a1 * b4 + a3 * b5 + a5;\n return out;\n};\n\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\nmat2d.mul = mat2d.multiply;\n\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.rotate = function (out, a, rad) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n out[4] = a4;\n out[5] = a5;\n return out;\n};\n\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\nmat2d.scale = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n v0 = v[0], v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n out[4] = a4;\n out[5] = a5;\n return out;\n};\n\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\nmat2d.translate = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n v0 = v[0], v1 = v[1];\n out[0] = a0;\n out[1] = a1;\n out[2] = a2;\n out[3] = a3;\n out[4] = a0 * v0 + a2 * v1 + a4;\n out[5] = a1 * v0 + a3 * v1 + a5;\n return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.fromRotation = function(out, rad) {\n var s = Math.sin(rad), c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2d} out\n */\nmat2d.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat2d} out\n */\nmat2d.fromTranslation = function(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = v[0];\n out[5] = v[1];\n return out;\n}\n\n/**\n * Returns a string representation of a mat2d\n *\n * @param {mat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2d.str = function (a) {\n return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n a[3] + ', ' + a[4] + ', ' + a[5] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {mat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2d.frob = function (a) { \n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1))\n}; \n\n/**\n * Adds two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n return out;\n};\n\n/**\n * Alias for {@link mat2d.subtract}\n * @function\n */\nmat2d.sub = mat2d.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2d} out\n */\nmat2d.multiplyScalar = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n return out;\n};\n\n/**\n * Adds two mat2d's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2d} out the receiving vector\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2d} out\n */\nmat2d.multiplyScalarAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n out[3] = a[3] + (b[3] * scale);\n out[4] = a[4] + (b[4] * scale);\n out[5] = a[5] + (b[5] * scale);\n return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.equals = function (a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)));\n};\n\nmodule.exports = mat2d;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQyZC5qcz9lNTljIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcs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QTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE1BQU07QUFDakIsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgMngzIE1hdHJpeFxuICogQG5hbWUgbWF0MmRcbiAqIFxuICogQGRlc2NyaXB0aW9uIFxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHldXG4gKiA8L3ByZT5cbiAqIFRoaXMgaXMgYSBzaG9ydCBmb3JtIGZvciB0aGUgM3gzIG1hdHJpeDpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHksXG4gKiAgMCwgMCwgMV1cbiAqIDwvcHJlPlxuICogVGhlIGxhc3Qgcm93IGlzIGlnbm9yZWQgc28gdGhlIGFycmF5IGlzIHNob3J0ZXIgYW5kIG9wZXJhdGlvbnMgYXJlIGZhc3Rlci5cbiAqL1xudmFyIG1hdDJkID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyZFxuICpcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5tYXQyZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyZCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0MmR9IGEgbmV3IDJ4MyBtYXRyaXhcbiAqL1xubWF0MmQuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyZCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IGEgbWF0MmQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MmQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQ29tcG9uZW50IEEgKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gYiBDb21wb25lbnQgQiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IGQgQ29tcG9uZW50IEQgKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gdHggQ29tcG9uZW50IFRYIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcbiAqIEByZXR1cm5zIHttYXQyZH0gQSBuZXcgbWF0MmRcbiAqL1xubWF0MmQuZnJvbVZhbHVlcyA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSBhO1xuICAgIG91dFsxXSA9IGI7XG4gICAgb3V0WzJdID0gYztcbiAgICBvdXRbM10gPSBkO1xuICAgIG91dFs0XSA9IHR4O1xuICAgIG91dFs1XSA9IHR5O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDJkIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIENvbXBvbmVudCBBIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gYyBDb21wb25lbnQgQyAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIENvbXBvbmVudCBEIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eSBDb21wb25lbnQgVFkgKGluZGV4IDUpXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5zZXQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICAgIG91dFswXSA9IGE7XG4gICAgb3V0WzFdID0gYjtcbiAgICBvdXRbMl0gPSBjO1xuICAgIG91dFszXSA9IGQ7XG4gICAgb3V0WzRdID0gdHg7XG4gICAgb3V0WzVdID0gdHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYWEgPSBhWzBdLCBhYiA9IGFbMV0sIGFjID0gYVsyXSwgYWQgPSBhWzNdLFxuICAgICAgICBhdHggPSBhWzRdLCBhdHkgPSBhWzVdO1xuXG4gICAgdmFyIGRldCA9IGFhICogYWQgLSBhYiAqIGFjO1xuICAgIGlmKCFkZXQpe1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gYWQgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWFiICogZGV0O1xuICAgIG91dFsyXSA9IC1hYyAqIGRldDtcbiAgICBvdXRbM10gPSBhYSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYWMgKiBhdHkgLSBhZCAqIGF0eCkgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGFiICogYXR4IC0gYWEgKiBhdHkpICogZGV0O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDJkLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzFdICogYVsyXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MmQnc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICBiMCA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM10sIGI0ID0gYls0XSwgYjUgPSBiWzVdO1xuICAgIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICAgIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICAgIG91dFsyXSA9IGEwICogYjIgKyBhMiAqIGIzO1xuICAgIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICAgIG91dFs0XSA9IGEwICogYjQgKyBhMiAqIGI1ICsgYTQ7XG4gICAgb3V0WzVdID0gYTEgKiBiNCArIGEzICogYjUgKyBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDJkLm11bCA9IG1hdDJkLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyZCBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5yb3RhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgb3V0WzRdID0gYTQ7XG4gICAgb3V0WzVdID0gYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIG91dFs0XSA9IGE0O1xuICAgIG91dFs1XSA9IGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgICBvdXRbNV0gPSBhMSAqIHYwICsgYTMgKiB2MSArIGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0MmQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGM7XG4gICAgb3V0WzFdID0gcztcbiAgICBvdXRbMl0gPSAtcztcbiAgICBvdXRbM10gPSBjO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0MmQuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSB2WzFdO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuZnJvbVRyYW5zbGF0aW9uID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICBvdXRbNF0gPSB2WzBdO1xuICAgIG91dFs1XSA9IHZbMV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDJkLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQyZCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbM10gKyAnLCAnICsgYVs0XSArICcsICcgKyBhWzVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQyZC5mcm9iID0gZnVuY3Rpb24gKGEpIHsgXG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyAxKSlcbn07IFxuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gICAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gICAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyZC5zdWIgPSBtYXQyZC5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQubXVsdGlwbHlTY2FsYXIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICBvdXRbNF0gPSBhWzRdICogYjtcbiAgICBvdXRbNV0gPSBhWzVdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byBtYXQyZCdzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLm11bHRpcGx5U2NhbGFyQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIG91dFszXSA9IGFbM10gKyAoYlszXSAqIHNjYWxlKTtcbiAgICBvdXRbNF0gPSBhWzRdICsgKGJbNF0gKiBzY2FsZSk7XG4gICAgb3V0WzVdID0gYVs1XSArIChiWzVdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge21hdDJkfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQyZC5leGFjdEVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xubWF0MmQuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XTtcbiAgICByZXR1cm4gKE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBtYXQyZDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvbWF0MmQuanNcbi8vIG1vZHVsZSBpZCA9IDM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { - - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {\n scalar: {},\n SIMD: {},\n};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.create = function() {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n};\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\nmat4.fromValues = function(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n};\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\nmat4.set = function(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n};\n\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nmat4.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1], a02 = a[2], a03 = a[3],\n a12 = a[6], a13 = a[7],\n a23 = a[11];\n\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n};\n\n/**\n * Transpose the values of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.transpose = function(out, a) {\n var a0, a1, a2, a3,\n tmp01, tmp23,\n out0, out1, out2, out3;\n\n a0 = SIMD.Float32x4.load(a, 0);\n a1 = SIMD.Float32x4.load(a, 4);\n a2 = SIMD.Float32x4.load(a, 8);\n a3 = SIMD.Float32x4.load(a, 12);\n\n tmp01 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n tmp23 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n out0 = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n out1 = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n SIMD.Float32x4.store(out, 0, out0);\n SIMD.Float32x4.store(out, 4, out1);\n\n tmp01 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n tmp23 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n out2 = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n out3 = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n SIMD.Float32x4.store(out, 8, out2);\n SIMD.Float32x4.store(out, 12, out3);\n\n return out;\n};\n\n/**\n * Transpse a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.transpose = glMatrix.USE_SIMD ? mat4.SIMD.transpose : mat4.scalar.transpose;\n\n/**\n * Inverts a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.invert = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n\n // Calculate the determinant\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n return out;\n};\n\n/**\n * Inverts a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.invert = function(out, a) {\n var row0, row1, row2, row3,\n tmp1,\n minor0, minor1, minor2, minor3,\n det,\n a0 = SIMD.Float32x4.load(a, 0),\n a1 = SIMD.Float32x4.load(a, 4),\n a2 = SIMD.Float32x4.load(a, 8),\n a3 = SIMD.Float32x4.load(a, 12);\n\n // Compute matrix adjugate\n tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n tmp1 = SIMD.Float32x4.mul(row2, row3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor0 = SIMD.Float32x4.mul(row1, tmp1);\n minor1 = SIMD.Float32x4.mul(row0, tmp1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n tmp1 = SIMD.Float32x4.mul(row1, row2);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n minor3 = SIMD.Float32x4.mul(row0, tmp1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n tmp1 = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n row2 = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n minor2 = SIMD.Float32x4.mul(row0, tmp1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n tmp1 = SIMD.Float32x4.mul(row0, row1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n tmp1 = SIMD.Float32x4.mul(row0, row3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n tmp1 = SIMD.Float32x4.mul(row0, row2);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n // Compute matrix determinant\n det = SIMD.Float32x4.mul(row0, minor0);\n det = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 2, 3, 0, 1), det);\n det = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 1, 0, 3, 2), det);\n tmp1 = SIMD.Float32x4.reciprocalApproximation(det);\n det = SIMD.Float32x4.sub(\n SIMD.Float32x4.add(tmp1, tmp1),\n SIMD.Float32x4.mul(det, SIMD.Float32x4.mul(tmp1, tmp1)));\n det = SIMD.Float32x4.swizzle(det, 0, 0, 0, 0);\n if (!det) {\n return null;\n }\n\n // Compute matrix inverse\n SIMD.Float32x4.store(out, 0, SIMD.Float32x4.mul(det, minor0));\n SIMD.Float32x4.store(out, 4, SIMD.Float32x4.mul(det, minor1));\n SIMD.Float32x4.store(out, 8, SIMD.Float32x4.mul(det, minor2));\n SIMD.Float32x4.store(out, 12, SIMD.Float32x4.mul(det, minor3));\n return out;\n}\n\n/**\n * Inverts a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.invert = glMatrix.USE_SIMD ? mat4.SIMD.invert : mat4.scalar.invert;\n\n/**\n * Calculates the adjugate of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.adjoint = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));\n out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.adjoint = function(out, a) {\n var a0, a1, a2, a3;\n var row0, row1, row2, row3;\n var tmp1;\n var minor0, minor1, minor2, minor3;\n\n var a0 = SIMD.Float32x4.load(a, 0);\n var a1 = SIMD.Float32x4.load(a, 4);\n var a2 = SIMD.Float32x4.load(a, 8);\n var a3 = SIMD.Float32x4.load(a, 12);\n\n // Transpose the source matrix. Sort of. Not a true transpose operation\n tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n\n tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n tmp1 = SIMD.Float32x4.mul(row2, row3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor0 = SIMD.Float32x4.mul(row1, tmp1);\n minor1 = SIMD.Float32x4.mul(row0, tmp1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n tmp1 = SIMD.Float32x4.mul(row1, row2);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n minor3 = SIMD.Float32x4.mul(row0, tmp1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n tmp1 = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n row2 = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n minor2 = SIMD.Float32x4.mul(row0, tmp1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n tmp1 = SIMD.Float32x4.mul(row0, row1);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n tmp1 = SIMD.Float32x4.mul(row0, row3);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n tmp1 = SIMD.Float32x4.mul(row0, row2);\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n SIMD.Float32x4.store(out, 0, minor0);\n SIMD.Float32x4.store(out, 4, minor1);\n SIMD.Float32x4.store(out, 8, minor2);\n SIMD.Float32x4.store(out, 12, minor3);\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n mat4.adjoint = glMatrix.USE_SIMD ? mat4.SIMD.adjoint : mat4.scalar.adjoint;\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nmat4.determinant = function (a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n};\n\n/**\n * Multiplies two mat4's explicitly using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand, must be a Float32Array\n * @param {mat4} b the second operand, must be a Float32Array\n * @returns {mat4} out\n */\nmat4.SIMD.multiply = function (out, a, b) {\n var a0 = SIMD.Float32x4.load(a, 0);\n var a1 = SIMD.Float32x4.load(a, 4);\n var a2 = SIMD.Float32x4.load(a, 8);\n var a3 = SIMD.Float32x4.load(a, 12);\n\n var b0 = SIMD.Float32x4.load(b, 0);\n var out0 = SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 0, 0, 0, 0), a0),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 1, 1, 1, 1), a1),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 2, 2, 2, 2), a2),\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 3, 3, 3, 3), a3))));\n SIMD.Float32x4.store(out, 0, out0);\n\n var b1 = SIMD.Float32x4.load(b, 4);\n var out1 = SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 0, 0, 0, 0), a0),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 1, 1, 1, 1), a1),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 2, 2, 2, 2), a2),\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 3, 3, 3, 3), a3))));\n SIMD.Float32x4.store(out, 4, out1);\n\n var b2 = SIMD.Float32x4.load(b, 8);\n var out2 = SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 0, 0, 0, 0), a0),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 1, 1, 1, 1), a1),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 2, 2, 2, 2), a2),\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 3, 3, 3, 3), a3))));\n SIMD.Float32x4.store(out, 8, out2);\n\n var b3 = SIMD.Float32x4.load(b, 12);\n var out3 = SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 0, 0, 0, 0), a0),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 1, 1, 1, 1), a1),\n SIMD.Float32x4.add(\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 2, 2, 2, 2), a2),\n SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 3, 3, 3, 3), a3))));\n SIMD.Float32x4.store(out, 12, out3);\n\n return out;\n};\n\n/**\n * Multiplies two mat4's explicitly not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.scalar.multiply = function (out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n // Cache only the current line of the second matrix\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n return out;\n};\n\n/**\n * Multiplies two mat4's using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.multiply = glMatrix.USE_SIMD ? mat4.SIMD.multiply : mat4.scalar.multiply;\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nmat4.mul = mat4.multiply;\n\n/**\n * Translate a mat4 by the given vector not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.scalar.translate = function (out, a, v) {\n var x = v[0], y = v[1], z = v[2],\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.SIMD.translate = function (out, a, v) {\n var a0 = SIMD.Float32x4.load(a, 0),\n a1 = SIMD.Float32x4.load(a, 4),\n a2 = SIMD.Float32x4.load(a, 8),\n a3 = SIMD.Float32x4.load(a, 12),\n vec = SIMD.Float32x4(v[0], v[1], v[2] , 0);\n\n if (a !== out) {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n }\n\n a0 = SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0));\n a1 = SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1));\n a2 = SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2));\n\n var t0 = SIMD.Float32x4.add(a0, SIMD.Float32x4.add(a1, SIMD.Float32x4.add(a2, a3)));\n SIMD.Float32x4.store(out, 12, t0);\n\n return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.translate = glMatrix.USE_SIMD ? mat4.SIMD.translate : mat4.scalar.translate;\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.scalar.scale = function(out, a, v) {\n var x = v[0], y = v[1], z = v[2];\n\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.SIMD.scale = function(out, a, v) {\n var a0, a1, a2;\n var vec = SIMD.Float32x4(v[0], v[1], v[2], 0);\n\n a0 = SIMD.Float32x4.load(a, 0);\n SIMD.Float32x4.store(\n out, 0, SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0)));\n\n a1 = SIMD.Float32x4.load(a, 4);\n SIMD.Float32x4.store(\n out, 4, SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1)));\n\n a2 = SIMD.Float32x4.load(a, 8);\n SIMD.Float32x4.store(\n out, 8, SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2)));\n\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n */\nmat4.scale = glMatrix.USE_SIMD ? mat4.SIMD.scale : mat4.scalar.scale;\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.rotate = function (out, a, rad, axis) {\n var x = axis[0], y = axis[1], z = axis[2],\n len = Math.sqrt(x * x + y * y + z * z),\n s, c, t,\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23,\n b00, b01, b02,\n b10, b11, b12,\n b20, b21, b22;\n\n if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n // Construct the elements of the rotation matrix\n b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;\n b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;\n b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;\n\n // Perform rotation-specific matrix multiplication\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateX = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateX = function (out, a, rad) {\n var s = SIMD.Float32x4.splat(Math.sin(rad)),\n c = SIMD.Float32x4.splat(Math.cos(rad));\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n var a_1 = SIMD.Float32x4.load(a, 4);\n var a_2 = SIMD.Float32x4.load(a, 8);\n SIMD.Float32x4.store(out, 4,\n SIMD.Float32x4.add(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_2, s)));\n SIMD.Float32x4.store(out, 8,\n SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_2, c), SIMD.Float32x4.mul(a_1, s)));\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD if availabe and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateX = glMatrix.USE_SIMD ? mat4.SIMD.rotateX : mat4.scalar.rotateX;\n\n/**\n * Rotates a matrix by the given angle around the Y axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateY = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateY = function (out, a, rad) {\n var s = SIMD.Float32x4.splat(Math.sin(rad)),\n c = SIMD.Float32x4.splat(Math.cos(rad));\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n var a_0 = SIMD.Float32x4.load(a, 0);\n var a_2 = SIMD.Float32x4.load(a, 8);\n SIMD.Float32x4.store(out, 0,\n SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_2, s)));\n SIMD.Float32x4.store(out, 8,\n SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, s), SIMD.Float32x4.mul(a_2, c)));\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateY = glMatrix.USE_SIMD ? mat4.SIMD.rotateY : mat4.scalar.rotateY;\n\n/**\n * Rotates a matrix by the given angle around the Z axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateZ = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateZ = function (out, a, rad) {\n var s = SIMD.Float32x4.splat(Math.sin(rad)),\n c = SIMD.Float32x4.splat(Math.cos(rad));\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n var a_0 = SIMD.Float32x4.load(a, 0);\n var a_1 = SIMD.Float32x4.load(a, 4);\n SIMD.Float32x4.store(out, 0,\n SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_1, s)));\n SIMD.Float32x4.store(out, 4,\n SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_0, s)));\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateZ = glMatrix.USE_SIMD ? mat4.SIMD.rotateZ : mat4.scalar.rotateZ;\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromTranslation = function(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Scaling vector\n * @returns {mat4} out\n */\nmat4.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.fromRotation = function(out, rad, axis) {\n var x = axis[0], y = axis[1], z = axis[2],\n len = Math.sqrt(x * x + y * y + z * z),\n s, c, t;\n\n if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n\n // Perform rotation-specific matrix multiplication\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromXRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n\n // Perform axis-specific matrix multiplication\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromYRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n\n // Perform axis-specific matrix multiplication\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromZRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n\n // Perform axis-specific matrix multiplication\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslation = function (out, q, v) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nmat4.getTranslation = function (out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n\n return out;\n};\n\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nmat4.getRotation = function (out, mat) {\n // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n var trace = mat[0] + mat[5] + mat[10];\n var S = 0;\n\n if (trace > 0) { \n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (mat[6] - mat[9]) / S;\n out[1] = (mat[8] - mat[2]) / S; \n out[2] = (mat[1] - mat[4]) / S; \n } else if ((mat[0] > mat[5])&(mat[0] > mat[10])) { \n S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2;\n out[3] = (mat[6] - mat[9]) / S;\n out[0] = 0.25 * S;\n out[1] = (mat[1] + mat[4]) / S; \n out[2] = (mat[8] + mat[2]) / S; \n } else if (mat[5] > mat[10]) { \n S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2;\n out[3] = (mat[8] - mat[2]) / S;\n out[0] = (mat[1] + mat[4]) / S; \n out[1] = 0.25 * S;\n out[2] = (mat[6] + mat[9]) / S; \n } else { \n S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2;\n out[3] = (mat[1] - mat[4]) / S;\n out[0] = (mat[8] + mat[2]) / S;\n out[1] = (mat[6] + mat[9]) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScale = function (out, q, v, s) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2,\n sx = s[0],\n sy = s[1],\n sz = s[2];\n\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @param {vec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2,\n\n sx = s[0],\n sy = s[1],\n sz = s[2],\n\n ox = o[0],\n oy = o[1],\n oz = o[2];\n\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz);\n out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz);\n out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz);\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nmat4.fromQuat = function (out, q) {\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n yx = y * x2,\n yy = y * y2,\n zx = z * x2,\n zy = z * y2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.frustum = function (out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left),\n tb = 1 / (top - bottom),\n nf = 1 / (near - far);\n out[0] = (near * 2) * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = (near * 2) * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (far * near * 2) * nf;\n out[15] = 0;\n return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspective = function (out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf = 1 / (near - far);\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (2 * far * near) * nf;\n out[15] = 0;\n return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspectiveFromFieldOfView = function (out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI/180.0),\n downTan = Math.tan(fov.downDegrees * Math.PI/180.0),\n leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0),\n rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0),\n xScale = 2.0 / (leftTan + rightTan),\n yScale = 2.0 / (upTan + downTan);\n\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = ((upTan - downTan) * yScale * 0.5);\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = (far * near) / (near - far);\n out[15] = 0.0;\n return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.ortho = function (out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right),\n bt = 1 / (bottom - top),\n nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n};\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nmat4.lookAt = function (out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,\n eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2],\n centerx = center[0],\n centery = center[1],\n centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON &&\n Math.abs(eyey - centery) < glMatrix.EPSILON &&\n Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return mat4.identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n\n len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n\n len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat4.str = function (a) {\n return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +\n a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +\n a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' +\n a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {mat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat4.frob = function (a) {\n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) ))\n};\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n};\n\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\nmat4.sub = mat4.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nmat4.multiplyScalar = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n};\n\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\nmat4.multiplyScalarAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n out[3] = a[3] + (b[3] * scale);\n out[4] = a[4] + (b[4] * scale);\n out[5] = a[5] + (b[5] * scale);\n out[6] = a[6] + (b[6] * scale);\n out[7] = a[7] + (b[7] * scale);\n out[8] = a[8] + (b[8] * scale);\n out[9] = a[9] + (b[9] * scale);\n out[10] = a[10] + (b[10] * scale);\n out[11] = a[11] + (b[11] * scale);\n out[12] = a[12] + (b[12] * scale);\n out[13] = a[13] + (b[13] * scale);\n out[14] = a[14] + (b[14] * scale);\n out[15] = a[15] + (b[15] * scale);\n return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && \n a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && \n a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] &&\n a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.equals = function (a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], \n a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11], \n a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3],\n b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], \n b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], \n b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)) &&\n Math.abs(a9 - b9) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a9), Math.abs(b9)) &&\n Math.abs(a10 - b10) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a10), Math.abs(b10)) &&\n Math.abs(a11 - b11) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a11), Math.abs(b11)) &&\n Math.abs(a12 - b12) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a12), Math.abs(b12)) &&\n Math.abs(a13 - b13) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a13), Math.abs(b13)) &&\n Math.abs(a14 - b14) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a14), Math.abs(b14)) &&\n Math.abs(a15 - b15) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a15), Math.abs(b15)));\n};\n\n\n\nmodule.exports = mat4;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQ0LmpzPzg5OWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsTUFBTTtBQUNqQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQSIsImZpbGUiOiIzNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgNHg0IE1hdHJpeFxuICogQG5hbWUgbWF0NFxuICovXG52YXIgbWF0NCA9IHtcbiAgc2NhbGFyOiB7fSxcbiAgU0lNRDoge30sXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0NFxuICpcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XG4gKi9cbm1hdDQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XG4gKi9cbm1hdDQuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQ0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG1hdDQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjMgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzIgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxuICogQHJldHVybnMge21hdDR9IEEgbmV3IG1hdDRcbiAqL1xubWF0NC5mcm9tVmFsdWVzID0gZnVuY3Rpb24obTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgICBvdXRbMF0gPSBtMDA7XG4gICAgb3V0WzFdID0gbTAxO1xuICAgIG91dFsyXSA9IG0wMjtcbiAgICBvdXRbM10gPSBtMDM7XG4gICAgb3V0WzRdID0gbTEwO1xuICAgIG91dFs1XSA9IG0xMTtcbiAgICBvdXRbNl0gPSBtMTI7XG4gICAgb3V0WzddID0gbTEzO1xuICAgIG91dFs4XSA9IG0yMDtcbiAgICBvdXRbOV0gPSBtMjE7XG4gICAgb3V0WzEwXSA9IG0yMjtcbiAgICBvdXRbMTFdID0gbTIzO1xuICAgIG91dFsxMl0gPSBtMzA7XG4gICAgb3V0WzEzXSA9IG0zMTtcbiAgICBvdXRbMTRdID0gbTMyO1xuICAgIG91dFsxNV0gPSBtMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zZXQgPSBmdW5jdGlvbihvdXQsIG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICAgIG91dFswXSA9IG0wMDtcbiAgICBvdXRbMV0gPSBtMDE7XG4gICAgb3V0WzJdID0gbTAyO1xuICAgIG91dFszXSA9IG0wMztcbiAgICBvdXRbNF0gPSBtMTA7XG4gICAgb3V0WzVdID0gbTExO1xuICAgIG91dFs2XSA9IG0xMjtcbiAgICBvdXRbN10gPSBtMTM7XG4gICAgb3V0WzhdID0gbTIwO1xuICAgIG91dFs5XSA9IG0yMTtcbiAgICBvdXRbMTBdID0gbTIyO1xuICAgIG91dFsxMV0gPSBtMjM7XG4gICAgb3V0WzEyXSA9IG0zMDtcbiAgICBvdXRbMTNdID0gbTMxO1xuICAgIG91dFsxNF0gPSBtMzI7XG4gICAgb3V0WzE1XSA9IG0zMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuXG4vKipcbiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NCBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgICAgICBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICAgICAgb3V0WzFdID0gYVs0XTtcbiAgICAgICAgb3V0WzJdID0gYVs4XTtcbiAgICAgICAgb3V0WzNdID0gYVsxMl07XG4gICAgICAgIG91dFs0XSA9IGEwMTtcbiAgICAgICAgb3V0WzZdID0gYVs5XTtcbiAgICAgICAgb3V0WzddID0gYVsxM107XG4gICAgICAgIG91dFs4XSA9IGEwMjtcbiAgICAgICAgb3V0WzldID0gYTEyO1xuICAgICAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgICAgIG91dFsxMl0gPSBhMDM7XG4gICAgICAgIG91dFsxM10gPSBhMTM7XG4gICAgICAgIG91dFsxNF0gPSBhMjM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVs0XTtcbiAgICAgICAgb3V0WzJdID0gYVs4XTtcbiAgICAgICAgb3V0WzNdID0gYVsxMl07XG4gICAgICAgIG91dFs0XSA9IGFbMV07XG4gICAgICAgIG91dFs1XSA9IGFbNV07XG4gICAgICAgIG91dFs2XSA9IGFbOV07XG4gICAgICAgIG91dFs3XSA9IGFbMTNdO1xuICAgICAgICBvdXRbOF0gPSBhWzJdO1xuICAgICAgICBvdXRbOV0gPSBhWzZdO1xuICAgICAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzEyXSA9IGFbM107XG4gICAgICAgIG91dFsxM10gPSBhWzddO1xuICAgICAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDQgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCwgYTEsIGEyLCBhMyxcbiAgICAgICAgdG1wMDEsIHRtcDIzLFxuICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzO1xuXG4gICAgYTAgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDApO1xuICAgIGExID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA0KTtcbiAgICBhMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgOCk7XG4gICAgYTMgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDEyKTtcblxuICAgIHRtcDAxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMCwgYTEsIDAsIDEsIDQsIDUpO1xuICAgIHRtcDIzID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMiwgYTMsIDAsIDEsIDQsIDUpO1xuICAgIG91dDAgID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh0bXAwMSwgdG1wMjMsIDAsIDIsIDQsIDYpO1xuICAgIG91dDEgID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh0bXAwMSwgdG1wMjMsIDEsIDMsIDUsIDcpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMCwgIG91dDApO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgNCwgIG91dDEpO1xuXG4gICAgdG1wMDEgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEwLCBhMSwgMiwgMywgNiwgNyk7XG4gICAgdG1wMjMgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEyLCBhMywgMiwgMywgNiwgNyk7XG4gICAgb3V0MiAgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHRtcDAxLCB0bXAyMywgMCwgMiwgNCwgNik7XG4gICAgb3V0MyAgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHRtcDAxLCB0bXAyMywgMSwgMywgNSwgNyk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA4LCAgb3V0Mik7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAxMiwgb3V0Myk7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3BzZSBhIG1hdDQgdXNpbmcgU0lNRCBpZiBhdmFpbGFibGUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQudHJhbnNwb3NlID0gZ2xNYXRyaXguVVNFX1NJTUQgPyBtYXQ0LlNJTUQudHJhbnNwb3NlIDogbWF0NC5zY2FsYXIudHJhbnNwb3NlO1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQ0IG5vdCB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnNjYWxhci5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XSxcblxuICAgICAgICBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXG4gICAgICAgIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcbiAgICAgICAgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwLFxuICAgICAgICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXG4gICAgICAgIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcbiAgICAgICAgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyLFxuICAgICAgICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXG4gICAgICAgIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcbiAgICAgICAgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwLFxuICAgICAgICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXG4gICAgICAgIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcbiAgICAgICAgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyLFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICAgICAgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gICAgaWYgKCFkZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICAgIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICAgIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICAgIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICAgIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICAgIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICAgIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICAgIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICAgIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDQgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICB2YXIgcm93MCwgcm93MSwgcm93Miwgcm93MyxcbiAgICAgIHRtcDEsXG4gICAgICBtaW5vcjAsIG1pbm9yMSwgbWlub3IyLCBtaW5vcjMsXG4gICAgICBkZXQsXG4gICAgICBhMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMCksXG4gICAgICBhMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCksXG4gICAgICBhMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgOCksXG4gICAgICBhMyA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMTIpO1xuXG4gIC8vIENvbXB1dGUgbWF0cml4IGFkanVnYXRlXG4gIHRtcDEgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEwLCBhMSwgMCwgMSwgNCwgNSk7XG4gIHJvdzEgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEyLCBhMywgMCwgMSwgNCwgNSk7XG4gIHJvdzAgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHRtcDEsIHJvdzEsIDAsIDIsIDQsIDYpO1xuICByb3cxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShyb3cxLCB0bXAxLCAxLCAzLCA1LCA3KTtcbiAgdG1wMSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTAsIGExLCAyLCAzLCA2LCA3KTtcbiAgcm93MyA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTIsIGEzLCAyLCAzLCA2LCA3KTtcbiAgcm93MiA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUodG1wMSwgcm93MywgMCwgMiwgNCwgNik7XG4gIHJvdzMgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHJvdzMsIHRtcDEsIDEsIDMsIDUsIDcpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCByb3czKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSksIG1pbm9yMCk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSksIG1pbm9yMSk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobWlub3IxLCAyLCAzLCAwLCAxKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgcm93Mik7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MywgdG1wMSksIG1pbm9yMCk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMCwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKSwgbWlub3IzKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShtaW5vcjMsIDIsIDMsIDAsIDEpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHJvdzEsIDIsIDMsIDAsIDEpLCByb3czKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgcm93MiAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShyb3cyLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSwgbWlub3IwKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjAgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IwLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSkpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpLCBtaW5vcjIpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG1pbm9yMiwgMiwgMywgMCwgMSk7XG5cbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHJvdzEpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDEsIDAsIDMsIDIpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjIpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpLCBtaW5vcjMpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjIpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IzLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSkpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCByb3czKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgbWlub3IxID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMSwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKSwgbWlub3IyKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IxID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSwgbWlub3IxKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMiwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgcm93Mik7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MywgdG1wMSksIG1pbm9yMSk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjMsIFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKSk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjEsIFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSksIG1pbm9yMyk7XG5cbiAgLy8gQ29tcHV0ZSBtYXRyaXggZGV0ZXJtaW5hbnRcbiAgZGV0ICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgbWlub3IwKTtcbiAgZGV0ICAgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShkZXQsIDIsIDMsIDAsIDEpLCBkZXQpO1xuICBkZXQgICA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGRldCwgMSwgMCwgMywgMiksIGRldCk7XG4gIHRtcDEgID0gU0lNRC5GbG9hdDMyeDQucmVjaXByb2NhbEFwcHJveGltYXRpb24oZGV0KTtcbiAgZGV0ICAgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoXG4gICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQodG1wMSwgdG1wMSksXG4gICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoZGV0LCBTSU1ELkZsb2F0MzJ4NC5tdWwodG1wMSwgdG1wMSkpKTtcbiAgZGV0ICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGRldCwgMCwgMCwgMCwgMCk7XG4gIGlmICghZGV0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgbWF0cml4IGludmVyc2VcbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAwLCAgU0lNRC5GbG9hdDMyeDQubXVsKGRldCwgbWlub3IwKSk7XG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgNCwgIFNJTUQuRmxvYXQzMng0Lm11bChkZXQsIG1pbm9yMSkpO1xuICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDgsICBTSU1ELkZsb2F0MzJ4NC5tdWwoZGV0LCBtaW5vcjIpKTtcbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAxMiwgU0lNRC5GbG9hdDMyeDQubXVsKGRldCwgbWlub3IzKSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDQgdXNpbmcgU0lNRCBpZiBhdmFpbGFibGUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuaW52ZXJ0ID0gZ2xNYXRyaXguVVNFX1NJTUQgPyBtYXQ0LlNJTUQuaW52ZXJ0IDogbWF0NC5zY2FsYXIuaW52ZXJ0O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0NCBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgb3V0WzBdICA9ICAoYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgICBvdXRbMV0gID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICAgIG91dFsyXSAgPSAgKGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzNdICA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbNF0gID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICAgIG91dFs1XSAgPSAgKGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gICAgb3V0WzZdICA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbN10gID0gIChhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICAgIG91dFs4XSAgPSAgKGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSk7XG4gICAgb3V0WzldICA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgICBvdXRbMTBdID0gIChhMDAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICAgIG91dFsxMV0gPSAtKGEwMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKSk7XG4gICAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgICBvdXRbMTNdID0gIChhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkpO1xuICAgIG91dFsxNF0gPSAtKGEwMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gICAgb3V0WzE1XSA9ICAoYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDQgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgdmFyIGEwLCBhMSwgYTIsIGEzO1xuICB2YXIgcm93MCwgcm93MSwgcm93Miwgcm93MztcbiAgdmFyIHRtcDE7XG4gIHZhciBtaW5vcjAsIG1pbm9yMSwgbWlub3IyLCBtaW5vcjM7XG5cbiAgdmFyIGEwID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCAwKTtcbiAgdmFyIGExID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA0KTtcbiAgdmFyIGEyID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA4KTtcbiAgdmFyIGEzID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCAxMik7XG5cbiAgLy8gVHJhbnNwb3NlIHRoZSBzb3VyY2UgbWF0cml4LiAgU29ydCBvZi4gIE5vdCBhIHRydWUgdHJhbnNwb3NlIG9wZXJhdGlvblxuICB0bXAxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMCwgYTEsIDAsIDEsIDQsIDUpO1xuICByb3cxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMiwgYTMsIDAsIDEsIDQsIDUpO1xuICByb3cwID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh0bXAxLCByb3cxLCAwLCAyLCA0LCA2KTtcbiAgcm93MSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUocm93MSwgdG1wMSwgMSwgMywgNSwgNyk7XG5cbiAgdG1wMSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTAsIGExLCAyLCAzLCA2LCA3KTtcbiAgcm93MyA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTIsIGEzLCAyLCAzLCA2LCA3KTtcbiAgcm93MiA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUodG1wMSwgcm93MywgMCwgMiwgNCwgNik7XG4gIHJvdzMgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHJvdzMsIHRtcDEsIDEsIDMsIDUsIDcpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCByb3czKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSksIG1pbm9yMCk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSksIG1pbm9yMSk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobWlub3IxLCAyLCAzLCAwLCAxKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgcm93Mik7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MywgdG1wMSksIG1pbm9yMCk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMCwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKSwgbWlub3IzKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShtaW5vcjMsIDIsIDMsIDAsIDEpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHJvdzEsIDIsIDMsIDAsIDEpLCByb3czKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgcm93MiAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShyb3cyLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSwgbWlub3IwKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjAgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IwLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSkpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpLCBtaW5vcjIpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG1pbm9yMiwgMiwgMywgMCwgMSk7XG5cbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHJvdzEpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDEsIDAsIDMsIDIpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjIpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpLCBtaW5vcjMpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjIgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjIpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IzLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSkpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCByb3czKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgbWlub3IxID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMSwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKSwgbWlub3IyKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IxID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSwgbWlub3IxKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMiwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgcm93Mik7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MywgdG1wMSksIG1pbm9yMSk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjMsIFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKSk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjEsIFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSksIG1pbm9yMyk7XG5cbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAwLCAgbWlub3IwKTtcbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA0LCAgbWlub3IxKTtcbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA4LCAgbWlub3IyKTtcbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAxMiwgbWlub3IzKTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQ0IHVzaW5nIFNJTUQgaWYgYXZhaWxhYmxlIGFuZCBlbmFibGVkXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG4gbWF0NC5hZGpvaW50ID0gZ2xNYXRyaXguVVNFX1NJTUQgPyBtYXQ0LlNJTUQuYWRqb2ludCA6IG1hdDQuc2NhbGFyLmFkam9pbnQ7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDQuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NCdzIGV4cGxpY2l0bHkgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmQsIG11c3QgYmUgYSBGbG9hdDMyQXJyYXlcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmQsIG11c3QgYmUgYSBGbG9hdDMyQXJyYXlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMCk7XG4gICAgdmFyIGExID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA0KTtcbiAgICB2YXIgYTIgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDgpO1xuICAgIHZhciBhMyA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMTIpO1xuXG4gICAgdmFyIGIwID0gU0lNRC5GbG9hdDMyeDQubG9hZChiLCAwKTtcbiAgICB2YXIgb3V0MCA9IFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMCwgMCwgMCwgMCwgMCksIGEwKSxcbiAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIwLCAxLCAxLCAxLCAxKSwgYTEpLFxuICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMCwgMiwgMiwgMiwgMiksIGEyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIwLCAzLCAzLCAzLCAzKSwgYTMpKSkpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMCwgb3V0MCk7XG5cbiAgICB2YXIgYjEgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGIsIDQpO1xuICAgIHZhciBvdXQxID0gU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIxLCAwLCAwLCAwLCAwKSwgYTApLFxuICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjEsIDEsIDEsIDEsIDEpLCBhMSksXG4gICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIxLCAyLCAyLCAyLCAyKSwgYTIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjEsIDMsIDMsIDMsIDMpLCBhMykpKSk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA0LCBvdXQxKTtcblxuICAgIHZhciBiMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYiwgOCk7XG4gICAgdmFyIG91dDIgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjIsIDAsIDAsIDAsIDApLCBhMCksXG4gICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMiwgMSwgMSwgMSwgMSksIGExKSxcbiAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIyLCAyLCAyLCAyLCAyKSwgYTIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIyLCAzLCAzLCAzLCAzKSwgYTMpKSkpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgOCwgb3V0Mik7XG5cbiAgICB2YXIgYjMgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGIsIDEyKTtcbiAgICB2YXIgb3V0MyA9IFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMywgMCwgMCwgMCwgMCksIGEwKSxcbiAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMywgMSwgMSwgMSwgMSksIGExKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMywgMiwgMiwgMiwgMiksIGEyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMywgMywgMywgMywgMyksIGEzKSkpKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDEyLCBvdXQzKTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDQncyBleHBsaWNpdGx5IG5vdCB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnNjYWxhci5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTtcblxuICAgIC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuICAgIHZhciBiMCAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdO1xuICAgIG91dFswXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFszXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYls0XTsgYjEgPSBiWzVdOyBiMiA9IGJbNl07IGIzID0gYls3XTtcbiAgICBvdXRbNF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzVdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFs2XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbN10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTsgYjMgPSBiWzExXTtcbiAgICBvdXRbOF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzldID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzExXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYlsxMl07IGIxID0gYlsxM107IGIyID0gYlsxNF07IGIzID0gYlsxNV07XG4gICAgb3V0WzEyXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMTNdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxNF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzE1XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3MgdXNpbmcgU0lNRCBpZiBhdmFpbGFibGUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHkgPSBnbE1hdHJpeC5VU0VfU0lNRCA/IG1hdDQuU0lNRC5tdWx0aXBseSA6IG1hdDQuc2NhbGFyLm11bHRpcGx5O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQ0Lm11bCA9IG1hdDQubXVsdGlwbHk7XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yIG5vdCB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIudHJhbnNsYXRlID0gZnVuY3Rpb24gKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdLFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzO1xuXG4gICAgaWYgKGEgPT09IG91dCkge1xuICAgICAgICBvdXRbMTJdID0gYVswXSAqIHggKyBhWzRdICogeSArIGFbOF0gKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMl0gKiB4ICsgYVs2XSAqIHkgKyBhWzEwXSAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbM10gKiB4ICsgYVs3XSAqIHkgKyBhWzExXSAqIHogKyBhWzE1XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhMDAgPSBhWzBdOyBhMDEgPSBhWzFdOyBhMDIgPSBhWzJdOyBhMDMgPSBhWzNdO1xuICAgICAgICBhMTAgPSBhWzRdOyBhMTEgPSBhWzVdOyBhMTIgPSBhWzZdOyBhMTMgPSBhWzddO1xuICAgICAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07XG5cbiAgICAgICAgb3V0WzBdID0gYTAwOyBvdXRbMV0gPSBhMDE7IG91dFsyXSA9IGEwMjsgb3V0WzNdID0gYTAzO1xuICAgICAgICBvdXRbNF0gPSBhMTA7IG91dFs1XSA9IGExMTsgb3V0WzZdID0gYTEyOyBvdXRbN10gPSBhMTM7XG4gICAgICAgIG91dFs4XSA9IGEyMDsgb3V0WzldID0gYTIxOyBvdXRbMTBdID0gYTIyOyBvdXRbMTFdID0gYTIzO1xuXG4gICAgICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yIHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LlNJTUQudHJhbnNsYXRlID0gZnVuY3Rpb24gKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMCksXG4gICAgICAgIGExID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA0KSxcbiAgICAgICAgYTIgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDgpLFxuICAgICAgICBhMyA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMTIpLFxuICAgICAgICB2ZWMgPSBTSU1ELkZsb2F0MzJ4NCh2WzBdLCB2WzFdLCB2WzJdICwgMCk7XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07IG91dFsxXSA9IGFbMV07IG91dFsyXSA9IGFbMl07IG91dFszXSA9IGFbM107XG4gICAgICAgIG91dFs0XSA9IGFbNF07IG91dFs1XSA9IGFbNV07IG91dFs2XSA9IGFbNl07IG91dFs3XSA9IGFbN107XG4gICAgICAgIG91dFs4XSA9IGFbOF07IG91dFs5XSA9IGFbOV07IG91dFsxMF0gPSBhWzEwXTsgb3V0WzExXSA9IGFbMTFdO1xuICAgIH1cblxuICAgIGEwID0gU0lNRC5GbG9hdDMyeDQubXVsKGEwLCBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHZlYywgMCwgMCwgMCwgMCkpO1xuICAgIGExID0gU0lNRC5GbG9hdDMyeDQubXVsKGExLCBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHZlYywgMSwgMSwgMSwgMSkpO1xuICAgIGEyID0gU0lNRC5GbG9hdDMyeDQubXVsKGEyLCBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHZlYywgMiwgMiwgMiwgMikpO1xuXG4gICAgdmFyIHQwID0gU0lNRC5GbG9hdDMyeDQuYWRkKGEwLCBTSU1ELkZsb2F0MzJ4NC5hZGQoYTEsIFNJTUQuRmxvYXQzMng0LmFkZChhMiwgYTMpKSk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAxMiwgdDApO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvciB1c2luZyBTSU1EIGlmIGF2YWlsYWJsZSBhbmQgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQudHJhbnNsYXRlID0gZ2xNYXRyaXguVVNFX1NJTUQgPyBtYXQ0LlNJTUQudHJhbnNsYXRlIDogbWF0NC5zY2FsYXIudHJhbnNsYXRlO1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyBub3QgdXNpbmcgdmVjdG9yaXphdGlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbm1hdDQuc2NhbGFyLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl07XG5cbiAgICBvdXRbMF0gPSBhWzBdICogeDtcbiAgICBvdXRbMV0gPSBhWzFdICogeDtcbiAgICBvdXRbMl0gPSBhWzJdICogeDtcbiAgICBvdXRbM10gPSBhWzNdICogeDtcbiAgICBvdXRbNF0gPSBhWzRdICogeTtcbiAgICBvdXRbNV0gPSBhWzVdICogeTtcbiAgICBvdXRbNl0gPSBhWzZdICogeTtcbiAgICBvdXRbN10gPSBhWzddICogeTtcbiAgICBvdXRbOF0gPSBhWzhdICogejtcbiAgICBvdXRbOV0gPSBhWzldICogejtcbiAgICBvdXRbMTBdID0gYVsxMF0gKiB6O1xuICAgIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyB1c2luZyB2ZWN0b3JpemF0aW9uXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICoqL1xubWF0NC5TSU1ELnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwLCBhMSwgYTI7XG4gICAgdmFyIHZlYyA9IFNJTUQuRmxvYXQzMng0KHZbMF0sIHZbMV0sIHZbMl0sIDApO1xuXG4gICAgYTAgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDApO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKFxuICAgICAgICBvdXQsIDAsIFNJTUQuRmxvYXQzMng0Lm11bChhMCwgU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh2ZWMsIDAsIDAsIDAsIDApKSk7XG5cbiAgICBhMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUoXG4gICAgICAgIG91dCwgNCwgU0lNRC5GbG9hdDMyeDQubXVsKGExLCBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHZlYywgMSwgMSwgMSwgMSkpKTtcblxuICAgIGEyID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA4KTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShcbiAgICAgICAgb3V0LCA4LCBTSU1ELkZsb2F0MzJ4NC5tdWwoYTIsIFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodmVjLCAyLCAyLCAyLCAyKSkpO1xuXG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyB1c2luZyBTSU1EIGlmIGF2YWlsYWJsZSBhbmQgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsZSA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELnNjYWxlIDogbWF0NC5zY2FsYXIuc2NhbGU7XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCwgYXhpcykge1xuICAgIHZhciB4ID0gYXhpc1swXSwgeSA9IGF4aXNbMV0sIHogPSBheGlzWzJdLFxuICAgICAgICBsZW4gPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KSxcbiAgICAgICAgcywgYywgdCxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMyxcbiAgICAgICAgYjAwLCBiMDEsIGIwMixcbiAgICAgICAgYjEwLCBiMTEsIGIxMixcbiAgICAgICAgYjIwLCBiMjEsIGIyMjtcblxuICAgIGlmIChNYXRoLmFicyhsZW4pIDwgZ2xNYXRyaXguRVBTSUxPTikgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4ICo9IGxlbjtcbiAgICB5ICo9IGxlbjtcbiAgICB6ICo9IGxlbjtcblxuICAgIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIHQgPSAxIC0gYztcblxuICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGVsZW1lbnRzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXhcbiAgICBiMDAgPSB4ICogeCAqIHQgKyBjOyBiMDEgPSB5ICogeCAqIHQgKyB6ICogczsgYjAyID0geiAqIHggKiB0IC0geSAqIHM7XG4gICAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7IGIxMSA9IHkgKiB5ICogdCArIGM7IGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICAgIGIyMCA9IHggKiB6ICogdCArIHkgKiBzOyBiMjEgPSB5ICogeiAqIHQgLSB4ICogczsgYjIyID0geiAqIHogKiB0ICsgYztcblxuICAgIC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICAgIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgICBvdXRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7XG4gICAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICAgIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgICBvdXRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7XG4gICAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICAgIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgICBvdXRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7XG4gICAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICAgIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gICAgb3V0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpcyBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2NhbGFyLnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMTAgPSBhWzRdLFxuICAgICAgICBhMTEgPSBhWzVdLFxuICAgICAgICBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLFxuICAgICAgICBhMjEgPSBhWzldLFxuICAgICAgICBhMjIgPSBhWzEwXSxcbiAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICAgICAgb3V0WzBdICA9IGFbMF07XG4gICAgICAgIG91dFsxXSAgPSBhWzFdO1xuICAgICAgICBvdXRbMl0gID0gYVsyXTtcbiAgICAgICAgb3V0WzNdICA9IGFbM107XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gICAgb3V0WzVdID0gYTExICogYyArIGEyMSAqIHM7XG4gICAgb3V0WzZdID0gYTEyICogYyArIGEyMiAqIHM7XG4gICAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gICAgb3V0WzhdID0gYTIwICogYyAtIGExMCAqIHM7XG4gICAgb3V0WzldID0gYTIxICogYyAtIGExMSAqIHM7XG4gICAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICAgIG91dFsxMV0gPSBhMjMgKiBjIC0gYTEzICogcztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpcyB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IFNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguc2luKHJhZCkpLFxuICAgICAgICBjID0gU0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5jb3MocmFkKSk7XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICAgIG91dFswXSAgPSBhWzBdO1xuICAgICAgb3V0WzFdICA9IGFbMV07XG4gICAgICBvdXRbMl0gID0gYVsyXTtcbiAgICAgIG91dFszXSAgPSBhWzNdO1xuICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICB2YXIgYV8xID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA0KTtcbiAgICB2YXIgYV8yID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA4KTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhXzEsIGMpLCBTSU1ELkZsb2F0MzJ4NC5tdWwoYV8yLCBzKSkpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKGFfMiwgYyksIFNJTUQuRmxvYXQzMng0Lm11bChhXzEsIHMpKSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXMgdXNpbmcgU0lNRCBpZiBhdmFpbGFiZSBhbmQgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlWCA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELnJvdGF0ZVggOiBtYXQ0LnNjYWxhci5yb3RhdGVYO1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzIG5vdCB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGEwMCA9IGFbMF0sXG4gICAgICAgIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM10sXG4gICAgICAgIGEyMCA9IGFbOF0sXG4gICAgICAgIGEyMSA9IGFbOV0sXG4gICAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgICBhMjMgPSBhWzExXTtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgICAgICBvdXRbNF0gID0gYVs0XTtcbiAgICAgICAgb3V0WzVdICA9IGFbNV07XG4gICAgICAgIG91dFs2XSAgPSBhWzZdO1xuICAgICAgICBvdXRbN10gID0gYVs3XTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gPSBhMDAgKiBjIC0gYTIwICogcztcbiAgICBvdXRbMV0gPSBhMDEgKiBjIC0gYTIxICogcztcbiAgICBvdXRbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcbiAgICBvdXRbM10gPSBhMDMgKiBjIC0gYTIzICogcztcbiAgICBvdXRbOF0gPSBhMDAgKiBzICsgYTIwICogYztcbiAgICBvdXRbOV0gPSBhMDEgKiBzICsgYTIxICogYztcbiAgICBvdXRbMTBdID0gYTAyICogcyArIGEyMiAqIGM7XG4gICAgb3V0WzExXSA9IGEwMyAqIHMgKyBhMjMgKiBjO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzIHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LlNJTUQucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gU0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5zaW4ocmFkKSksXG4gICAgICAgIGMgPSBTSU1ELkZsb2F0MzJ4NC5zcGxhdChNYXRoLmNvcyhyYWQpKTtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgICAgICBvdXRbNF0gID0gYVs0XTtcbiAgICAgICAgb3V0WzVdICA9IGFbNV07XG4gICAgICAgIG91dFs2XSAgPSBhWzZdO1xuICAgICAgICBvdXRbN10gID0gYVs3XTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICB2YXIgYV8wID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCAwKTtcbiAgICB2YXIgYV8yID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA4KTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChhXzAsIGMpLCBTSU1ELkZsb2F0MzJ4NC5tdWwoYV8yLCBzKSkpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGFfMCwgcyksIFNJTUQuRmxvYXQzMng0Lm11bChhXzIsIGMpKSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMgaWYgU0lNRCBhdmFpbGFibGUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG4gbWF0NC5yb3RhdGVZID0gZ2xNYXRyaXguVVNFX1NJTUQgPyBtYXQ0LlNJTUQucm90YXRlWSA6IG1hdDQuc2NhbGFyLnJvdGF0ZVk7XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXMgbm90IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnNjYWxhci5yb3RhdGVaID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTAwID0gYVswXSxcbiAgICAgICAgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSxcbiAgICAgICAgYTExID0gYVs1XSxcbiAgICAgICAgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XTtcblxuICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICAgICAgb3V0WzhdICA9IGFbOF07XG4gICAgICAgIG91dFs5XSAgPSBhWzldO1xuICAgICAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgICBvdXRbMV0gPSBhMDEgKiBjICsgYTExICogcztcbiAgICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogcztcbiAgICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgICBvdXRbNF0gPSBhMTAgKiBjIC0gYTAwICogcztcbiAgICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcbiAgICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgICBvdXRbN10gPSBhMTMgKiBjIC0gYTAzICogcztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpcyB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELnJvdGF0ZVogPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IFNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguc2luKHJhZCkpLFxuICAgICAgICBjID0gU0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5jb3MocmFkKSk7XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgICAgIG91dFs4XSAgPSBhWzhdO1xuICAgICAgICBvdXRbOV0gID0gYVs5XTtcbiAgICAgICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgICAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgdmFyIGFfMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMCk7XG4gICAgdmFyIGFfMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoYV8wLCBjKSwgU0lNRC5GbG9hdDMyeDQubXVsKGFfMSwgcykpKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChhXzEsIGMpLCBTSU1ELkZsb2F0MzJ4NC5tdWwoYV8wLCBzKSkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzIGlmIFNJTUQgYXZhaWxhYmxlIGFuZCBlbmFibGVkXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuIG1hdDQucm90YXRlWiA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELnJvdGF0ZVogOiBtYXQ0LnNjYWxhci5yb3RhdGVaO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVRyYW5zbGF0aW9uID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMzfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gdlsxXTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSB2WzJdO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGUgYXJvdW5kIGEgZ2l2ZW4gYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkLCBheGlzKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICAgIHZhciB4ID0gYXhpc1swXSwgeSA9IGF4aXNbMV0sIHogPSBheGlzWzJdLFxuICAgICAgICBsZW4gPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KSxcbiAgICAgICAgcywgYywgdDtcblxuICAgIGlmIChNYXRoLmFicyhsZW4pIDwgZ2xNYXRyaXguRVBTSUxPTikgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4ICo9IGxlbjtcbiAgICB5ICo9IGxlbjtcbiAgICB6ICo9IGxlbjtcblxuICAgIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIHQgPSAxIC0gYztcblxuICAgIC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0geCAqIHggKiB0ICsgYztcbiAgICBvdXRbMV0gPSB5ICogeCAqIHQgKyB6ICogcztcbiAgICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHggKiB5ICogdCAtIHogKiBzO1xuICAgIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gICAgb3V0WzZdID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgICBvdXRbOV0gPSB5ICogeiAqIHQgLSB4ICogcztcbiAgICBvdXRbMTBdID0geiAqIHogKiB0ICsgYztcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWChkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVhSb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gID0gMTtcbiAgICBvdXRbMV0gID0gMDtcbiAgICBvdXRbMl0gID0gMDtcbiAgICBvdXRbM10gID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGM7XG4gICAgb3V0WzZdID0gcztcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gLXM7XG4gICAgb3V0WzEwXSA9IGM7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVkoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21ZUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdICA9IGM7XG4gICAgb3V0WzFdICA9IDA7XG4gICAgb3V0WzJdICA9IC1zO1xuICAgIG91dFszXSAgPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gcztcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSBjO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVaKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tWlJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSAgPSBjO1xuICAgIG91dFsxXSAgPSBzO1xuICAgIG91dFsyXSAgPSAwO1xuICAgIG91dFszXSAgPSAwO1xuICAgIG91dFs0XSA9IC1zO1xuICAgIG91dFs1XSA9IGM7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICB2YXIgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24gPSBmdW5jdGlvbiAob3V0LCBxLCB2KSB7XG4gICAgLy8gUXVhdGVybmlvbiBtYXRoXG4gICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdLFxuICAgICAgICB4MiA9IHggKyB4LFxuICAgICAgICB5MiA9IHkgKyB5LFxuICAgICAgICB6MiA9IHogKyB6LFxuXG4gICAgICAgIHh4ID0geCAqIHgyLFxuICAgICAgICB4eSA9IHggKiB5MixcbiAgICAgICAgeHogPSB4ICogejIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB5eiA9IHkgKiB6MixcbiAgICAgICAgenogPSB6ICogejIsXG4gICAgICAgIHd4ID0gdyAqIHgyLFxuICAgICAgICB3eSA9IHcgKiB5MixcbiAgICAgICAgd3ogPSB3ICogejI7XG5cbiAgICBvdXRbMF0gPSAxIC0gKHl5ICsgenopO1xuICAgIG91dFsxXSA9IHh5ICsgd3o7XG4gICAgb3V0WzJdID0geHogLSB3eTtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHh5IC0gd3o7XG4gICAgb3V0WzVdID0gMSAtICh4eCArIHp6KTtcbiAgICBvdXRbNl0gPSB5eiArIHd4O1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geHogKyB3eTtcbiAgICBvdXRbOV0gPSB5eiAtIHd4O1xuICAgIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSB2WzBdO1xuICAgIG91dFsxM10gPSB2WzFdO1xuICAgIG91dFsxNF0gPSB2WzJdO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLFxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSB0cmFuc2xhdGlvbiBjb21wb25lbnRcbiAqIEBwYXJhbSAge21hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXG4gKiBAcmV0dXJuIHt2ZWMzfSBvdXRcbiAqL1xubWF0NC5nZXRUcmFuc2xhdGlvbiA9IGZ1bmN0aW9uIChvdXQsIG1hdCkge1xuICBvdXRbMF0gPSBtYXRbMTJdO1xuICBvdXRbMV0gPSBtYXRbMTNdO1xuICBvdXRbMl0gPSBtYXRbMTRdO1xuXG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb25hbCBjb21wb25lbnRcbiAqICBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aFxuICogIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLCB0aGUgcmV0dXJuZWQgcXVhdGVybmlvbiB3aWxsIGJlIHRoZVxuICogIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSB7cXVhdH0gb3V0IFF1YXRlcm5pb24gdG8gcmVjZWl2ZSB0aGUgcm90YXRpb24gY29tcG9uZW50XG4gKiBAcGFyYW0ge21hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcbiAqL1xubWF0NC5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uIChvdXQsIG1hdCkge1xuICAvLyBBbGdvcml0aG0gdGFrZW4gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuICB2YXIgdHJhY2UgPSBtYXRbMF0gKyBtYXRbNV0gKyBtYXRbMTBdO1xuICB2YXIgUyA9IDA7XG5cbiAgaWYgKHRyYWNlID4gMCkgeyBcbiAgICBTID0gTWF0aC5zcXJ0KHRyYWNlICsgMS4wKSAqIDI7XG4gICAgb3V0WzNdID0gMC4yNSAqIFM7XG4gICAgb3V0WzBdID0gKG1hdFs2XSAtIG1hdFs5XSkgLyBTO1xuICAgIG91dFsxXSA9IChtYXRbOF0gLSBtYXRbMl0pIC8gUzsgXG4gICAgb3V0WzJdID0gKG1hdFsxXSAtIG1hdFs0XSkgLyBTOyBcbiAgfSBlbHNlIGlmICgobWF0WzBdID4gbWF0WzVdKSYobWF0WzBdID4gbWF0WzEwXSkpIHsgXG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBtYXRbMF0gLSBtYXRbNV0gLSBtYXRbMTBdKSAqIDI7XG4gICAgb3V0WzNdID0gKG1hdFs2XSAtIG1hdFs5XSkgLyBTO1xuICAgIG91dFswXSA9IDAuMjUgKiBTO1xuICAgIG91dFsxXSA9IChtYXRbMV0gKyBtYXRbNF0pIC8gUzsgXG4gICAgb3V0WzJdID0gKG1hdFs4XSArIG1hdFsyXSkgLyBTOyBcbiAgfSBlbHNlIGlmIChtYXRbNV0gPiBtYXRbMTBdKSB7IFxuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgbWF0WzVdIC0gbWF0WzBdIC0gbWF0WzEwXSkgKiAyO1xuICAgIG91dFszXSA9IChtYXRbOF0gLSBtYXRbMl0pIC8gUztcbiAgICBvdXRbMF0gPSAobWF0WzFdICsgbWF0WzRdKSAvIFM7IFxuICAgIG91dFsxXSA9IDAuMjUgKiBTO1xuICAgIG91dFsyXSA9IChtYXRbNl0gKyBtYXRbOV0pIC8gUzsgXG4gIH0gZWxzZSB7IFxuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgbWF0WzEwXSAtIG1hdFswXSAtIG1hdFs1XSkgKiAyO1xuICAgIG91dFszXSA9IChtYXRbMV0gLSBtYXRbNF0pIC8gUztcbiAgICBvdXRbMF0gPSAobWF0WzhdICsgbWF0WzJdKSAvIFM7XG4gICAgb3V0WzFdID0gKG1hdFs2XSArIG1hdFs5XSkgLyBTO1xuICAgIG91dFsyXSA9IDAuMjUgKiBTO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XG4gKiAgICAgdmFyIHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlID0gZnVuY3Rpb24gKG91dCwgcSwgdiwgcykge1xuICAgIC8vIFF1YXRlcm5pb24gbWF0aFxuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeHkgPSB4ICogeTIsXG4gICAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgeXogPSB5ICogejIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyLFxuICAgICAgICBzeCA9IHNbMF0sXG4gICAgICAgIHN5ID0gc1sxXSxcbiAgICAgICAgc3ogPSBzWzJdO1xuXG4gICAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gICAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gICAgb3V0WzJdID0gKHh6IC0gd3kpICogc3g7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgICBvdXRbNV0gPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9ICh4eiArIHd5KSAqIHN6O1xuICAgIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICAgIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlLCByb3RhdGluZyBhbmQgc2NhbGluZyBhcm91bmQgdGhlIGdpdmVuIG9yaWdpblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBvcmlnaW4pO1xuICogICAgIHZhciBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG5lZ2F0aXZlT3JpZ2luKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBvIFRoZSBvcmlnaW4gdmVjdG9yIGFyb3VuZCB3aGljaCB0byBzY2FsZSBhbmQgcm90YXRlXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbiA9IGZ1bmN0aW9uIChvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgIHgyID0geCArIHgsXG4gICAgICB5MiA9IHkgKyB5LFxuICAgICAgejIgPSB6ICsgeixcblxuICAgICAgeHggPSB4ICogeDIsXG4gICAgICB4eSA9IHggKiB5MixcbiAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgeXkgPSB5ICogeTIsXG4gICAgICB5eiA9IHkgKiB6MixcbiAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgd3ggPSB3ICogeDIsXG4gICAgICB3eSA9IHcgKiB5MixcbiAgICAgIHd6ID0gdyAqIHoyLFxuXG4gICAgICBzeCA9IHNbMF0sXG4gICAgICBzeSA9IHNbMV0sXG4gICAgICBzeiA9IHNbMl0sXG5cbiAgICAgIG94ID0gb1swXSxcbiAgICAgIG95ID0gb1sxXSxcbiAgICAgIG96ID0gb1syXTtcblxuICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0WzBdICogb3ggKyBvdXRbNF0gKiBveSArIG91dFs4XSAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXRbMV0gKiBveCArIG91dFs1XSAqIG95ICsgb3V0WzldICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dFsyXSAqIG94ICsgb3V0WzZdICogb3kgKyBvdXRbMTBdICogb3opO1xuICBvdXRbMTVdID0gMTtcblxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgNHg0IG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXG4gKlxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21RdWF0ID0gZnVuY3Rpb24gKG91dCwgcSkge1xuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeXggPSB5ICogeDIsXG4gICAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgICB6eCA9IHogKiB4MixcbiAgICAgICAgenkgPSB6ICogeTIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gICAgb3V0WzFdID0geXggKyB3ejtcbiAgICBvdXRbMl0gPSB6eCAtIHd5O1xuICAgIG91dFszXSA9IDA7XG5cbiAgICBvdXRbNF0gPSB5eCAtIHd6O1xuICAgIG91dFs1XSA9IDEgLSB4eCAtIHp6O1xuICAgIG91dFs2XSA9IHp5ICsgd3g7XG4gICAgb3V0WzddID0gMDtcblxuICAgIG91dFs4XSA9IHp4ICsgd3k7XG4gICAgb3V0WzldID0genkgLSB3eDtcbiAgICBvdXRbMTBdID0gMSAtIHh4IC0geXk7XG4gICAgb3V0WzExXSA9IDA7XG5cbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZydXN0dW0gPSBmdW5jdGlvbiAob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICAgIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgdGIgPSAxIC8gKHRvcCAtIGJvdHRvbSksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSAobmVhciAqIDIpICogcmw7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAobmVhciAqIDIpICogdGI7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IChyaWdodCArIGxlZnQpICogcmw7XG4gICAgb3V0WzldID0gKHRvcCArIGJvdHRvbSkgKiB0YjtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoZmFyICogbmVhciAqIDIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5wZXJzcGVjdGl2ZSA9IGZ1bmN0aW9uIChvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBmaWVsZCBvZiB2aWV3LlxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBnZW5lcmF0aW5nIHByb2plY3Rpb24gbWF0cmljZXMgdG8gYmUgdXNlZFxuICogd2l0aCB0aGUgc3RpbGwgZXhwZXJpZW1lbnRhbCBXZWJWUiBBUEkuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtPYmplY3R9IGZvdiBPYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHZhbHVlczogdXBEZWdyZWVzLCBkb3duRGVncmVlcywgbGVmdERlZ3JlZXMsIHJpZ2h0RGVncmVlc1xuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyA9IGZ1bmN0aW9uIChvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gICAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkvMTgwLjApLFxuICAgICAgICBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJLzE4MC4wKSxcbiAgICAgICAgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pLFxuICAgICAgICB5U2NhbGUgPSAyLjAgLyAodXBUYW4gKyBkb3duVGFuKTtcblxuICAgIG91dFswXSA9IHhTY2FsZTtcbiAgICBvdXRbMV0gPSAwLjA7XG4gICAgb3V0WzJdID0gMC4wO1xuICAgIG91dFszXSA9IDAuMDtcbiAgICBvdXRbNF0gPSAwLjA7XG4gICAgb3V0WzVdID0geVNjYWxlO1xuICAgIG91dFs2XSA9IDAuMDtcbiAgICBvdXRbN10gPSAwLjA7XG4gICAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gICAgb3V0WzldID0gKCh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41KTtcbiAgICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxMV0gPSAtMS4wO1xuICAgIG91dFsxMl0gPSAwLjA7XG4gICAgb3V0WzEzXSA9IDAuMDtcbiAgICBvdXRbMTRdID0gKGZhciAqIG5lYXIpIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxNV0gPSAwLjA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm9ydGhvID0gZnVuY3Rpb24gKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCksXG4gICAgICAgIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gLTIgKiBscjtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IC0yICogYnQ7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMiAqIG5mO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICAgIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICAgIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBsb29rLWF0IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBleWUgcG9zaXRpb24sIGZvY2FsIHBvaW50LCBhbmQgdXAgYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7dmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7dmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubG9va0F0ID0gZnVuY3Rpb24gKG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCBnbE1hdHJpeC5FUFNJTE9OICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IGdsTWF0cml4LkVQU0lMT04gJiZcbiAgICAgICAgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgICAgICByZXR1cm4gbWF0NC5pZGVudGl0eShvdXQpO1xuICAgIH1cblxuICAgIHowID0gZXlleCAtIGNlbnRlcng7XG4gICAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuXG4gICAgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuXG4gICAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gICAgbGVuID0gTWF0aC5zcXJ0KHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeDAgPSAwO1xuICAgICAgICB4MSA9IDA7XG4gICAgICAgIHgyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB4MCAqPSBsZW47XG4gICAgICAgIHgxICo9IGxlbjtcbiAgICAgICAgeDIgKj0gbGVuO1xuICAgIH1cblxuICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gICAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuXG4gICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeTAgPSAwO1xuICAgICAgICB5MSA9IDA7XG4gICAgICAgIHkyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB5MCAqPSBsZW47XG4gICAgICAgIHkxICo9IGxlbjtcbiAgICAgICAgeTIgKj0gbGVuO1xuICAgIH1cblxuICAgIG91dFswXSA9IHgwO1xuICAgIG91dFsxXSA9IHkwO1xuICAgIG91dFsyXSA9IHowO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geDE7XG4gICAgb3V0WzVdID0geTE7XG4gICAgb3V0WzZdID0gejE7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4MjtcbiAgICBvdXRbOV0gPSB5MjtcbiAgICBvdXRbMTBdID0gejI7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gbWF0IG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVs0XSArICcsICcgKyBhWzVdICsgJywgJyArIGFbNl0gKyAnLCAnICsgYVs3XSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzhdICsgJywgJyArIGFbOV0gKyAnLCAnICsgYVsxMF0gKyAnLCAnICsgYVsxMV0gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVsxMl0gKyAnLCAnICsgYVsxM10gKyAnLCAnICsgYVsxNF0gKyAnLCAnICsgYVsxNV0gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQ0LmZyb2IgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybihNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgTWF0aC5wb3coYVs2XSwgMikgKyBNYXRoLnBvdyhhWzddLCAyKSArIE1hdGgucG93KGFbOF0sIDIpICsgTWF0aC5wb3coYVs5XSwgMikgKyBNYXRoLnBvdyhhWzEwXSwgMikgKyBNYXRoLnBvdyhhWzExXSwgMikgKyBNYXRoLnBvdyhhWzEyXSwgMikgKyBNYXRoLnBvdyhhWzEzXSwgMikgKyBNYXRoLnBvdyhhWzE0XSwgMikgKyBNYXRoLnBvdyhhWzE1XSwgMikgKSlcbn07XG5cbi8qKlxuICogQWRkcyB0d28gbWF0NCdzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICAgIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICAgIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICAgIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICAgIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICAgIG91dFs4XSA9IGFbOF0gKyBiWzhdO1xuICAgIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXSArIGJbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXSArIGJbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XSArIGJbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gICAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gICAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gICAgb3V0WzZdID0gYVs2XSAtIGJbNl07XG4gICAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gICAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gICAgb3V0WzldID0gYVs5XSAtIGJbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdIC0gYlsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdIC0gYlsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdIC0gYlsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdIC0gYlsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdIC0gYlsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdIC0gYlsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDQuc3ViID0gbWF0NC5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5tdWx0aXBseVNjYWxhciA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIG91dFszXSA9IGFbM10gKiBiO1xuICAgIG91dFs0XSA9IGFbNF0gKiBiO1xuICAgIG91dFs1XSA9IGFbNV0gKiBiO1xuICAgIG91dFs2XSA9IGFbNl0gKiBiO1xuICAgIG91dFs3XSA9IGFbN10gKiBiO1xuICAgIG91dFs4XSA9IGFbOF0gKiBiO1xuICAgIG91dFs5XSA9IGFbOV0gKiBiO1xuICAgIG91dFsxMF0gPSBhWzEwXSAqIGI7XG4gICAgb3V0WzExXSA9IGFbMTFdICogYjtcbiAgICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICAgIG91dFsxM10gPSBhWzEzXSAqIGI7XG4gICAgb3V0WzE0XSA9IGFbMTRdICogYjtcbiAgICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHlTY2FsYXJBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgb3V0WzBdID0gYVswXSArIChiWzBdICogc2NhbGUpO1xuICAgIG91dFsxXSA9IGFbMV0gKyAoYlsxXSAqIHNjYWxlKTtcbiAgICBvdXRbMl0gPSBhWzJdICsgKGJbMl0gKiBzY2FsZSk7XG4gICAgb3V0WzNdID0gYVszXSArIChiWzNdICogc2NhbGUpO1xuICAgIG91dFs0XSA9IGFbNF0gKyAoYls0XSAqIHNjYWxlKTtcbiAgICBvdXRbNV0gPSBhWzVdICsgKGJbNV0gKiBzY2FsZSk7XG4gICAgb3V0WzZdID0gYVs2XSArIChiWzZdICogc2NhbGUpO1xuICAgIG91dFs3XSA9IGFbN10gKyAoYls3XSAqIHNjYWxlKTtcbiAgICBvdXRbOF0gPSBhWzhdICsgKGJbOF0gKiBzY2FsZSk7XG4gICAgb3V0WzldID0gYVs5XSArIChiWzldICogc2NhbGUpO1xuICAgIG91dFsxMF0gPSBhWzEwXSArIChiWzEwXSAqIHNjYWxlKTtcbiAgICBvdXRbMTFdID0gYVsxMV0gKyAoYlsxMV0gKiBzY2FsZSk7XG4gICAgb3V0WzEyXSA9IGFbMTJdICsgKGJbMTJdICogc2NhbGUpO1xuICAgIG91dFsxM10gPSBhWzEzXSArIChiWzEzXSAqIHNjYWxlKTtcbiAgICBvdXRbMTRdID0gYVsxNF0gKyAoYlsxNF0gKiBzY2FsZSk7XG4gICAgb3V0WzE1XSA9IGFbMTVdICsgKGJbMTVdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7bWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xubWF0NC5leGFjdEVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgXG4gICAgICAgICAgIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgXG4gICAgICAgICAgIGFbOF0gPT09IGJbOF0gJiYgYVs5XSA9PT0gYls5XSAmJiBhWzEwXSA9PT0gYlsxMF0gJiYgYVsxMV0gPT09IGJbMTFdICYmXG4gICAgICAgICAgIGFbMTJdID09PSBiWzEyXSAmJiBhWzEzXSA9PT0gYlsxM10gJiYgYVsxNF0gPT09IGJbMTRdICYmIGFbMTVdID09PSBiWzE1XTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQ0LmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGEwICA9IGFbMF0sICBhMSAgPSBhWzFdLCAgYTIgID0gYVsyXSwgIGEzICA9IGFbM10sXG4gICAgICAgIGE0ICA9IGFbNF0sICBhNSAgPSBhWzVdLCAgYTYgID0gYVs2XSwgIGE3ICA9IGFbN10sIFxuICAgICAgICBhOCAgPSBhWzhdLCAgYTkgID0gYVs5XSwgIGExMCA9IGFbMTBdLCBhMTEgPSBhWzExXSwgXG4gICAgICAgIGExMiA9IGFbMTJdLCBhMTMgPSBhWzEzXSwgYTE0ID0gYVsxNF0sIGExNSA9IGFbMTVdO1xuXG4gICAgdmFyIGIwICA9IGJbMF0sICBiMSAgPSBiWzFdLCAgYjIgID0gYlsyXSwgIGIzICA9IGJbM10sXG4gICAgICAgIGI0ICA9IGJbNF0sICBiNSAgPSBiWzVdLCAgYjYgID0gYls2XSwgIGI3ICA9IGJbN10sIFxuICAgICAgICBiOCAgPSBiWzhdLCAgYjkgID0gYls5XSwgIGIxMCA9IGJbMTBdLCBiMTEgPSBiWzExXSwgXG4gICAgICAgIGIxMiA9IGJbMTJdLCBiMTMgPSBiWzEzXSwgYjE0ID0gYlsxNF0sIGIxNSA9IGJbMTVdO1xuXG4gICAgcmV0dXJuIChNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhOSAtIGI5KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTkpLCBNYXRoLmFicyhiOSkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMTAgLSBiMTApIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTApLCBNYXRoLmFicyhiMTApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTExIC0gYjExKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTExKSwgTWF0aC5hYnMoYjExKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExMiAtIGIxMikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMiksIE1hdGguYWJzKGIxMikpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMTMgLSBiMTMpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTMpLCBNYXRoLmFicyhiMTMpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTE0IC0gYjE0KSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE0KSwgTWF0aC5hYnMoYjE0KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExNSAtIGIxNSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNSksIE1hdGguYWJzKGIxNSkpKTtcbn07XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdDQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9+L2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L21hdDQuanNcbi8vIG1vZHVsZSBpZCA9IDM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 37 */ -/***/ function(module, exports, __webpack_require__) { - - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\nvar mat3 = __webpack_require__(20);\nvar vec3 = __webpack_require__(21);\nvar vec4 = __webpack_require__(22);\n\n/**\n * @class Quaternion\n * @name quat\n */\nvar quat = {};\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nquat.create = function() {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {vec3} a the initial vector\n * @param {vec3} b the destination vector\n * @returns {quat} out\n */\nquat.rotationTo = (function() {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1,0,0);\n var yUnitVec3 = vec3.fromValues(0,1,0);\n\n return function(out, a, b) {\n var dot = vec3.dot(a, b);\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.length(tmpvec3) < 0.000001)\n vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n quat.setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return quat.normalize(out, out);\n }\n };\n})();\n\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {vec3} view the vector representing the viewing direction\n * @param {vec3} right the vector representing the local \"right\" direction\n * @param {vec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\nquat.setAxes = (function() {\n var matr = mat3.create();\n\n return function(out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n\n return quat.normalize(out, quat.fromMat3(out, matr));\n };\n})();\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nquat.clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nquat.fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nquat.copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nquat.set = vec4.set;\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nquat.identity = function(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nquat.setAxisAngle = function(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n};\n\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {quat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\nquat.getAxisAngle = function(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n if (s != 0.0) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n return rad;\n};\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nquat.add = vec4.add;\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nquat.multiply = function(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n};\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nquat.mul = quat.multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nquat.scale = vec4.scale;\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateX = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateY = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n by = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateZ = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bz = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n};\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\nquat.calculateW = function (out, a) {\n var x = a[0], y = a[1], z = a[2];\n\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n};\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nquat.dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nquat.lerp = vec4.lerp;\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nquat.slerp = function (out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n var omega, cosom, sinom, scale0, scale1;\n\n // calc cosine\n cosom = ax * bx + ay * by + az * bz + aw * bw;\n // adjust signs (if necessary)\n if ( cosom < 0.0 ) {\n cosom = -cosom;\n bx = - bx;\n by = - by;\n bz = - bz;\n bw = - bw;\n }\n // calculate coefficients\n if ( (1.0 - cosom) > 0.000001 ) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else { \n // \"from\" and \"to\" quaternions are very close \n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n }\n // calculate final values\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n \n return out;\n};\n\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {quat} c the third operand\n * @param {quat} d the fourth operand\n * @param {Number} t interpolation amount\n * @returns {quat} out\n */\nquat.sqlerp = (function () {\n var temp1 = quat.create();\n var temp2 = quat.create();\n \n return function (out, a, b, c, d, t) {\n quat.slerp(temp1, a, d, t);\n quat.slerp(temp2, b, c, t);\n quat.slerp(out, temp1, temp2, 2 * t * (1 - t));\n \n return out;\n };\n}());\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nquat.invert = function(out, a) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,\n invDot = dot ? 1.0/dot : 0;\n \n // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0*invDot;\n out[1] = -a1*invDot;\n out[2] = -a2*invDot;\n out[3] = a3*invDot;\n return out;\n};\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nquat.conjugate = function (out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n * @function\n */\nquat.length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nquat.len = quat.length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nquat.squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nquat.sqrLen = quat.squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nquat.normalize = vec4.normalize;\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nquat.fromMat3 = function(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if ( fTrace > 0.0 ) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n out[3] = 0.5 * fRoot;\n fRoot = 0.5/fRoot; // 1/(4w)\n out[0] = (m[5]-m[7])*fRoot;\n out[1] = (m[6]-m[2])*fRoot;\n out[2] = (m[1]-m[3])*fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if ( m[4] > m[0] )\n i = 1;\n if ( m[8] > m[i*3+i] )\n i = 2;\n var j = (i+1)%3;\n var k = (i+2)%3;\n \n fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j*3+k] - m[k*3+j]) * fRoot;\n out[j] = (m[j*3+i] + m[i*3+j]) * fRoot;\n out[k] = (m[k*3+i] + m[i*3+k]) * fRoot;\n }\n \n return out;\n};\n\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nquat.str = function (a) {\n return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {quat} a The first quaternion.\n * @param {quat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.exactEquals = vec4.exactEquals;\n\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {quat} a The first vector.\n * @param {quat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.equals = vec4.equals;\n\nmodule.exports = quat;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9xdWF0LmpzP2QxMjUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCLFlBQVksS0FBSztBQUNqQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQSxlOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0EsZTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBLGU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxPO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQSIsImZpbGUiOiIzNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcbnZhciBtYXQzID0gcmVxdWlyZShcIi4vbWF0My5qc1wiKTtcbnZhciB2ZWMzID0gcmVxdWlyZShcIi4vdmVjMy5qc1wiKTtcbnZhciB2ZWM0ID0gcmVxdWlyZShcIi4vdmVjNC5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgUXVhdGVybmlvblxuICogQG5hbWUgcXVhdFxuICovXG52YXIgcXVhdCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxuICpcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKi9cbnF1YXQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxuICogdmVjdG9yIHRvIGFub3RoZXIuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRpb25UbyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG1wdmVjMyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLDAsMCk7XG4gICAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLDEsMCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcbiAgICAgICAgaWYgKGRvdCA8IC0wLjk5OTk5OSkge1xuICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB4VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgaWYgKHZlYzMubGVuZ3RoKHRtcHZlYzMpIDwgMC4wMDAwMDEpXG4gICAgICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICAgICAgICBxdWF0LnNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgICAgICAgb3V0WzBdID0gMDtcbiAgICAgICAgICAgIG91dFsxXSA9IDA7XG4gICAgICAgICAgICBvdXRbMl0gPSAwO1xuICAgICAgICAgICAgb3V0WzNdID0gMTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIGEsIGIpO1xuICAgICAgICAgICAgb3V0WzBdID0gdG1wdmVjM1swXTtcbiAgICAgICAgICAgIG91dFsxXSA9IHRtcHZlYzNbMV07XG4gICAgICAgICAgICBvdXRbMl0gPSB0bXB2ZWMzWzJdO1xuICAgICAgICAgICAgb3V0WzNdID0gMSArIGRvdDtcbiAgICAgICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSByaWdodCB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJyaWdodFwiIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnNldEF4ZXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgICAgIG1hdHJbMF0gPSByaWdodFswXTtcbiAgICAgICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgICAgICBtYXRyWzZdID0gcmlnaHRbMl07XG5cbiAgICAgICAgbWF0clsxXSA9IHVwWzBdO1xuICAgICAgICBtYXRyWzRdID0gdXBbMV07XG4gICAgICAgIG1hdHJbN10gPSB1cFsyXTtcblxuICAgICAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICAgICAgbWF0cls4XSA9IC12aWV3WzJdO1xuXG4gICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIHF1YXQuZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY2xvbmUgPSB2ZWM0LmNsb25lO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY29weSA9IHZlYzQuY29weTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zZXQgPSB2ZWM0LnNldDtcblxuLyoqXG4gKiBTZXQgYSBxdWF0IHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIGFyb3VuZCB3aGljaCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqKi9cbnF1YXQuc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24ob3V0LCBheGlzLCByYWQpIHtcbiAgICByYWQgPSByYWQgKiAwLjU7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIG91dFswXSA9IHMgKiBheGlzWzBdO1xuICAgIG91dFsxXSA9IHMgKiBheGlzWzFdO1xuICAgIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICAgIG91dFszXSA9IE1hdGguY29zKHJhZCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgcm90YXRpb24gYXhpcyBhbmQgYW5nbGUgZm9yIGEgZ2l2ZW5cbiAqICBxdWF0ZXJuaW9uLiBJZiBhIHF1YXRlcm5pb24gaXMgY3JlYXRlZCB3aXRoXG4gKiAgc2V0QXhpc0FuZ2xlLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZVxuICogIHZhbHVlcyBhcyBwcm92aWRpZWQgaW4gdGhlIG9yaWdpbmFsIHBhcmFtZXRlciBsaXN0XG4gKiAgT1IgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdmFsdWVzLlxuICogRXhhbXBsZTogVGhlIHF1YXRlcm5pb24gZm9ybWVkIGJ5IGF4aXMgWzAsIDAsIDFdIGFuZFxuICogIGFuZ2xlIC05MCBpcyB0aGUgc2FtZSBhcyB0aGUgcXVhdGVybmlvbiBmb3JtZWQgYnlcbiAqICBbMCwgMCwgMV0gYW5kIDI3MC4gVGhpcyBtZXRob2QgZmF2b3JzIHRoZSBsYXR0ZXIuXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXRfYXhpcyAgVmVjdG9yIHJlY2VpdmluZyB0aGUgYXhpcyBvZiByb3RhdGlvblxuICogQHBhcmFtICB7cXVhdH0gcSAgICAgUXVhdGVybmlvbiB0byBiZSBkZWNvbXBvc2VkXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgb2YgdGhlIHJvdGF0aW9uXG4gKi9cbnF1YXQuZ2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24ob3V0X2F4aXMsIHEpIHtcbiAgICB2YXIgcmFkID0gTWF0aC5hY29zKHFbM10pICogMi4wO1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkIC8gMi4wKTtcbiAgICBpZiAocyAhPSAwLjApIHtcbiAgICAgICAgb3V0X2F4aXNbMF0gPSBxWzBdIC8gcztcbiAgICAgICAgb3V0X2F4aXNbMV0gPSBxWzFdIC8gcztcbiAgICAgICAgb3V0X2F4aXNbMl0gPSBxWzJdIC8gcztcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBzIGlzIHplcm8sIHJldHVybiBhbnkgYXhpcyAobm8gcm90YXRpb24gLSBheGlzIGRvZXMgbm90IG1hdHRlcilcbiAgICAgICAgb3V0X2F4aXNbMF0gPSAxO1xuICAgICAgICBvdXRfYXhpc1sxXSA9IDA7XG4gICAgICAgIG91dF9heGlzWzJdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHJhZDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmFkZCA9IHZlYzQuYWRkO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lm11bCA9IHF1YXQubXVsdGlwbHk7XG5cbi8qKlxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zY2FsZSA9IHZlYzQuc2NhbGU7XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ4ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF6ICogYng7XG4gICAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ5ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF4ICogYnk7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF5ICogYnk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVogPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41OyBcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ6ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gICAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYno7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXG4gKiBBc3N1bWVzIHRoYXQgcXVhdGVybmlvbiBpcyAxIHVuaXQgaW4gbGVuZ3RoLlxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG5cbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZG90ID0gdmVjNC5kb3Q7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVycCA9IHZlYzQubGVycDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5zbGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICAvLyBiZW5jaG1hcmtzOlxuICAgIC8vICAgIGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tc2xlcnAtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICB2YXIgICAgICAgIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxO1xuXG4gICAgLy8gY2FsYyBjb3NpbmVcbiAgICBjb3NvbSA9IGF4ICogYnggKyBheSAqIGJ5ICsgYXogKiBieiArIGF3ICogYnc7XG4gICAgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG4gICAgaWYgKCBjb3NvbSA8IDAuMCApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICggKDEuMCAtIGNvc29tKSA+IDAuMDAwMDAxICkge1xuICAgICAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcbiAgICAgICAgb21lZ2EgID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICAgICAgc2lub20gID0gTWF0aC5zaW4ob21lZ2EpO1xuICAgICAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICAgICAgc2NhbGUxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xuICAgIH0gZWxzZSB7ICAgICAgICBcbiAgICAgICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZSBcbiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgICAgICBzY2FsZTEgPSB0O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzXG4gICAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgICBvdXRbMV0gPSBzY2FsZTAgKiBheSArIHNjYWxlMSAqIGJ5O1xuICAgIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7XG4gICAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuc3FsZXJwID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlbXAxID0gcXVhdC5jcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gcXVhdC5jcmVhdGUoKTtcbiAgXG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgcXVhdC5zbGVycCh0ZW1wMSwgYSwgZCwgdCk7XG4gICAgcXVhdC5zbGVycCh0ZW1wMiwgYiwgYywgdCk7XG4gICAgcXVhdC5zbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICBcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpKTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICBkb3QgPSBhMCphMCArIGExKmExICsgYTIqYTIgKyBhMyphMyxcbiAgICAgICAgaW52RG90ID0gZG90ID8gMS4wL2RvdCA6IDA7XG4gICAgXG4gICAgLy8gVE9ETzogV291bGQgYmUgZmFzdGVyIHRvIHJldHVybiBbMCwwLDAsMF0gaW1tZWRpYXRlbHkgaWYgZG90ID09IDBcblxuICAgIG91dFswXSA9IC1hMCppbnZEb3Q7XG4gICAgb3V0WzFdID0gLWExKmludkRvdDtcbiAgICBvdXRbMl0gPSAtYTIqaW52RG90O1xuICAgIG91dFszXSA9IGEzKmludkRvdDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjb25qdWdhdGUgb2YgYSBxdWF0XG4gKiBJZiB0aGUgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHF1YXQuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5sZW5ndGggPSB2ZWM0Lmxlbmd0aDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVuID0gcXVhdC5sZW5ndGg7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LnNxdWFyZWRMZW5ndGggPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zcXJMZW4gPSBxdWF0LnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5ub3JtYWxpemUgPSB2ZWM0Lm5vcm1hbGl6ZTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxuICpcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge21hdDN9IG0gcm90YXRpb24gbWF0cml4XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5mcm9tTWF0MyA9IGZ1bmN0aW9uKG91dCwgbSkge1xuICAgIC8vIEFsZ29yaXRobSBpbiBLZW4gU2hvZW1ha2UncyBhcnRpY2xlIGluIDE5ODcgU0lHR1JBUEggY291cnNlIG5vdGVzXG4gICAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gICAgdmFyIGZUcmFjZSA9IG1bMF0gKyBtWzRdICsgbVs4XTtcbiAgICB2YXIgZlJvb3Q7XG5cbiAgICBpZiAoIGZUcmFjZSA+IDAuMCApIHtcbiAgICAgICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgICAgICBmUm9vdCA9IE1hdGguc3FydChmVHJhY2UgKyAxLjApOyAgLy8gMndcbiAgICAgICAgb3V0WzNdID0gMC41ICogZlJvb3Q7XG4gICAgICAgIGZSb290ID0gMC41L2ZSb290OyAgLy8gMS8oNHcpXG4gICAgICAgIG91dFswXSA9IChtWzVdLW1bN10pKmZSb290O1xuICAgICAgICBvdXRbMV0gPSAobVs2XS1tWzJdKSpmUm9vdDtcbiAgICAgICAgb3V0WzJdID0gKG1bMV0tbVszXSkqZlJvb3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gfHd8IDw9IDEvMlxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIGlmICggbVs0XSA+IG1bMF0gKVxuICAgICAgICAgIGkgPSAxO1xuICAgICAgICBpZiAoIG1bOF0gPiBtW2kqMytpXSApXG4gICAgICAgICAgaSA9IDI7XG4gICAgICAgIHZhciBqID0gKGkrMSklMztcbiAgICAgICAgdmFyIGsgPSAoaSsyKSUzO1xuICAgICAgICBcbiAgICAgICAgZlJvb3QgPSBNYXRoLnNxcnQobVtpKjMraV0tbVtqKjMral0tbVtrKjMra10gKyAxLjApO1xuICAgICAgICBvdXRbaV0gPSAwLjUgKiBmUm9vdDtcbiAgICAgICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICAgICAgb3V0WzNdID0gKG1baiozK2tdIC0gbVtrKjMral0pICogZlJvb3Q7XG4gICAgICAgIG91dFtqXSA9IChtW2oqMytpXSArIG1baSozK2pdKSAqIGZSb290O1xuICAgICAgICBvdXRba10gPSAobVtrKjMraV0gKyBtW2kqMytrXSkgKiBmUm9vdDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnF1YXQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3F1YXQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IGEgVGhlIGZpcnN0IHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge3F1YXR9IGIgVGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnF1YXQuZXhhY3RFcXVhbHMgPSB2ZWM0LmV4YWN0RXF1YWxzO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7cXVhdH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5xdWF0LmVxdWFscyA9IHZlYzQuZXF1YWxzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHF1YXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9+L2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3F1YXQuanNcbi8vIG1vZHVsZSBpZCA9IDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { - - eval("/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(3);\n\n/**\n * @class 2 Dimensional Vector\n * @name vec2\n */\nvar vec2 = {};\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nvec2.create = function() {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nvec2.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nvec2.fromValues = function(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n};\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nvec2.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nvec2.set = function(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n};\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nvec2.sub = vec2.subtract;\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nvec2.mul = vec2.multiply;\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nvec2.div = vec2.divide;\n\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to ceil\n * @returns {vec2} out\n */\nvec2.ceil = function (out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n};\n\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to floor\n * @returns {vec2} out\n */\nvec2.floor = function (out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n};\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n};\n\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to round\n * @returns {vec2} out\n */\nvec2.round = function (out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n};\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nvec2.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n};\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\nvec2.scaleAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nvec2.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nvec2.dist = vec2.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec2.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nvec2.sqrDist = vec2.squaredDistance;\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec2.length = function (a) {\n var x = a[0],\n y = a[1];\n return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nvec2.len = vec2.length;\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec2.squaredLength = function (a) {\n var x = a[0],\n y = a[1];\n return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nvec2.sqrLen = vec2.squaredLength;\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nvec2.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n};\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nvec2.inverse = function(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n};\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nvec2.normalize = function(out, a) {\n var x = a[0],\n y = a[1];\n var len = x*x + y*y;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec2.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1];\n};\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nvec2.cross = function(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n};\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nvec2.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\nvec2.random = function (out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2 = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2d = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat3 = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat4 = function(out, a, m) {\n var x = a[0], \n y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n};\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec2.forEach = (function() {\n var vec = vec2.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 2;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec2.str = function (a) {\n return 'vec2(' + a[0] + ', ' + a[1] + ')';\n};\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.exactEquals = function (a, b) {\n return a[0] === b[0] && a[1] === b[1];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.equals = function (a, b) {\n var a0 = a[0], a1 = a[1];\n var b0 = b[0], b1 = b[1];\n return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)));\n};\n\nmodule.exports = vec2;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vfi9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWMyLmpzPzZkZjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNB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QUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSx1QkFBdUIsT0FBTztBQUM5QiwwQkFBMEI7QUFDMUI7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgMiBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBuYW1lIHZlYzJcbiAqL1xudmFyIHZlYzIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSkge1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zdWIgPSB2ZWMyLnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLm11bCA9IHZlYzIubXVsdGlwbHk7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmRpdmlkZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5kaXYgPSB2ZWMyLmRpdmlkZTtcblxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmNlaWwgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICAgIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuZmxvb3IgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnJvdW5kID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGlzdCA9IHZlYzIuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMyLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckRpc3QgPSB2ZWMyLnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWMyLmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5sZW4gPSB2ZWMyLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMyLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zcXJMZW4gPSB2ZWMyLnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmludmVyc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgdmFyIGxlbiA9IHgqeCArIHkqeTtcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW47XG4gICAgICAgIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xudmVjMi5kb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzIuY3Jvc3MgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gICAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdO1xuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIucmFuZG9tID0gZnVuY3Rpb24gKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQyID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWMyLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKGNvdW50KSB7XG4gICAgICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbCA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgdmVjWzBdID0gYVtpXTsgdmVjWzFdID0gYVtpKzFdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgZXhhY3RseSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzIuZXhhY3RFcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzIuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV07XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdO1xuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlYzI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9+L2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3ZlYzIuanNcbi8vIG1vZHVsZSBpZCA9IDM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); - -/***/ }, -/* 39 */ -/***/ function(module, exports) { - - eval("module.exports = {\n\t\"name\": \"@mapd/mapd-draw\",\n\t\"description\": \"A Utility Library for drawing and interacting with shapes using canvas\",\n\t\"version\": \"1.1.0\",\n\t\"homepage\": \"http://mapd.com\",\n\t\"bugs\": \"https://github.com/map-d/mapd-draw.js/issues\",\n\t\"main\": \"dist/mapd-draw.js\",\n\t\"author\": \"MapD Technologies\",\n\t\"license\": \"MIT\",\n\t\"engines\": {\n\t\t\"node\": \">=4.0.0\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git+https://github.com/map-d/mapd-draw.js.git\"\n\t},\n\t\"dependencies\": {\n\t\t\"gl-matrix\": \"^2.3.2\",\n\t\t\"css-element-queries\": \"^0.4.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"babel-core\": \"^6.10.4\",\n\t\t\"babel-loader\": \"^6.2.4\",\n\t\t\"babel-plugin-lodash\": \"^3.1.2\",\n\t\t\"babel-preset-es2015\": \"^6.9.0\",\n\t\t\"babel-preset-stage-0\": \"^6.5.0\",\n\t\t\"eslint\": \"^3.0.1\",\n\t\t\"http-server\": \"^0.9.0\",\n\t\t\"json-loader\": \"0.5.4\",\n\t\t\"webpack\": \"^1.13.1\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"npm run build:prod; npm run build:dev\",\n\t\t\"build:prod\": \"npm run webpack\",\n\t\t\"build:dev\": \"npm run webpack:dev\",\n\t\t\"clean\": \"bash scripts/clean.sh\",\n\t\t\"eslint\": \"eslint -c ./.eslintrc.json\",\n\t\t\"lint-fix\": \"eslint --fix $(find src -name \\\"*.js\\\" ! -name '*.spec.js')\",\n\t\t\"lint\": \"eslint $(find src -name \\\"*.js\\\" ! -name '*.spec.js')\",\n\t\t\"start\": \"npm run build; http-server -p 8080 -o;\",\n\t\t\"watch:dev\": \"node node_modules/webpack/bin/webpack.js --progress --colors --watch --config webpack.dev.config.js\",\n\t\t\"webpack\": \"node node_modules/webpack/bin/webpack.js\",\n\t\t\"webpack:dev\": \"node node_modules/webpack/bin/webpack.js --config webpack.dev.config.js\",\n\t\t\"test\": \"node_modules/.bin/mocha ./test --require ./test/config --require ./test/setup\"\n\t},\n\t\"pre-commit\": [\n\t\t\"lint\"\n\t]\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vcGFja2FnZS5qc29uPzBmYTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix3QkFBd0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0XCJuYW1lXCI6IFwiQG1hcGQvbWFwZC1kcmF3XCIsXG5cdFwiZGVzY3JpcHRpb25cIjogXCJBIFV0aWxpdHkgTGlicmFyeSBmb3IgZHJhd2luZyBhbmQgaW50ZXJhY3Rpbmcgd2l0aCBzaGFwZXMgdXNpbmcgY2FudmFzXCIsXG5cdFwidmVyc2lvblwiOiBcIjEuMS4wXCIsXG5cdFwiaG9tZXBhZ2VcIjogXCJodHRwOi8vbWFwZC5jb21cIixcblx0XCJidWdzXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL21hcC1kL21hcGQtZHJhdy5qcy9pc3N1ZXNcIixcblx0XCJtYWluXCI6IFwiZGlzdC9tYXBkLWRyYXcuanNcIixcblx0XCJhdXRob3JcIjogXCJNYXBEIFRlY2hub2xvZ2llc1wiLFxuXHRcImxpY2Vuc2VcIjogXCJNSVRcIixcblx0XCJlbmdpbmVzXCI6IHtcblx0XHRcIm5vZGVcIjogXCI+PTQuMC4wXCJcblx0fSxcblx0XCJyZXBvc2l0b3J5XCI6IHtcblx0XHRcInR5cGVcIjogXCJnaXRcIixcblx0XHRcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vbWFwLWQvbWFwZC1kcmF3LmpzLmdpdFwiXG5cdH0sXG5cdFwiZGVwZW5kZW5jaWVzXCI6IHtcblx0XHRcImdsLW1hdHJpeFwiOiBcIl4yLjMuMlwiLFxuXHRcdFwiY3NzLWVsZW1lbnQtcXVlcmllc1wiOiBcIl4wLjQuMFwiXG5cdH0sXG5cdFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcblx0XHRcImJhYmVsLWNvcmVcIjogXCJeNi4xMC40XCIsXG5cdFx0XCJiYWJlbC1sb2FkZXJcIjogXCJeNi4yLjRcIixcblx0XHRcImJhYmVsLXBsdWdpbi1sb2Rhc2hcIjogXCJeMy4xLjJcIixcblx0XHRcImJhYmVsLXByZXNldC1lczIwMTVcIjogXCJeNi45LjBcIixcblx0XHRcImJhYmVsLXByZXNldC1zdGFnZS0wXCI6IFwiXjYuNS4wXCIsXG5cdFx0XCJlc2xpbnRcIjogXCJeMy4wLjFcIixcblx0XHRcImh0dHAtc2VydmVyXCI6IFwiXjAuOS4wXCIsXG5cdFx0XCJqc29uLWxvYWRlclwiOiBcIjAuNS40XCIsXG5cdFx0XCJ3ZWJwYWNrXCI6IFwiXjEuMTMuMVwiXG5cdH0sXG5cdFwic2NyaXB0c1wiOiB7XG5cdFx0XCJidWlsZFwiOiBcIm5wbSBydW4gYnVpbGQ6cHJvZDsgbnBtIHJ1biBidWlsZDpkZXZcIixcblx0XHRcImJ1aWxkOnByb2RcIjogXCJucG0gcnVuIHdlYnBhY2tcIixcblx0XHRcImJ1aWxkOmRldlwiOiBcIm5wbSBydW4gd2VicGFjazpkZXZcIixcblx0XHRcImNsZWFuXCI6IFwiYmFzaCBzY3JpcHRzL2NsZWFuLnNoXCIsXG5cdFx0XCJlc2xpbnRcIjogXCJlc2xpbnQgLWMgLi8uZXNsaW50cmMuanNvblwiLFxuXHRcdFwibGludC1maXhcIjogXCJlc2xpbnQgLS1maXggJChmaW5kIHNyYyAtbmFtZSBcXFwiKi5qc1xcXCIgISAtbmFtZSAnKi5zcGVjLmpzJylcIixcblx0XHRcImxpbnRcIjogXCJlc2xpbnQgJChmaW5kIHNyYyAtbmFtZSBcXFwiKi5qc1xcXCIgISAtbmFtZSAnKi5zcGVjLmpzJylcIixcblx0XHRcInN0YXJ0XCI6IFwibnBtIHJ1biBidWlsZDsgaHR0cC1zZXJ2ZXIgLXAgODA4MCAtbztcIixcblx0XHRcIndhdGNoOmRldlwiOiBcIm5vZGUgbm9kZV9tb2R1bGVzL3dlYnBhY2svYmluL3dlYnBhY2suanMgLS1wcm9ncmVzcyAtLWNvbG9ycyAtLXdhdGNoIC0tY29uZmlnIHdlYnBhY2suZGV2LmNvbmZpZy5qc1wiLFxuXHRcdFwid2VicGFja1wiOiBcIm5vZGUgbm9kZV9tb2R1bGVzL3dlYnBhY2svYmluL3dlYnBhY2suanNcIixcblx0XHRcIndlYnBhY2s6ZGV2XCI6IFwibm9kZSBub2RlX21vZHVsZXMvd2VicGFjay9iaW4vd2VicGFjay5qcyAtLWNvbmZpZyB3ZWJwYWNrLmRldi5jb25maWcuanNcIixcblx0XHRcInRlc3RcIjogXCJub2RlX21vZHVsZXMvLmJpbi9tb2NoYSAuL3Rlc3QgLS1yZXF1aXJlIC4vdGVzdC9jb25maWcgLS1yZXF1aXJlIC4vdGVzdC9zZXR1cFwiXG5cdH0sXG5cdFwicHJlLWNvbW1pdFwiOiBbXG5cdFx0XCJsaW50XCJcblx0XVxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9wYWNrYWdlLmpzb25cbi8vIG1vZHVsZSBpZCA9IDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="); - -/***/ } +/***/ }) /******/ ]) }); ; \ No newline at end of file diff --git a/dist/mapd-draw.js b/dist/mapd-draw.js index d29ceb7..0d16041 100644 --- a/dist/mapd-draw.js +++ b/dist/mapd-draw.js @@ -1,7 +1,34 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.MapdDraw=e():t.MapdDraw=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var a=r[n]={exports:{},id:n,loaded:!1};return t[n].call(a.exports,a,a.exports,e),a.loaded=!0,a.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.simpleHull_2D=e.Math=e.Point=e.PolyLine=e.Poly=e.Rect=e.Circle=e.Vec2d=e.BasicStyle=e.Mat2=e.Point2d=e.Mat2d=e.AABox2d=e.DrawEngine=e.ShapeBuilder=e.version=void 0;var i=r(39);Object.defineProperty(e,"version",{enumerable:!0,get:function(){return i.version}});var o=r(1);Object.defineProperty(e,"Mat2",{enumerable:!0,get:function(){return o.mat2}});var s=r(15);Object.defineProperty(e,"simpleHull_2D",{enumerable:!0,get:function(){return s.simpleHull_2D}});var l=r(23),u=a(l),c=r(14),f=a(c),h=r(2),d=n(h),p=r(5),_=a(p),v=r(4),y=n(v),m=r(9),M=a(m),b=r(10),x=a(b),g=r(27),S=a(g),I=r(16),D=a(I),w=r(29),F=a(w),O=r(11),k=a(O),E=r(28),P=a(E),C=r(6),A=a(C);e.ShapeBuilder=u.default,e.DrawEngine=f.default,e.AABox2d=d,e.Mat2d=_.default,e.Point2d=y,e.BasicStyle=M.default,e.Vec2d=x.default,e.Circle=S.default,e.Rect=D.default,e.Poly=F.default,e.PolyLine=k.default,e.Point=P.default,e.Math=A.default},function(t,e,r){e.glMatrix=r(3),e.mat2=r(34),e.mat2d=r(35),e.mat3=r(20),e.mat4=r(36),e.quat=r(37),e.vec2=r(38),e.vec3=r(21),e.vec4=r(22)},function(t,e,r){"use strict";function n(t,e,r,n,a){return t[P]="number"==typeof e?e:1/0,t[C]="number"==typeof r?r:1/0,t[A]="number"==typeof n?n:-(1/0),t[j]="number"==typeof a?a:-(1/0),t}function a(t,e,r,a){var i=new E.glMatrix.ARRAY_TYPE(z.BOX_SIDES);return n(i,t,e,r,a)}function i(t){var e=new E.glMatrix.ARRAY_TYPE(z.BOX_SIDES);return e[P]=t[P],e[C]=t[C],e[A]=t[A],e[j]=t[j],e}function o(t,e){return t[P]=e[P],t[C]=e[C],t[A]=e[A],t[j]=e[j],t}function s(t){return t[P]=1/0,t[C]=1/0,t[A]=-(1/0),t[j]=-(1/0),t}function l(t){return t[P]=-(1/0),t[C]=-(1/0),t[A]=1/0,t[j]=1/0,t}function u(t,e){return e[0]<0?(t[P]=-e[0],t[A]=0):(t[P]=0,t[A]=e[0]),e[1]<0?(t[C]=-e[1],t[j]=0):(t[C]=0,t[j]=e[1]),t}function c(t,e,r){for(var n=0;n<2;n+=1)r[n]<0?(t[n]=e[n]-r[n],t[n+2]=e[n]):(t[n]=e[n],t[n+2]=e[n]+r[n]);return t}function f(t,e,r){for(var n=0;n<2;n+=1)r[n]<0?(t[n]=e[n]+r[n],t[n+2]=e[n]-r[n]):(t[n]=e[n]-r[n],t[n+2]=e[n]+r[n]);return t}function h(t){return t[P]>t[A]||t[C]>t[j]}function d(t){return!(isFinite(t[P])&&isFinite(t[C])&&isFinite(t[A])&&isFinite(t[j]))}function p(t,e){var r=t[0],n=t[1],a=t[2],i=t[3],o=e[0],s=e[1],l=e[2],u=e[3];return Math.abs(r-o)<=E.glMatrix.EPSILON&&Math.abs(n-s)<=E.glMatrix.EPSILON&&Math.abs(a-l)<=E.glMatrix.EPSILON&&Math.abs(i-u)<=E.glMatrix.EPSILON}function _(t,e){return E.vec2.set(t,e[A]-e[P],e[j]-e[C])}function v(t,e){return _(t,e),E.vec2.scale(t,t,.5)}function y(t,e){return v(t,e),t[P]+=e[P],t[C]+=e[C],t}function m(t,e,r){t[P]=e[P]-r[0],t[A]=e[A]+r[0],t[C]=e[C]-r[1],t[j]=e[j]+r[1]}function M(t){return(t[A]-t[P])*(t[j]-t[C])}function b(t,e,r){return a(Math.min(e[P],r[P]),Math.min(e[C],r[C]),Math.max(e[A],r[A]),Math.max(e[j],r[j]))}function x(t,e,r){var n=t;t===e&&(n=a());for(var i=P,l=A;i<=C&&!(e[l]r[l]);i+=1,l+=1)n[i]=Math.max(e[i],r[i]),n[l]=Math.min(e[l],r[l]);return i!==C+1&&s(n),t===e&&o(t,n),t}function g(t,e){return!(t[A]<=e[P]||t[P]>=e[A]||t[j]<=e[C]||t[C]>=e[j])}function S(t,e){return!(e[P]t[A]||e[C]t[j])}function I(t,e){return e[P]>=t[P]&&e[P]<=t[A]&&e[C]>=t[C]&&e[C]<=t[j]}function D(t,e,r){return t!==e&&o(t,e),h(e)?(t[P]=r[P],t[A]=r[P],t[C]=r[C],t[j]=r[C]):(r[P]t[A]&&(t[A]=r[P]),r[C]t[j]&&(t[j]=r[C])),t}function w(t,e,r){t[P]=e[P]+r[0],t[C]=e[C]+r[1],t[A]=e[A]+r[0],t[j]=e[j]+r[1]}function F(t,e,r,n){var i=t;t===e&&(i=a()),s(i);var l=E.vec2.set(E.vec2.create(),e[P],e[C]),u=E.vec2.create();return n(u,l,r),D(i,i,u),l[P]=e[A],n(u,l,r),D(i,i,u),l[C]=e[j],n(u,l,r),D(i,i,u),l[P]=e[P],n(u,l,r),D(i,i,u),t===e&&o(t,i),t}function O(t,e,r){return F(t,e,r,E.vec2.transformMat2)}function k(t,e,r){return F(t,e,r,E.vec2.transformMat2d)}Object.defineProperty(e,"__esModule",{value:!0}),e.MAXY=e.MAXX=e.MINY=e.MINX=void 0,e.set=n,e.create=a,e.clone=i,e.copy=o,e.initEmpty=s,e.initInfinity=l,e.initSizeFromOrigin=u,e.initSizeFromLocation=c,e.initCenterExtents=f,e.isEmpty=h,e.isInfinite=d,e.equals=p,e.getSize=_,e.getExtents=v,e.getCenter=y,e.expand=m,e.area=M,e.hull=b,e.intersection=x,e.overlaps=g,e.contains=S,e.containsPt=I,e.encapsulatePt=D,e.translate=w,e.transformMat2=O,e.transformMat2d=k;var E=r(1),P=e.MINX=0,C=e.MINY=1,A=e.MAXX=2,j=e.MAXY=3,z={BOX_SIDES:4}},function(t,e){var r={};r.EPSILON=1e-6,r.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,r.RANDOM=Math.random,r.ENABLE_SIMD=!1,r.SIMD_AVAILABLE=r.ARRAY_TYPE===Float32Array&&"SIMD"in this,r.USE_SIMD=r.ENABLE_SIMD&&r.SIMD_AVAILABLE,r.setMatrixArrayType=function(t){r.ARRAY_TYPE=t};var n=Math.PI/180;r.toRadian=function(t){return t*n},r.equals=function(t,e){return Math.abs(t-e)<=r.EPSILON*Math.max(1,Math.abs(t),Math.abs(e))},t.exports=r},function(t,e,r){"use strict";function n(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return t[M]=e,t[b]=r,t}function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=new m.glMatrix.ARRAY_TYPE(2);return n(r,t,e)}function i(t){var e=new m.glMatrix.ARRAY_TYPE(2);return e[M]=t[M],e[b]=t[b],e}function o(t,e){return t[M]=e[M],t[b]=e[b],t}function s(t,e){return a(t,e)}function l(t,e,r){return m.vec2.add(t,e,r)}function u(t,e,r){return m.vec2.sub(t,e,r)}function c(t,e,r){return m.vec2.transformMat2(t,e,r)}function f(t,e,r){return m.vec2.transformMat2d(t,e,r)}function h(t){return"point2d("+t[0]+" , "+t[1]+")"}function d(t,e){return m.vec2.distance(t,e)}function p(t,e){return m.vec2.squaredDistance(t,e)}function _(t,e,r,n){return m.vec2.lerp(t,e,r,n)}function v(t,e){return m.vec2.equals(t,e)}function y(t,e){return m.vec2.exactEquals(t,e)}Object.defineProperty(e,"__esModule",{value:!0}),e.sqrDist=e.dist=void 0,e.set=n,e.create=a,e.clone=i,e.copy=o,e.initFromValues=s,e.addVec2=l,e.sub=u,e.transformMat2=c,e.transformMat2d=f,e.str=h,e.distance=d,e.squaredDistance=p,e.lerp=_,e.equals=v,e.exactEquals=y;var m=r(1),M=0,b=1;e.dist=d,e.sqrDist=p},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(1);n.mat2d.svd=function(t,e,r,n){if(t&&(t[0]=n[4],t[1]=n[5]),e||r){var a=(n[0]+n[3])/2,i=(n[0]-n[3])/2,o=(n[1]+n[2])/2,s=(n[1]-n[2])/2;if(e){var l=Math.sqrt(a*a+s*s),u=Math.sqrt(i*i+o*o);e[0]=l+u,e[1]=l-u}if(r){var c=Math.atan2(o,i),f=Math.atan2(s,a);r[0]=(f-c)/2,r[1]=(f+c)/2}}},e.default=n.mat2d},function(t,e){"use strict";function r(t,e,r){return tr?r:t}function n(t){return t<0?0:t>1?1:t}function a(t,e,r){return t*(1-r)+e*r}Object.defineProperty(e,"__esModule",{value:!0});var i=1e-5,o=.25,s=.5,l=2;Math.QUATER_PI=o*Math.PI,Math.HALF_PI=s*Math.PI,Math.HALF_NPI=-s*Math.PI,Math.TWO_PI=l*Math.PI,Math.NPI=-Math.PI,Math.NQUATER_PI=o*Math.NPI,Math.NHALF_PI=s*Math.NPI,Math.NTWO_PI=l*Math.NPI,Math.INV_PI=1/Math.PI,Math.RAD_TO_DEG=180/Math.PI,Math.DEG_TO_RAD=Math.PI/180,Math.EPS=i,Math.clamp=r,Math.clamp01=n,Math.lerp=a,e.default=Math},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null;this.transformCtx(t,this._fullXform,e),t.beginPath();var i=this._draw(t);(i||"undefined"==typeof i)&&(this.isFillVisible()&&(null===n||Boolean(n))&&(r.setFillStyle(t,this),t.fill()),this.isStrokeVisible()&&(null===a||Boolean(a))&&(r.setStrokeStyle(t,this),t.setTransform(1,0,0,1,0,0),t.stroke()))}},{key:"setStyle",value:function(t){return b.default.copyBasicStyle(t,this),this}},{key:"toJSON",value:function(){var t=this;return this._stateStack&&this._stateStack.length&&(t=this._stateStack[0]),Object.assign({visible:this.visible,zIndex:t.zIndex},b.default.toJSON(t),v.default.toJSON(this))}},{key:"visible",get:function(){return this._visible&&(this.isFillVisible()||this.isStrokeVisible())}}],[{key:"shapeCompare",value:function(t,e){var r=t.zIndex,n=e.zIndex;if(rn)return 1;var a=h.default.compareFillStyle(t,e);return a||(a=p.default.compareStrokeStyle(t,e)),a}}]),e}((0,m.default)(I,(0,_.createEventedTransform2dMixin)("changed:xform"),(0,f.createEventedFillStyleMixin)("changed:style"),(0,d.createEventedStrokeStyleMixin)("changed:style")));e.default=D},function(t,e){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var i=function(t){for(var e=arguments.length,i=Array(e>1?e-1:0),o=1;ot[2]&&(t[2]=e[0],n[2]=r),e[1]t[3]&&(t[3]=e[1],n[3]=r))}function u(t,e,r){var n=e[0]*r[1]-r[0]*e[1];return t[0]+=(e[0]+r[0])*n,t[1]+=(e[1]+r[1])*n,n}function c(t){return Array.isArray(t)||ArrayBuffer&&ArrayBuffer.isView(t)}Object.defineProperty(e,"__esModule",{value:!0});var f=function(){function t(t,e){for(var r=0;r=this._verts.length)throw new Error("Cannot translate vertex at index "+t+". There are only "+this._verts.length+" vertices in the polygon.");if(e[0]||e[1]){var r=v.clone(this._verts[t]),n=v.clone(this._verts[t]);v.addVec2(n,n,e),this._collapseVerts(),this._resetAABox=!0,this._geomDirty=!0,v.copy(n),this.fire("changed:geom",{attr:"verts["+t+"]",prevVal:r,currVal:n})}return this}},{key:"setVertPosition",value:function(t,e){if(t>=this._verts.length)throw new Error("Cannot translate vertex at index "+t+". There are only "+this._verts.length+" vertices in the polygon.");if(!v.equals(e,this._verts[t])){var r=v.clone(this._verts[t]);this._collapseVerts(),v.copy(this._verts[t],e),this._resetAABox=!0,this._geomDirty=!0,this.fire("changed:geom",{attr:"verts["+t+"]",prevVal:r,currVal:e})}}},{key:"insertVert",value:function(t,e){var r=x.default.min(x.default.max(t,0),this._verts.length);return this._collapseVerts(),t>=this._verts.length?(this._verts.push(v.clone(e)),r=this._verts.length-1):this._verts.splice(t,0,v.clone(e)),this._resetAABox=!0,this._geomDirty=!0,this.fire("changed:geom:addvert",{attr:"verts["+r+"]",currVal:e}),r}},{key:"appendVert",value:function(t){return this.insertVert(this._verts.length,t)}},{key:"removeVert",value:function(t){if(t>=this._verts.length||t<0)throw new Error("Cannot remove vertex "+t+". Invalid index. There are only "+this._verts.length+" vertices in the shape.");var e=this._verts[t];return this._verts.splice(t,1),this._collapseVerts(),this._resetAABox=!0,this._geomDirty=!0,this.fire("changed:geom:removevert",{attr:"verts["+t+"]",currVal:e}),t}},{key:"_rebuildAABox",value:function(){var t=this;p.initEmpty(this._aabox),this._verts.length<3?this._convexHull=this._verts.map(function(t,e){return e}):this._convexHull=(0,g.simpleHull_2D)(this._verts),this._convexHull.forEach(function(e){l(t._aabox,t._verts[e],e,t._extentIndices)});var e=v.create(0,0);p.getCenter(e,this._aabox),this.pivot=e}},{key:"_updateAABox",value:function(){var t=this;if(this._resetAABox&&(this._rebuildAABox(),this._resetAABox=!1),this._boundsOutOfDate||this._geomDirty){p.initEmpty(this._aabox);var e=[0,0],r=this.globalXform;if(this._convexHull.forEach(function(n){p.encapsulatePt(t._aabox,t._aabox,v.transformMat2d(e,t._verts[n],r))}),this._boundsOutOfDate=!1,this._geomDirty){var n=v.create();n[0]=this._verts[this._extentIndices[0]][0]+.5*(this._verts[this._extentIndices[2]][0]-this._verts[this._extentIndices[0]][0]),n[1]=this._verts[this._extentIndices[1]][1]+.5*(this._verts[this._extentIndices[3]][1]-this._verts[this._extentIndices[1]][1]),this.pivot=n,this._geomDirty=!1}}}},{key:"_draw",value:function(t){var e=!1;if(this._verts.length>=2){t.moveTo(this._verts[0][0],this._verts[0][1]);for(var r=1;r=e.length)return 0;var o=0,s=null;return s=t.get(e[r]),s&&(o=n(s[0],e,r+1,a),s[1].forEach(function(t){return t.call(i,a)}),o+=s[1].length),o}function a(t,e){var r=-1,n=t[0],i=t[1];i.length&&e.forEach(function(t){(r=i.indexOf(t))>=0&&i.splice(r,1)}),n.forEach(function(t){a(t,e)})}function i(t){var e=t;if("string"==typeof t)e=[t];else if(!Array.isArray(t))throw new Error("Input must be an array of strings");return e}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:null;this._margins=e&&e.margins?Object.assign({},e.margins):{},k.forEach(function(t){"number"!=typeof r._margins[t]&&(r._margins[t]=0)});var a=u(t),i=a.canvasContainer,o=a.canvas,s=a.canvasContext,l=a.ratio;this._container=i,this._drawCanvas=o,this._drawCtx=s,this._pixelRatio=l,this._parent=t,(0,x.bindAll)(["_resize"],this),this._resize(e),this._resizeSensor=new F.default(t,this._resize),(n||null===n&&e&&e.enableEvents)&&this._enableEvents()}},{key:"_destroyCanvas",value:function(){this._drawCanvas&&this._disableEvents(),this._parent&&(this._parent.removeChild(this._drawCanvas),this._resizeSensor&&this._resizeSensor.detach(this._parent,this._resize)),this._drawCanvas=null,this._drawCtx=null,this._parent=null}},{key:"_init",value:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this.registerEvents([E.SHAPE_ADD,E.SHAPE_DELETE]),(0,x.bindAll)(["_reorderCb","_rerenderCb"],this),(0,x.bindAll)(["_mousedownCB","_mouseupCB","_mousemoveCB","_clickCB","_dblclickCB","_mouseoverCB","_mouseoutCB"],this),this._renderFrameCb=this.renderAll.bind(this),this._renderRequestId=0,this._ids={shapeId:1},this._objects=new Map,this._sortedObjs=[],this._reorderedObjIdxs=new Set,this._initCanvas(t,e,r),this._styleState=new P({fillColor:"red"})}},{key:"getContainer",value:function(){return this._parent}},{key:"getCanvasContainer",value:function(){return this._container}},{key:"getCanvas",value:function(){return this._drawCanvas}},{key:"project",value:function(t,e){var r=this._camera.screenToWorldMatrix;return v.transformMat2d(t,e,r)}},{key:"unproject",value:function(t,e){var r=this._camera.worldToScreenMatrix;return v.transformMat2d(t,e,r)}},{key:"hasShape",value:function(t){return this._objects.has(t)}},{key:"addShape",value:function(t){var e=t;Array.isArray(e)||(e=[t]),c(e,this._objects,this._ids,this._reorderCb,this._rerenderCb),this.fire("shape:add",{shape:e});var r={target:e};return this._reorderCb(r),this}},{key:"deleteShape",value:function(t){var e=t;Array.isArray(e)||(e=[t]);for(var r=f(e,this._objects,this._reorderCb,this._rerenderCb),n=-1,a=0;a=0&&this._sortedObjs.splice(n,1),this._reorderedObjIdxs.add(r[a]);return this._rerenderCb(),this.fire("shape:delete",{shape:e}),this}},{key:"deleteAllShapes",value:function(){return this.deleteShape(this.sortedShapes.slice()),this}},{key:"moveShapeToTop",value:function(t){if(this._objects.has(t)){var e=this.sortedShapes,r=e[e.length-1].zIndex;t.zIndex=r+1}}},{key:"moveShapeToBack",value:function(t){if(this._objects.has(t)){var e=this.sortedShapes,r=e[0].zIndex;t.zIndex=r}}},{key:"getShapesAsJSON",value:function(){var t=this.sortedShapes;return t.map(function(t){return t.toJSON()})}},{key:"_rerenderCb",value:function(){this._renderRequestId&&window.cancelAnimationFrame(this._renderRequestId),this._renderRequestId=window.requestAnimationFrame(this._renderFrameCb)}},{key:"_reorderCb",value:function(t){var e=this,r=t.target;Array.isArray(r)||(r=[t.target]),r.forEach(function(t){console.assert(t,"A changed event doesn't have an object");var r=e._objects.get(t);console.assert(r,"A changed event target isn't in the list of shapes "+t),r.shapeIdx<0&&(r.shapeIdx=e._sortedObjs.push(t)-1),e._reorderedObjIdxs.add(r.shapeIdx)}),this._rerenderCb()}},{key:"_renderShapes",value:function(t,e,r){var n=this,a=r.worldToScreenMatrix;e.forEach(function(e){e.visible&&e.render(t,a,n._styleState)})}},{key:"renderAll",value:function(){var t=this._drawCtx;if(t.clearRect(0,0,this._drawCanvas.offsetWidth,this._drawCanvas.offsetHeight),this._objects.size){t.save();var e=this.sortedShapes;this._styleState.applyDefaults(t),this._renderShapes(t,e,this._camera),t.restore()}}},{key:"sortedShapes",get:function(){return this._reorderedObjIdxs.size&&(console.assert(this._sortedObjs.length===this._objects.size,"Size mismatch when rendering objets. Something got out of sync - sorted objs length: "+this._sortedObjs.length+", objects length: "+this._objects.size),this._sortedObjs.sort(m.default.shapeCompare),this._reorderedObjIdxs.clear()),this._sortedObjs}},{key:"margins",get:function(){var t=this,e={};return k.forEach(function(r){e[r]=t._margins[r]}),e},set:function(t){var e=this;k.forEach(function(r){"number"==typeof t[r]&&t[r]!==e._margins[r]&&(e._margins[r]=t.prop)}),this._resize()}},{key:"viewport",get:function(){return this._camera.viewport},set:function(t){this._camera.viewport=t}},{key:"projectionDimensions",get:function(){return this._camera.projectionDimensions},set:function(t){return this._camera.projectionDimensions=t,this}},{key:"cameraPosition",get:function(){return this._camera.getPosition()},set:function(t){return this._camera.setPosition(t),this}}]),e}(D.default);e.default=C,C.EventConstants=E},function(t,e){"use strict";function r(t,e,r){return(e[a]-t[a])*(r[i]-t[i])-(r[a]-t[a])*(e[i]-t[i])}function n(t){var e=[],n=t.length;if(n<3){for(var a=0;a0?(i[o+1]=0,i[o+2]=1):(i[o+1]=1,i[o+2]=0);for(var l=3;l=0&&i[o+1]>=0&&r(t[i[o]],t[i[o+1]],t[l])<=0;)o+=1;for(o-=1,i[o]=l;i[s]>=0&&i[s+1]>=0&&r(t[i[s-1]],t[i[s]],t[l])<=0;)s-=1;s+=1,i[s]=l}var u=0;for(u=0;u<=s-o-1;u+=1)e[u]=i[o+u];return i[o+u]!==e[0]&&(e[u]=i[o+u]),e}Object.defineProperty(e,"__esModule",{value:!0}),e.simpleHull_2D=n;var a=0,i=1},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var r=0;r>>24)+", "+((16711680&t)>>16)+", "+((65280&t)>>8)+", "+s(t)+")"}function c(t){if("string"!=typeof t)throw new Error(t+" is not a valid color string");var e=0,r=null;if(r=t.match(y))e=255,e|=_.default.clamp(Number.parseInt(r[3],10),0,255)<<8,e|=_.default.clamp(Number.parseInt(r[2],10),0,255)<<16,e|=_.default.clamp(Number.parseInt(r[1],10),0,255)<<24;else if(r=t.match(m))e=l(Number.parseFloat(r[4],10)),e|=_.default.clamp(Number.parseInt(r[3],10),0,255)<<8,e|=_.default.clamp(Number.parseInt(r[2],10),0,255)<<16,e|=_.default.clamp(Number.parseInt(r[1],10),0,255)<<24;else if(r=t.match(M))e=255,e|=_.default.clamp(Number.parseInt(r[3],16),0,255)<<8,e|=_.default.clamp(Number.parseInt(r[2],16),0,255)<<16,e|=_.default.clamp(Number.parseInt(r[1],16),0,255)<<24;else{if(!v.has(t))throw new Error(t+" is not a valid color string");r=v.get(t).match(M),e=255,e|=_.default.clamp(Number.parseInt(r[3],16),0,255)<<8,e|=_.default.clamp(Number.parseInt(r[2],16),0,255)<<16,e|=_.default.clamp(Number.parseInt(r[1],16),0,255)<<24}return e}function f(t,e){return function(r){function n(){return o(this,n),a(this,(n.__proto__||Object.getPrototypeOf(n)).apply(this,arguments))}return i(n,r),d(n,[{key:"initializer",value:function(t,e){this._eventHandler=e,h(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"initializer",this).call(this,t)}},{key:"_checkPackedColorChanged",value:function(r){if(r!==this._color){var n=this._color,a=s(n),i=s(r);this._color=r,this._eventHandler.fire(t,{attr:e,prevVal:u(n),currVal:u(this._color)}),i!==a&&this._eventHandler.fire(t,{attr:"opacity",prevVal:a,currVal:i})}}},{key:"value",set:function(t){var e=c(t);return this._checkPackedColorChanged(e),this},get:function(){return u(this._color)}},{key:"packedValue",set:function(t){var e=0;return e|=t,this._checkPackedColorChanged(e),this},get:function(){return this._color}},{key:"opacity",set:function(e){if("number"!=typeof e)throw new Error("Opacity must be a number between 0-1");var r=255&this._color,n=l(e);return n!==r&&(this._color&=4294967040,this._color|=n,this._eventHandler.fire(t,{attr:"opacity",prevVal:r/255,currVal:n/255})),this},get:function(){return s(this._color)}}]),n}(b)}Object.defineProperty(e,"__esModule",{value:!0});var h=function t(e,r,n){null===e&&(e=Function.prototype);var a=Object.getOwnPropertyDescriptor(e,r);if(void 0===a){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,r,n)}if("value"in a)return a.value;var o=a.get;if(void 0!==o)return o.call(n)},d=function(){function t(t,e){for(var r=0;r1?r-1:0),a=1;a0}},{key:"isTransparent",value:function(){return this._fillColor.isTransparent()}},{key:"setFillCtx",value:function(t){t.fillStyle=this.fillColor}},{key:"fillColor",set:function(t){return this._fillColor.value=t,this},get:function(){return this._fillColor.value}},{key:"fillOpacity",set:function(t){return this._fillColor.opacity=t,this},get:function(){return this._fillColor.opacity}},{key:"packedFillColor",set:function(t){return this._fillColor.packedValue=t,this},get:function(){return this._fillColor.packedValue}}],[{key:"copyFillStyle",value:function(t,e){"undefined"==typeof t.packedFillColor?("undefined"!=typeof t.fillColor&&(e.fillColor=t.fillColor),"undefined"!=typeof t.fillOpacity&&(e.fillOpacity=t.fillOpacity)):e.packedFillColor=t.packedFillColor}},{key:"compareFillStyle",value:function(t,e){var r=t.isFillVisible(),n=e.isFillVisible();return r!==n?r-n:t.packedFillColor-e.packedFillColor}},{key:"toJSON",value:function(t){return{fillColor:t.fillColor}}}]),t}();e.default=f},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){if("number"!=typeof t)throw new Error("Stroke width must be a number")}function o(t){var e=-1;if("string"!=typeof t||(e=y.indexOf(t.toLowerCase()))<0)throw new Error("Line join must be a string and must be one of ["+y.join(", ")+"]");return e}function s(t){var e=-1;if("string"!=typeof t||(e=M.indexOf(t.toLowerCase()))<0)throw new Error("Line cap must be a string and must be one of ["+M.join(", ")+"]");return e}function l(t){if(!t||!Array.isArray(t)||t.length%2!==0)throw new Error("The dash pattern must be an array with an even number of numbers (or an empty array)")}function u(t){if("number"!=typeof t)throw new Error("The dash offset must be a number")}function c(t){var e=(0,h.createEventedColorRGBAClass)(t,"strokeColor");return(0,_.default)(null,b,function(){function r(){a(this,r)}return f(r,[{key:"initializer",value:function(t){this._strokeColor=new e("black",this),this._strokeWidth=0,this._lineJoin=v.MITER,this._lineCap=m.BUTT,this._dashPattern=[],this._dashOffset=0,this._initStrokeStyleFromOptions(t)}},{key:"strokeWidth",set:function(e){if(i(e),e!==this._strokeWidth){var r=this._strokeWidth;this._strokeWidth=e,this.fire(t,{attr:"strokeWidth",prevVal:r,curral:this._strokeWidth})}return this},get:function(){return this._strokeWidth}},{key:"lineJoin",set:function(e){var r=o(e);if(r!==this._lineJoin){var n=this._lineJoin;this._lineJoin=r,this.fire(t,{attr:"lineJoin",prevVal:n,curral:this._lineJoin})}return this},get:function(){return y[this._lineJoin]}},{key:"lineCap",set:function(e){var r=s(e);if(r!==this._lineCap){var n=this._lineCap;this._lineCap=r,this.fire(t,{attr:"lineCap",prevVal:n,curral:this._lineCap})}return this},get:function(){return M[this._lineCap]}},{key:"dashPattern",set:function(e){l(e);var r=!1;if(e.length===this._dashPattern.length){for(var n=0;n0&&this._strokeWidth>0}},{key:"isTransparent",value:function(){return this._strokeColor.isTransparent()}},{key:"setStrokeCtx",value:function(t){t.strokeStyle=this.strokeColor,t.lineWidth=this._strokeWidth,t.lineJoin=this._lineJoin,t.lineCap=this._lineCap,t.setLineDash(this._dashPattern),t.lineDashOffset=this._dashOffset}},{key:"strokeColor",set:function(t){return this._strokeColor.value=t,this},get:function(){return this._strokeColor.value}},{key:"strokeOpacity",set:function(t){this._strokeColor.opacity=t},get:function(){return this._strokeColor.opacity}},{key:"packedStrokeColor",set:function(t){this._strokeColor.packedValue=t},get:function(){return this._strokeColor.packedValue}},{key:"strokeWidth",set:function(t){return i(t),this._strokeWidth=t,this},get:function(){return this._strokeWidth}},{key:"lineJoin",set:function(t){var e=o(t);return this._lineJoin=e,this},get:function(){return y[this._lineJoin]}},{key:"lineCap",set:function(t){var e=s(t);return this._lineCap=e,this},get:function(){return M[this._lineJoin]}},{key:"dashPattern",set:function(t){return l(t),this._dashPattern=t.slice(),this},get:function(){return this._dashPattern.slice()}},{key:"dashOffset",set:function(t){return u(t),this._dashOffset=t,this},get:function(){return this._dashOffset}}],[{key:"copyStrokeStyle",value:function(t,e){"undefined"==typeof t.packedStrokeColor?("undefined"!=typeof t.strokeColor&&(e.strokeColor=t.strokeColor),"undefined"!=typeof t.strokeOpacity&&(e.strokeOpacity=t.strokeOpacity)):e.packedStrokeColor=t.packedStrokeColor,"undefined"!=typeof t.strokeWidth&&(e.strokeWidth=t.strokeWidth),"undefined"!=typeof t.lineJoin&&(e.lineJoin=t.lineJoin),"undefined"!=typeof t.lineCap&&(e.lineCap=t.lineCap),"undefined"!=typeof t.dashPattern&&(e.dashPattern=t.dashPattern),"undefined"!=typeof t.dashOffset&&(e.dashOffset=t.dashOffset)}},{key:"compareStrokeStyle",value:function(t,e){var r=t.isStrokeVisible(),n=e.isStrokeVisible();if(r!==n)return r-n;if(r=t.packedStrokeColor,n=e.packedStrokeColor,r!==n)return r-n;if(r=t.strokeWidth,n=e.strokeWidth,r!==n)return r-n;if(r=t._lineJoin,n=e._lineJoin,r!==n)return r-n;if(r=t._lineCap,n=e._lineCap,r!==n)return r-n;if(r=t._dashPattern,n=e._dashPattern,r.length===n.length&&r.length>0){for(var a=0;a0&&(i=1/Math.sqrt(i),t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i),t},a.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},a.cross=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=r[0],s=r[1],l=r[2];return t[0]=a*l-i*s,t[1]=i*o-n*l,t[2]=n*s-a*o,t},a.lerp=function(t,e,r,n){var a=e[0],i=e[1],o=e[2];return t[0]=a+n*(r[0]-a),t[1]=i+n*(r[1]-i),t[2]=o+n*(r[2]-o),t},a.hermite=function(t,e,r,n,a,i){var o=i*i,s=o*(2*i-3)+1,l=o*(i-2)+i,u=o*(i-1),c=o*(3-2*i);return t[0]=e[0]*s+r[0]*l+n[0]*u+a[0]*c,t[1]=e[1]*s+r[1]*l+n[1]*u+a[1]*c,t[2]=e[2]*s+r[2]*l+n[2]*u+a[2]*c,t},a.bezier=function(t,e,r,n,a,i){var o=1-i,s=o*o,l=i*i,u=s*o,c=3*i*s,f=3*l*o,h=l*i;return t[0]=e[0]*u+r[0]*c+n[0]*f+a[0]*h,t[1]=e[1]*u+r[1]*c+n[1]*f+a[1]*h,t[2]=e[2]*u+r[2]*c+n[2]*f+a[2]*h,t},a.random=function(t,e){e=e||1;var r=2*n.RANDOM()*Math.PI,a=2*n.RANDOM()-1,i=Math.sqrt(1-a*a)*e;return t[0]=Math.cos(r)*i,t[1]=Math.sin(r)*i,t[2]=a*e,t},a.transformMat4=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=r[3]*n+r[7]*a+r[11]*i+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*a+r[8]*i+r[12])/o,t[1]=(r[1]*n+r[5]*a+r[9]*i+r[13])/o,t[2]=(r[2]*n+r[6]*a+r[10]*i+r[14])/o,t},a.transformMat3=function(t,e,r){var n=e[0],a=e[1],i=e[2];return t[0]=n*r[0]+a*r[3]+i*r[6],t[1]=n*r[1]+a*r[4]+i*r[7],t[2]=n*r[2]+a*r[5]+i*r[8],t},a.transformQuat=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=r[0],s=r[1],l=r[2],u=r[3],c=u*n+s*i-l*a,f=u*a+l*n-o*i,h=u*i+o*a-s*n,d=-o*n-s*a-l*i;return t[0]=c*u+d*-o+f*-l-h*-s,t[1]=f*u+d*-s+h*-o-c*-l,t[2]=h*u+d*-l+c*-s-f*-o,t},a.rotateX=function(t,e,r,n){var a=[],i=[];return a[0]=e[0]-r[0],a[1]=e[1]-r[1],a[2]=e[2]-r[2],i[0]=a[0],i[1]=a[1]*Math.cos(n)-a[2]*Math.sin(n),i[2]=a[1]*Math.sin(n)+a[2]*Math.cos(n),t[0]=i[0]+r[0],t[1]=i[1]+r[1],t[2]=i[2]+r[2],t},a.rotateY=function(t,e,r,n){var a=[],i=[];return a[0]=e[0]-r[0],a[1]=e[1]-r[1],a[2]=e[2]-r[2],i[0]=a[2]*Math.sin(n)+a[0]*Math.cos(n),i[1]=a[1],i[2]=a[2]*Math.cos(n)-a[0]*Math.sin(n),t[0]=i[0]+r[0],t[1]=i[1]+r[1],t[2]=i[2]+r[2],t},a.rotateZ=function(t,e,r,n){var a=[],i=[];return a[0]=e[0]-r[0],a[1]=e[1]-r[1],a[2]=e[2]-r[2],i[0]=a[0]*Math.cos(n)-a[1]*Math.sin(n),i[1]=a[0]*Math.sin(n)+a[1]*Math.cos(n),i[2]=a[2],t[0]=i[0]+r[0],t[1]=i[1]+r[1],t[2]=i[2]+r[2],t},a.forEach=function(){var t=a.create();return function(e,r,n,a,i,o){var s,l;for(r||(r=3),n||(n=0),l=a?Math.min(a*r+n,e.length):e.length,s=n;s1?0:Math.acos(i)},a.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},a.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]},a.equals=function(t,e){var r=t[0],a=t[1],i=t[2],o=e[0],s=e[1],l=e[2];return Math.abs(r-o)<=n.EPSILON*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(a-s)<=n.EPSILON*Math.max(1,Math.abs(a),Math.abs(s))&&Math.abs(i-l)<=n.EPSILON*Math.max(1,Math.abs(i),Math.abs(l))},t.exports=a},function(t,e,r){var n=r(3),a={};a.create=function(){var t=new n.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},a.clone=function(t){var e=new n.ARRAY_TYPE(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},a.fromValues=function(t,e,r,a){var i=new n.ARRAY_TYPE(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=a,i},a.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},a.set=function(t,e,r,n,a){return t[0]=e,t[1]=r,t[2]=n,t[3]=a,t},a.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t},a.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t},a.sub=a.subtract,a.multiply=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t},a.mul=a.multiply,a.divide=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t},a.div=a.divide,a.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t[3]=Math.ceil(e[3]),t},a.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t[3]=Math.floor(e[3]),t},a.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t},a.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t},a.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t[3]=Math.round(e[3]),t},a.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t},a.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t},a.distance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],a=e[2]-t[2],i=e[3]-t[3];return Math.sqrt(r*r+n*n+a*a+i*i)},a.dist=a.distance,a.squaredDistance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],a=e[2]-t[2],i=e[3]-t[3];return r*r+n*n+a*a+i*i},a.sqrDist=a.squaredDistance,a.length=function(t){var e=t[0],r=t[1],n=t[2],a=t[3];return Math.sqrt(e*e+r*r+n*n+a*a)},a.len=a.length,a.squaredLength=function(t){var e=t[0],r=t[1],n=t[2],a=t[3];return e*e+r*r+n*n+a*a},a.sqrLen=a.squaredLength,a.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t},a.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t},a.normalize=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=r*r+n*n+a*a+i*i;return o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=n*o,t[2]=a*o,t[3]=i*o),t},a.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},a.lerp=function(t,e,r,n){var a=e[0],i=e[1],o=e[2],s=e[3];return t[0]=a+n*(r[0]-a),t[1]=i+n*(r[1]-i),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t},a.random=function(t,e){return e=e||1,t[0]=n.RANDOM(),t[1]=n.RANDOM(),t[2]=n.RANDOM(),t[3]=n.RANDOM(),a.normalize(t,t),a.scale(t,t,e),t},a.transformMat4=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3];return t[0]=r[0]*n+r[4]*a+r[8]*i+r[12]*o,t[1]=r[1]*n+r[5]*a+r[9]*i+r[13]*o,t[2]=r[2]*n+r[6]*a+r[10]*i+r[14]*o,t[3]=r[3]*n+r[7]*a+r[11]*i+r[15]*o,t},a.transformQuat=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=r[0],s=r[1],l=r[2],u=r[3],c=u*n+s*i-l*a,f=u*a+l*n-o*i,h=u*i+o*a-s*n,d=-o*n-s*a-l*i;return t[0]=c*u+d*-o+f*-l-h*-s,t[1]=f*u+d*-s+h*-o-c*-l,t[2]=h*u+d*-l+c*-s-f*-o,t[3]=e[3],t},a.forEach=function(){var t=a.create();return function(e,r,n,a,i,o){var s,l;for(r||(r=4),n||(n=0),l=a?Math.min(a*r+n,e.length):e.length,s=n;s=0&&a<=t.clientWidth&&(i=r-n.top-t.clientTop)>=0&&i<=t.clientHeight;return o}function u(t,e,r){var n=e.getBoundingClientRect();t[0]=r.clientX-n.left-e.clientLeft,t[1]=r.clientY-n.top-e.clientTop}function c(t,e,r,n){u(Y,t,e),D.transformMat2d(H,Y,n.screenToWorldMatrix);var a=r.shape;a instanceof N.default?S.transformXformShape(a,r,Y,H,n):a instanceof z.default?S.translateVert(a,r,Y,H,n):S.translateShape(a,r,Y,H,n)}function f(t,e){e.keys={altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey}}function h(t){var e=[];return t.forEach(function(t,r){e.push(r)}),e}function d(t,e,r,n,a,i){var o={unselectedShapes:h(r)};p(r),t.save();var s=e[e.length-1].zIndex;t.zIndex=s+1,F.default.copyBasicStyle(n,t),t.selected=!0;var l=null;return(i.scalable||i.rotatable)&&(l=new N.default(a||G,i),t.addChildXform(l)),r.set(t,l),o.selectedShapes=[t],o}function p(t){t.forEach(function(t,e){e.restore(),e.selected=!1,e.removeChildXform(t)}),t.clear()}function _(t,e){var r=[];return e.forEach(function(e){var n=t.get(e);e.restore(),e.selected=!1,e.removeChildXform(n),t.delete(e),r.push(e)}),r}function v(t,e){var r=document.querySelector(""+("#"+e.id+" canvas")),n={x:t.offsetX+r.offsetLeft,y:t.offsetY+r.offsetTop};return n}function y(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:W.SVG_OFFSET,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:W.SVG_OFFSET,i=document.getElementById("cursor"),o=v(t,e);if(null===i){var s=document.createElement("span");s.setAttribute("id","cursor"),s.setAttribute("style","position: absolute; top: "+(o.y+"px")+"; left: "+(o.x+"px")+"; width: 28px; height: 28px; background: "+r+"; cursor: none; z-index: 10; pointer-events: none; transform: translate("+n+"px, "+a+"px)"),e.appendChild(s)}else i.style.background===r?M(t,e):(i.style.background=r,M(t,e))}function m(){var t=document.getElementById("cursor");null!==t&&t.parentNode.removeChild(t)}function M(t,e){var r=document.getElementById("cursor"),n=v(t,e);null!==r&&(r.style.top=""+(n.y+"px"),r.style.left=""+(n.x+"px"))}Object.defineProperty(e,"__esModule",{value:!0});var b=function(){function t(t,e){for(var r=0;r=0;n-=1){var o=this._objects.get(r[n]);if(r[n].selected){a=this._selectedShapes.get(r[n]),i=o;var s=null;if(a&&(s=a.containsPoint(Y,H,e,this._drawCtx)).hit){if(a instanceof z.default&&t.altKey&&s.controlIndex canvas"));null===_?(this._parent.addEventListener("mouseout",J),this._parent.addEventListener("mouseover",U)):(_.addEventListener("mouseout",K),_.addEventListener("mouseover",Q)),!this._dragInfo&&i.movable&&(this._dragInfo={startLocalPos:a.getPosition()}),this._dragInfo&&(this._dragInfo.shape=a,this._dragInfo.startPos=D.clone(Y),this._dragInfo.startWorldPos=D.clone(H),this._dragInfo.objectToWorldMatrix=P.default.clone(a.globalXform),f(t,this._dragInfo),t.stopImmediatePropagation(),this.fire(X.DRAG_BEGIN,{shapes:h(this._selectedShapes)})),t.preventDefault()}}}},{key:"_mouseupCB",value:function(t){if(this._dragInfo&&this._dragInfo.shape){t.stopImmediatePropagation(),t.preventDefault();var e=document.querySelector(""+("#"+this._parent.id+" > canvas"));null===e?(this._parent.removeEventListener("mouseout",J),this._parent.removeEventListener("mouseover",U)):(e.removeEventListener("mouseout",K),e.removeEventListener("mouseover",Q)),this._dragInfo=null,this.fire(X.DRAG_END,{shapes:h(this._selectedShapes)})}else if(performance.now()-this.timer=0;o-=1)if(i=this._objects.get(n[o]),i.selectable&&n[o].containsPoint(Y,H,r,this._drawCtx)){a=n[o];break}if(a&&!a.selected){var s=d(a,n,this._selectedShapes,this._selectStyle,this._xformStyle,i);this.fire(X.SELECTION_CHANGED,s)}}}},{key:"_mousemoveCB",value:function(t){if(l(this._drawCanvas,t.clientX,t.clientY)||this._dragInfo)if(this._dragInfo&&this._dragInfo.shape)M(t,this._parent),f(t,this._dragInfo),c(this._drawCanvas,t,this._dragInfo,this._camera),t.stopImmediatePropagation(),t.preventDefault();else if(!t.buttons&&this._selectedShapes.size){D.set(Y,t.offsetX,t.offsetY),D.transformMat2d(H,Y,this._camera.screenToWorldMatrix);var e=this._camera.worldToScreenMatrix,r=this.sortedShapes,n=0,a=this._camera.isYFlipped();for(n=r.length-1;n>=0;n-=1)if(r[n].selected){var i=this._objects.get(r[n]),o=this._selectedShapes.get(r[n]),s=null;this._parent.style.cursor="none";for(var u=0;u/g,""+h))}else s.controlIndex<4?0===s.controlIndex||3===s.controlIndex?y(t,this._parent,""+R.replace(//g,""+(-r[n].getRotation()-W.FORTY_FIVE_ANGLE))):1!==s.controlIndex&&2!==s.controlIndex||y(t,this._parent,""+R.replace(//g,""+(-r[n].getRotation()+W.FORTY_FIVE_ANGLE))):s.controlIndex%2===0?y(t,this._parent,""+R.replace(//g,""+-r[n].getRotation())):y(t,this._parent,""+R.replace(//g,""+(-r[n].getRotation()+W.RIGHT_ANGLE)));else if(o instanceof z.default){this._parent.style.cursor="none";for(var d=0;d=r[n].numVerts?y(t,this._parent,V,-8,-6):t.altKey?y(t,this._parent,L,-8,-6):y(t,this._parent,q,W.SVG_OFFSET,W.SVG_OFFSET)}t.stopImmediatePropagation(),t.preventDefault();break}if(r[n].containsPoint(Y,H,e,this._drawCtx)){if(i&&i.movable){var p=document.getElementById("cursor");null!==p&&p.parentNode.removeChild(p),this._parent.style.cursor="move";for(var _=0;_=0;n-=1){var a=this._objects.get(r[n]);if(a.selectable&&r[n].containsPoint(Y,H,e,this._drawCtx)){if(a.editable&&r[n]instanceof A.default){var i=r[n],o=!1;if(r[n].selected){var s=this._selectedShapes.get(r[n]);s&&(i.restore(),i.removeChildXform(s),o=!(s instanceof N.default))}i.selected=!0,i.save();var u=r[r.length-1].zIndex;i.zIndex=u+1,F.default.copyBasicStyle(this._selectStyle,i);var c=null;o?(a.rotatable||a.scalable)&&(c=new N.default(this._xformStyle||G,a),i.addChildXform(c)):(c=new z.default(i,this._xformStyle),i.addChildXform(c)),this._selectedShapes.set(i,c)}else if(!r[n].selected){var f=d(r[n],r,this._selectedShapes,this._selectStyle,this._xformStyle,a);this.fire(X.SELECTION_CHANGED,f)}break}}n<0&&this._selectedShapes.size?(this._selectedShapes.size&&this.fire(X.SELECTION_CHANGED,{unselectedShapes:h(this._selectedShapes),selectedShapes:[]}),this._dragInfo=null,p(this._selectedShapes)):t.stopImmediatePropagation(),t.preventDefault()}}},{key:"_mouseoverCB",value:function(){}},{key:"_mouseoutCB",value:function(){}},{key:"_init",value:function(t,r){this._activated=r&&r.enableInteractions,x(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_init",this).call(this,t,r,this._activated);var n=Object.getOwnPropertyNames(X).map(function(t){return X[t]});this.registerEvents(n),this._dragInfo=null,this._selectedShapes=new Map,this._selectStyle=new F.default(r&&r.selectStyle?r.selectStyle:{fillColor:"orange"}),this._xformStyle=new F.default(r&&r.xformStyle?r.xformStyle:{fillColor:"white",strokeColor:"black",strokeWidth:2}),this.timer=0}},{key:"_renderShapes",value:function(t,e,r){var n=this,a=r.worldToScreenMatrix;e.forEach(function(e){if(e.visible&&(e.render(t,a,n._styleState),e.selected)){var r=n._selectedShapes.get(e);r&&r.render(t,a,n._styleState)}})}},{key:"selectShape",value:function(t){var e=this._objects.get(t);if(e&&e.selectable){var r=d(t,this.sortedShapes,this._selectedShapes,this._selectStyle,this._xformStyle,e);this.fire(X.SELECTION_CHANGED,r)}}},{key:"clearSelection",value:function(){if(this._selectedShapes.size){var t=h(this._selectedShapes);p(this._selectedShapes),this.fire(X.SELECTION_CHANGED,{unselectedShapes:t,selectedShapes:[]}),this._rerenderCb()}}},{key:"addShape",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=t;if(Array.isArray(i)||(i=[t]),x(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"addShape",this).call(this,i),i.forEach(function(t){var e=r._objects.get(t);e&&(e.selectable=!n||"undefined"==typeof n.selectable||Boolean(n.selectable),e.movable=!n||"undefined"==typeof n.movable||Boolean(n.movable),e.rotatable=!n||"undefined"==typeof n.rotatable||Boolean(n.rotatable),e.scalable=!n||"undefined"==typeof n.scalable||Boolean(n.scalable),e.uniformScaleOnly=!(!n||"undefined"==typeof n.uniformScaleOnly)&&Boolean(n.uniformScaleOnly),e.centerScaleOnly=!(!n||"undefined"==typeof n.centerScaleOnly)&&Boolean(n.centerScaleOnly),e.editable=!n||"undefined"==typeof n.editable||Boolean(n.editable))}),a){var o={unselectedShapes:h(this._selectedShapes)},s=[];i.forEach(function(t){var e=r._objects.get(t);e.selectable&&(d(t,r.sortedShapes,r._selectedShapes,r._selectStyle,r._xformStyle,e),s.push(t))}),s.length&&(o.selectedShapes=s,this.fire(X.SELECTION_CHANGED,o))}return this}},{key:"deleteShape",value:function(t){var r=t;Array.isArray(r)||(r=[t]);var n=_(this._selectedShapes,r);this.fire(X.SELECTION_CHANGED,{unselectedShapes:n,selectedShapes:h(this._selectedShapes)}),m(),this._parent.style.cursor="default";for(var a=0;a0&&void 0!==arguments[0])||arguments[0];return t&&this.clearSelection(),this._disableEvents(),this._activated=!1,this}},{key:"selectStyle",set:function(t){F.default.copyBasicStyle(t,this._selectStyle)},get:function(){return this._selectStyle}},{key:"selectedShapes",get:function(){return h(this._selectedShapes)}},{key:"interactionsEnabled",get:function(){return this._activated}}]),e}(k.default);e.default=Z,Object.assign(X,k.default.EventConstants),Z.EventConstants=X},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t,e,r,n,a){var i=[0,0],o=[0,0];h.default.svd(i,o,null,r.objectToWorldMatrix);var s=[0,0];c.sub(s,r.startWorldPos,i),p.default.normalize(s,s);var l=i;c.sub(l,a,i),p.default.normalize(l,l);var u=p.default.angle(s,l);r.keys.shiftKey&&(u=Math.round(u/Math.QUATER_PI)*Math.QUATER_PI),e.setRotation(r.startLocalRot+Math.RAD_TO_DEG*u)}function o(t,e,r,n,a){var o=t.parent,s=[0,0],l=[0,0],u=[0,0];if(e.rotate)return void i(t,o,e,r,n,a);var f=e.keys.shiftKey||e.uniformScaleOnly,d=e.keys.altKey||e.centerScaleOnly,_=[0,0];if(h.default.svd(_,null,null,e.objectToWorldMatrix),p.default.sub(l,n,e.startWorldPos),f&&e.controlIndex<4){var v=[e.objectToWorldMatrix[0],e.objectToWorldMatrix[1]],y=[e.objectToWorldMatrix[2],e.objectToWorldMatrix[3]],m=[0,0];e.controlIndex<2&&p.default.negate(v,v),e.controlIndex%2===0&&p.default.negate(y,y),p.default.normalize(v,v),p.default.normalize(y,y),p.default.add(m,v,y),p.default.normalize(m,m);var M=p.default.cross2d(l,m),b=null;0===e.controlIndex||3===e.controlIndex?(b=y,M<0&&(b=v)):(b=v,M<0&&(b=y));var x=p.default.dot(l,b);x=Math.sign(x)*Math.sqrt(2*x*x),p.default.scale(l,m,x),c.addVec2(n,e.startWorldPos,l)}c.copy(s,n),c.transformMat2d(s,s,e.worldToObjectMatrix),p.default.sub(u,s,e.startObjectPos),c.copy(_,e.startLocalPos);var g=0,S=0;if(e.controlIndex<4)g=e.controlIndex<2?-1:1,S=e.controlIndex%2===0?-1:1,d||c.addVec2(_,_,p.default.scale(l,l,.5)),o.setPosition(_);else{var I=e.controlIndex-4,D=[0,0];I%2===0?(p.default.set(D,e.objectToWorldMatrix[0],e.objectToWorldMatrix[1]),S=0,g=I<2?-1:1,f&&(S=g,u[1]=u[0])):(p.default.set(D,e.objectToWorldMatrix[2],e.objectToWorldMatrix[3]),g=0,S=I<2?-1:1,f&&(g=S,u[0]=u[1])),d||(p.default.normalize(D,D),p.default.scale(D,D,p.default.dot(l,D)),c.addVec2(_,_,p.default.scale(D,D,.5))),o.setPosition(_)}d&&(g*=2,S*=2),o.setScale([e.startLocalScale[0]*(1+g*u[0]/e.shapeWidth),e.startLocalScale[1]*(1+S*u[1]/e.shapeHeight)])}function s(t,e,r,n,a){var i=[0,0],o=[0,0];if(h.default.svd(o,null,null,e.objectToWorldMatrix),e.keys.shiftKey){c.sub(i,r,e.startPos);var s=Math.atan2(i[1],i[0]);s=Math.round(s/Math.QUATER_PI)*Math.QUATER_PI;var l=[Math.cos(s),Math.sin(s)];p.default.scale(i,l,p.default.dot(i,l)),p.default.transformMat2(i,i,a.screenToWorldMatrix)}else p.default.sub(i,n,e.startWorldPos);c.addVec2(o,e.startLocalPos,i),t.setPosition(o)}function l(t,e,r,n){var a=t.parent,i=a.numVerts;if(e.controlIndex>=i){var o=Math.min(e.controlIndex-i,i-1),s=o===i-1?0:o+1,l=[0,0],u=[0,0],f=[0,0],h=[0,0],d=a.vertsRef,_=a.globalXform;c.transformMat2d(u,d[o],_),c.transformMat2d(f,d[s],_),c.sub(h,f,u),p.default.scale(h,h,.5),c.addVec2(l,u,h),e.controlIndex=a.insertVert(o+1,l)}else a.setVertPosition(e.controlIndex,n)}Object.defineProperty(e,"__esModule",{value:!0}),e.transformXformShape=o,e.translateShape=s,e.translateVert=l;var u=r(4),c=a(u),f=r(5),h=n(f),d=r(10),p=n(d)},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var r=0;r0&&l===this._transformedVerts.length-1&&(h.sub(f,this._transformedVerts[0],this._transformedVerts[l]),d.vec2.scale(f,f,.5),h.addVec2(u,this._transformedVerts[l],f),c.initCenterExtents(i,u,s),c.containsPt(i,t)&&(a.hit=!0,a.controlIndex=this._transformedVerts.length+l))}}return a}},{key:"renderBounds",value:function(t,e,r){this._updateAABox(e),t.save(),t.setTransform(1,0,0,1,0,0),r.setStrokeCtx(t);var n=[0,0],a=[0,0];c.getCenter(n,this._aabox),c.getExtents(a,this._aabox),t.beginPath(),t.rect(n[0]-a[0],n[1]-a[1],2*a[0],2*a[1]),t.stroke(),t.restore()}},{key:"render",value:function(t){var e=this;t.save(),t.setTransform(1,0,0,1,0,0);var r=this._baseVertShape._fullXform,n=this._baseVertShape.vertsRef;this._transformedVerts=new Array(n.length);var a=[0,0],i=[0,0];t.beginPath();var o=0;this._transformedVerts[o]=[0,0],h.transformMat2d(this._transformedVerts[o],n[o],r);var s=Math.max(1.5*t.lineWidth,2.5);for(o=0;o0&&(h.sub(i,this._transformedVerts[0],this._transformedVerts[o]),d.vec2.scale(i,i,.5),h.addVec2(a,this._transformedVerts[o],i),t.moveTo(a[0]+s,a[1]),t.arc(a[0],a[1],s,0,Math.TWO_PI),t.fillStyle=t.strokeStyle,t.fill()),t.beginPath(),this._transformedVerts.forEach(function(r){t.moveTo(r[0]+e._vertRadius,r[1]),t.arc(r[0],r[1],e._vertRadius,0,Math.TWO_PI)}),this.isFillVisible()&&(this.setFillCtx(t),t.fill()),this.isStrokeVisible()&&(this.setStrokeCtx(t),t.stroke()),t.restore()}}]),e}(_.default);e.default=v},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e,r,n,a,i,o){_.transformMat2d(e,e,r),t.setTransform(1,0,0,1,0,0),t.translate(e[0],e[1]),t.rotate(i[1]),t.scale(o[0],o[1]),t.rotate(i[0]),t.translate(-e[0],-e[1]),t.rect(e[0]-a,e[1]-a,n,n)}function u(t,e,r,n,a,i,o,s,l,u){var c=!1,f=!1;if(_.transformMat2d(e,e,r),_.distance(e,t)<=s){g.default.negate(e,e),n[4]=n[0]*e[0]+n[2]*e[1],n[5]=n[1]*e[0]+n[3]*e[1];var h=0,d=0;_.transformMat2d(e,t,n),(Math.abs(e[0])<=a&&Math.abs(e[1])<=a||Boolean(l)&&Boolean(u)&&(f=(h=l*e[0])>-a&&h<=o&&(d=u*e[1])>-a&&d<=o))&&(c=!0)}return{hit:c,rotate:f}}Object.defineProperty(e,"__esModule",{value:!0});var c=function(){function t(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{scalable:!0,rotatable:!0};i(this,e);var n=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return n._interactiveBoxSize=8,n._interactiveBoxPadding=10,t&&"undefined"!=typeof t.vertexSize&&(n._interactiveBoxSize=t.vertexSize),n._scalable=!0,n._rotatable=!0,r&&("undefined"!=typeof r.scalable&&(n._scalable=Boolean(r.scalable)),"undefined"!=typeof r.rotatable&&(n._rotatable=Boolean(r.rotatable))),n}return s(e,t),c(e,[{key:"containsPoint",value:function(t){var e={hit:!1,rotate:!1,controlIndex:-1},r=this.aabox;if((this._rotatable||this._scalable)&&this.visible&&d.containsPt(r,t)){var n=[0,0],a=[0,0];m.default.svd(null,n,a,this._fullXform);var i=m.default.create();n[0]=n[0]<0?-1:1,n[1]=n[1]<0?-1:1,n[0]*n[1]>0&&g.default.negate(a,a),m.default.rotate(i,i,a[1]),m.default.scale(i,i,n),m.default.rotate(i,i,a[0]);for(var o=this._rotatable?this._interactiveBoxPadding:0,s=this._interactiveBoxSize/2,l=this.width/2,c=this.height/2,f=[0,0],h=s+o,p=Math.sqrt(2*h*h),v=0,y=0,M=0;M0&&void 0!==arguments[0]&&arguments[0];if(t||this._geomDirty||this._boundsOutOfDate){var e=this._rotatable?this._interactiveBoxPadding:0,r=e+this._interactiveBoxSize/2;d.initCenterExtents(this._aabox,[0,0],[this.width/2,this.height/2]),d.transformMat2d(this._aabox,this._aabox,this._fullXform),d.expand(this._aabox,this._aabox,[r,r]),this._aaboxUpdated=!0,this._geomDirty=this._boundsOutOfDate=!1}}},{key:"renderBounds",value:function(t,e,r){var n=this.aabox;t.save(),t.setTransform(1,0,0,1,0,0),r.setStrokeCtx(t);var a=[0,0],i=[0,0];d.getCenter(a,n),d.getExtents(i,n),t.beginPath(),t.rect(a[0]-i[0],a[1]-i[1],2*i[0],2*i[1]),t.stroke(),t.restore()}},{key:"render",value:function(t,r,n){if(this.parent&&"undefined"!=typeof this.parent.width&&"undefined"!==this.parent.height){this._aaboxUpdated=!1,f(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"render",this).call(this,t,r,n,!1),this._aaboxUpdated||this._updateAABox(!0);var a=[0,0],i=[0,0];m.default.svd(null,a,i,this._fullXform),a[0]=a[0]<0?-1:1,a[1]=a[1]<0?-1:1;var o=this._interactiveBoxSize/2,s=this.width/2,u=this.height/2,c=[s,u];t.save(),t.beginPath(),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a,"3"),_.set(c,s,-u),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a,"2"),_.set(c,-s,-u),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a,"0"),_.set(c,-s,u),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a,"1"),this._scalable&&(_.set(c,0,u),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a),_.set(c,0,-u),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a),_.set(c,s,0),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a),_.set(c,-s,0),l(t,c,this._fullXform,this._interactiveBoxSize,o,i,a)),this.isFillVisible()&&(n.setFillStyle(t,this),t.fill()),this.isStrokeVisible()&&(n.setStrokeStyle(t,this),t.setTransform(1,0,0,1,0,0),t.stroke()),t.restore()}}},{key:"width",get:function(){return this.parent&&"undefined"!==this.parent.width?this.parent.width:0}},{key:"height",get:function(){return this.parent&&"undefined"!==this.parent.height?this.parent.height:0}}]),e}(b.default);e.default=I},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function a(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var r=0;r=f.MINIMUM_POINTS){t.moveTo(this._verts[0][0],this._verts[0][1]);for(var r=1;r2&&void 0!==arguments[2]&&arguments[2];i(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,["changed","changed:xform"]));return a._viewport=c.clone(t),a._projectionDimensions=m.vec2.clone(r),a._yflip=n,a._screenMatrix=y.default.create(),a._screenDirty=!0,a}return s(e,t),l(e,[{key:"isYFlipped",value:function(){return this._yflip}},{key:"viewport",set:function(t){if(!c.equals(t,this._viewport)){var e=c.clone(this._viewport);c.copy(this._viewport,t),this._screenDirty=!0,this._worldToScreenOutdated=!0,this.fire("changed",{attr:"viewport",prevVal:e,currVal:t})}return this},get:function(){return c.clone(this._viewport)}},{key:"viewportRef",get:function(){return this._viewport}},{key:"screenMatrix",get:function(){if(this._screenDirty){var t=[0,0],e=[0,0];c.getCenter(t,this._viewport),c.getExtents(e,this._viewport),y.default.set(this._screenMatrix,e[0],0,0,e[1],t[0],t[1]),this._worldToScreenOutdated=!0,this._screenDirty=!1}return this._screenMatrix}}]),e}(_.default),b=function(t){function e(t,r,n){i(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,r,n));return a._viewMatrix=y.default.create(),a._viewDirty=!0,a._projMatrix=y.default.create(),a._projDirty=!0,a}return s(e,t),l(e,[{key:"_localXformUpdated",value:function(){this._boundsOutOfDate=!0}},{key:"_globalXformUpdated",value:function(){this._boundsOutOfDate=!0}},{key:"_matricesDirty",value:function(){return this._boundsOutOfDate||this._lxformDirty||this._xformDirty||this._viewDirty||this._projDirty||this._screenDirty}},{key:"projectionDimensions",set:function(t){if(!m.vec2.equals(t,this._projectionDimensions)){var e=m.vec2.clone(this._projectionDimensions);c.copy(this._projectionDimensions,t),this._viewDirty=!0,this._projDirty=!0,this.fire("changed",{attr:"projectionDimensions",prevVal:e,currVal:t})}return this},get:function(){return m.vec2.clone(this._projectionDimensions)}},{key:"projectionDimensionsRef",get:function(){return this._projectionDimensions}},{key:"viewMatrix",get:function(){if(this._viewDirty||this._boundsOutOfDate||this._xformDirty||this._lxformDirty){var t=[0,0],e=[0,0],r=[0,0],n=this.globalXform;y.default.svd(t,e,r,n),y.default.fromTranslation(this._viewMatrix,m.vec2.negate(t,t)),y.default.rotate(this._viewMatrix,this._viewMatrix,-r[0]),y.default.scale(this._viewMatrix,this._viewMatrix,e),y.default.rotate(this._viewMatrix,this._viewMatrix,-r[1]),this._worldToScreenOutdated=!0,this._viewDirty=!1}return this._viewMatrix}},{key:"projMatrix",get:function(){if(this._projDirty){var t=this._yflip?-1:1;y.default.set(this._projMatrix,2/this._projectionDimensions[0],0,0,2*t/this._projectionDimensions[1],0,0),this._worldToScreenOutdated=!0,this._projDirty=!1}return this._projMatrix}},{key:"worldToScreenMatrix",get:function(){return(!this._worldToScreenMatrix||this._worldToScreenOutdated||this._matricesDirty())&&(this._worldToScreenMatrix||(this._worldToScreenMatrix=y.default.create()),y.default.copy(this._worldToScreenMatrix,this.viewMatrix),y.default.multiply(this._worldToScreenMatrix,this.projMatrix,this._worldToScreenMatrix),y.default.multiply(this._worldToScreenMatrix,this.screenMatrix,this._worldToScreenMatrix),this._worldToScreenOutdated=!1,this._screenToWorldOutdated=!0),this._worldToScreenMatrix}},{key:"screenToWorldMatrix",get:function(){return(!this._screenToWorld||this._screenToWorldOutdated||this._matricesDirty())&&(this._screenToWorld||(this._screenToWorld=y.default.create()),y.default.copy(this._screenToWorld,this.worldToScreenMatrix),y.default.invert(this._screenToWorld,this._screenToWorld),this._screenToWorldOutdated=!1),this._screenToWorld}}]),e}((0,h.default)(M,(0,d.createEventedTransform2dMixin)("changed:xform")));e.default=b},function(t,e,r){var n,a;!function(i,o){n=o,a="function"==typeof n?n.call(e,r,e,t):n,!(void 0!==a&&(t.exports=a))}(this,function(){function t(t,e){var r=Object.prototype.toString.call(t),n="[object Array]"===r||"[object NodeList]"===r||"[object HTMLCollection]"===r||"[object Object]"===r||"undefined"!=typeof jQuery&&t instanceof jQuery||"undefined"!=typeof Elements&&t instanceof Elements,a=0,i=t.length;if(n)for(;a
',t.appendChild(t.resizeSensor),"static"==o(t,"position")&&(t.style.position="relative");var s,l,u,c,f=t.resizeSensor.childNodes[0],h=f.childNodes[0],d=t.resizeSensor.childNodes[1],p=t.offsetWidth,_=t.offsetHeight,v=function(){h.style.width="100000px",h.style.height="100000px",f.scrollLeft=1e5,f.scrollTop=1e5,d.scrollLeft=1e5,d.scrollTop=1e5};v();var y=function(){l=0,s&&(p=u,_=c,t.resizedAttached&&t.resizedAttached.call())},m=function(){u=t.offsetWidth,c=t.offsetHeight,s=u!=p||c!=_,s&&!l&&(l=e(y)),v()},M=function(t,e,r){t.attachEvent?t.attachEvent("on"+e,r):t.addEventListener(e,r)};M(f,"scroll",m),M(d,"scroll",m)}t(n,function(t){s(t,a)}),this.detach=function(t){r.detach(n,t)}};return r.detach=function(e,r){t(e,function(t){t.resizedAttached&&"function"==typeof r&&(t.resizedAttached.remove(r),t.resizedAttached.length())||t.resizeSensor&&(t.contains(t.resizeSensor)&&t.removeChild(t.resizeSensor),delete t.resizeSensor,delete t.resizedAttached)})},r})},function(t,e,r){var n=r(3),a={};a.create=function(){var t=new n.ARRAY_TYPE(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},a.clone=function(t){var e=new n.ARRAY_TYPE(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},a.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},a.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},a.fromValues=function(t,e,r,a){var i=new n.ARRAY_TYPE(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=a,i},a.set=function(t,e,r,n,a){return t[0]=e,t[1]=r,t[2]=n,t[3]=a,t},a.transpose=function(t,e){if(t===e){var r=e[1];t[1]=e[2],t[2]=r}else t[0]=e[0],t[1]=e[2],t[2]=e[1],t[3]=e[3];return t},a.invert=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=r*i-a*n;return o?(o=1/o,t[0]=i*o,t[1]=-n*o,t[2]=-a*o,t[3]=r*o,t):null},a.adjoint=function(t,e){var r=e[0];return t[0]=e[3],t[1]=-e[1],t[2]=-e[2],t[3]=r,t},a.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},a.multiply=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=r[0],l=r[1],u=r[2],c=r[3];return t[0]=n*s+i*l,t[1]=a*s+o*l,t[2]=n*u+i*c,t[3]=a*u+o*c,t},a.mul=a.multiply,a.rotate=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=Math.sin(r),l=Math.cos(r);return t[0]=n*l+i*s,t[1]=a*l+o*s,t[2]=n*-s+i*l,t[3]=a*-s+o*l,t},a.scale=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=r[0],l=r[1];return t[0]=n*s,t[1]=a*s,t[2]=i*l,t[3]=o*l,t},a.fromRotation=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=-r,t[3]=n,t},a.fromScaling=function(t,e){return t[0]=e[0], -t[1]=0,t[2]=0,t[3]=e[1],t},a.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},a.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},a.LDU=function(t,e,r,n){return t[2]=n[2]/n[0],r[0]=n[0],r[1]=n[1],r[3]=n[3]-t[2]*r[1],[t,e,r]},a.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t},a.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t},a.sub=a.subtract,a.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},a.equals=function(t,e){var r=t[0],a=t[1],i=t[2],o=t[3],s=e[0],l=e[1],u=e[2],c=e[3];return Math.abs(r-s)<=n.EPSILON*Math.max(1,Math.abs(r),Math.abs(s))&&Math.abs(a-l)<=n.EPSILON*Math.max(1,Math.abs(a),Math.abs(l))&&Math.abs(i-u)<=n.EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=n.EPSILON*Math.max(1,Math.abs(o),Math.abs(c))},a.multiplyScalar=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t},a.multiplyScalarAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t},t.exports=a},function(t,e,r){var n=r(3),a={};a.create=function(){var t=new n.ARRAY_TYPE(6);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},a.clone=function(t){var e=new n.ARRAY_TYPE(6);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e},a.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},a.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},a.fromValues=function(t,e,r,a,i,o){var s=new n.ARRAY_TYPE(6);return s[0]=t,s[1]=e,s[2]=r,s[3]=a,s[4]=i,s[5]=o,s},a.set=function(t,e,r,n,a,i,o){return t[0]=e,t[1]=r,t[2]=n,t[3]=a,t[4]=i,t[5]=o,t},a.invert=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=e[4],s=e[5],l=r*i-n*a;return l?(l=1/l,t[0]=i*l,t[1]=-n*l,t[2]=-a*l,t[3]=r*l,t[4]=(a*s-i*o)*l,t[5]=(n*o-r*s)*l,t):null},a.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},a.multiply=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=e[4],l=e[5],u=r[0],c=r[1],f=r[2],h=r[3],d=r[4],p=r[5];return t[0]=n*u+i*c,t[1]=a*u+o*c,t[2]=n*f+i*h,t[3]=a*f+o*h,t[4]=n*d+i*p+s,t[5]=a*d+o*p+l,t},a.mul=a.multiply,a.rotate=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=e[4],l=e[5],u=Math.sin(r),c=Math.cos(r);return t[0]=n*c+i*u,t[1]=a*c+o*u,t[2]=n*-u+i*c,t[3]=a*-u+o*c,t[4]=s,t[5]=l,t},a.scale=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=e[4],l=e[5],u=r[0],c=r[1];return t[0]=n*u,t[1]=a*u,t[2]=i*c,t[3]=o*c,t[4]=s,t[5]=l,t},a.translate=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=e[4],l=e[5],u=r[0],c=r[1];return t[0]=n,t[1]=a,t[2]=i,t[3]=o,t[4]=n*u+i*c+s,t[5]=a*u+o*c+l,t},a.fromRotation=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=-r,t[3]=n,t[4]=0,t[5]=0,t},a.fromScaling=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=e[1],t[4]=0,t[5]=0,t},a.fromTranslation=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=e[0],t[5]=e[1],t},a.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},a.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},a.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t[4]=e[4]+r[4],t[5]=e[5]+r[5],t},a.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t[4]=e[4]-r[4],t[5]=e[5]-r[5],t},a.sub=a.subtract,a.multiplyScalar=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t[4]=e[4]*r,t[5]=e[5]*r,t},a.multiplyScalarAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t[4]=e[4]+r[4]*n,t[5]=e[5]+r[5]*n,t},a.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]},a.equals=function(t,e){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=e[0],c=e[1],f=e[2],h=e[3],d=e[4],p=e[5];return Math.abs(r-u)<=n.EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(a-c)<=n.EPSILON*Math.max(1,Math.abs(a),Math.abs(c))&&Math.abs(i-f)<=n.EPSILON*Math.max(1,Math.abs(i),Math.abs(f))&&Math.abs(o-h)<=n.EPSILON*Math.max(1,Math.abs(o),Math.abs(h))&&Math.abs(s-d)<=n.EPSILON*Math.max(1,Math.abs(s),Math.abs(d))&&Math.abs(l-p)<=n.EPSILON*Math.max(1,Math.abs(l),Math.abs(p))},t.exports=a},function(t,e,r){var n=r(3),a={scalar:{},SIMD:{}};a.create=function(){var t=new n.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},a.clone=function(t){var e=new n.ARRAY_TYPE(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},a.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},a.fromValues=function(t,e,r,a,i,o,s,l,u,c,f,h,d,p,_,v){var y=new n.ARRAY_TYPE(16);return y[0]=t,y[1]=e,y[2]=r,y[3]=a,y[4]=i,y[5]=o,y[6]=s,y[7]=l,y[8]=u,y[9]=c,y[10]=f,y[11]=h,y[12]=d,y[13]=p,y[14]=_,y[15]=v,y},a.set=function(t,e,r,n,a,i,o,s,l,u,c,f,h,d,p,_,v){return t[0]=e,t[1]=r,t[2]=n,t[3]=a,t[4]=i,t[5]=o,t[6]=s,t[7]=l,t[8]=u,t[9]=c,t[10]=f,t[11]=h,t[12]=d,t[13]=p,t[14]=_,t[15]=v,t},a.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},a.scalar.transpose=function(t,e){if(t===e){var r=e[1],n=e[2],a=e[3],i=e[6],o=e[7],s=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=r,t[6]=e[9],t[7]=e[13],t[8]=n,t[9]=i,t[11]=e[14],t[12]=a,t[13]=o,t[14]=s}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t},a.SIMD.transpose=function(t,e){var r,n,a,i,o,s,l,u,c,f;return r=SIMD.Float32x4.load(e,0),n=SIMD.Float32x4.load(e,4),a=SIMD.Float32x4.load(e,8),i=SIMD.Float32x4.load(e,12),o=SIMD.Float32x4.shuffle(r,n,0,1,4,5),s=SIMD.Float32x4.shuffle(a,i,0,1,4,5),l=SIMD.Float32x4.shuffle(o,s,0,2,4,6),u=SIMD.Float32x4.shuffle(o,s,1,3,5,7),SIMD.Float32x4.store(t,0,l),SIMD.Float32x4.store(t,4,u),o=SIMD.Float32x4.shuffle(r,n,2,3,6,7),s=SIMD.Float32x4.shuffle(a,i,2,3,6,7),c=SIMD.Float32x4.shuffle(o,s,0,2,4,6),f=SIMD.Float32x4.shuffle(o,s,1,3,5,7),SIMD.Float32x4.store(t,8,c),SIMD.Float32x4.store(t,12,f),t},a.transpose=n.USE_SIMD?a.SIMD.transpose:a.scalar.transpose,a.scalar.invert=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],d=e[11],p=e[12],_=e[13],v=e[14],y=e[15],m=r*s-n*o,M=r*l-a*o,b=r*u-i*o,x=n*l-a*s,g=n*u-i*s,S=a*u-i*l,I=c*_-f*p,D=c*v-h*p,w=c*y-d*p,F=f*v-h*_,O=f*y-d*_,k=h*y-d*v,E=m*k-M*O+b*F+x*w-g*D+S*I;return E?(E=1/E,t[0]=(s*k-l*O+u*F)*E,t[1]=(a*O-n*k-i*F)*E,t[2]=(_*S-v*g+y*x)*E,t[3]=(h*g-f*S-d*x)*E,t[4]=(l*w-o*k-u*D)*E,t[5]=(r*k-a*w+i*D)*E,t[6]=(v*b-p*S-y*M)*E,t[7]=(c*S-h*b+d*M)*E,t[8]=(o*O-s*w+u*I)*E,t[9]=(n*w-r*O-i*I)*E,t[10]=(p*g-_*b+y*m)*E,t[11]=(f*b-c*g-d*m)*E,t[12]=(s*D-o*F-l*I)*E,t[13]=(r*F-n*D+a*I)*E,t[14]=(_*M-p*x-v*m)*E,t[15]=(c*x-f*M+h*m)*E,t):null},a.SIMD.invert=function(t,e){var r,n,a,i,o,s,l,u,c,f,h=SIMD.Float32x4.load(e,0),d=SIMD.Float32x4.load(e,4),p=SIMD.Float32x4.load(e,8),_=SIMD.Float32x4.load(e,12);return o=SIMD.Float32x4.shuffle(h,d,0,1,4,5),n=SIMD.Float32x4.shuffle(p,_,0,1,4,5),r=SIMD.Float32x4.shuffle(o,n,0,2,4,6),n=SIMD.Float32x4.shuffle(n,o,1,3,5,7),o=SIMD.Float32x4.shuffle(h,d,2,3,6,7),i=SIMD.Float32x4.shuffle(p,_,2,3,6,7),a=SIMD.Float32x4.shuffle(o,i,0,2,4,6),i=SIMD.Float32x4.shuffle(i,o,1,3,5,7),o=SIMD.Float32x4.mul(a,i),o=SIMD.Float32x4.swizzle(o,1,0,3,2),s=SIMD.Float32x4.mul(n,o),l=SIMD.Float32x4.mul(r,o),o=SIMD.Float32x4.swizzle(o,2,3,0,1),s=SIMD.Float32x4.sub(SIMD.Float32x4.mul(n,o),s),l=SIMD.Float32x4.sub(SIMD.Float32x4.mul(r,o),l),l=SIMD.Float32x4.swizzle(l,2,3,0,1),o=SIMD.Float32x4.mul(n,a),o=SIMD.Float32x4.swizzle(o,1,0,3,2),s=SIMD.Float32x4.add(SIMD.Float32x4.mul(i,o),s),c=SIMD.Float32x4.mul(r,o),o=SIMD.Float32x4.swizzle(o,2,3,0,1),s=SIMD.Float32x4.sub(s,SIMD.Float32x4.mul(i,o)),c=SIMD.Float32x4.sub(SIMD.Float32x4.mul(r,o),c),c=SIMD.Float32x4.swizzle(c,2,3,0,1),o=SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(n,2,3,0,1),i),o=SIMD.Float32x4.swizzle(o,1,0,3,2),a=SIMD.Float32x4.swizzle(a,2,3,0,1),s=SIMD.Float32x4.add(SIMD.Float32x4.mul(a,o),s),u=SIMD.Float32x4.mul(r,o),o=SIMD.Float32x4.swizzle(o,2,3,0,1),s=SIMD.Float32x4.sub(s,SIMD.Float32x4.mul(a,o)),u=SIMD.Float32x4.sub(SIMD.Float32x4.mul(r,o),u),u=SIMD.Float32x4.swizzle(u,2,3,0,1),o=SIMD.Float32x4.mul(r,n),o=SIMD.Float32x4.swizzle(o,1,0,3,2),u=SIMD.Float32x4.add(SIMD.Float32x4.mul(i,o),u),c=SIMD.Float32x4.sub(SIMD.Float32x4.mul(a,o),c),o=SIMD.Float32x4.swizzle(o,2,3,0,1),u=SIMD.Float32x4.sub(SIMD.Float32x4.mul(i,o),u),c=SIMD.Float32x4.sub(c,SIMD.Float32x4.mul(a,o)),o=SIMD.Float32x4.mul(r,i),o=SIMD.Float32x4.swizzle(o,1,0,3,2),l=SIMD.Float32x4.sub(l,SIMD.Float32x4.mul(a,o)),u=SIMD.Float32x4.add(SIMD.Float32x4.mul(n,o),u),o=SIMD.Float32x4.swizzle(o,2,3,0,1),l=SIMD.Float32x4.add(SIMD.Float32x4.mul(a,o),l),u=SIMD.Float32x4.sub(u,SIMD.Float32x4.mul(n,o)),o=SIMD.Float32x4.mul(r,a),o=SIMD.Float32x4.swizzle(o,1,0,3,2),l=SIMD.Float32x4.add(SIMD.Float32x4.mul(i,o),l),c=SIMD.Float32x4.sub(c,SIMD.Float32x4.mul(n,o)),o=SIMD.Float32x4.swizzle(o,2,3,0,1),l=SIMD.Float32x4.sub(l,SIMD.Float32x4.mul(i,o)),c=SIMD.Float32x4.add(SIMD.Float32x4.mul(n,o),c),f=SIMD.Float32x4.mul(r,s),f=SIMD.Float32x4.add(SIMD.Float32x4.swizzle(f,2,3,0,1),f),f=SIMD.Float32x4.add(SIMD.Float32x4.swizzle(f,1,0,3,2),f),o=SIMD.Float32x4.reciprocalApproximation(f),f=SIMD.Float32x4.sub(SIMD.Float32x4.add(o,o),SIMD.Float32x4.mul(f,SIMD.Float32x4.mul(o,o))),(f=SIMD.Float32x4.swizzle(f,0,0,0,0))?(SIMD.Float32x4.store(t,0,SIMD.Float32x4.mul(f,s)),SIMD.Float32x4.store(t,4,SIMD.Float32x4.mul(f,l)),SIMD.Float32x4.store(t,8,SIMD.Float32x4.mul(f,u)),SIMD.Float32x4.store(t,12,SIMD.Float32x4.mul(f,c)),t):null},a.invert=n.USE_SIMD?a.SIMD.invert:a.scalar.invert,a.scalar.adjoint=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],d=e[11],p=e[12],_=e[13],v=e[14],y=e[15];return t[0]=s*(h*y-d*v)-f*(l*y-u*v)+_*(l*d-u*h),t[1]=-(n*(h*y-d*v)-f*(a*y-i*v)+_*(a*d-i*h)),t[2]=n*(l*y-u*v)-s*(a*y-i*v)+_*(a*u-i*l),t[3]=-(n*(l*d-u*h)-s*(a*d-i*h)+f*(a*u-i*l)),t[4]=-(o*(h*y-d*v)-c*(l*y-u*v)+p*(l*d-u*h)),t[5]=r*(h*y-d*v)-c*(a*y-i*v)+p*(a*d-i*h),t[6]=-(r*(l*y-u*v)-o*(a*y-i*v)+p*(a*u-i*l)),t[7]=r*(l*d-u*h)-o*(a*d-i*h)+c*(a*u-i*l),t[8]=o*(f*y-d*_)-c*(s*y-u*_)+p*(s*d-u*f),t[9]=-(r*(f*y-d*_)-c*(n*y-i*_)+p*(n*d-i*f)),t[10]=r*(s*y-u*_)-o*(n*y-i*_)+p*(n*u-i*s),t[11]=-(r*(s*d-u*f)-o*(n*d-i*f)+c*(n*u-i*s)),t[12]=-(o*(f*v-h*_)-c*(s*v-l*_)+p*(s*h-l*f)),t[13]=r*(f*v-h*_)-c*(n*v-a*_)+p*(n*h-a*f),t[14]=-(r*(s*v-l*_)-o*(n*v-a*_)+p*(n*l-a*s)),t[15]=r*(s*h-l*f)-o*(n*h-a*f)+c*(n*l-a*s),t},a.SIMD.adjoint=function(t,e){var r,n,a,i,o,s,l,u,c,f,h,d,p,r=SIMD.Float32x4.load(e,0),n=SIMD.Float32x4.load(e,4),a=SIMD.Float32x4.load(e,8),i=SIMD.Float32x4.load(e,12);return c=SIMD.Float32x4.shuffle(r,n,0,1,4,5),s=SIMD.Float32x4.shuffle(a,i,0,1,4,5),o=SIMD.Float32x4.shuffle(c,s,0,2,4,6),s=SIMD.Float32x4.shuffle(s,c,1,3,5,7),c=SIMD.Float32x4.shuffle(r,n,2,3,6,7),u=SIMD.Float32x4.shuffle(a,i,2,3,6,7),l=SIMD.Float32x4.shuffle(c,u,0,2,4,6),u=SIMD.Float32x4.shuffle(u,c,1,3,5,7),c=SIMD.Float32x4.mul(l,u),c=SIMD.Float32x4.swizzle(c,1,0,3,2),f=SIMD.Float32x4.mul(s,c),h=SIMD.Float32x4.mul(o,c),c=SIMD.Float32x4.swizzle(c,2,3,0,1),f=SIMD.Float32x4.sub(SIMD.Float32x4.mul(s,c),f),h=SIMD.Float32x4.sub(SIMD.Float32x4.mul(o,c),h),h=SIMD.Float32x4.swizzle(h,2,3,0,1),c=SIMD.Float32x4.mul(s,l),c=SIMD.Float32x4.swizzle(c,1,0,3,2),f=SIMD.Float32x4.add(SIMD.Float32x4.mul(u,c),f),p=SIMD.Float32x4.mul(o,c),c=SIMD.Float32x4.swizzle(c,2,3,0,1),f=SIMD.Float32x4.sub(f,SIMD.Float32x4.mul(u,c)),p=SIMD.Float32x4.sub(SIMD.Float32x4.mul(o,c),p),p=SIMD.Float32x4.swizzle(p,2,3,0,1),c=SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,2,3,0,1),u),c=SIMD.Float32x4.swizzle(c,1,0,3,2),l=SIMD.Float32x4.swizzle(l,2,3,0,1),f=SIMD.Float32x4.add(SIMD.Float32x4.mul(l,c),f),d=SIMD.Float32x4.mul(o,c),c=SIMD.Float32x4.swizzle(c,2,3,0,1),f=SIMD.Float32x4.sub(f,SIMD.Float32x4.mul(l,c)),d=SIMD.Float32x4.sub(SIMD.Float32x4.mul(o,c),d),d=SIMD.Float32x4.swizzle(d,2,3,0,1),c=SIMD.Float32x4.mul(o,s),c=SIMD.Float32x4.swizzle(c,1,0,3,2),d=SIMD.Float32x4.add(SIMD.Float32x4.mul(u,c),d),p=SIMD.Float32x4.sub(SIMD.Float32x4.mul(l,c),p),c=SIMD.Float32x4.swizzle(c,2,3,0,1),d=SIMD.Float32x4.sub(SIMD.Float32x4.mul(u,c),d),p=SIMD.Float32x4.sub(p,SIMD.Float32x4.mul(l,c)),c=SIMD.Float32x4.mul(o,u),c=SIMD.Float32x4.swizzle(c,1,0,3,2),h=SIMD.Float32x4.sub(h,SIMD.Float32x4.mul(l,c)),d=SIMD.Float32x4.add(SIMD.Float32x4.mul(s,c),d),c=SIMD.Float32x4.swizzle(c,2,3,0,1),h=SIMD.Float32x4.add(SIMD.Float32x4.mul(l,c),h),d=SIMD.Float32x4.sub(d,SIMD.Float32x4.mul(s,c)),c=SIMD.Float32x4.mul(o,l),c=SIMD.Float32x4.swizzle(c,1,0,3,2),h=SIMD.Float32x4.add(SIMD.Float32x4.mul(u,c),h),p=SIMD.Float32x4.sub(p,SIMD.Float32x4.mul(s,c)),c=SIMD.Float32x4.swizzle(c,2,3,0,1),h=SIMD.Float32x4.sub(h,SIMD.Float32x4.mul(u,c)),p=SIMD.Float32x4.add(SIMD.Float32x4.mul(s,c),p),SIMD.Float32x4.store(t,0,f),SIMD.Float32x4.store(t,4,h),SIMD.Float32x4.store(t,8,d),SIMD.Float32x4.store(t,12,p),t},a.adjoint=n.USE_SIMD?a.SIMD.adjoint:a.scalar.adjoint,a.determinant=function(t){var e=t[0],r=t[1],n=t[2],a=t[3],i=t[4],o=t[5],s=t[6],l=t[7],u=t[8],c=t[9],f=t[10],h=t[11],d=t[12],p=t[13],_=t[14],v=t[15],y=e*o-r*i,m=e*s-n*i,M=e*l-a*i,b=r*s-n*o,x=r*l-a*o,g=n*l-a*s,S=u*p-c*d,I=u*_-f*d,D=u*v-h*d,w=c*_-f*p,F=c*v-h*p,O=f*v-h*_;return y*O-m*F+M*w+b*D-x*I+g*S},a.SIMD.multiply=function(t,e,r){var n=SIMD.Float32x4.load(e,0),a=SIMD.Float32x4.load(e,4),i=SIMD.Float32x4.load(e,8),o=SIMD.Float32x4.load(e,12),s=SIMD.Float32x4.load(r,0),l=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,0,0,0,0),n),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,1,1,1,1),a),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,2,2,2,2),i),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(s,3,3,3,3),o))));SIMD.Float32x4.store(t,0,l);var u=SIMD.Float32x4.load(r,4),c=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(u,0,0,0,0),n),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(u,1,1,1,1),a),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(u,2,2,2,2),i),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(u,3,3,3,3),o))));SIMD.Float32x4.store(t,4,c);var f=SIMD.Float32x4.load(r,8),h=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(f,0,0,0,0),n),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(f,1,1,1,1),a),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(f,2,2,2,2),i),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(f,3,3,3,3),o))));SIMD.Float32x4.store(t,8,h);var d=SIMD.Float32x4.load(r,12),p=SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(d,0,0,0,0),n),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(d,1,1,1,1),a),SIMD.Float32x4.add(SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(d,2,2,2,2),i),SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(d,3,3,3,3),o))));return SIMD.Float32x4.store(t,12,p),t},a.scalar.multiply=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],d=e[10],p=e[11],_=e[12],v=e[13],y=e[14],m=e[15],M=r[0],b=r[1],x=r[2],g=r[3];return t[0]=M*n+b*s+x*f+g*_,t[1]=M*a+b*l+x*h+g*v,t[2]=M*i+b*u+x*d+g*y,t[3]=M*o+b*c+x*p+g*m,M=r[4],b=r[5],x=r[6],g=r[7],t[4]=M*n+b*s+x*f+g*_,t[5]=M*a+b*l+x*h+g*v,t[6]=M*i+b*u+x*d+g*y,t[7]=M*o+b*c+x*p+g*m,M=r[8],b=r[9],x=r[10],g=r[11],t[8]=M*n+b*s+x*f+g*_,t[9]=M*a+b*l+x*h+g*v,t[10]=M*i+b*u+x*d+g*y,t[11]=M*o+b*c+x*p+g*m,M=r[12],b=r[13],x=r[14],g=r[15],t[12]=M*n+b*s+x*f+g*_,t[13]=M*a+b*l+x*h+g*v,t[14]=M*i+b*u+x*d+g*y,t[15]=M*o+b*c+x*p+g*m,t},a.multiply=n.USE_SIMD?a.SIMD.multiply:a.scalar.multiply,a.mul=a.multiply,a.scalar.translate=function(t,e,r){var n,a,i,o,s,l,u,c,f,h,d,p,_=r[0],v=r[1],y=r[2];return e===t?(t[12]=e[0]*_+e[4]*v+e[8]*y+e[12],t[13]=e[1]*_+e[5]*v+e[9]*y+e[13],t[14]=e[2]*_+e[6]*v+e[10]*y+e[14],t[15]=e[3]*_+e[7]*v+e[11]*y+e[15]):(n=e[0],a=e[1],i=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],d=e[10],p=e[11],t[0]=n,t[1]=a,t[2]=i,t[3]=o,t[4]=s,t[5]=l,t[6]=u,t[7]=c,t[8]=f,t[9]=h,t[10]=d,t[11]=p,t[12]=n*_+s*v+f*y+e[12],t[13]=a*_+l*v+h*y+e[13],t[14]=i*_+u*v+d*y+e[14],t[15]=o*_+c*v+p*y+e[15]),t},a.SIMD.translate=function(t,e,r){var n=SIMD.Float32x4.load(e,0),a=SIMD.Float32x4.load(e,4),i=SIMD.Float32x4.load(e,8),o=SIMD.Float32x4.load(e,12),s=SIMD.Float32x4(r[0],r[1],r[2],0);e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11]),n=SIMD.Float32x4.mul(n,SIMD.Float32x4.swizzle(s,0,0,0,0)),a=SIMD.Float32x4.mul(a,SIMD.Float32x4.swizzle(s,1,1,1,1)),i=SIMD.Float32x4.mul(i,SIMD.Float32x4.swizzle(s,2,2,2,2));var l=SIMD.Float32x4.add(n,SIMD.Float32x4.add(a,SIMD.Float32x4.add(i,o)));return SIMD.Float32x4.store(t,12,l),t},a.translate=n.USE_SIMD?a.SIMD.translate:a.scalar.translate,a.scalar.scale=function(t,e,r){var n=r[0],a=r[1],i=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*a,t[5]=e[5]*a,t[6]=e[6]*a,t[7]=e[7]*a,t[8]=e[8]*i,t[9]=e[9]*i,t[10]=e[10]*i,t[11]=e[11]*i,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},a.SIMD.scale=function(t,e,r){var n,a,i,o=SIMD.Float32x4(r[0],r[1],r[2],0);return n=SIMD.Float32x4.load(e,0),SIMD.Float32x4.store(t,0,SIMD.Float32x4.mul(n,SIMD.Float32x4.swizzle(o,0,0,0,0))),a=SIMD.Float32x4.load(e,4),SIMD.Float32x4.store(t,4,SIMD.Float32x4.mul(a,SIMD.Float32x4.swizzle(o,1,1,1,1))),i=SIMD.Float32x4.load(e,8),SIMD.Float32x4.store(t,8,SIMD.Float32x4.mul(i,SIMD.Float32x4.swizzle(o,2,2,2,2))),t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},a.scale=n.USE_SIMD?a.SIMD.scale:a.scalar.scale,a.rotate=function(t,e,r,a){var i,o,s,l,u,c,f,h,d,p,_,v,y,m,M,b,x,g,S,I,D,w,F,O,k=a[0],E=a[1],P=a[2],C=Math.sqrt(k*k+E*E+P*P);return Math.abs(C)0?(n=2*Math.sqrt(r+1),t[3]=.25*n,t[0]=(e[6]-e[9])/n,t[1]=(e[8]-e[2])/n,t[2]=(e[1]-e[4])/n):e[0]>e[5]&e[0]>e[10]?(n=2*Math.sqrt(1+e[0]-e[5]-e[10]),t[3]=(e[6]-e[9])/n,t[0]=.25*n,t[1]=(e[1]+e[4])/n,t[2]=(e[8]+e[2])/n):e[5]>e[10]?(n=2*Math.sqrt(1+e[5]-e[0]-e[10]),t[3]=(e[8]-e[2])/n,t[0]=(e[1]+e[4])/n,t[1]=.25*n,t[2]=(e[6]+e[9])/n):(n=2*Math.sqrt(1+e[10]-e[0]-e[5]),t[3]=(e[1]-e[4])/n,t[0]=(e[8]+e[2])/n,t[1]=(e[6]+e[9])/n,t[2]=.25*n),t},a.fromRotationTranslationScale=function(t,e,r,n){var a=e[0],i=e[1],o=e[2],s=e[3],l=a+a,u=i+i,c=o+o,f=a*l,h=a*u,d=a*c,p=i*u,_=i*c,v=o*c,y=s*l,m=s*u,M=s*c,b=n[0],x=n[1],g=n[2];return t[0]=(1-(p+v))*b,t[1]=(h+M)*b,t[2]=(d-m)*b,t[3]=0,t[4]=(h-M)*x,t[5]=(1-(f+v))*x,t[6]=(_+y)*x,t[7]=0,t[8]=(d+m)*g,t[9]=(_-y)*g,t[10]=(1-(f+p))*g,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},a.fromRotationTranslationScaleOrigin=function(t,e,r,n,a){var i=e[0],o=e[1],s=e[2],l=e[3],u=i+i,c=o+o,f=s+s,h=i*u,d=i*c,p=i*f,_=o*c,v=o*f,y=s*f,m=l*u,M=l*c,b=l*f,x=n[0],g=n[1],S=n[2],I=a[0],D=a[1],w=a[2];return t[0]=(1-(_+y))*x,t[1]=(d+b)*x,t[2]=(p-M)*x,t[3]=0,t[4]=(d-b)*g,t[5]=(1-(h+y))*g,t[6]=(v+m)*g,t[7]=0,t[8]=(p+M)*S,t[9]=(v-m)*S,t[10]=(1-(h+_))*S,t[11]=0,t[12]=r[0]+I-(t[0]*I+t[4]*D+t[8]*w),t[13]=r[1]+D-(t[1]*I+t[5]*D+t[9]*w),t[14]=r[2]+w-(t[2]*I+t[6]*D+t[10]*w),t[15]=1,t},a.fromQuat=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=r+r,s=n+n,l=a+a,u=r*o,c=n*o,f=n*s,h=a*o,d=a*s,p=a*l,_=i*o,v=i*s,y=i*l;return t[0]=1-f-p,t[1]=c+y,t[2]=h-v,t[3]=0,t[4]=c-y,t[5]=1-u-p,t[6]=d+_,t[7]=0,t[8]=h+v,t[9]=d-_,t[10]=1-u-f,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},a.frustum=function(t,e,r,n,a,i,o){var s=1/(r-e),l=1/(a-n),u=1/(i-o);return t[0]=2*i*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*i*l,t[6]=0,t[7]=0,t[8]=(r+e)*s,t[9]=(a+n)*l,t[10]=(o+i)*u,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*i*2*u,t[15]=0,t},a.perspective=function(t,e,r,n,a){var i=1/Math.tan(e/2),o=1/(n-a);return t[0]=i/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=i,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(a+n)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*a*n*o,t[15]=0,t},a.perspectiveFromFieldOfView=function(t,e,r,n){var a=Math.tan(e.upDegrees*Math.PI/180),i=Math.tan(e.downDegrees*Math.PI/180),o=Math.tan(e.leftDegrees*Math.PI/180),s=Math.tan(e.rightDegrees*Math.PI/180),l=2/(o+s),u=2/(a+i);return t[0]=l,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=-((o-s)*l*.5),t[9]=(a-i)*u*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t},a.ortho=function(t,e,r,n,a,i,o){var s=1/(e-r),l=1/(n-a),u=1/(i-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*s,t[13]=(a+n)*l,t[14]=(o+i)*u,t[15]=1,t},a.lookAt=function(t,e,r,i){var o,s,l,u,c,f,h,d,p,_,v=e[0],y=e[1],m=e[2],M=i[0],b=i[1],x=i[2],g=r[0],S=r[1],I=r[2];return Math.abs(v-g).999999?(n[0]=0,n[1]=0,n[2]=0,n[3]=1,n):(i.cross(t,a,o),n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=1+l,s.normalize(n,n))}}(),s.setAxes=function(){var t=a.create();return function(e,r,n,a){return t[0]=n[0],t[3]=n[1],t[6]=n[2],t[1]=a[0],t[4]=a[1],t[7]=a[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],s.normalize(e,s.fromMat3(e,t))}}(),s.clone=o.clone,s.fromValues=o.fromValues,s.copy=o.copy,s.set=o.set,s.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},s.setAxisAngle=function(t,e,r){r*=.5;var n=Math.sin(r);return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=Math.cos(r),t},s.getAxisAngle=function(t,e){var r=2*Math.acos(e[3]),n=Math.sin(r/2);return 0!=n?(t[0]=e[0]/n,t[1]=e[1]/n,t[2]=e[2]/n):(t[0]=1,t[1]=0,t[2]=0),r},s.add=o.add,s.multiply=function(t,e,r){var n=e[0],a=e[1],i=e[2],o=e[3],s=r[0],l=r[1],u=r[2],c=r[3];return t[0]=n*c+o*s+a*u-i*l,t[1]=a*c+o*l+i*s-n*u,t[2]=i*c+o*u+n*l-a*s,t[3]=o*c-n*s-a*l-i*u,t},s.mul=s.multiply,s.scale=o.scale,s.rotateX=function(t,e,r){r*=.5;var n=e[0],a=e[1],i=e[2],o=e[3],s=Math.sin(r),l=Math.cos(r);return t[0]=n*l+o*s,t[1]=a*l+i*s,t[2]=i*l-a*s,t[3]=o*l-n*s,t},s.rotateY=function(t,e,r){r*=.5;var n=e[0],a=e[1],i=e[2],o=e[3],s=Math.sin(r),l=Math.cos(r);return t[0]=n*l-i*s,t[1]=a*l+o*s,t[2]=i*l+n*s,t[3]=o*l-a*s,t},s.rotateZ=function(t,e,r){r*=.5;var n=e[0],a=e[1],i=e[2],o=e[3],s=Math.sin(r),l=Math.cos(r);return t[0]=n*l+a*s,t[1]=a*l-n*s,t[2]=i*l+o*s,t[3]=o*l-i*s,t},s.calculateW=function(t,e){var r=e[0],n=e[1],a=e[2];return t[0]=r,t[1]=n,t[2]=a,t[3]=Math.sqrt(Math.abs(1-r*r-n*n-a*a)),t},s.dot=o.dot,s.lerp=o.lerp,s.slerp=function(t,e,r,n){var a,i,o,s,l,u=e[0],c=e[1],f=e[2],h=e[3],d=r[0],p=r[1],_=r[2],v=r[3];return i=u*d+c*p+f*_+h*v,i<0&&(i=-i,d=-d,p=-p,_=-_,v=-v),1-i>1e-6?(a=Math.acos(i),o=Math.sin(a),s=Math.sin((1-n)*a)/o,l=Math.sin(n*a)/o):(s=1-n,l=n),t[0]=s*u+l*d,t[1]=s*c+l*p,t[2]=s*f+l*_,t[3]=s*h+l*v,t},s.sqlerp=function(){var t=s.create(),e=s.create();return function(r,n,a,i,o,l){return s.slerp(t,n,o,l),s.slerp(e,a,i,l),s.slerp(r,t,e,2*l*(1-l)),r}}(),s.invert=function(t,e){var r=e[0],n=e[1],a=e[2],i=e[3],o=r*r+n*n+a*a+i*i,s=o?1/o:0;return t[0]=-r*s,t[1]=-n*s,t[2]=-a*s,t[3]=i*s,t},s.conjugate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},s.length=o.length,s.len=s.length,s.squaredLength=o.squaredLength,s.sqrLen=s.squaredLength, -s.normalize=o.normalize,s.fromMat3=function(t,e){var r,n=e[0]+e[4]+e[8];if(n>0)r=Math.sqrt(n+1),t[3]=.5*r,r=.5/r,t[0]=(e[5]-e[7])*r,t[1]=(e[6]-e[2])*r,t[2]=(e[1]-e[3])*r;else{var a=0;e[4]>e[0]&&(a=1),e[8]>e[3*a+a]&&(a=2);var i=(a+1)%3,o=(a+2)%3;r=Math.sqrt(e[3*a+a]-e[3*i+i]-e[3*o+o]+1),t[a]=.5*r,r=.5/r,t[3]=(e[3*i+o]-e[3*o+i])*r,t[i]=(e[3*i+a]+e[3*a+i])*r,t[o]=(e[3*o+a]+e[3*a+o])*r}return t},s.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},s.exactEquals=o.exactEquals,s.equals=o.equals,t.exports=s},function(t,e,r){var n=r(3),a={};a.create=function(){var t=new n.ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},a.clone=function(t){var e=new n.ARRAY_TYPE(2);return e[0]=t[0],e[1]=t[1],e},a.fromValues=function(t,e){var r=new n.ARRAY_TYPE(2);return r[0]=t,r[1]=e,r},a.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},a.set=function(t,e,r){return t[0]=e,t[1]=r,t},a.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t},a.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t},a.sub=a.subtract,a.multiply=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t},a.mul=a.multiply,a.divide=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t},a.div=a.divide,a.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t},a.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t},a.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t},a.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t},a.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t},a.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t},a.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t},a.distance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1];return Math.sqrt(r*r+n*n)},a.dist=a.distance,a.squaredDistance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1];return r*r+n*n},a.sqrDist=a.squaredDistance,a.length=function(t){var e=t[0],r=t[1];return Math.sqrt(e*e+r*r)},a.len=a.length,a.squaredLength=function(t){var e=t[0],r=t[1];return e*e+r*r},a.sqrLen=a.squaredLength,a.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t},a.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t},a.normalize=function(t,e){var r=e[0],n=e[1],a=r*r+n*n;return a>0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a),t},a.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]},a.cross=function(t,e,r){var n=e[0]*r[1]-e[1]*r[0];return t[0]=t[1]=0,t[2]=n,t},a.lerp=function(t,e,r,n){var a=e[0],i=e[1];return t[0]=a+n*(r[0]-a),t[1]=i+n*(r[1]-i),t},a.random=function(t,e){e=e||1;var r=2*n.RANDOM()*Math.PI;return t[0]=Math.cos(r)*e,t[1]=Math.sin(r)*e,t},a.transformMat2=function(t,e,r){var n=e[0],a=e[1];return t[0]=r[0]*n+r[2]*a,t[1]=r[1]*n+r[3]*a,t},a.transformMat2d=function(t,e,r){var n=e[0],a=e[1];return t[0]=r[0]*n+r[2]*a+r[4],t[1]=r[1]*n+r[3]*a+r[5],t},a.transformMat3=function(t,e,r){var n=e[0],a=e[1];return t[0]=r[0]*n+r[3]*a+r[6],t[1]=r[1]*n+r[4]*a+r[7],t},a.transformMat4=function(t,e,r){var n=e[0],a=e[1];return t[0]=r[0]*n+r[4]*a+r[12],t[1]=r[1]*n+r[5]*a+r[13],t},a.forEach=function(){var t=a.create();return function(e,r,n,a,i,o){var s,l;for(r||(r=2),n||(n=0),l=a?Math.min(a*r+n,e.length):e.length,s=n;s=4.0.0"},repository:{type:"git",url:"git+https://github.com/map-d/mapd-draw.js.git"},dependencies:{"gl-matrix":"^2.3.2","css-element-queries":"^0.4.0"},devDependencies:{"babel-core":"^6.10.4","babel-loader":"^6.2.4","babel-plugin-lodash":"^3.1.2","babel-preset-es2015":"^6.9.0","babel-preset-stage-0":"^6.5.0",eslint:"^3.0.1","http-server":"^0.9.0","json-loader":"0.5.4",webpack:"^1.13.1"},scripts:{build:"npm run build:prod; npm run build:dev","build:prod":"npm run webpack","build:dev":"npm run webpack:dev",clean:"bash scripts/clean.sh",eslint:"eslint -c ./.eslintrc.json","lint-fix":"eslint --fix $(find src -name \"*.js\" ! -name '*.spec.js')",lint:"eslint $(find src -name \"*.js\" ! -name '*.spec.js')",start:"npm run build; http-server -p 8080 -o;","watch:dev":"node node_modules/webpack/bin/webpack.js --progress --colors --watch --config webpack.dev.config.js",webpack:"node node_modules/webpack/bin/webpack.js","webpack:dev":"node node_modules/webpack/bin/webpack.js --config webpack.dev.config.js",test:"node_modules/.bin/mocha ./test --require ./test/config --require ./test/setup"},"pre-commit":["lint"]}}])}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.MapdDraw=e():t.MapdDraw=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.simpleHull_2D=e.Math=e.Point=e.PolyLine=e.Poly=e.Rect=e.Circle=e.Vec2d=e.BasicStyle=e.Mat2=e.Point2d=e.Mat2d=e.AABox2d=e.DrawEngine=e.ShapeBuilder=e.version=void 0;var o=r(30);Object.defineProperty(e,"version",{enumerable:!0,get:function(){return o.version}});var a=r(1);Object.defineProperty(e,"Mat2",{enumerable:!0,get:function(){return a.mat2}});var s=r(14);Object.defineProperty(e,"simpleHull_2D",{enumerable:!0,get:function(){return s.simpleHull_2D}});var u=r(19),l=i(u),c=r(13),h=i(c),f=r(2),d=n(f),p=r(4),v=i(p),_=r(3),y=n(_),b=r(8),m=i(b),g=r(9),M=i(g),O=r(23),w=i(O),x=r(15),E=i(x),k=r(25),S=i(k),P=r(10),C=i(P),A=r(24),I=i(A),j=r(5),D=i(j);e.ShapeBuilder=l.default,e.DrawEngine=h.default,e.AABox2d=d,e.Mat2d=v.default,e.Point2d=y,e.BasicStyle=m.default,e.Vec2d=M.default,e.Circle=w.default,e.Rect=E.default,e.Poly=S.default,e.PolyLine=C.default,e.Point=I.default,e.Math=D.default},function(t,e,r){/*! + @fileoverview gl-matrix - High performance matrix and vector operations + @author Brandon Jones + @author Colin MacKenzie IV + @version 2.7.0 + + Copyright (c) 2015-2018, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ +!function(e,r){t.exports=r()}("undefined"!=typeof self?self:this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};return e.m=t,e.c=r,e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:n})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,r){if(1&r&&(t=e(t)),8&r)return t;if(4&r&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(e.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&r&&"string"!=typeof t)for(var i in t)e.d(n,i,function(e){return t[e]}.bind(null,i));return n},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=10)}([function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=t},e.toRadian=function(t){return t*i},e.equals=function(t,e){return Math.abs(t-e)<=n*Math.max(1,Math.abs(t),Math.abs(e))};var n=e.EPSILON=1e-6;e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,e.RANDOM=Math.random;var i=Math.PI/180},function(t,e,r){"use strict";function n(){var t=new h.ARRAY_TYPE(4);return h.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function i(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t}function o(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}function a(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t}function s(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],o=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+o*o)}function u(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],o=e[3]-t[3];return r*r+n*n+i*i+o*o}function l(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)}function c(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i}Object.defineProperty(e,"__esModule",{value:!0}),e.forEach=e.sqrLen=e.len=e.sqrDist=e.dist=e.div=e.mul=e.sub=void 0,e.create=n,e.clone=function(t){var e=new h.ARRAY_TYPE(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},e.fromValues=function(t,e,r,n){var i=new h.ARRAY_TYPE(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=n,i},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},e.set=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t},e.subtract=i,e.multiply=o,e.divide=a,e.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t[3]=Math.ceil(e[3]),t},e.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t[3]=Math.floor(e[3]),t},e.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t},e.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t},e.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t[3]=Math.round(e[3]),t},e.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t},e.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t},e.distance=s,e.squaredDistance=u,e.length=l,e.squaredLength=c,e.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t},e.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t},e.normalize=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=r*r+n*n+i*i+o*o;return a>0&&(a=1/Math.sqrt(a),t[0]=r*a,t[1]=n*a,t[2]=i*a,t[3]=o*a),t},e.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},e.lerp=function(t,e,r,n){var i=e[0],o=e[1],a=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=o+n*(r[1]-o),t[2]=a+n*(r[2]-a),t[3]=s+n*(r[3]-s),t},e.random=function(t,e){var r,n,i,o,a,s;e=e||1;do r=2*h.RANDOM()-1,n=2*h.RANDOM()-1,a=r*r+n*n;while(a>=1);do i=2*h.RANDOM()-1,o=2*h.RANDOM()-1,s=i*i+o*o;while(s>=1);var u=Math.sqrt((1-a)/s);return t[0]=e*r,t[1]=e*n,t[2]=e*i*u,t[3]=e*o*u,t},e.transformMat4=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*o+r[12]*a,t[1]=r[1]*n+r[5]*i+r[9]*o+r[13]*a,t[2]=r[2]*n+r[6]*i+r[10]*o+r[14]*a,t[3]=r[3]*n+r[7]*i+r[11]*o+r[15]*a,t},e.transformQuat=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=r[0],s=r[1],u=r[2],l=r[3],c=l*n+s*o-u*i,h=l*i+u*n-a*o,f=l*o+a*i-s*n,d=-a*n-s*i-u*o;return t[0]=c*l+d*-a+h*-u-f*-s,t[1]=h*l+d*-s+f*-a-c*-u,t[2]=f*l+d*-u+c*-s-h*-a,t[3]=e[3],t},e.str=function(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],o=t[3],a=e[0],s=e[1],u=e[2],l=e[3];return Math.abs(r-a)<=h.EPSILON*Math.max(1,Math.abs(r),Math.abs(a))&&Math.abs(n-s)<=h.EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(i-u)<=h.EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-l)<=h.EPSILON*Math.max(1,Math.abs(o),Math.abs(l))};var h=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.sub=i,e.mul=o,e.div=a,e.dist=s,e.sqrDist=u,e.len=l,e.sqrLen=c,e.forEach=function(){var t=n();return function(e,r,n,i,o,a){var s=void 0,u=void 0;for(r||(r=4),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t}function d(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}Object.defineProperty(e,"__esModule",{value:!0}),e.forEach=e.sqrLen=e.len=e.sqrDist=e.dist=e.div=e.mul=e.sub=void 0,e.create=n,e.clone=function(t){var e=new p.ARRAY_TYPE(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},e.length=i,e.fromValues=o,e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},e.set=function(t,e,r,n){return t[0]=e,t[1]=r,t[2]=n,t},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t},e.subtract=a,e.multiply=s,e.divide=u,e.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t},e.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t},e.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t},e.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t},e.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t},e.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t},e.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t},e.distance=l,e.squaredDistance=c,e.squaredLength=h,e.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t},e.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t},e.normalize=f,e.dot=d,e.cross=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=r[0],s=r[1],u=r[2];return t[0]=i*u-o*s,t[1]=o*a-n*u,t[2]=n*s-i*a,t},e.lerp=function(t,e,r,n){var i=e[0],o=e[1],a=e[2];return t[0]=i+n*(r[0]-i),t[1]=o+n*(r[1]-o),t[2]=a+n*(r[2]-a),t},e.hermite=function(t,e,r,n,i,o){var a=o*o,s=a*(2*o-3)+1,u=a*(o-2)+o,l=a*(o-1),c=a*(3-2*o);return t[0]=e[0]*s+r[0]*u+n[0]*l+i[0]*c,t[1]=e[1]*s+r[1]*u+n[1]*l+i[1]*c,t[2]=e[2]*s+r[2]*u+n[2]*l+i[2]*c,t},e.bezier=function(t,e,r,n,i,o){var a=1-o,s=a*a,u=o*o,l=s*a,c=3*o*s,h=3*u*a,f=u*o;return t[0]=e[0]*l+r[0]*c+n[0]*h+i[0]*f,t[1]=e[1]*l+r[1]*c+n[1]*h+i[1]*f,t[2]=e[2]*l+r[2]*c+n[2]*h+i[2]*f,t},e.random=function(t,e){e=e||1;var r=2*p.RANDOM()*Math.PI,n=2*p.RANDOM()-1,i=Math.sqrt(1-n*n)*e;return t[0]=Math.cos(r)*i,t[1]=Math.sin(r)*i,t[2]=n*e,t},e.transformMat4=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=r[3]*n+r[7]*i+r[11]*o+r[15];return a=a||1,t[0]=(r[0]*n+r[4]*i+r[8]*o+r[12])/a,t[1]=(r[1]*n+r[5]*i+r[9]*o+r[13])/a,t[2]=(r[2]*n+r[6]*i+r[10]*o+r[14])/a,t},e.transformMat3=function(t,e,r){var n=e[0],i=e[1],o=e[2];return t[0]=n*r[0]+i*r[3]+o*r[6],t[1]=n*r[1]+i*r[4]+o*r[7],t[2]=n*r[2]+i*r[5]+o*r[8],t},e.transformQuat=function(t,e,r){var n=r[0],i=r[1],o=r[2],a=r[3],s=e[0],u=e[1],l=e[2],c=i*l-o*u,h=o*s-n*l,f=n*u-i*s,d=i*f-o*h,p=o*c-n*f,v=n*h-i*c,_=2*a;return c*=_,h*=_,f*=_,d*=2,p*=2,v*=2,t[0]=s+c+d,t[1]=u+h+p,t[2]=l+f+v,t},e.rotateX=function(t,e,r,n){var i=[],o=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],o[0]=i[0],o[1]=i[1]*Math.cos(n)-i[2]*Math.sin(n),o[2]=i[1]*Math.sin(n)+i[2]*Math.cos(n),t[0]=o[0]+r[0],t[1]=o[1]+r[1],t[2]=o[2]+r[2],t},e.rotateY=function(t,e,r,n){var i=[],o=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],o[0]=i[2]*Math.sin(n)+i[0]*Math.cos(n),o[1]=i[1],o[2]=i[2]*Math.cos(n)-i[0]*Math.sin(n),t[0]=o[0]+r[0],t[1]=o[1]+r[1],t[2]=o[2]+r[2],t},e.rotateZ=function(t,e,r,n){var i=[],o=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],o[0]=i[0]*Math.cos(n)-i[1]*Math.sin(n),o[1]=i[0]*Math.sin(n)+i[1]*Math.cos(n),o[2]=i[2],t[0]=o[0]+r[0],t[1]=o[1]+r[1],t[2]=o[2]+r[2],t},e.angle=function(t,e){var r=o(t[0],t[1],t[2]),n=o(e[0],e[1],e[2]);f(r,r),f(n,n);var i=d(r,n);return i>1?0:i<-1?Math.PI:Math.acos(i)},e.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],o=e[0],a=e[1],s=e[2];return Math.abs(r-o)<=p.EPSILON*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(n-a)<=p.EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-s)<=p.EPSILON*Math.max(1,Math.abs(i),Math.abs(s))};var p=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.sub=a,e.mul=s,e.div=u,e.dist=l,e.sqrDist=c,e.len=i,e.sqrLen=h,e.forEach=function(){var t=n();return function(e,r,n,i,o,a){var s=void 0,u=void 0;for(r||(r=3),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;sl.EPSILON?(d=Math.acos(p),v=Math.sin(d),_=Math.sin((1-n)*d)/v,y=Math.sin(n*d)/v):(_=1-n,y=n),t[0]=_*i+y*u,t[1]=_*o+y*c,t[2]=_*a+y*h,t[3]=_*s+y*f,t}function u(t,e){var r=e[0]+e[4]+e[8],n=void 0;if(r>0)n=Math.sqrt(r+1),t[3]=.5*n,n=.5/n,t[0]=(e[5]-e[7])*n,t[1]=(e[6]-e[2])*n,t[2]=(e[1]-e[3])*n;else{var i=0;e[4]>e[0]&&(i=1),e[8]>e[3*i+i]&&(i=2);var o=(i+1)%3,a=(i+2)%3;n=Math.sqrt(e[3*i+i]-e[3*o+o]-e[3*a+a]+1),t[i]=.5*n,n=.5/n,t[3]=(e[3*o+a]-e[3*a+o])*n,t[o]=(e[3*o+i]+e[3*i+o])*n,t[a]=(e[3*a+i]+e[3*i+a])*n}return t}Object.defineProperty(e,"__esModule",{value:!0}),e.setAxes=e.sqlerp=e.rotationTo=e.equals=e.exactEquals=e.normalize=e.sqrLen=e.squaredLength=e.len=e.length=e.lerp=e.dot=e.scale=e.mul=e.add=e.set=e.copy=e.fromValues=e.clone=void 0,e.create=i,e.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},e.setAxisAngle=o,e.getAxisAngle=function(t,e){var r=2*Math.acos(e[3]),n=Math.sin(r/2);return n>l.EPSILON?(t[0]=e[0]/n,t[1]=e[1]/n,t[2]=e[2]/n):(t[0]=1,t[1]=0,t[2]=0),r},e.multiply=a,e.rotateX=function(t,e,r){r*=.5;var n=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+a*s,t[1]=i*u+o*s,t[2]=o*u-i*s,t[3]=a*u-n*s,t},e.rotateY=function(t,e,r){r*=.5;var n=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u-o*s,t[1]=i*u+a*s,t[2]=o*u+n*s,t[3]=a*u-i*s,t},e.rotateZ=function(t,e,r){r*=.5;var n=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+i*s,t[1]=i*u-n*s,t[2]=o*u+a*s,t[3]=a*u-o*s,t},e.calculateW=function(t,e){var r=e[0],n=e[1],i=e[2];return t[0]=r,t[1]=n,t[2]=i,t[3]=Math.sqrt(Math.abs(1-r*r-n*n-i*i)),t},e.slerp=s,e.random=function(t){var e=l.RANDOM(),r=l.RANDOM(),n=l.RANDOM(),i=Math.sqrt(1-e),o=Math.sqrt(e);return t[0]=i*Math.sin(2*Math.PI*r),t[1]=i*Math.cos(2*Math.PI*r),t[2]=o*Math.sin(2*Math.PI*n),t[3]=o*Math.cos(2*Math.PI*n),t},e.invert=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=r*r+n*n+i*i+o*o,s=a?1/a:0;return t[0]=-r*s,t[1]=-n*s,t[2]=-i*s,t[3]=o*s,t},e.conjugate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},e.fromMat3=u,e.fromEuler=function(t,e,r,n){var i=.5*Math.PI/180;e*=i,r*=i,n*=i;var o=Math.sin(e),a=Math.cos(e),s=Math.sin(r),u=Math.cos(r),l=Math.sin(n),c=Math.cos(n);return t[0]=o*u*c-a*s*l,t[1]=a*s*c+o*u*l,t[2]=a*u*l-o*s*c,t[3]=a*u*c+o*s*l,t},e.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"};var l=n(r(0)),c=n(r(5)),h=n(r(2)),f=n(r(1));e.clone=f.clone,e.fromValues=f.fromValues,e.copy=f.copy,e.set=f.set,e.add=f.add,e.mul=a,e.scale=f.scale,e.dot=f.dot,e.lerp=f.lerp;var d=e.length=f.length,p=(e.len=d,e.squaredLength=f.squaredLength),v=(e.sqrLen=p,e.normalize=f.normalize);e.exactEquals=f.exactEquals,e.equals=f.equals,e.rotationTo=function(){var t=h.create(),e=h.fromValues(1,0,0),r=h.fromValues(0,1,0);return function(n,i,a){var s=h.dot(i,a);return s<-.999999?(h.cross(t,e,i),h.len(t)<1e-6&&h.cross(t,r,i),h.normalize(t,t),o(n,t,Math.PI),n):s>.999999?(n[0]=0,n[1]=0,n[2]=0,n[3]=1,n):(h.cross(t,i,a),n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=1+s,v(n,n))}}(),e.sqlerp=function(){var t=i(),e=i();return function(r,n,i,o,a,u){return s(t,n,a,u),s(e,i,o,u),s(r,t,e,2*u*(1-u)),r}}(),e.setAxes=function(){var t=c.create();return function(e,r,n,i){return t[0]=n[0],t[3]=n[1],t[6]=n[2],t[1]=i[0],t[4]=i[1],t[7]=i[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],v(e,u(e,t))}}()},function(t,e,r){"use strict";function n(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function i(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=e[6],c=e[7],h=e[8],f=e[9],d=e[10],p=e[11],v=e[12],_=e[13],y=e[14],b=e[15],m=r[0],g=r[1],M=r[2],O=r[3];return t[0]=m*n+g*s+M*h+O*v,t[1]=m*i+g*u+M*f+O*_,t[2]=m*o+g*l+M*d+O*y,t[3]=m*a+g*c+M*p+O*b,m=r[4],g=r[5],M=r[6],O=r[7],t[4]=m*n+g*s+M*h+O*v,t[5]=m*i+g*u+M*f+O*_,t[6]=m*o+g*l+M*d+O*y,t[7]=m*a+g*c+M*p+O*b,m=r[8],g=r[9],M=r[10],O=r[11],t[8]=m*n+g*s+M*h+O*v,t[9]=m*i+g*u+M*f+O*_,t[10]=m*o+g*l+M*d+O*y,t[11]=m*a+g*c+M*p+O*b,m=r[12],g=r[13],M=r[14],O=r[15],t[12]=m*n+g*s+M*h+O*v,t[13]=m*i+g*u+M*f+O*_,t[14]=m*o+g*l+M*d+O*y,t[15]=m*a+g*c+M*p+O*b,t}function o(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=n+n,u=i+i,l=o+o,c=n*s,h=n*u,f=n*l,d=i*u,p=i*l,v=o*l,_=a*s,y=a*u,b=a*l;return t[0]=1-(d+v),t[1]=h+b,t[2]=f-y,t[3]=0,t[4]=h-b,t[5]=1-(c+v),t[6]=p+_,t[7]=0,t[8]=f+y,t[9]=p-_,t[10]=1-(c+d),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}function a(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t[4]=e[4]-r[4],t[5]=e[5]-r[5],t[6]=e[6]-r[6],t[7]=e[7]-r[7],t[8]=e[8]-r[8],t[9]=e[9]-r[9],t[10]=e[10]-r[10],t[11]=e[11]-r[11],t[12]=e[12]-r[12],t[13]=e[13]-r[13],t[14]=e[14]-r[14],t[15]=e[15]-r[15],t}Object.defineProperty(e,"__esModule",{value:!0}),e.sub=e.mul=void 0,e.create=function(){var t=new s.ARRAY_TYPE(16);return s.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},e.clone=function(t){var e=new s.ARRAY_TYPE(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},e.fromValues=function(t,e,r,n,i,o,a,u,l,c,h,f,d,p,v,_){var y=new s.ARRAY_TYPE(16);return y[0]=t,y[1]=e,y[2]=r,y[3]=n,y[4]=i,y[5]=o,y[6]=a,y[7]=u,y[8]=l,y[9]=c,y[10]=h,y[11]=f,y[12]=d,y[13]=p,y[14]=v,y[15]=_,y},e.set=function(t,e,r,n,i,o,a,s,u,l,c,h,f,d,p,v,_){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t[4]=o,t[5]=a,t[6]=s,t[7]=u,t[8]=l,t[9]=c,t[10]=h,t[11]=f,t[12]=d,t[13]=p,t[14]=v,t[15]=_,t},e.identity=n,e.transpose=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[3],o=e[6],a=e[7],s=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=r,t[6]=e[9],t[7]=e[13],t[8]=n,t[9]=o,t[11]=e[14],t[12]=i,t[13]=a,t[14]=s}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t},e.invert=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],l=e[7],c=e[8],h=e[9],f=e[10],d=e[11],p=e[12],v=e[13],_=e[14],y=e[15],b=r*s-n*a,m=r*u-i*a,g=r*l-o*a,M=n*u-i*s,O=n*l-o*s,w=i*l-o*u,x=c*v-h*p,E=c*_-f*p,k=c*y-d*p,S=h*_-f*v,P=h*y-d*v,C=f*y-d*_,A=b*C-m*P+g*S+M*k-O*E+w*x;return A?(A=1/A,t[0]=(s*C-u*P+l*S)*A,t[1]=(i*P-n*C-o*S)*A,t[2]=(v*w-_*O+y*M)*A,t[3]=(f*O-h*w-d*M)*A,t[4]=(u*k-a*C-l*E)*A,t[5]=(r*C-i*k+o*E)*A,t[6]=(_*g-p*w-y*m)*A,t[7]=(c*w-f*g+d*m)*A,t[8]=(a*P-s*k+l*x)*A,t[9]=(n*k-r*P-o*x)*A,t[10]=(p*O-v*g+y*b)*A,t[11]=(h*g-c*O-d*b)*A,t[12]=(s*E-a*S-u*x)*A,t[13]=(r*S-n*E+i*x)*A,t[14]=(v*m-p*M-_*b)*A,t[15]=(c*M-h*m+f*b)*A,t):null},e.adjoint=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],l=e[7],c=e[8],h=e[9],f=e[10],d=e[11],p=e[12],v=e[13],_=e[14],y=e[15];return t[0]=s*(f*y-d*_)-h*(u*y-l*_)+v*(u*d-l*f),t[1]=-(n*(f*y-d*_)-h*(i*y-o*_)+v*(i*d-o*f)),t[2]=n*(u*y-l*_)-s*(i*y-o*_)+v*(i*l-o*u),t[3]=-(n*(u*d-l*f)-s*(i*d-o*f)+h*(i*l-o*u)),t[4]=-(a*(f*y-d*_)-c*(u*y-l*_)+p*(u*d-l*f)),t[5]=r*(f*y-d*_)-c*(i*y-o*_)+p*(i*d-o*f),t[6]=-(r*(u*y-l*_)-a*(i*y-o*_)+p*(i*l-o*u)),t[7]=r*(u*d-l*f)-a*(i*d-o*f)+c*(i*l-o*u),t[8]=a*(h*y-d*v)-c*(s*y-l*v)+p*(s*d-l*h),t[9]=-(r*(h*y-d*v)-c*(n*y-o*v)+p*(n*d-o*h)),t[10]=r*(s*y-l*v)-a*(n*y-o*v)+p*(n*l-o*s),t[11]=-(r*(s*d-l*h)-a*(n*d-o*h)+c*(n*l-o*s)),t[12]=-(a*(h*_-f*v)-c*(s*_-u*v)+p*(s*f-u*h)),t[13]=r*(h*_-f*v)-c*(n*_-i*v)+p*(n*f-i*h),t[14]=-(r*(s*_-u*v)-a*(n*_-i*v)+p*(n*u-i*s)),t[15]=r*(s*f-u*h)-a*(n*f-i*h)+c*(n*u-i*s),t},e.determinant=function(t){var e=t[0],r=t[1],n=t[2],i=t[3],o=t[4],a=t[5],s=t[6],u=t[7],l=t[8],c=t[9],h=t[10],f=t[11],d=t[12],p=t[13],v=t[14],_=t[15];return(e*a-r*o)*(h*_-f*v)-(e*s-n*o)*(c*_-f*p)+(e*u-i*o)*(c*v-h*p)+(r*s-n*a)*(l*_-f*d)-(r*u-i*a)*(l*v-h*d)+(n*u-i*s)*(l*p-c*d)},e.multiply=i,e.translate=function(t,e,r){var n=r[0],i=r[1],o=r[2],a=void 0,s=void 0,u=void 0,l=void 0,c=void 0,h=void 0,f=void 0,d=void 0,p=void 0,v=void 0,_=void 0,y=void 0;return e===t?(t[12]=e[0]*n+e[4]*i+e[8]*o+e[12],t[13]=e[1]*n+e[5]*i+e[9]*o+e[13],t[14]=e[2]*n+e[6]*i+e[10]*o+e[14],t[15]=e[3]*n+e[7]*i+e[11]*o+e[15]):(a=e[0],s=e[1],u=e[2],l=e[3],c=e[4],h=e[5],f=e[6],d=e[7],p=e[8],v=e[9],_=e[10],y=e[11],t[0]=a,t[1]=s,t[2]=u,t[3]=l,t[4]=c,t[5]=h,t[6]=f,t[7]=d,t[8]=p,t[9]=v,t[10]=_,t[11]=y,t[12]=a*n+c*i+p*o+e[12],t[13]=s*n+h*i+v*o+e[13],t[14]=u*n+f*i+_*o+e[14],t[15]=l*n+d*i+y*o+e[15]),t},e.scale=function(t,e,r){var n=r[0],i=r[1],o=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*o,t[9]=e[9]*o,t[10]=e[10]*o,t[11]=e[11]*o,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},e.rotate=function(t,e,r,n){var i=n[0],o=n[1],a=n[2],u=Math.sqrt(i*i+o*o+a*a),l=void 0,c=void 0,h=void 0,f=void 0,d=void 0,p=void 0,v=void 0,_=void 0,y=void 0,b=void 0,m=void 0,g=void 0,M=void 0,O=void 0,w=void 0,x=void 0,E=void 0,k=void 0,S=void 0,P=void 0,C=void 0,A=void 0,I=void 0,j=void 0;return u0?(r[0]=2*(l*u+f*n+c*a-h*i)/d,r[1]=2*(c*u+f*i+h*n-l*a)/d,r[2]=2*(h*u+f*a+l*i-c*n)/d):(r[0]=2*(l*u+f*n+c*a-h*i),r[1]=2*(c*u+f*i+h*n-l*a),r[2]=2*(h*u+f*a+l*i-c*n)),o(t,e,r),t},e.getTranslation=function(t,e){return t[0]=e[12],t[1]=e[13],t[2]=e[14],t},e.getScaling=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[4],a=e[5],s=e[6],u=e[8],l=e[9],c=e[10];return t[0]=Math.sqrt(r*r+n*n+i*i),t[1]=Math.sqrt(o*o+a*a+s*s),t[2]=Math.sqrt(u*u+l*l+c*c),t},e.getRotation=function(t,e){var r=e[0]+e[5]+e[10],n=0;return r>0?(n=2*Math.sqrt(r+1),t[3]=.25*n,t[0]=(e[6]-e[9])/n,t[1]=(e[8]-e[2])/n,t[2]=(e[1]-e[4])/n):e[0]>e[5]&&e[0]>e[10]?(n=2*Math.sqrt(1+e[0]-e[5]-e[10]),t[3]=(e[6]-e[9])/n,t[0]=.25*n,t[1]=(e[1]+e[4])/n,t[2]=(e[8]+e[2])/n):e[5]>e[10]?(n=2*Math.sqrt(1+e[5]-e[0]-e[10]),t[3]=(e[8]-e[2])/n,t[0]=(e[1]+e[4])/n,t[1]=.25*n,t[2]=(e[6]+e[9])/n):(n=2*Math.sqrt(1+e[10]-e[0]-e[5]),t[3]=(e[1]-e[4])/n,t[0]=(e[8]+e[2])/n,t[1]=(e[6]+e[9])/n,t[2]=.25*n),t},e.fromRotationTranslationScale=function(t,e,r,n){var i=e[0],o=e[1],a=e[2],s=e[3],u=i+i,l=o+o,c=a+a,h=i*u,f=i*l,d=i*c,p=o*l,v=o*c,_=a*c,y=s*u,b=s*l,m=s*c,g=n[0],M=n[1],O=n[2];return t[0]=(1-(p+_))*g,t[1]=(f+m)*g,t[2]=(d-b)*g,t[3]=0,t[4]=(f-m)*M,t[5]=(1-(h+_))*M,t[6]=(v+y)*M,t[7]=0,t[8]=(d+b)*O,t[9]=(v-y)*O,t[10]=(1-(h+p))*O,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},e.fromRotationTranslationScaleOrigin=function(t,e,r,n,i){var o=e[0],a=e[1],s=e[2],u=e[3],l=o+o,c=a+a,h=s+s,f=o*l,d=o*c,p=o*h,v=a*c,_=a*h,y=s*h,b=u*l,m=u*c,g=u*h,M=n[0],O=n[1],w=n[2],x=i[0],E=i[1],k=i[2],S=(1-(v+y))*M,P=(d+g)*M,C=(p-m)*M,A=(d-g)*O,I=(1-(f+y))*O,j=(_+b)*O,D=(p+m)*w,T=(_-b)*w,F=(1-(f+v))*w;return t[0]=S,t[1]=P,t[2]=C,t[3]=0,t[4]=A,t[5]=I,t[6]=j,t[7]=0,t[8]=D,t[9]=T,t[10]=F,t[11]=0,t[12]=r[0]+x-(S*x+A*E+D*k),t[13]=r[1]+E-(P*x+I*E+T*k),t[14]=r[2]+k-(C*x+j*E+F*k),t[15]=1,t},e.fromQuat=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=r+r,s=n+n,u=i+i,l=r*a,c=n*a,h=n*s,f=i*a,d=i*s,p=i*u,v=o*a,_=o*s,y=o*u;return t[0]=1-h-p,t[1]=c+y,t[2]=f-_,t[3]=0,t[4]=c-y,t[5]=1-l-p,t[6]=d+v,t[7]=0,t[8]=f+_,t[9]=d-v,t[10]=1-l-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.frustum=function(t,e,r,n,i,o,a){var s=1/(r-e),u=1/(i-n),l=1/(o-a);return t[0]=2*o*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*o*u,t[6]=0,t[7]=0,t[8]=(r+e)*s,t[9]=(i+n)*u,t[10]=(a+o)*l,t[11]=-1,t[12]=0,t[13]=0,t[14]=a*o*2*l,t[15]=0,t},e.perspective=function(t,e,r,n,i){var o=1/Math.tan(e/2),a=void 0;return t[0]=o/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=o,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=i&&i!==1/0?(a=1/(n-i),t[10]=(i+n)*a,t[14]=2*i*n*a):(t[10]=-1,t[14]=-2*n),t},e.perspectiveFromFieldOfView=function(t,e,r,n){var i=Math.tan(e.upDegrees*Math.PI/180),o=Math.tan(e.downDegrees*Math.PI/180),a=Math.tan(e.leftDegrees*Math.PI/180),s=Math.tan(e.rightDegrees*Math.PI/180),u=2/(a+s),l=2/(i+o);return t[0]=u,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=l,t[6]=0,t[7]=0,t[8]=-(a-s)*u*.5,t[9]=(i-o)*l*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t},e.ortho=function(t,e,r,n,i,o,a){var s=1/(e-r),u=1/(n-i),l=1/(o-a);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*l,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*u,t[14]=(a+o)*l,t[15]=1,t},e.lookAt=function(t,e,r,i){var o=void 0,a=void 0,u=void 0,l=void 0,c=void 0,h=void 0,f=void 0,d=void 0,p=void 0,v=void 0,_=e[0],y=e[1],b=e[2],m=i[0],g=i[1],M=i[2],O=r[0],w=r[1],x=r[2];return Math.abs(_-O)0&&(d=1/Math.sqrt(d),c*=d,h*=d,f*=d);var p=u*f-l*h,v=l*c-s*f,_=s*h-u*c;return(d=p*p+v*v+_*_)>0&&(d=1/Math.sqrt(d),p*=d,v*=d,_*=d),t[0]=p,t[1]=v,t[2]=_,t[3]=0,t[4]=h*_-f*v,t[5]=f*p-c*_,t[6]=c*v-h*p,t[7]=0,t[8]=c,t[9]=h,t[10]=f,t[11]=0,t[12]=i,t[13]=o,t[14]=a,t[15]=1,t},e.str=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t[4]=e[4]+r[4],t[5]=e[5]+r[5],t[6]=e[6]+r[6],t[7]=e[7]+r[7],t[8]=e[8]+r[8],t[9]=e[9]+r[9],t[10]=e[10]+r[10],t[11]=e[11]+r[11],t[12]=e[12]+r[12],t[13]=e[13]+r[13],t[14]=e[14]+r[14],t[15]=e[15]+r[15],t},e.subtract=a,e.multiplyScalar=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t[4]=e[4]*r,t[5]=e[5]*r,t[6]=e[6]*r,t[7]=e[7]*r,t[8]=e[8]*r,t[9]=e[9]*r,t[10]=e[10]*r,t[11]=e[11]*r,t[12]=e[12]*r,t[13]=e[13]*r,t[14]=e[14]*r,t[15]=e[15]*r,t},e.multiplyScalarAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t[4]=e[4]+r[4]*n,t[5]=e[5]+r[5]*n,t[6]=e[6]+r[6]*n,t[7]=e[7]+r[7]*n,t[8]=e[8]+r[8]*n,t[9]=e[9]+r[9]*n,t[10]=e[10]+r[10]*n,t[11]=e[11]+r[11]*n,t[12]=e[12]+r[12]*n,t[13]=e[13]+r[13]*n,t[14]=e[14]+r[14]*n,t[15]=e[15]+r[15]*n,t},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]&&t[8]===e[8]&&t[9]===e[9]&&t[10]===e[10]&&t[11]===e[11]&&t[12]===e[12]&&t[13]===e[13]&&t[14]===e[14]&&t[15]===e[15]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],o=t[3],a=t[4],u=t[5],l=t[6],c=t[7],h=t[8],f=t[9],d=t[10],p=t[11],v=t[12],_=t[13],y=t[14],b=t[15],m=e[0],g=e[1],M=e[2],O=e[3],w=e[4],x=e[5],E=e[6],k=e[7],S=e[8],P=e[9],C=e[10],A=e[11],I=e[12],j=e[13],D=e[14],T=e[15];return Math.abs(r-m)<=s.EPSILON*Math.max(1,Math.abs(r),Math.abs(m))&&Math.abs(n-g)<=s.EPSILON*Math.max(1,Math.abs(n),Math.abs(g))&&Math.abs(i-M)<=s.EPSILON*Math.max(1,Math.abs(i),Math.abs(M))&&Math.abs(o-O)<=s.EPSILON*Math.max(1,Math.abs(o),Math.abs(O))&&Math.abs(a-w)<=s.EPSILON*Math.max(1,Math.abs(a),Math.abs(w))&&Math.abs(u-x)<=s.EPSILON*Math.max(1,Math.abs(u),Math.abs(x))&&Math.abs(l-E)<=s.EPSILON*Math.max(1,Math.abs(l),Math.abs(E))&&Math.abs(c-k)<=s.EPSILON*Math.max(1,Math.abs(c),Math.abs(k))&&Math.abs(h-S)<=s.EPSILON*Math.max(1,Math.abs(h),Math.abs(S))&&Math.abs(f-P)<=s.EPSILON*Math.max(1,Math.abs(f),Math.abs(P))&&Math.abs(d-C)<=s.EPSILON*Math.max(1,Math.abs(d),Math.abs(C))&&Math.abs(p-A)<=s.EPSILON*Math.max(1,Math.abs(p),Math.abs(A))&&Math.abs(v-I)<=s.EPSILON*Math.max(1,Math.abs(v),Math.abs(I))&&Math.abs(_-j)<=s.EPSILON*Math.max(1,Math.abs(_),Math.abs(j))&&Math.abs(y-D)<=s.EPSILON*Math.max(1,Math.abs(y),Math.abs(D))&&Math.abs(b-T)<=s.EPSILON*Math.max(1,Math.abs(b),Math.abs(T))};var s=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.mul=i,e.sub=a},function(t,e,r){"use strict";function n(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=e[6],c=e[7],h=e[8],f=r[0],d=r[1],p=r[2],v=r[3],_=r[4],y=r[5],b=r[6],m=r[7],g=r[8];return t[0]=f*n+d*a+p*l,t[1]=f*i+d*s+p*c,t[2]=f*o+d*u+p*h,t[3]=v*n+_*a+y*l,t[4]=v*i+_*s+y*c,t[5]=v*o+_*u+y*h,t[6]=b*n+m*a+g*l,t[7]=b*i+m*s+g*c,t[8]=b*o+m*u+g*h,t}function i(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t[4]=e[4]-r[4],t[5]=e[5]-r[5],t[6]=e[6]-r[6],t[7]=e[7]-r[7],t[8]=e[8]-r[8],t}Object.defineProperty(e,"__esModule",{value:!0}),e.sub=e.mul=void 0,e.create=function(){var t=new o.ARRAY_TYPE(9);return o.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t},e.fromMat4=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[4],t[4]=e[5],t[5]=e[6],t[6]=e[8],t[7]=e[9],t[8]=e[10],t},e.clone=function(t){ +var e=new o.ARRAY_TYPE(9);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t},e.fromValues=function(t,e,r,n,i,a,s,u,l){var c=new o.ARRAY_TYPE(9);return c[0]=t,c[1]=e,c[2]=r,c[3]=n,c[4]=i,c[5]=a,c[6]=s,c[7]=u,c[8]=l,c},e.set=function(t,e,r,n,i,o,a,s,u,l){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t[4]=o,t[5]=a,t[6]=s,t[7]=u,t[8]=l,t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.transpose=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[5];t[1]=e[3],t[2]=e[6],t[3]=r,t[5]=e[7],t[6]=n,t[7]=i}else t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8];return t},e.invert=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],l=e[7],c=e[8],h=c*a-s*l,f=-c*o+s*u,d=l*o-a*u,p=r*h+n*f+i*d;return p?(p=1/p,t[0]=h*p,t[1]=(-c*n+i*l)*p,t[2]=(s*n-i*a)*p,t[3]=f*p,t[4]=(c*r-i*u)*p,t[5]=(-s*r+i*o)*p,t[6]=d*p,t[7]=(-l*r+n*u)*p,t[8]=(a*r-n*o)*p,t):null},e.adjoint=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],l=e[7],c=e[8];return t[0]=a*c-s*l,t[1]=i*l-n*c,t[2]=n*s-i*a,t[3]=s*u-o*c,t[4]=r*c-i*u,t[5]=i*o-r*s,t[6]=o*l-a*u,t[7]=n*u-r*l,t[8]=r*a-n*o,t},e.determinant=function(t){var e=t[0],r=t[1],n=t[2],i=t[3],o=t[4],a=t[5],s=t[6],u=t[7],l=t[8];return e*(l*o-a*u)+r*(-l*i+a*s)+n*(u*i-o*s)},e.multiply=n,e.translate=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=e[6],c=e[7],h=e[8],f=r[0],d=r[1];return t[0]=n,t[1]=i,t[2]=o,t[3]=a,t[4]=s,t[5]=u,t[6]=f*n+d*a+l,t[7]=f*i+d*s+c,t[8]=f*o+d*u+h,t},e.rotate=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=e[6],c=e[7],h=e[8],f=Math.sin(r),d=Math.cos(r);return t[0]=d*n+f*a,t[1]=d*i+f*s,t[2]=d*o+f*u,t[3]=d*a-f*n,t[4]=d*s-f*i,t[5]=d*u-f*o,t[6]=l,t[7]=c,t[8]=h,t},e.scale=function(t,e,r){var n=r[0],i=r[1];return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=i*e[3],t[4]=i*e[4],t[5]=i*e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t},e.fromTranslation=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=e[0],t[7]=e[1],t[8]=1,t},e.fromRotation=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=0,t[3]=-r,t[4]=n,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromScaling=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=e[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat2d=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=0,t[3]=e[2],t[4]=e[3],t[5]=0,t[6]=e[4],t[7]=e[5],t[8]=1,t},e.fromQuat=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=r+r,s=n+n,u=i+i,l=r*a,c=n*a,h=n*s,f=i*a,d=i*s,p=i*u,v=o*a,_=o*s,y=o*u;return t[0]=1-h-p,t[3]=c-y,t[6]=f+_,t[1]=c+y,t[4]=1-l-p,t[7]=d-v,t[2]=f-_,t[5]=d+v,t[8]=1-l-h,t},e.normalFromMat4=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=e[6],l=e[7],c=e[8],h=e[9],f=e[10],d=e[11],p=e[12],v=e[13],_=e[14],y=e[15],b=r*s-n*a,m=r*u-i*a,g=r*l-o*a,M=n*u-i*s,O=n*l-o*s,w=i*l-o*u,x=c*v-h*p,E=c*_-f*p,k=c*y-d*p,S=h*_-f*v,P=h*y-d*v,C=f*y-d*_,A=b*C-m*P+g*S+M*k-O*E+w*x;return A?(A=1/A,t[0]=(s*C-u*P+l*S)*A,t[1]=(u*k-a*C-l*E)*A,t[2]=(a*P-s*k+l*x)*A,t[3]=(i*P-n*C-o*S)*A,t[4]=(r*C-i*k+o*E)*A,t[5]=(n*k-r*P-o*x)*A,t[6]=(v*w-_*O+y*M)*A,t[7]=(_*g-p*w-y*m)*A,t[8]=(p*O-v*g+y*b)*A,t):null},e.projection=function(t,e,r){return t[0]=2/e,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/r,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},e.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t[4]=e[4]+r[4],t[5]=e[5]+r[5],t[6]=e[6]+r[6],t[7]=e[7]+r[7],t[8]=e[8]+r[8],t},e.subtract=i,e.multiplyScalar=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t[4]=e[4]*r,t[5]=e[5]*r,t[6]=e[6]*r,t[7]=e[7]*r,t[8]=e[8]*r,t},e.multiplyScalarAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t[4]=e[4]+r[4]*n,t[5]=e[5]+r[5]*n,t[6]=e[6]+r[6]*n,t[7]=e[7]+r[7]*n,t[8]=e[8]+r[8]*n,t},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]&&t[8]===e[8]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],a=t[3],s=t[4],u=t[5],l=t[6],c=t[7],h=t[8],f=e[0],d=e[1],p=e[2],v=e[3],_=e[4],y=e[5],b=e[6],m=e[7],g=e[8];return Math.abs(r-f)<=o.EPSILON*Math.max(1,Math.abs(r),Math.abs(f))&&Math.abs(n-d)<=o.EPSILON*Math.max(1,Math.abs(n),Math.abs(d))&&Math.abs(i-p)<=o.EPSILON*Math.max(1,Math.abs(i),Math.abs(p))&&Math.abs(a-v)<=o.EPSILON*Math.max(1,Math.abs(a),Math.abs(v))&&Math.abs(s-_)<=o.EPSILON*Math.max(1,Math.abs(s),Math.abs(_))&&Math.abs(u-y)<=o.EPSILON*Math.max(1,Math.abs(u),Math.abs(y))&&Math.abs(l-b)<=o.EPSILON*Math.max(1,Math.abs(l),Math.abs(b))&&Math.abs(c-m)<=o.EPSILON*Math.max(1,Math.abs(c),Math.abs(m))&&Math.abs(h-g)<=o.EPSILON*Math.max(1,Math.abs(h),Math.abs(g))};var o=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.mul=n,e.sub=i},function(t,e,r){"use strict";function n(){var t=new h.ARRAY_TYPE(2);return h.ARRAY_TYPE!=Float32Array&&(t[0]=0,t[1]=0),t}function i(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t}function o(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t}function a(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t}function s(t,e){var r=e[0]-t[0],n=e[1]-t[1];return Math.sqrt(r*r+n*n)}function u(t,e){var r=e[0]-t[0],n=e[1]-t[1];return r*r+n*n}function l(t){var e=t[0],r=t[1];return Math.sqrt(e*e+r*r)}function c(t){var e=t[0],r=t[1];return e*e+r*r}Object.defineProperty(e,"__esModule",{value:!0}),e.forEach=e.sqrLen=e.sqrDist=e.dist=e.div=e.mul=e.sub=e.len=void 0,e.create=n,e.clone=function(t){var e=new h.ARRAY_TYPE(2);return e[0]=t[0],e[1]=t[1],e},e.fromValues=function(t,e){var r=new h.ARRAY_TYPE(2);return r[0]=t,r[1]=e,r},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},e.set=function(t,e,r){return t[0]=e,t[1]=r,t},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t},e.subtract=i,e.multiply=o,e.divide=a,e.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t},e.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t},e.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t},e.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t},e.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t},e.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t},e.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t},e.distance=s,e.squaredDistance=u,e.length=l,e.squaredLength=c,e.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t},e.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t},e.normalize=function(t,e){var r=e[0],n=e[1],i=r*r+n*n;return i>0&&(i=1/Math.sqrt(i),t[0]=e[0]*i,t[1]=e[1]*i),t},e.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]},e.cross=function(t,e,r){var n=e[0]*r[1]-e[1]*r[0];return t[0]=t[1]=0,t[2]=n,t},e.lerp=function(t,e,r,n){var i=e[0],o=e[1];return t[0]=i+n*(r[0]-i),t[1]=o+n*(r[1]-o),t},e.random=function(t,e){e=e||1;var r=2*h.RANDOM()*Math.PI;return t[0]=Math.cos(r)*e,t[1]=Math.sin(r)*e,t},e.transformMat2=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i,t[1]=r[1]*n+r[3]*i,t},e.transformMat2d=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i+r[4],t[1]=r[1]*n+r[3]*i+r[5],t},e.transformMat3=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[3]*i+r[6],t[1]=r[1]*n+r[4]*i+r[7],t},e.transformMat4=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[4]*i+r[12],t[1]=r[1]*n+r[5]*i+r[13],t},e.rotate=function(t,e,r,n){var i=e[0]-r[0],o=e[1]-r[1],a=Math.sin(n),s=Math.cos(n);return t[0]=i*s-o*a+r[0],t[1]=i*a+o*s+r[1],t},e.angle=function(t,e){var r=t[0],n=t[1],i=e[0],o=e[1],a=r*r+n*n;a>0&&(a=1/Math.sqrt(a));var s=i*i+o*o;s>0&&(s=1/Math.sqrt(s));var u=(r*i+n*o)*a*s;return u>1?0:u<-1?Math.PI:Math.acos(u)},e.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]},e.equals=function(t,e){var r=t[0],n=t[1],i=e[0],o=e[1];return Math.abs(r-i)<=h.EPSILON*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(n-o)<=h.EPSILON*Math.max(1,Math.abs(n),Math.abs(o))};var h=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.len=l,e.sub=i,e.mul=o,e.div=a,e.dist=s,e.sqrDist=u,e.sqrLen=c,e.forEach=function(){var t=n();return function(e,r,n,i,o,a){var s=void 0,u=void 0;for(r||(r=2),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s0){r=Math.sqrt(r);var n=e[0]/r,i=e[1]/r,o=e[2]/r,a=e[3]/r,s=e[4],u=e[5],l=e[6],c=e[7],h=n*s+i*u+o*l+a*c;t[0]=n,t[1]=i,t[2]=o,t[3]=a,t[4]=(s-n*h)/r,t[5]=(u-i*h)/r,t[6]=(l-o*h)/r,t[7]=(c-a*h)/r}return t},e.str=function(t){return"quat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],o=t[3],a=t[4],u=t[5],l=t[6],c=t[7],h=e[0],f=e[1],d=e[2],p=e[3],v=e[4],_=e[5],y=e[6],b=e[7];return Math.abs(r-h)<=s.EPSILON*Math.max(1,Math.abs(r),Math.abs(h))&&Math.abs(n-f)<=s.EPSILON*Math.max(1,Math.abs(n),Math.abs(f))&&Math.abs(i-d)<=s.EPSILON*Math.max(1,Math.abs(i),Math.abs(d))&&Math.abs(o-p)<=s.EPSILON*Math.max(1,Math.abs(o),Math.abs(p))&&Math.abs(a-v)<=s.EPSILON*Math.max(1,Math.abs(a),Math.abs(v))&&Math.abs(u-_)<=s.EPSILON*Math.max(1,Math.abs(u),Math.abs(_))&&Math.abs(l-y)<=s.EPSILON*Math.max(1,Math.abs(l),Math.abs(y))&&Math.abs(c-b)<=s.EPSILON*Math.max(1,Math.abs(c),Math.abs(b))};var s=n(r(0)),u=n(r(3)),l=n(r(4));e.getReal=u.copy,e.setReal=u.copy,e.mul=a;var c=e.dot=u.dot,h=e.length=u.length,f=(e.len=h,e.squaredLength=u.squaredLength);e.sqrLen=f},function(t,e,r){"use strict";function n(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=r[0],c=r[1],h=r[2],f=r[3],d=r[4],p=r[5];return t[0]=n*l+o*c,t[1]=i*l+a*c,t[2]=n*h+o*f,t[3]=i*h+a*f,t[4]=n*d+o*p+s,t[5]=i*d+a*p+u,t}function i(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t[4]=e[4]-r[4],t[5]=e[5]-r[5],t}Object.defineProperty(e,"__esModule",{value:!0}),e.sub=e.mul=void 0,e.create=function(){var t=new o.ARRAY_TYPE(6);return o.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0,t[4]=0,t[5]=0),t[0]=1,t[3]=1,t},e.clone=function(t){var e=new o.ARRAY_TYPE(6);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},e.fromValues=function(t,e,r,n,i,a){var s=new o.ARRAY_TYPE(6);return s[0]=t,s[1]=e,s[2]=r,s[3]=n,s[4]=i,s[5]=a,s},e.set=function(t,e,r,n,i,o,a){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t[4]=o,t[5]=a,t},e.invert=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=e[4],s=e[5],u=r*o-n*i;return u?(u=1/u,t[0]=o*u,t[1]=-n*u,t[2]=-i*u,t[3]=r*u,t[4]=(i*s-o*a)*u,t[5]=(n*a-r*s)*u,t):null},e.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},e.multiply=n,e.rotate=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=Math.sin(r),c=Math.cos(r);return t[0]=n*c+o*l,t[1]=i*c+a*l,t[2]=n*-l+o*c,t[3]=i*-l+a*c,t[4]=s,t[5]=u,t},e.scale=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=r[0],c=r[1];return t[0]=n*l,t[1]=i*l,t[2]=o*c,t[3]=a*c,t[4]=s,t[5]=u,t},e.translate=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=e[4],u=e[5],l=r[0],c=r[1];return t[0]=n,t[1]=i,t[2]=o,t[3]=a,t[4]=n*l+o*c+s,t[5]=i*l+a*c+u,t},e.fromRotation=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=-r,t[3]=n,t[4]=0,t[5]=0,t},e.fromScaling=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=e[1],t[4]=0,t[5]=0,t},e.fromTranslation=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=e[0],t[5]=e[1],t},e.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t[4]=e[4]+r[4],t[5]=e[5]+r[5],t},e.subtract=i,e.multiplyScalar=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t[4]=e[4]*r,t[5]=e[5]*r,t},e.multiplyScalarAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t[4]=e[4]+r[4]*n,t[5]=e[5]+r[5]*n,t},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],a=t[3],s=t[4],u=t[5],l=e[0],c=e[1],h=e[2],f=e[3],d=e[4],p=e[5];return Math.abs(r-l)<=o.EPSILON*Math.max(1,Math.abs(r),Math.abs(l))&&Math.abs(n-c)<=o.EPSILON*Math.max(1,Math.abs(n),Math.abs(c))&&Math.abs(i-h)<=o.EPSILON*Math.max(1,Math.abs(i),Math.abs(h))&&Math.abs(a-f)<=o.EPSILON*Math.max(1,Math.abs(a),Math.abs(f))&&Math.abs(s-d)<=o.EPSILON*Math.max(1,Math.abs(s),Math.abs(d))&&Math.abs(u-p)<=o.EPSILON*Math.max(1,Math.abs(u),Math.abs(p))};var o=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.mul=n,e.sub=i},function(t,e,r){"use strict";function n(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=r[0],u=r[1],l=r[2],c=r[3];return t[0]=n*s+o*u,t[1]=i*s+a*u,t[2]=n*l+o*c,t[3]=i*l+a*c,t}function i(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t}Object.defineProperty(e,"__esModule",{value:!0}),e.sub=e.mul=void 0,e.create=function(){var t=new o.ARRAY_TYPE(4);return o.ARRAY_TYPE!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},e.clone=function(t){var e=new o.ARRAY_TYPE(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},e.fromValues=function(t,e,r,n){var i=new o.ARRAY_TYPE(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=n,i},e.set=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t},e.transpose=function(t,e){if(t===e){var r=e[1];t[1]=e[2],t[2]=r}else t[0]=e[0],t[1]=e[2],t[2]=e[1],t[3]=e[3];return t},e.invert=function(t,e){var r=e[0],n=e[1],i=e[2],o=e[3],a=r*o-i*n;return a?(a=1/a,t[0]=o*a,t[1]=-n*a,t[2]=-i*a,t[3]=r*a,t):null},e.adjoint=function(t,e){var r=e[0];return t[0]=e[3],t[1]=-e[1],t[2]=-e[2],t[3]=r,t},e.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},e.multiply=n,e.rotate=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+o*s,t[1]=i*u+a*s,t[2]=n*-s+o*u,t[3]=i*-s+a*u,t},e.scale=function(t,e,r){var n=e[0],i=e[1],o=e[2],a=e[3],s=r[0],u=r[1];return t[0]=n*s,t[1]=i*s,t[2]=o*u,t[3]=a*u,t},e.fromRotation=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=-r,t[3]=n,t},e.fromScaling=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=e[1],t},e.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},e.LDU=function(t,e,r,n){return t[2]=n[2]/n[0],r[0]=n[0],r[1]=n[1],r[3]=n[3]-t[2]*r[1],[t,e,r]},e.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t},e.subtract=i,e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},e.equals=function(t,e){var r=t[0],n=t[1],i=t[2],a=t[3],s=e[0],u=e[1],l=e[2],c=e[3];return Math.abs(r-s)<=o.EPSILON*Math.max(1,Math.abs(r),Math.abs(s))&&Math.abs(n-u)<=o.EPSILON*Math.max(1,Math.abs(n),Math.abs(u))&&Math.abs(i-l)<=o.EPSILON*Math.max(1,Math.abs(i),Math.abs(l))&&Math.abs(a-c)<=o.EPSILON*Math.max(1,Math.abs(a),Math.abs(c))},e.multiplyScalar=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t},e.multiplyScalarAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t};var o=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(r(0));e.mul=n,e.sub=i},function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}Object.defineProperty(e,"__esModule",{value:!0}),e.vec4=e.vec3=e.vec2=e.quat2=e.quat=e.mat4=e.mat3=e.mat2d=e.mat2=e.glMatrix=void 0;var i=n(r(0)),o=n(r(9)),a=n(r(8)),s=n(r(5)),u=n(r(4)),l=n(r(3)),c=n(r(7)),h=n(r(6)),f=n(r(2)),d=n(r(1));e.glMatrix=i,e.mat2=o,e.mat2d=a,e.mat3=s,e.mat4=u,e.quat=l,e.quat2=c,e.vec2=h,e.vec3=f,e.vec4=d}])})},function(t,e,r){"use strict";function n(t,e,r,n,i){return t[I]="number"==typeof e?e:1/0,t[j]="number"==typeof r?r:1/0,t[D]="number"==typeof n?n:-(1/0),t[T]="number"==typeof i?i:-(1/0),t}function i(t,e,r,i){var o=new A.glMatrix.ARRAY_TYPE(F.BOX_SIDES);return n(o,t,e,r,i)}function o(t){var e=new A.glMatrix.ARRAY_TYPE(F.BOX_SIDES);return e[I]=t[I],e[j]=t[j],e[D]=t[D],e[T]=t[T],e}function a(t,e){return t[I]=e[I],t[j]=e[j],t[D]=e[D],t[T]=e[T],t}function s(t){return t[I]=1/0,t[j]=1/0,t[D]=-(1/0),t[T]=-(1/0),t}function u(t){return t[I]=-(1/0),t[j]=-(1/0),t[D]=1/0,t[T]=1/0,t}function l(t,e){return e[0]<0?(t[I]=-e[0],t[D]=0):(t[I]=0,t[D]=e[0]),e[1]<0?(t[j]=-e[1],t[T]=0):(t[j]=0,t[T]=e[1]),t}function c(t,e,r){for(var n=0;n<2;n+=1)r[n]<0?(t[n]=e[n]-r[n],t[n+2]=e[n]):(t[n]=e[n],t[n+2]=e[n]+r[n]);return t}function h(t,e,r){for(var n=0;n<2;n+=1)r[n]<0?(t[n]=e[n]+r[n],t[n+2]=e[n]-r[n]):(t[n]=e[n]-r[n],t[n+2]=e[n]+r[n]);return t}function f(t){return t[I]>t[D]||t[j]>t[T]}function d(t){return!(isFinite(t[I])&&isFinite(t[j])&&isFinite(t[D])&&isFinite(t[T]))}function p(t,e){var r=t[0],n=t[1],i=t[2],o=t[3],a=e[0],s=e[1],u=e[2],l=e[3];return Math.abs(r-a)<=A.glMatrix.EPSILON&&Math.abs(n-s)<=A.glMatrix.EPSILON&&Math.abs(i-u)<=A.glMatrix.EPSILON&&Math.abs(o-l)<=A.glMatrix.EPSILON}function v(t,e){return A.vec2.set(t,e[D]-e[I],e[T]-e[j])}function _(t,e){return v(t,e),A.vec2.scale(t,t,.5)}function y(t,e){return _(t,e),t[I]+=e[I],t[j]+=e[j],t}function b(t,e,r){t[I]=e[I]-r[0],t[D]=e[D]+r[0],t[j]=e[j]-r[1],t[T]=e[T]+r[1]}function m(t){return(t[D]-t[I])*(t[T]-t[j])}function g(t,e,r){return i(Math.min(e[I],r[I]),Math.min(e[j],r[j]),Math.max(e[D],r[D]),Math.max(e[T],r[T]))}function M(t,e,r){var n=t;t===e&&(n=i());for(var o=I,u=D;o<=j&&!(e[u]r[u]);o+=1,u+=1)n[o]=Math.max(e[o],r[o]),n[u]=Math.min(e[u],r[u]);return o!==j+1&&s(n),t===e&&a(t,n),t}function O(t,e){return!(t[D]<=e[I]||t[I]>=e[D]||t[T]<=e[j]||t[j]>=e[T])}function w(t,e){return!(e[I]t[D]||e[j]t[T])}function x(t,e){return e[I]>=t[I]&&e[I]<=t[D]&&e[j]>=t[j]&&e[j]<=t[T]}function E(t,e,r){return t!==e&&a(t,e),f(e)?(t[I]=r[I],t[D]=r[I],t[j]=r[j],t[T]=r[j]):(r[I]t[D]&&(t[D]=r[I]),r[j]t[T]&&(t[T]=r[j])),t}function k(t,e,r){t[I]=e[I]+r[0],t[j]=e[j]+r[1],t[D]=e[D]+r[0],t[T]=e[T]+r[1]}function S(t,e,r,n){var o=t;t===e&&(o=i()),s(o);var u=A.vec2.set(A.vec2.create(),e[I],e[j]),l=A.vec2.create();return n(l,u,r),E(o,o,l),u[I]=e[D],n(l,u,r),E(o,o,l),u[j]=e[T],n(l,u,r),E(o,o,l),u[I]=e[I],n(l,u,r),E(o,o,l),t===e&&a(t,o),t}function P(t,e,r){return S(t,e,r,A.vec2.transformMat2)}function C(t,e,r){return S(t,e,r,A.vec2.transformMat2d)}Object.defineProperty(e,"__esModule",{value:!0}),e.MAXY=e.MAXX=e.MINY=e.MINX=void 0,e.set=n,e.create=i,e.clone=o,e.copy=a,e.initEmpty=s,e.initInfinity=u,e.initSizeFromOrigin=l,e.initSizeFromLocation=c,e.initCenterExtents=h,e.isEmpty=f,e.isInfinite=d,e.equals=p,e.getSize=v,e.getExtents=_,e.getCenter=y,e.expand=b,e.area=m,e.hull=g,e.intersection=M,e.overlaps=O,e.contains=w,e.containsPt=x,e.encapsulatePt=E,e.translate=k,e.transformMat2=P,e.transformMat2d=C;var A=r(1),I=e.MINX=0,j=e.MINY=1,D=e.MAXX=2,T=e.MAXY=3,F={BOX_SIDES:4}},function(t,e,r){"use strict";function n(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return t[m]=e,t[g]=r,t}function i(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=new b.glMatrix.ARRAY_TYPE(2);return n(r,t,e)}function o(t){var e=new b.glMatrix.ARRAY_TYPE(2);return e[m]=t[m],e[g]=t[g],e}function a(t,e){return t[m]=e[m],t[g]=e[g],t}function s(t,e){return i(t,e)}function u(t,e,r){return b.vec2.add(t,e,r)}function l(t,e,r){return b.vec2.sub(t,e,r)}function c(t,e,r){return b.vec2.transformMat2(t,e,r)}function h(t,e,r){return b.vec2.transformMat2d(t,e,r)}function f(t){return"point2d("+t[0]+" , "+t[1]+")"}function d(t,e){return b.vec2.distance(t,e)}function p(t,e){return b.vec2.squaredDistance(t,e)}function v(t,e,r,n){return b.vec2.lerp(t,e,r,n)}function _(t,e){return b.vec2.equals(t,e)}function y(t,e){return b.vec2.exactEquals(t,e)}Object.defineProperty(e,"__esModule",{value:!0}),e.sqrDist=e.dist=void 0,e.set=n,e.create=i,e.clone=o,e.copy=a,e.initFromValues=s,e.addVec2=u,e.sub=l,e.transformMat2=c,e.transformMat2d=h,e.str=f,e.distance=d,e.squaredDistance=p,e.lerp=v,e.equals=_,e.exactEquals=y;var b=r(1),m=0,g=1;e.dist=d,e.sqrDist=p},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(1);n.mat2d.svd=function(t,e,r,n){if(t&&(t[0]=n[4],t[1]=n[5]),e||r){var i=(n[0]+n[3])/2,o=(n[0]-n[3])/2,a=(n[1]+n[2])/2,s=(n[1]-n[2])/2;if(e){var u=Math.sqrt(i*i+s*s),l=Math.sqrt(o*o+a*a);e[0]=u+l,e[1]=u-l}if(r){var c=Math.atan2(a,o),h=Math.atan2(s,i);r[0]=(h-c)/2,r[1]=(h+c)/2}}},e.default=n.mat2d},function(t,e){"use strict";function r(t,e,r){return tr?r:t}function n(t){return t<0?0:t>1?1:t}function i(t,e,r){return t*(1-r)+e*r}Object.defineProperty(e,"__esModule",{value:!0});var o=1e-5,a=.25,s=.5,u=2;Math.QUATER_PI=a*Math.PI,Math.HALF_PI=s*Math.PI,Math.HALF_NPI=-s*Math.PI,Math.TWO_PI=u*Math.PI,Math.NPI=-Math.PI,Math.NQUATER_PI=a*Math.NPI,Math.NHALF_PI=s*Math.NPI,Math.NTWO_PI=u*Math.NPI,Math.INV_PI=1/Math.PI,Math.RAD_TO_DEG=180/Math.PI,Math.DEG_TO_RAD=Math.PI/180,Math.EPS=o,Math.clamp=r,Math.clamp01=n,Math.lerp=i,e.default=Math},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function t(t,e){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null;this.transformCtx(t,this._fullXform,e),t.beginPath();var o=this._draw(t);(o||"undefined"==typeof o)&&(this.isFillVisible()&&(null===n||Boolean(n))&&(r.setFillStyle(t,this),t.fill()),this.isStrokeVisible()&&(null===i||Boolean(i))&&(r.setStrokeStyle(t,this), +t.setTransform(1,0,0,1,0,0),t.stroke()))}},{key:"setStyle",value:function(t){return g.default.copyBasicStyle(t,this),this}},{key:"toJSON",value:function(){var t=this;return this._stateStack&&this._stateStack.length&&(t=this._stateStack[0]),Object.assign({visible:this.visible,zIndex:t.zIndex},g.default.toJSON(t),_.default.toJSON(this))}},{key:"visible",get:function(){return this._visible&&(this.isFillVisible()||this.isStrokeVisible())}}],[{key:"shapeCompare",value:function(t,e){var r=t.zIndex,n=e.zIndex;if(rn)return 1;var i=f.default.compareFillStyle(t,e);return i||(i=p.default.compareStrokeStyle(t,e)),i}}]),e}((0,b.default)(x,(0,v.createEventedTransform2dMixin)("changed:xform"),(0,h.createEventedFillStyleMixin)("changed:style"),(0,d.createEventedStrokeStyleMixin)("changed:style")));e.default=E},function(t,e){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var o=function(t){for(var e=arguments.length,o=Array(e>1?e-1:0),a=1;at[2]&&(t[2]=e[0],n[2]=r),e[1]t[3]&&(t[3]=e[1],n[3]=r))}function l(t,e,r){var n=e[0]*r[1]-r[0]*e[1];return t[0]+=(e[0]+r[0])*n,t[1]+=(e[1]+r[1])*n,n}function c(t){return Array.isArray(t)||ArrayBuffer&&ArrayBuffer.isView(t)}Object.defineProperty(e,"__esModule",{value:!0});var h=function(){function t(t,e){for(var r=0;r=this._verts.length)throw new Error("Cannot translate vertex at index "+t+". There are only "+this._verts.length+" vertices in the polygon.");if(e[0]||e[1]){var r=_.clone(this._verts[t]),n=_.clone(this._verts[t]);_.addVec2(n,n,e),this._collapseVerts(),this._resetAABox=!0,this._geomDirty=!0,_.copy(n),this.fire("changed:geom",{attr:"verts["+t+"]",prevVal:r,currVal:n})}return this}},{key:"setVertPosition",value:function(t,e){if(t>=this._verts.length)throw new Error("Cannot translate vertex at index "+t+". There are only "+this._verts.length+" vertices in the polygon.");if(!_.equals(e,this._verts[t])){var r=_.clone(this._verts[t]);this._collapseVerts(),_.copy(this._verts[t],e),this._resetAABox=!0,this._geomDirty=!0,this.fire("changed:geom",{attr:"verts["+t+"]",prevVal:r,currVal:e})}}},{key:"insertVert",value:function(t,e){var r=M.default.min(M.default.max(t,0),this._verts.length);return this._collapseVerts(),t>=this._verts.length?(this._verts.push(_.clone(e)),r=this._verts.length-1):this._verts.splice(t,0,_.clone(e)),this._resetAABox=!0,this._geomDirty=!0,this.fire("changed:geom:addvert",{attr:"verts["+r+"]",currVal:e}),r}},{key:"appendVert",value:function(t){return this.insertVert(this._verts.length,t)}},{key:"removeVert",value:function(t){if(t>=this._verts.length||t<0)throw new Error("Cannot remove vertex "+t+". Invalid index. There are only "+this._verts.length+" vertices in the shape.");var e=this._verts[t];return this._verts.splice(t,1),this._collapseVerts(),this._resetAABox=!0,this._geomDirty=!0,this.fire("changed:geom:removevert",{attr:"verts["+t+"]",currVal:e}),t}},{key:"_rebuildAABox",value:function(){var t=this;p.initEmpty(this._aabox),this._verts.length<3?this._convexHull=this._verts.map(function(t,e){return e}):this._convexHull=(0,O.simpleHull_2D)(this._verts),this._convexHull.forEach(function(e){u(t._aabox,t._verts[e],e,t._extentIndices)});var e=_.create(0,0);p.getCenter(e,this._aabox),this.pivot=e}},{key:"_updateAABox",value:function(){var t=this;if(this._resetAABox&&(this._rebuildAABox(),this._resetAABox=!1),this._boundsOutOfDate||this._geomDirty){p.initEmpty(this._aabox);var e=[0,0],r=this.globalXform;if(this._convexHull.forEach(function(n){p.encapsulatePt(t._aabox,t._aabox,_.transformMat2d(e,t._verts[n],r))}),this._boundsOutOfDate=!1,this._geomDirty){var n=_.create();n[0]=this._verts[this._extentIndices[0]][0]+.5*(this._verts[this._extentIndices[2]][0]-this._verts[this._extentIndices[0]][0]),n[1]=this._verts[this._extentIndices[1]][1]+.5*(this._verts[this._extentIndices[3]][1]-this._verts[this._extentIndices[1]][1]),this.pivot=n,this._geomDirty=!1}}}},{key:"_draw",value:function(t){var e=!1;if(this._verts.length>=2){t.moveTo(this._verts[0][0],this._verts[0][1]);for(var r=1;r=e.length)return 0;var a=0,s=null;return s=t.get(e[r]),s&&(a=n(s[0],e,r+1,i),s[1].forEach(function(t){return t.call(o,i)}),a+=s[1].length),a}function i(t,e){var r=-1,n=t[0],o=t[1];o.length&&e.forEach(function(t){(r=o.indexOf(t))>=0&&o.splice(r,1)}),n.forEach(function(t){i(t,e)})}function o(t){var e=t;if("string"==typeof t)e=[t];else if(!Array.isArray(t))throw new Error("Input must be an array of strings");return e}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:null;this._margins=e&&e.margins?Object.assign({},e.margins):{},C.forEach(function(t){"number"!=typeof r._margins[t]&&(r._margins[t]=0)});var i=l(t),o=i.canvasContainer,a=i.canvas,s=i.canvasContext,u=i.ratio;this._container=o,this._drawCanvas=a,this._drawCtx=s,this._pixelRatio=u,this._parent=t,(0,M.bindAll)(["_resize"],this),this._resize(e),this._resizeSensor=new S.default(t,this._resize),(n||null===n&&e&&e.enableEvents)&&this._enableEvents()}},{key:"_destroyCanvas",value:function(){this._drawCanvas&&this._disableEvents(),this._parent&&(this._parent.removeChild(this._drawCanvas),this._resizeSensor&&this._resizeSensor.detach(this._parent,this._resize)),this._drawCanvas=null,this._drawCtx=null,this._parent=null}},{key:"_init",value:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this.registerEvents([A.SHAPE_ADD,A.SHAPE_DELETE]),(0,M.bindAll)(["_reorderCb","_rerenderCb"],this),(0,M.bindAll)(["_mousedownCB","_mouseupCB","_mousemoveCB","_clickCB","_dblclickCB","_mouseoverCB","_mouseoutCB","_touchstartCB","_touchendCB","_touchmoveCB"],this),this._renderFrameCb=this.renderAll.bind(this),this._renderRequestId=0,this._ids={shapeId:1},this._objects=new Map,this._sortedObjs=[],this._reorderedObjIdxs=new Set,this._initCanvas(t,e,r),this._styleState=new I({fillColor:"red"})}},{key:"getContainer",value:function(){return this._parent}},{key:"getCanvasContainer",value:function(){return this._container}},{key:"getCanvas",value:function(){return this._drawCanvas}},{key:"project",value:function(t,e){var r=this._camera.screenToWorldMatrix;return _.transformMat2d(t,e,r)}},{key:"unproject",value:function(t,e){var r=this._camera.worldToScreenMatrix;return _.transformMat2d(t,e,r)}},{key:"hasShape",value:function(t){return this._objects.has(t)}},{key:"addShape",value:function(t){var e=t;Array.isArray(e)||(e=[t]),c(e,this._objects,this._ids,this._reorderCb,this._rerenderCb),this.fire("shape:add",{shape:e});var r={target:e};return this._reorderCb(r),this}},{key:"deleteShape",value:function(t){var e=t;Array.isArray(e)||(e=[t]);for(var r=h(e,this._objects,this._reorderCb,this._rerenderCb),n=-1,i=0;i=0&&this._sortedObjs.splice(n,1),this._reorderedObjIdxs.add(r[i]);return this._rerenderCb(),this.fire("shape:delete",{shape:e}),this}},{key:"deleteAllShapes",value:function(){return this.deleteShape(this.sortedShapes.slice()),this}},{key:"moveShapeToTop",value:function(t){if(this._objects.has(t)){var e=this.sortedShapes,r=e[e.length-1].zIndex;t.zIndex=r+1}}},{key:"moveShapeToBack",value:function(t){if(this._objects.has(t)){var e=this.sortedShapes,r=e[0].zIndex;t.zIndex=r}}},{key:"getShapesAsJSON",value:function(){var t=this.sortedShapes;return t.map(function(t){return t.toJSON()})}},{key:"_rerenderCb",value:function(){this._renderRequestId&&window.cancelAnimationFrame(this._renderRequestId),this._renderRequestId=window.requestAnimationFrame(this._renderFrameCb)}},{key:"_reorderCb",value:function(t){var e=this,r=t.target;Array.isArray(r)||(r=[t.target]),r.forEach(function(t){console.assert(t,"A changed event doesn't have an object");var r=e._objects.get(t);console.assert(r,"A changed event target isn't in the list of shapes "+t),r.shapeIdx<0&&(r.shapeIdx=e._sortedObjs.push(t)-1),e._reorderedObjIdxs.add(r.shapeIdx)}),this._rerenderCb()}},{key:"_renderShapes",value:function(t,e,r){var n=this,i=r.worldToScreenMatrix;e.forEach(function(e){e.visible&&e.render(t,i,n._styleState)})}},{key:"renderAll",value:function(){var t=this._drawCtx;if(t.clearRect(0,0,this._drawCanvas.offsetWidth,this._drawCanvas.offsetHeight),this._objects.size){t.save();var e=this.sortedShapes;this._styleState.applyDefaults(t),this._renderShapes(t,e,this._camera),t.restore()}}},{key:"sortedShapes",get:function(){return this._reorderedObjIdxs.size&&(console.assert(this._sortedObjs.length===this._objects.size,"Size mismatch when rendering objets. Something got out of sync - sorted objs length: "+this._sortedObjs.length+", objects length: "+this._objects.size),this._sortedObjs.sort(b.default.shapeCompare),this._reorderedObjIdxs.clear()),this._sortedObjs}},{key:"margins",get:function(){var t=this,e={}; +return C.forEach(function(r){e[r]=t._margins[r]}),e},set:function(t){var e=this;C.forEach(function(r){"number"==typeof t[r]&&t[r]!==e._margins[r]&&(e._margins[r]=t.prop)}),this._resize()}},{key:"viewport",get:function(){return this._camera.viewport},set:function(t){this._camera.viewport=t}},{key:"projectionDimensions",get:function(){return this._camera.projectionDimensions},set:function(t){return this._camera.projectionDimensions=t,this}},{key:"cameraPosition",get:function(){return this._camera.getPosition()},set:function(t){return this._camera.setPosition(t),this}}]),e}(E.default);e.default=j,j.EventConstants=A},function(t,e){"use strict";function r(t,e,r){return(e[i]-t[i])*(r[o]-t[o])-(r[i]-t[i])*(e[o]-t[o])}function n(t){var e=[],n=t.length;if(n<3){for(var i=0;i0?(o[a+1]=0,o[a+2]=1):(o[a+1]=1,o[a+2]=0);for(var u=3;u=0&&o[a+1]>=0&&r(t[o[a]],t[o[a+1]],t[u])<=0;)a+=1;for(a-=1,o[a]=u;o[s]>=0&&o[s+1]>=0&&r(t[o[s-1]],t[o[s]],t[u])<=0;)s-=1;s+=1,o[s]=u}var l=0;for(l=0;l<=s-a-1;l+=1)e[l]=o[a+l];return o[a+l]!==e[0]&&(e[l]=o[a+l]),e}Object.defineProperty(e,"__esModule",{value:!0}),e.simpleHull_2D=n;var i=0,o=1},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function t(t,e){for(var r=0;r>>24)+", "+((16711680&t)>>16)+", "+((65280&t)>>8)+", "+s(t)+")"}function c(t){if("string"!=typeof t)throw new Error(t+" is not a valid color string");var e=0,r=null;if(r=t.match(y))e=255,e|=v.default.clamp(Number.parseInt(r[3],10),0,255)<<8,e|=v.default.clamp(Number.parseInt(r[2],10),0,255)<<16,e|=v.default.clamp(Number.parseInt(r[1],10),0,255)<<24;else if(r=t.match(b))e=u(Number.parseFloat(r[4],10)),e|=v.default.clamp(Number.parseInt(r[3],10),0,255)<<8,e|=v.default.clamp(Number.parseInt(r[2],10),0,255)<<16,e|=v.default.clamp(Number.parseInt(r[1],10),0,255)<<24;else if(r=t.match(m))e=255,e|=v.default.clamp(Number.parseInt(r[3],16),0,255)<<8,e|=v.default.clamp(Number.parseInt(r[2],16),0,255)<<16,e|=v.default.clamp(Number.parseInt(r[1],16),0,255)<<24;else{if(!_.has(t))throw new Error(t+" is not a valid color string");r=_.get(t).match(m),e=255,e|=v.default.clamp(Number.parseInt(r[3],16),0,255)<<8,e|=v.default.clamp(Number.parseInt(r[2],16),0,255)<<16,e|=v.default.clamp(Number.parseInt(r[1],16),0,255)<<24}return e}function h(t,e){return function(r){function n(){return a(this,n),i(this,(n.__proto__||Object.getPrototypeOf(n)).apply(this,arguments))}return o(n,r),d(n,[{key:"initializer",value:function(t,e){this._eventHandler=e,f(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"initializer",this).call(this,t)}},{key:"_checkPackedColorChanged",value:function(r){if(r!==this._color){var n=this._color,i=s(n),o=s(r);this._color=r,this._eventHandler.fire(t,{attr:e,prevVal:l(n),currVal:l(this._color)}),o!==i&&this._eventHandler.fire(t,{attr:"opacity",prevVal:i,currVal:o})}}},{key:"value",set:function(t){var e=c(t);return this._checkPackedColorChanged(e),this},get:function(){return l(this._color)}},{key:"packedValue",set:function(t){var e=0;return e|=t,this._checkPackedColorChanged(e),this},get:function(){return this._color}},{key:"opacity",set:function(e){if("number"!=typeof e)throw new Error("Opacity must be a number between 0-1");var r=255&this._color,n=u(e);return n!==r&&(this._color&=4294967040,this._color|=n,this._eventHandler.fire(t,{attr:"opacity",prevVal:r/255,currVal:n/255})),this},get:function(){return s(this._color)}}]),n}(g)}Object.defineProperty(e,"__esModule",{value:!0});var f=function t(e,r,n){null===e&&(e=Function.prototype);var i=Object.getOwnPropertyDescriptor(e,r);if(void 0===i){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,r,n)}if("value"in i)return i.value;var a=i.get;if(void 0!==a)return a.call(n)},d=function(){function t(t,e){for(var r=0;r1?r-1:0),i=1;i0}},{key:"isTransparent",value:function(){return this._fillColor.isTransparent()}},{key:"setFillCtx",value:function(t){t.fillStyle=this.fillColor}},{key:"fillColor",set:function(t){return this._fillColor.value=t,this},get:function(){return this._fillColor.value}},{key:"fillOpacity",set:function(t){return this._fillColor.opacity=t,this},get:function(){return this._fillColor.opacity}},{key:"packedFillColor",set:function(t){return this._fillColor.packedValue=t,this},get:function(){return this._fillColor.packedValue}}],[{key:"copyFillStyle",value:function(t,e){"undefined"==typeof t.packedFillColor?("undefined"!=typeof t.fillColor&&(e.fillColor=t.fillColor),"undefined"!=typeof t.fillOpacity&&(e.fillOpacity=t.fillOpacity)):e.packedFillColor=t.packedFillColor}},{key:"compareFillStyle",value:function(t,e){var r=t.isFillVisible(),n=e.isFillVisible();return r!==n?r-n:t.packedFillColor-e.packedFillColor}},{key:"toJSON",value:function(t){return{fillColor:t.fillColor}}}]),t}();e.default=h},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){if("number"!=typeof t)throw new Error("Stroke width must be a number")}function a(t){var e=-1;if("string"!=typeof t||(e=y.indexOf(t.toLowerCase()))<0)throw new Error("Line join must be a string and must be one of ["+y.join(", ")+"]");return e}function s(t){var e=-1;if("string"!=typeof t||(e=m.indexOf(t.toLowerCase()))<0)throw new Error("Line cap must be a string and must be one of ["+m.join(", ")+"]");return e}function u(t){if(!t||!Array.isArray(t)||t.length%2!==0)throw new Error("The dash pattern must be an array with an even number of numbers (or an empty array)")}function l(t){if("number"!=typeof t)throw new Error("The dash offset must be a number")}function c(t){var e=(0,f.createEventedColorRGBAClass)(t,"strokeColor");return(0,v.default)(null,g,function(){function r(){i(this,r)}return h(r,[{key:"initializer",value:function(t){this._strokeColor=new e("black",this),this._strokeWidth=0,this._lineJoin=_.MITER,this._lineCap=b.BUTT,this._dashPattern=[],this._dashOffset=0,this._initStrokeStyleFromOptions(t)}},{key:"strokeWidth",set:function(e){if(o(e),e!==this._strokeWidth){var r=this._strokeWidth;this._strokeWidth=e,this.fire(t,{attr:"strokeWidth",prevVal:r,curral:this._strokeWidth})}return this},get:function(){return this._strokeWidth}},{key:"lineJoin",set:function(e){var r=a(e);if(r!==this._lineJoin){var n=this._lineJoin;this._lineJoin=r,this.fire(t,{attr:"lineJoin",prevVal:n,curral:this._lineJoin})}return this},get:function(){return y[this._lineJoin]}},{key:"lineCap",set:function(e){var r=s(e);if(r!==this._lineCap){var n=this._lineCap;this._lineCap=r,this.fire(t,{attr:"lineCap",prevVal:n,curral:this._lineCap})}return this},get:function(){return m[this._lineCap]}},{key:"dashPattern",set:function(e){u(e);var r=!1;if(e.length===this._dashPattern.length){for(var n=0;n0&&this._strokeWidth>0}},{key:"isTransparent",value:function(){return this._strokeColor.isTransparent()}},{key:"setStrokeCtx",value:function(t){t.strokeStyle=this.strokeColor,t.lineWidth=this._strokeWidth,t.lineJoin=this._lineJoin,t.lineCap=this._lineCap,t.setLineDash(this._dashPattern),t.lineDashOffset=this._dashOffset}},{key:"strokeColor",set:function(t){return this._strokeColor.value=t,this},get:function(){return this._strokeColor.value}},{key:"strokeOpacity",set:function(t){this._strokeColor.opacity=t},get:function(){return this._strokeColor.opacity}},{key:"packedStrokeColor",set:function(t){this._strokeColor.packedValue=t},get:function(){return this._strokeColor.packedValue}},{key:"strokeWidth",set:function(t){return o(t),this._strokeWidth=t,this},get:function(){return this._strokeWidth}},{key:"lineJoin",set:function(t){var e=a(t);return this._lineJoin=e,this},get:function(){return y[this._lineJoin]}},{key:"lineCap",set:function(t){var e=s(t);return this._lineCap=e,this},get:function(){return m[this._lineJoin]}},{key:"dashPattern",set:function(t){return u(t),this._dashPattern=t.slice(),this},get:function(){return this._dashPattern.slice()}},{key:"dashOffset",set:function(t){return l(t),this._dashOffset=t,this},get:function(){return this._dashOffset}}],[{key:"copyStrokeStyle",value:function(t,e){"undefined"==typeof t.packedStrokeColor?("undefined"!=typeof t.strokeColor&&(e.strokeColor=t.strokeColor),"undefined"!=typeof t.strokeOpacity&&(e.strokeOpacity=t.strokeOpacity)):e.packedStrokeColor=t.packedStrokeColor,"undefined"!=typeof t.strokeWidth&&(e.strokeWidth=t.strokeWidth),"undefined"!=typeof t.lineJoin&&(e.lineJoin=t.lineJoin),"undefined"!=typeof t.lineCap&&(e.lineCap=t.lineCap),"undefined"!=typeof t.dashPattern&&(e.dashPattern=t.dashPattern),"undefined"!=typeof t.dashOffset&&(e.dashOffset=t.dashOffset)}},{key:"compareStrokeStyle",value:function(t,e){var r=t.isStrokeVisible(),n=e.isStrokeVisible();if(r!==n)return r-n;if(r=t.packedStrokeColor,n=e.packedStrokeColor,r!==n)return r-n;if(r=t.strokeWidth,n=e.strokeWidth,r!==n)return r-n;if(r=t._lineJoin,n=e._lineJoin,r!==n)return r-n;if(r=t._lineCap,n=e._lineCap,r!==n)return r-n;if(r=t._dashPattern,n=e._dashPattern,r.length===n.length&&r.length>0){for(var i=0;i=0&&i<=t.clientWidth&&(o=r-n.top-t.clientTop)>=0&&o<=t.clientHeight;return a}function c(t,e,r){var n=e.getBoundingClientRect();t[0]=r.clientX-n.left-e.clientLeft,t[1]=r.clientY-n.top-e.clientTop}function h(t,e,r,n){c(H,t,e),k.transformMat2d(U,H,n.screenToWorldMatrix);var i=r.shape;i instanceof B.default?x.transformXformShape(i,r,H,U,n):i instanceof R.default?x.translateVert(i,r,H,U,n):x.translateShape(i,r,H,U,n)}function f(t,e){e.keys={altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey}}function d(t){var e=[];return t.forEach(function(t,r){e.push(r)}),e}function p(t,e,r,n,i,o){var a={unselectedShapes:d(r)};v(r),t.save();var s=e[e.length-1].zIndex;t.zIndex=s+1,P.default.copyBasicStyle(n,t),t.selected=!0;var u=null;return(o.scalable||o.rotatable)&&(u=new B.default(i||G,o),t.addChildXform(u)),r.set(t,u),a.selectedShapes=[t],a}function v(t){t.forEach(function(t,e){e.restore(),e.selected=!1,e.removeChildXform(t)}),t.clear()}function _(t,e){var r=[];return e.forEach(function(e){var n=t.get(e);e.restore(),e.selected=!1,e.removeChildXform(n),t.delete(e),r.push(e)}),r}function y(t,e){var r=document.querySelector(""+("#"+e.id+" canvas")),n={x:t.offsetX+r.offsetLeft,y:t.offsetY+r.offsetTop};return n}function b(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:W.SVG_OFFSET,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:W.SVG_OFFSET,o=document.getElementById("cursor"),a=y(t,e);if(null===o){var s=document.createElement("span");s.setAttribute("id","cursor"),s.setAttribute("style","position: absolute; top: "+(a.y+"px")+"; left: "+(a.x+"px")+"; width: 28px; height: 28px; background: "+r+"; cursor: none; z-index: 10; pointer-events: none; transform: translate("+n+"px, "+i+"px)"),e.appendChild(s)}else o.style.background===r?g(t,e):(o.style.background=r,g(t,e))}function m(){var t=document.getElementById("cursor");null!==t&&t.parentNode.removeChild(t)}function g(t,e){var r=document.getElementById("cursor"),n=y(t,e);null!==r&&(r.style.top=""+(n.y+"px"),r.style.left=""+(n.x+"px"))}Object.defineProperty(e,"__esModule",{value:!0});var M=function(){function t(t,e){for(var r=0;r=0;n-=1){var a=this._objects.get(r[n]);if(r[n].selected){i=this._selectedShapes.get(r[n]),o=a;var s=null;if(i&&(s=i.containsPoint(H,U,e,this._drawCtx)).hit){if(i instanceof R.default&&t.altKey&&s.controlIndex canvas"));null===_?(this._parent.addEventListener("mouseout",Q),this._parent.addEventListener("mouseover",$)):(_.addEventListener("mouseout",Z),_.addEventListener("mouseover",tt)),!this._dragInfo&&o.movable&&(this._dragInfo={startLocalPos:i.getPosition()}),this._dragInfo&&(this._dragInfo.shape=i,this._dragInfo.startPos=k.clone(H),this._dragInfo.startWorldPos=k.clone(U),this._dragInfo.objectToWorldMatrix=j.default.clone(i.globalXform),f(t,this._dragInfo),t.stopImmediatePropagation(),this.fire(X.DRAG_BEGIN,{shapes:d(this._selectedShapes)})),t.touches||t.preventDefault()}}}},{key:"_mouseupCB",value:function(t){if(this.denyMouseEvent&&!t.touches)return void this.setDenyMouseEventFlag(t);if(t.touches&&(t=this.previousEventObj),this._dragInfo&&this._dragInfo.shape){t.stopImmediatePropagation(),t.cancelable&&t.preventDefault();var e=document.querySelector(""+("#"+this._parent.id+" > canvas"));null===e?(this._parent.removeEventListener("mouseout",Q),this._parent.removeEventListener("mouseover",$)):(e.removeEventListener("mouseout",Z),e.removeEventListener("mouseover",tt)),this._dragInfo=null,this.fire(X.DRAG_END,{shapes:d(this._selectedShapes)})}else if(performance.now()-this.timer=0;a-=1)if(o=this._objects.get(n[a]),o.selectable&&n[a].containsPoint(H,U,r,this._drawCtx)){i=n[a];break}if(i&&!i.selected){var s=p(i,n,this._selectedShapes,this._selectStyle,this._xformStyle,o);this.fire(X.SELECTION_CHANGED,s)}else this._makeParentElementMovable()}t.touches&&(t.cancelable&&t.preventDefault(),Date.now()-this.firstTapTime=0;n-=1)if(r[n].selected){var o=this._objects.get(r[n]),a=this._selectedShapes.get(r[n]),s=null;this._parent.style.cursor="none";for(var c=0;c/g,""+d))}else s.controlIndex<4?0===s.controlIndex||3===s.controlIndex?b(t,this._parent,""+V.replace(//g,""+(-r[n].getRotation()-W.FORTY_FIVE_ANGLE))):1!==s.controlIndex&&2!==s.controlIndex||b(t,this._parent,""+V.replace(//g,""+(-r[n].getRotation()+W.FORTY_FIVE_ANGLE))):s.controlIndex%2===0?b(t,this._parent,""+V.replace(//g,""+-r[n].getRotation())):b(t,this._parent,""+V.replace(//g,""+(-r[n].getRotation()+W.RIGHT_ANGLE)));else if(a instanceof R.default){this._parent.style.cursor="none";for(var p=0;p=r[n].numVerts?b(t,this._parent,z,-8,-6):t.altKey?b(t,this._parent,q,-8,-6):b(t,this._parent,Y,W.SVG_OFFSET,W.SVG_OFFSET)}t.stopImmediatePropagation(),t.preventDefault();break}if(r[n].containsPoint(H,U,e,this._drawCtx)){if(o&&o.movable){var v=document.getElementById("cursor");null!==v&&v.parentNode.removeChild(v),this._parent.style.cursor="move";for(var _=0;_=0;n-=1){var i=this._objects.get(r[n]);if(i.selectable&&r[n].containsPoint(H,U,e,this._drawCtx)){if(i.editable&&r[n]instanceof T.default){var o=r[n],a=!1;if(r[n].selected){var s=this._selectedShapes.get(r[n]);s&&(o.restore(),o.removeChildXform(s),a=!(s instanceof B.default))}o.selected=!0,o.save();var u=r[r.length-1].zIndex;o.zIndex=u+1,P.default.copyBasicStyle(this._selectStyle,o);var c=null;a?(i.rotatable||i.scalable)&&(c=new B.default(this._xformStyle||G,i),o.addChildXform(c)):(c=new R.default(o,this._xformStyle),o.addChildXform(c)),this._selectedShapes.set(o,c)}else if(!r[n].selected){var h=p(r[n],r,this._selectedShapes,this._selectStyle,this._xformStyle,i);this.fire(X.SELECTION_CHANGED,h)}break}}n<0&&this._selectedShapes.size?(this._selectedShapes.size&&this.fire(X.SELECTION_CHANGED,{unselectedShapes:d(this._selectedShapes),selectedShapes:[]}),this._dragInfo=null,v(this._selectedShapes)):t.stopImmediatePropagation(),t.cancelable&&t.preventDefault()}}},{key:"_mouseoverCB",value:function(){}},{key:"_mouseoutCB",value:function(){}},{key:"_init",value:function(t,r){this._activated=r&&r.enableInteractions,O(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_init",this).call(this,t,r,this._activated);var n=Object.getOwnPropertyNames(X).map(function(t){return X[t]});this.registerEvents(n),this._dragInfo=null,this._selectedShapes=new Map,this._selectStyle=new P.default(r&&r.selectStyle?r.selectStyle:{fillColor:"orange"}),this._xformStyle=new P.default(r&&r.xformStyle?r.xformStyle:{fillColor:"white",strokeColor:"black",strokeWidth:2}),this.timer=0}},{key:"_makeParentElementMovable",value:function(){m(),this._parent.style.cursor="default";for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=t;if(Array.isArray(o)||(o=[t]),O(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"addShape",this).call(this,o),o.forEach(function(t){var e=r._objects.get(t);e&&(e.selectable=!n||"undefined"==typeof n.selectable||Boolean(n.selectable),e.movable=!n||"undefined"==typeof n.movable||Boolean(n.movable),e.rotatable=!n||"undefined"==typeof n.rotatable||Boolean(n.rotatable),e.scalable=!n||"undefined"==typeof n.scalable||Boolean(n.scalable),e.uniformScaleOnly=!(!n||"undefined"==typeof n.uniformScaleOnly)&&Boolean(n.uniformScaleOnly),e.centerScaleOnly=!(!n||"undefined"==typeof n.centerScaleOnly)&&Boolean(n.centerScaleOnly),e.editable=!n||"undefined"==typeof n.editable||Boolean(n.editable))}),i){var a={unselectedShapes:d(this._selectedShapes)},s=[];o.forEach(function(t){var e=r._objects.get(t);e.selectable&&(p(t,r.sortedShapes,r._selectedShapes,r._selectStyle,r._xformStyle,e),s.push(t))}),s.length&&(a.selectedShapes=s,this.fire(X.SELECTION_CHANGED,a))}return this}},{key:"deleteShape",value:function(t){var r=t;Array.isArray(r)||(r=[t]);var n=_(this._selectedShapes,r);this.fire(X.SELECTION_CHANGED,{unselectedShapes:n,selectedShapes:d(this._selectedShapes)}),m(),this._parent.style.cursor="default";for(var i=0;i0&&void 0!==arguments[0])||arguments[0];return t&&this.clearSelection(),this._disableEvents(),this._activated=!1,this}},{key:"setDenyMouseEventFlag",value:function(t){t.touches?this.denyMouseEvent=!0:t.type===J.MOUSEUP&&(this.denyMouseEvent=!1)}},{key:"selectStyle",set:function(t){P.default.copyBasicStyle(t,this._selectStyle)},get:function(){return this._selectStyle}},{key:"selectedShapes",get:function(){return d(this._selectedShapes)}},{key:"interactionsEnabled",get:function(){return this._activated}}]),e}(A.default);e.default=et,Object.assign(X,A.default.EventConstants),et.EventConstants=X},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function o(t,e,r,n,i){var o=[0,0],a=[0,0];f.default.svd(o,a,null,r.objectToWorldMatrix);var s=[0,0];c.sub(s,r.startWorldPos,o),p.default.normalize(s,s);var u=o;c.sub(u,i,o),p.default.normalize(u,u);var l=p.default.angle(s,u);r.keys.shiftKey&&(l=Math.round(l/Math.QUATER_PI)*Math.QUATER_PI),e.setRotation(r.startLocalRot+Math.RAD_TO_DEG*l)}function a(t,e,r,n,i){var a=t.parent,s=[0,0],u=[0,0],l=[0,0];if(e.rotate)return void o(t,a,e,r,n,i);var h=e.keys.shiftKey||e.uniformScaleOnly,d=e.keys.altKey||e.centerScaleOnly,v=[0,0];if(f.default.svd(v,null,null,e.objectToWorldMatrix),p.default.sub(u,n,e.startWorldPos),h&&e.controlIndex<4){var _=[e.objectToWorldMatrix[0],e.objectToWorldMatrix[1]],y=[e.objectToWorldMatrix[2],e.objectToWorldMatrix[3]],b=[0,0];e.controlIndex<2&&p.default.negate(_,_),e.controlIndex%2===0&&p.default.negate(y,y),p.default.normalize(_,_),p.default.normalize(y,y),p.default.add(b,_,y),p.default.normalize(b,b);var m=p.default.cross2d(u,b),g=null;0===e.controlIndex||3===e.controlIndex?(g=y,m<0&&(g=_)):(g=_,m<0&&(g=y));var M=p.default.dot(u,g);M=Math.sign(M)*Math.sqrt(2*M*M),p.default.scale(u,b,M),c.addVec2(n,e.startWorldPos,u)}c.copy(s,n),c.transformMat2d(s,s,e.worldToObjectMatrix),p.default.sub(l,s,e.startObjectPos),c.copy(v,e.startLocalPos);var O=0,w=0;if(e.controlIndex<4)O=e.controlIndex<2?-1:1,w=e.controlIndex%2===0?-1:1,d||c.addVec2(v,v,p.default.scale(u,u,.5)),a.setPosition(v);else{var x=e.controlIndex-4,E=[0,0];x%2===0?(p.default.set(E,e.objectToWorldMatrix[0],e.objectToWorldMatrix[1]),w=0,O=x<2?-1:1,h&&(w=O,l[1]=l[0])):(p.default.set(E,e.objectToWorldMatrix[2],e.objectToWorldMatrix[3]),O=0,w=x<2?-1:1,h&&(O=w,l[0]=l[1])),d||(p.default.normalize(E,E),p.default.scale(E,E,p.default.dot(u,E)),c.addVec2(v,v,p.default.scale(E,E,.5))),a.setPosition(v)}d&&(O*=2,w*=2),a.setScale([e.startLocalScale[0]*(1+O*l[0]/e.shapeWidth),e.startLocalScale[1]*(1+w*l[1]/e.shapeHeight)])}function s(t,e,r,n,i){var o=[0,0],a=[0,0];if(f.default.svd(a,null,null,e.objectToWorldMatrix),e.keys.shiftKey){c.sub(o,r,e.startPos);var s=Math.atan2(o[1],o[0]);s=Math.round(s/Math.QUATER_PI)*Math.QUATER_PI;var u=[Math.cos(s),Math.sin(s)];p.default.scale(o,u,p.default.dot(o,u)),p.default.transformMat2(o,o,i.screenToWorldMatrix)}else p.default.sub(o,n,e.startWorldPos);c.addVec2(a,e.startLocalPos,o),t.setPosition(a)}function u(t,e,r,n){var i=t.parent,o=i.numVerts;if(e.controlIndex>=o){var a=Math.min(e.controlIndex-o,o-1),s=a===o-1?0:a+1,u=[0,0],l=[0,0],h=[0,0],f=[0,0],d=i.vertsRef,v=i.globalXform;c.transformMat2d(l,d[a],v),c.transformMat2d(h,d[s],v),c.sub(f,h,l),p.default.scale(f,f,.5),c.addVec2(u,l,f),e.controlIndex=i.insertVert(a+1,u)}else i.setVertPosition(e.controlIndex,n)}Object.defineProperty(e,"__esModule",{value:!0}),e.transformXformShape=a,e.translateShape=s,e.translateVert=u;var l=r(3),c=i(l),h=r(4),f=n(h),d=r(9),p=n(d)},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function t(t,e){for(var r=0;r0&&u===this._transformedVerts.length-1&&(f.sub(h,this._transformedVerts[0],this._transformedVerts[u]),d.vec2.scale(h,h,.5),f.addVec2(l,this._transformedVerts[u],h),c.initCenterExtents(o,l,s),c.containsPt(o,t)&&(i.hit=!0,i.controlIndex=this._transformedVerts.length+u))}}return i}},{key:"renderBounds",value:function(t,e,r){this._updateAABox(e),t.save(),t.setTransform(1,0,0,1,0,0),r.setStrokeCtx(t);var n=[0,0],i=[0,0];c.getCenter(n,this._aabox),c.getExtents(i,this._aabox),t.beginPath(),t.rect(n[0]-i[0],n[1]-i[1],2*i[0],2*i[1]),t.stroke(),t.restore()}},{key:"render",value:function(t){var e=this;t.save(),t.setTransform(1,0,0,1,0,0);var r=this._baseVertShape._fullXform,n=this._baseVertShape.vertsRef;this._transformedVerts=new Array(n.length);var i=[0,0],o=[0,0];t.beginPath();var a=0;this._transformedVerts[a]=[0,0],f.transformMat2d(this._transformedVerts[a],n[a],r);var s=Math.max(1.5*t.lineWidth,2.5);for(a=0;a0&&(f.sub(o,this._transformedVerts[0],this._transformedVerts[a]),d.vec2.scale(o,o,.5),f.addVec2(i,this._transformedVerts[a],o),t.moveTo(i[0]+s,i[1]),t.arc(i[0],i[1],s,0,Math.TWO_PI),t.fillStyle=t.strokeStyle,t.fill()),t.beginPath(),this._transformedVerts.forEach(function(r){t.moveTo(r[0]+e._vertRadius,r[1]),t.arc(r[0],r[1],e._vertRadius,0,Math.TWO_PI)}),this.isFillVisible()&&(this.setFillCtx(t),t.fill()),this.isStrokeVisible()&&(this.setStrokeCtx(t),t.stroke()),t.restore()}}]),e}(v.default);e.default=_},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t,e,r,n,i,o,a){v.transformMat2d(e,e,r),t.setTransform(1,0,0,1,0,0),t.translate(e[0],e[1]),t.rotate(o[1]),t.scale(a[0],a[1]),t.rotate(o[0]),t.translate(-e[0],-e[1]),t.rect(e[0]-i,e[1]-i,n,n)}function l(t,e,r,n,i,o,a,s,u,l){var c=!1,h=!1;if(v.transformMat2d(e,e,r),v.distance(e,t)<=s){O.default.negate(e,e),n[4]=n[0]*e[0]+n[2]*e[1],n[5]=n[1]*e[0]+n[3]*e[1];var f=0,d=0;v.transformMat2d(e,t,n),(Math.abs(e[0])<=i&&Math.abs(e[1])<=i||Boolean(u)&&Boolean(l)&&(h=(f=u*e[0])>-i&&f<=a&&(d=l*e[1])>-i&&d<=a))&&(c=!0)}return{hit:c,rotate:h}}Object.defineProperty(e,"__esModule",{value:!0});var c=function(){function t(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{scalable:!0,rotatable:!0};o(this,e);var n=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return n._interactiveBoxSize=8,n._interactiveBoxPadding=10,t&&"undefined"!=typeof t.vertexSize&&(n._interactiveBoxSize=t.vertexSize),n._scalable=!0,n._rotatable=!0,r&&("undefined"!=typeof r.scalable&&(n._scalable=Boolean(r.scalable)),"undefined"!=typeof r.rotatable&&(n._rotatable=Boolean(r.rotatable))),n}return s(e,t),c(e,[{key:"containsPoint",value:function(t){var e={hit:!1,rotate:!1,controlIndex:-1},r=this.aabox;if((this._rotatable||this._scalable)&&this.visible&&d.containsPt(r,t)){var n=[0,0],i=[0,0];b.default.svd(null,n,i,this._fullXform);var o=b.default.create();n[0]=n[0]<0?-1:1,n[1]=n[1]<0?-1:1,n[0]*n[1]>0&&O.default.negate(i,i),b.default.rotate(o,o,i[1]),b.default.scale(o,o,n),b.default.rotate(o,o,i[0]);for(var a=this._rotatable?this._interactiveBoxPadding:0,s=this._interactiveBoxSize/2,u=this.width/2,c=this.height/2,h=[0,0],f=s+a,p=Math.sqrt(2*f*f),_=0,y=0,m=0;m0&&void 0!==arguments[0]&&arguments[0];if(t||this._geomDirty||this._boundsOutOfDate){var e=this._rotatable?this._interactiveBoxPadding:0,r=e+this._interactiveBoxSize/2;d.initCenterExtents(this._aabox,[0,0],[this.width/2,this.height/2]),d.transformMat2d(this._aabox,this._aabox,this._fullXform),d.expand(this._aabox,this._aabox,[r,r]),this._aaboxUpdated=!0,this._geomDirty=this._boundsOutOfDate=!1}}},{key:"renderBounds",value:function(t,e,r){var n=this.aabox;t.save(),t.setTransform(1,0,0,1,0,0),r.setStrokeCtx(t);var i=[0,0],o=[0,0];d.getCenter(i,n),d.getExtents(o,n),t.beginPath(),t.rect(i[0]-o[0],i[1]-o[1],2*o[0],2*o[1]),t.stroke(),t.restore()}},{key:"render",value:function(t,r,n){if(this.parent&&"undefined"!=typeof this.parent.width&&"undefined"!==this.parent.height){this._aaboxUpdated=!1,h(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"render",this).call(this,t,r,n,!1),this._aaboxUpdated||this._updateAABox(!0);var i=[0,0],o=[0,0];b.default.svd(null,i,o,this._fullXform),i[0]=i[0]<0?-1:1,i[1]=i[1]<0?-1:1;var a=this._interactiveBoxSize/2,s=this.width/2,l=this.height/2,c=[s,l];t.save(),t.beginPath(),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i,"3"),v.set(c,s,-l),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i,"2"),v.set(c,-s,-l),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i,"0"),v.set(c,-s,l),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i,"1"),this._scalable&&(v.set(c,0,l),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i),v.set(c,0,-l),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i),v.set(c,s,0),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i),v.set(c,-s,0),u(t,c,this._fullXform,this._interactiveBoxSize,a,o,i)),this.isFillVisible()&&(n.setFillStyle(t,this),t.fill()),this.isStrokeVisible()&&(n.setStrokeStyle(t,this),t.setTransform(1,0,0,1,0,0),t.stroke()),t.restore()}}},{key:"width",get:function(){return this.parent&&"undefined"!==this.parent.width?this.parent.width:0}},{key:"height",get:function(){return this.parent&&"undefined"!==this.parent.height?this.parent.height:0}}]),e}(g.default);e.default=x},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function t(t,e){for(var r=0;r=h.MINIMUM_POINTS){t.moveTo(this._verts[0][0],this._verts[0][1]);for(var r=1;r2&&void 0!==arguments[2]&&arguments[2];o(this,e);var i=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,["changed","changed:xform"]));return i._viewport=c.clone(t),i._projectionDimensions=b.vec2.clone(r),i._yflip=n,i._screenMatrix=y.default.create(),i._screenDirty=!0,i}return s(e,t),u(e,[{key:"isYFlipped",value:function(){return this._yflip}},{key:"viewport",set:function(t){if(!c.equals(t,this._viewport)){var e=c.clone(this._viewport);c.copy(this._viewport,t), +this._screenDirty=!0,this._worldToScreenOutdated=!0,this.fire("changed",{attr:"viewport",prevVal:e,currVal:t})}return this},get:function(){return c.clone(this._viewport)}},{key:"viewportRef",get:function(){return this._viewport}},{key:"screenMatrix",get:function(){if(this._screenDirty){var t=[0,0],e=[0,0];c.getCenter(t,this._viewport),c.getExtents(e,this._viewport),y.default.set(this._screenMatrix,e[0],0,0,e[1],t[0],t[1]),this._worldToScreenOutdated=!0,this._screenDirty=!1}return this._screenMatrix}}]),e}(v.default),g=function(t){function e(t,r,n){o(this,e);var i=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,r,n));return i._viewMatrix=y.default.create(),i._viewDirty=!0,i._projMatrix=y.default.create(),i._projDirty=!0,i}return s(e,t),u(e,[{key:"_localXformUpdated",value:function(){this._boundsOutOfDate=!0}},{key:"_globalXformUpdated",value:function(){this._boundsOutOfDate=!0}},{key:"_matricesDirty",value:function(){return this._boundsOutOfDate||this._lxformDirty||this._xformDirty||this._viewDirty||this._projDirty||this._screenDirty}},{key:"projectionDimensions",set:function(t){if(!b.vec2.equals(t,this._projectionDimensions)){var e=b.vec2.clone(this._projectionDimensions);c.copy(this._projectionDimensions,t),this._viewDirty=!0,this._projDirty=!0,this.fire("changed",{attr:"projectionDimensions",prevVal:e,currVal:t})}return this},get:function(){return b.vec2.clone(this._projectionDimensions)}},{key:"projectionDimensionsRef",get:function(){return this._projectionDimensions}},{key:"viewMatrix",get:function(){if(this._viewDirty||this._boundsOutOfDate||this._xformDirty||this._lxformDirty){var t=[0,0],e=[0,0],r=[0,0],n=this.globalXform;y.default.svd(t,e,r,n),y.default.fromTranslation(this._viewMatrix,b.vec2.negate(t,t)),y.default.rotate(this._viewMatrix,this._viewMatrix,-r[0]),y.default.scale(this._viewMatrix,this._viewMatrix,e),y.default.rotate(this._viewMatrix,this._viewMatrix,-r[1]),this._worldToScreenOutdated=!0,this._viewDirty=!1}return this._viewMatrix}},{key:"projMatrix",get:function(){if(this._projDirty){var t=this._yflip?-1:1;y.default.set(this._projMatrix,2/this._projectionDimensions[0],0,0,2*t/this._projectionDimensions[1],0,0),this._worldToScreenOutdated=!0,this._projDirty=!1}return this._projMatrix}},{key:"worldToScreenMatrix",get:function(){return(!this._worldToScreenMatrix||this._worldToScreenOutdated||this._matricesDirty())&&(this._worldToScreenMatrix||(this._worldToScreenMatrix=y.default.create()),y.default.copy(this._worldToScreenMatrix,this.viewMatrix),y.default.multiply(this._worldToScreenMatrix,this.projMatrix,this._worldToScreenMatrix),y.default.multiply(this._worldToScreenMatrix,this.screenMatrix,this._worldToScreenMatrix),this._worldToScreenOutdated=!1,this._screenToWorldOutdated=!0),this._worldToScreenMatrix}},{key:"screenToWorldMatrix",get:function(){return(!this._screenToWorld||this._screenToWorldOutdated||this._matricesDirty())&&(this._screenToWorld||(this._screenToWorld=y.default.create()),y.default.copy(this._screenToWorld,this.worldToScreenMatrix),y.default.invert(this._screenToWorld,this._screenToWorld),this._screenToWorldOutdated=!1),this._screenToWorld}}]),e}((0,f.default)(m,(0,d.createEventedTransform2dMixin)("changed:xform")));e.default=g},function(t,e,r){var n,i;!function(o,a){n=a,i="function"==typeof n?n.call(e,r,e,t):n,!(void 0!==i&&(t.exports=i))}(this,function(){function t(t,e){var r=Object.prototype.toString.call(t),n="[object Array]"===r||"[object NodeList]"===r||"[object HTMLCollection]"===r||"[object Object]"===r||"undefined"!=typeof jQuery&&t instanceof jQuery||"undefined"!=typeof Elements&&t instanceof Elements,i=0,o=t.length;if(n)for(;i
',t.appendChild(t.resizeSensor),"static"==a(t,"position")&&(t.style.position="relative");var s,u,l,c,h=t.resizeSensor.childNodes[0],f=h.childNodes[0],d=t.resizeSensor.childNodes[1],p=t.offsetWidth,v=t.offsetHeight,_=function(){f.style.width="100000px",f.style.height="100000px",h.scrollLeft=1e5,h.scrollTop=1e5,d.scrollLeft=1e5,d.scrollTop=1e5};_();var y=function(){u=0,s&&(p=l,v=c,t.resizedAttached&&t.resizedAttached.call())},b=function(){l=t.offsetWidth,c=t.offsetHeight,s=l!=p||c!=v,s&&!u&&(u=e(y)),_()},m=function(t,e,r){t.attachEvent?t.attachEvent("on"+e,r):t.addEventListener(e,r)};m(h,"scroll",b),m(d,"scroll",b)}t(n,function(t){s(t,i)}),this.detach=function(t){r.detach(n,t)}};return r.detach=function(e,r){t(e,function(t){t.resizedAttached&&"function"==typeof r&&(t.resizedAttached.remove(r),t.resizedAttached.length())||t.resizeSensor&&(t.contains(t.resizeSensor)&&t.removeChild(t.resizeSensor),delete t.resizeSensor,delete t.resizedAttached)})},r})},function(t,e){t.exports={name:"@mapd/mapd-draw",description:"A Utility Library for drawing and interacting with shapes using canvas",version:"1.1.0",homepage:"https://omnisci.com",bugs:"https://github.com/omnisci/mapd-draw/issues",main:"dist/mapd-draw.js",author:"MapD Technologies",license:"MIT",engines:{node:">=4.0.0"},repository:{type:"git",url:"git+https://github.com/omnisci/mapd-draw.git"},dependencies:{"gl-matrix":"^2.3.2","css-element-queries":"^0.4.0"},devDependencies:{"babel-core":"^6.10.4","babel-eslint":"^10.0.1","babel-loader":"^6.2.4","babel-preset-es2015":"^6.9.0","babel-preset-stage-0":"^6.5.0","babel-register":"^6.24.1",chai:"^3.5.0",eslint:"^3.0.1","eslint-plugin-react":"^7.12.4","http-server":"^0.11.1","json-loader":"0.5.4",mocha:"^6.0.2","pre-commit":"^1.2.2",webpack:"^1.13.1"},scripts:{build:"npm run build:prod; npm run build:dev","build:prod":"npm run webpack","build:dev":"npm run webpack:dev",clean:"bash scripts/clean.sh",eslint:"eslint -c ./.eslintrc.json","lint-fix":"eslint --fix $(find src -name \"*.js\" ! -name '*.spec.js')",lint:"eslint $(find src -name \"*.js\" ! -name '*.spec.js')",start:"npm run build; http-server -p 8080 -o;","watch:dev":"node node_modules/webpack/bin/webpack.js --progress --colors --watch --config webpack.dev.config.js",webpack:"node node_modules/webpack/bin/webpack.js","webpack:dev":"node node_modules/webpack/bin/webpack.js --config webpack.dev.config.js",test:"mocha --recursive --require babel-register"},"pre-commit":["lint","test"]}}])}); //# sourceMappingURL=mapd-draw.js.map \ No newline at end of file diff --git a/dist/mapd-draw.js.map b/dist/mapd-draw.js.map index 94781c2..d2fe6fb 100644 --- a/dist/mapd-draw.js.map +++ b/dist/mapd-draw.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///mapd-draw.js","webpack:///webpack/bootstrap 36cec25af982a9d810b2","webpack:///./mapd-draw.js","webpack:///../~/gl-matrix/src/gl-matrix.js","webpack:///./core/aabox2d.js","webpack:///../~/gl-matrix/src/gl-matrix/common.js","webpack:///./core/point2d.js","webpack:///./core/mat2d.js","webpack:///./math/math.js","webpack:///./shapes/base-shape.js","webpack:///./util/aggregation.js","webpack:///./style/basic-style.js","webpack:///./core/vec2d.js","webpack:///./shapes/poly-line.js","webpack:///./shapes/transform2d.js","webpack:///./util/event-handler.js","webpack:///./engine/draw-engine.js","webpack:///./math/convex-hull.js","webpack:///./shapes/rect.js","webpack:///./style/color-rgba.js","webpack:///./style/fill-style.js","webpack:///./style/stroke-style.js","webpack:///../~/gl-matrix/src/gl-matrix/mat3.js","webpack:///../~/gl-matrix/src/gl-matrix/vec3.js","webpack:///../~/gl-matrix/src/gl-matrix/vec4.js","webpack:///./engine/shape-builder.js","webpack:///./interactions/interact-utils.js","webpack:///./interactions/vert-editable-shape.js","webpack:///./interactions/xform-shape.js","webpack:///./shapes/circle.js","webpack:///./shapes/point.js","webpack:///./shapes/poly.js","webpack:///./util/canvas-utils.js","webpack:///./util/utils.js","webpack:///./view/camera2d.js","webpack:///../~/css-element-queries/src/ResizeSensor.js","webpack:///../~/gl-matrix/src/gl-matrix/mat2.js","webpack:///../~/gl-matrix/src/gl-matrix/mat2d.js","webpack:///../~/gl-matrix/src/gl-matrix/mat4.js","webpack:///../~/gl-matrix/src/gl-matrix/quat.js","webpack:///../~/gl-matrix/src/gl-matrix/vec2.js","webpack:///../package.json"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireWildcard","obj","__esModule","newObj","key","Object","prototype","hasOwnProperty","default","_interopRequireDefault","defineProperty","value","simpleHull_2D","Math","Point","PolyLine","Poly","Rect","Circle","Vec2d","BasicStyle","Mat2","Point2d","Mat2d","AABox2d","DrawEngine","ShapeBuilder","version","undefined","_package","enumerable","get","_glMatrix","mat2","_convexHull","_shapeBuilder","_shapeBuilder2","_drawEngine","_drawEngine2","_aabox2d","_AABox2d","_mat2d","_mat2d2","_point2d","_Point2d","_basicStyle","_basicStyle2","_vec2d","_vec2d2","_circle","_circle2","_rect","_rect2","_poly","_poly2","_polyLine","_polyLine2","_point","_point2","_math","_math2","glMatrix","mat2d","mat3","mat4","quat","vec2","vec3","vec4","set","out","minx","miny","maxx","maxy","MINX","Infinity","MINY","MAXX","MAXY","create","ARRAY_TYPE","Constants","BOX_SIDES","clone","box","copy","initEmpty","initInfinity","initSizeFromOrigin","sizes","initSizeFromLocation","pt","i","initCenterExtents","center","isEmpty","isInfinite","isFinite","equals","a","b","a0","a1","a2","a3","b0","b1","b2","b3","abs","EPSILON","getSize","getExtents","scale","getCenter","expand","expandSize","area","hull","min","max","intersection","boxToUse","minindex","maxindex","overlaps","contains","containsPt","encapsulatePt","translate","pos","transform","mat","xformFunc","pt1","pt2","transformMat2","transformMat2d","Float32Array","Array","RANDOM","random","ENABLE_SIMD","SIMD_AVAILABLE","USE_SIMD","setMatrixArrayType","type","degree","PI","toRadian","x","arguments","length","y","X","Y","initFromValues","addVec2","v","add","sub","str","distance","p1","p2","squaredDistance","lerp","t","exactEquals","sqrDist","dist","svd","outTranslate","outScale","outRotate","E","F","G","H","Q","sqrt","R","atan2","clamp","f","minv","maxv","clamp01","f1","f2","EPS","quarter","half","two","QUATER_PI","HALF_PI","HALF_NPI","TWO_PI","NPI","NQUATER_PI","NHALF_PI","NTWO_PI","INV_PI","RAD_TO_DEG","DEG_TO_RAD","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","constructor","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","descriptor","protoProps","staticProps","_fillStyle","_fillStyle2","_strokeStyle","_strokeStyle2","_transform2d","_transform2d2","_aggregation2","_aggregation3","_eventHandler","_eventHandler2","CoreBaseShape","_EventHandler","opts","_this","getPrototypeOf","_aabox","_zIndex","zIndex","_visible","_geomDirty","_fullXform","Number","isInteger","Error","prev","fire","attr","prevVal","currVal","_updateAABox","visible","BaseShape","_aggregation","_this2","_stateStack","state","copyBasicStyle","push","pop","globalXform","width","height","screenPt","worldPt","worldToScreenMatrix","ctx","rtn","aabox","save","setTransform","beginPath","_draw","strokeStyle","lineWidth","strokeWidth","dashPattern","stroke","isFillVisible","isPointInPath","isStrokeVisible","isPointInStroke","restore","boundsStrokeStyle","setStrokeCtx","extents","rect","_boundsOutOfDate","styleState","doFill","doStroke","transformCtx","Boolean","setFillStyle","fill","setStrokeStyle","newStyle","assign","toJSON","shape1","shape2","zIndex1","zIndex2","compareFillStyle","compareStrokeStyle","createEventedTransform2dMixin","createEventedFillStyleMixin","createEventedStrokeStyleMixin","aggregation","base","_len","mixins","_key","aggregate","__Aggregate","_ref","_len2","args","_key2","apply","concat","forEach","mixin","initializer","_mixin$prototype$init","_base","copyProps","source","getOwnPropertyNames","getOwnPropertySymbols","prop","match","getOwnPropertyDescriptor","srcBasicStyle","dstBasicStyle","copyFillStyle","copyStrokeStyle","basicStyleObj","BaseBasicStyle","cross2d","v1","v2","angleFast","acos","dot","angle","s","anglePosX","aaboxEncapsulatePt","ptIdx","extentIndices","buildCentroid","centroidPt","isArray","ArrayBuffer","isView","_get","object","property","receiver","Function","desc","parent","getter","_baseShape","_baseShape2","identityMatrix","_BaseShape","verts","_extentIndices","_localaabox","_verts","_centroid","signedArea","idx","pivot","map","val","_pivot","xform","localXform","setTransformations","vertIndex","newPt","_collapseVerts","_resetAABox","splice","insertVert","_this3","_this4","_rebuildAABox","tmppt","moveTo","lineTo","vertsRef","vert","buildXformMatrix","rdeg","identity","rotate","dirtyChildren","children","child","_xformDirty","_children","eventName","Transform2d","EventedTransform2d","_pos","_lxformDirty","translation","_scale","scaleMult","multiply","deg","degToUse","_rotDeg","curral","tx","ty","sx","sy","attrs","prevVals","currVals","position","setPosition","setScale","rotation","setRotation","_localXform","fromValues","_globalXform","_parent","Set","_initTransformFromOptions","childXform","has","removeChild","delete","_localXformUpdated","_updatelocalxform","_globalXformUpdated","currMatrix","_updateglobalxform","xformObj","getPositionRef","getScaleRef","pivotRef","getRotation","recursiveFire","currMap","subtypes","currIdx","fireData","cnt","data","listener","recursiveDelete","currNode","listeners","index","subnodes","nodelisteners","indexOf","node","arrayify","intype","arrayToUse","EventHandler","eventsToRegister","_listeners","Map","registerEvents","events","eventsToUse","event","subevents","split","types","typesToUse","subtype","keys","_this5","wrapper","off","on","_eventParent","listens","_eventParentData","addClass","element","className","createCanvas","canvasContainer","document","createElement","canvas","canvasContext","getContext","ratio","CanvasUtils","makeCanvasAutoHighDPI","style","pointerEvents","appendChild","addShapesToMap","newShapes","existingObjectsMap","currIds","reorderCb","redrawCb","shape","shapeObj","shapeId","shapeIdx","deleteShapesFromMap","shapes","idxs","shapeInfo","EventConstants","_canvasUtils","_utils","_camera2d","_camera2d2","_ResizeSensor","_ResizeSensor2","mouseevents","marginProps","MOUSEDOWN","MOUSEUP","MOUSEMOVE","CLICK","DBLCLICK","MOUSEOVER","MOUSEOUT","SHAPE_ADD","SHAPE_DELETE","DrawStyleState","_BasicStyle","_defaults","packedFillColor","packedStrokeColor","lineJoin","lineCap","dashOffset","fillStyle","fillColor","strokeColor","_strokeWidth","_lineJoin","_lineCap","_dashPattern","diff","setLineDash","_dashOffset","lineDashOffset","setFillCtx","_EventHander","_init","_destroyCanvas","_objects","_reorderCb","_redrawCb","clear","_sortedObjs","_reorderedObjIdxs","offsetWidth","_margins","left","right","offsetHeight","top","bottom","_drawCanvas","_pixelRatio","_camera","projDims","projectionDimensions","flipY","cameraPosition","_rerenderCb","originalEvent","callbacks","addEventListener","removeEventListener","forceEvents","margins","_createCanvas","_container","_drawCtx","bindAll","_resize","_resizeSensor","enableEvents","_enableEvents","_disableEvents","detach","_renderFrameCb","renderAll","bind","_renderRequestId","_ids","_initCanvas","_styleState","screenToWorldMatrix","proxyEvent","deleteShape","sortedShapes","slice","zindex","window","cancelAnimationFrame","requestAnimationFrame","_this6","changedShapes","changedShape","console","assert","drawShapes","camera","_this7","worldToScreenMat","render","clearRect","size","applyDefaults","_renderShapes","sort","shapeCompare","_this8","_this9","viewport","getPosition","isLeft","P0","P1","P2","n","D","bot","h","_width","_height","getOpacity","packedRgbaColor","packOpacity","opacity","floor","getRGBAString","getPackedColorRGBAFromString","color","packedColor","rgbRegex","parseInt","rgbaRegex","parseFloat","hexRegex","colorKeywords","createEventedColorRGBAClass","colorName","_ColorRGBA","EventedColorRGBA","initColorStr","eventHandler","newPackedColor","_color","prevOpacity","tmpcolor","_checkPackedColorChanged","currOpacity","newOpacity","ColorRGBA","FillColorClass","_colorRgba","FillStyle","EventedFillStyle","_fillColor","_initFillStyleFromOptions","_colorRgba2","fillOpacity","isTransparent","packedValue","srcStyle","dstStyle","fillStyleA","fillStyleB","valA","valB","fillStyleObj","validateStrokeWidth","validateLineJoin","lineJoinOpts","toLowerCase","join","validateLineCap","lineCapOpts","validateDashPattern","validateDashOffset","StrokeColorClass","StrokeStyle","EventedStrokeStyle","_strokeColor","JoinEnum","MITER","CapEnum","BUTT","_initStrokeStyleFromOptions","enumVal","BEVEL","ROUND","SQUARE","strokeOpacity","lineMiter","strokeStyleA","strokeStyleB","strokeStyleObj","fromMat4","m00","m01","m02","m10","m11","m12","m20","m21","m22","transpose","a01","a02","a12","invert","a00","a10","a11","a20","a21","a22","b01","b11","b21","det","adjoint","determinant","b00","b02","b10","b12","b20","b22","mul","rad","sin","cos","fromTranslation","fromRotation","fromScaling","fromMat2d","fromQuat","q","z","w","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","normalFromMat4","a03","a13","a23","a30","a31","a32","a33","b03","b04","b05","b06","b07","b08","b09","frob","pow","subtract","multiplyScalar","multiplyScalarAndAdd","a4","a5","a6","a7","a8","b4","b5","b6","b7","b8","divide","div","ceil","round","scaleAndAdd","len","squaredLength","sqrLen","negate","inverse","normalize","cross","ax","ay","az","bx","by","bz","hermite","d","factorTimes2","factor1","factor2","factor3","factor4","bezier","inverseFactor","inverseFactorTimesTwo","r","zScale","transformMat4","transformMat3","transformQuat","qx","qy","qz","qw","ix","iy","iz","iw","rotateX","rotateY","rotateZ","vec","stride","offset","count","fn","arg","l","tempA","tempB","cosine","aw","inCanvas","domrect","getBoundingClientRect","localX","localY","isInCanvas","clientLeft","clientWidth","clientTop","clientHeight","getLocalMousePos","elem","clientX","clientY","transformSelectedShape","selectedInfo","tmpPt1","tmpPt2","InteractUtils","transformXformShape","translateVert","translateShape","addEventKeysToSelectedInfo","altKey","ctrlKey","shiftKey","metaKey","getSelectedObjsFromMap","selectionMap","selectedObjs","subshape","selectShape","selectedShape","currSelectedShapes","selectStyle","xformStyle","selectOpts","fireObject","unselectedShapes","clearSelectedShapes","maxZ","selected","newSelectShape","scalable","rotatable","_xformShape2","defaultXformStyle","addChildXform","selectedShapes","selectedShapeMap","removeChildXform","clearSpecificShapes","clearedShapes","getMouseCoordinates","e","querySelector","coords","offsetX","offsetLeft","offsetY","offsetTop","appendCustomCursor","_event","cursorStyle","SVG_OFFSET","cursor","getElementById","mouse","newCursor","setAttribute","background","updateCursorPosition","removeCustomCursor","parentNode","_interactUtils","_vertEditableShape","_vertEditableShape2","_xformShape","scaleSvg","rotateSvg","addSvg","removeSvg","repositionSvg","SELECTION_CHANGED","DRAG_BEGIN","DRAG_END","QUICK_CLICK_TIME","RIGHT_ANGLE","STRAIGHT_ANGLE","FORTY_FIVE_ANGLE","hideCursor","display","showCursor","hideCursorWithPointer","showCursorWithPointer","_DrawEngine","timer","performance","now","_selectedShapes","hitInfo","containsPoint","hit","controlIndex","numVerts","removeVert","invLocalXform","startObjPos","_dragInfo","startObjectPos","worldToObjectMatrix","startLocalPos","startLocalScale","getScale","startLocalRot","shapeWidth","shapeHeight","movable","startPos","startWorldPos","objectToWorldMatrix","stopImmediatePropagation","preventDefault","selectable","selectEventObj","_selectStyle","_xformStyle","buttons","flipy","isYFlipped","selectInfo","j","childNodes","nodeName","degrees","replace","editable","doXform","interactiveShape","_activated","enableInteractions","myevents","interacShape","select","newShape","uniformScaleOnly","centerScaleOnly","selectClearedShapes","clearSelection","rotateOBBox","parentShape","screenPos","worldPos","startDir","dir","objPos","deltaPos","deltaDims","uniformScale","centerScale","xAxisDir","yAxisDir","diagDir","axisToUse","mindist","sign","xScale","yScale","axisDir","transformDir","idx1","idx2","setVertPosition","VertEditableShape","baseVertShape","_baseVertShape","_vertRadius","_transformedVerts","_baseaabox","_worldToScreenMatrix","pad","rtnObj","tmpPt","tmpVec","radius","objToScreenMatrix","arc","drawOBBoxModifierRect","objToScreenMat","modifierSize","modifierHalfSize","modifierRotation","isPointInOBBoxModifierRect","modifierPt","modifierMat","halfBoxSz","boxSz","padBoxSz","padBoxRadius","SIDES","XformShape","_Rect","_interactiveBoxSize","_interactiveBoxPadding","vertexSize","_scalable","_rotatable","rot","boxPadding","halfWidth","halfHeight","padSz","padRadius","force","padding","_aaboxUpdated","_radius","diameter","cossqr","sinsqr","asqr","bsqr","A","B","_size","MINIMUM_POINTS","_PolyLine","closePath","getPixelRatio","canvasCtx","backingStore","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","devicePixelRatio","pixelRatio","allRatioArgs","funcName","_super","setTransformArgs","funcNames","thisArg","BaseCamera2d","_viewport","_projectionDimensions","_yflip","_screenMatrix","_screenDirty","_worldToScreenOutdated","Camera2d","_viewMatrix","_viewDirty","_projMatrix","_projDirty","flip","_matricesDirty","viewMatrix","projMatrix","screenMatrix","_screenToWorldOutdated","_screenToWorld","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","forEachElement","elements","callback","elementsType","toString","isCollectionTyped","jQuery","Elements","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout","ResizeSensor","EventQueue","ev","remove","newQueue","getComputedStyle","currentStyle","getPropertyValue","attachResizeEvent","resized","resizedAttached","resizeSensor","styleChild","cssText","innerHTML","dirty","rafId","newWidth","newHeight","expandChild","shrink","lastWidth","lastHeight","reset","scrollLeft","scrollTop","onResized","onScroll","addEvent","el","name","cb","attachEvent","v0","LDU","L","U","aa","ab","ac","ad","atx","aty","scalar","SIMD","m03","m13","m23","m30","m31","m32","m33","tmp01","tmp23","out0","out1","out2","out3","Float32x4","load","shuffle","store","row0","row1","row2","row3","tmp1","minor0","minor1","minor2","minor3","swizzle","reciprocalApproximation","t0","axis","splat","a_1","a_2","a_0","fromXRotation","fromYRotation","fromZRotation","fromRotationTranslation","xy","xz","yz","getTranslation","trace","S","fromRotationTranslationScale","sz","fromRotationTranslationScaleOrigin","o","ox","oy","oz","frustum","near","far","rl","tb","nf","perspective","fovy","aspect","tan","perspectiveFromFieldOfView","fov","upTan","upDegrees","downTan","downDegrees","leftTan","leftDegrees","rightTan","rightDegrees","ortho","lr","bt","lookAt","eye","up","x0","x1","y0","y1","z0","z1","eyex","eyey","eyez","upx","upy","upz","centerx","centery","centerz","a9","a14","a15","b9","b13","b14","b15","rotationTo","tmpvec3","xUnitVec3","yUnitVec3","setAxisAngle","setAxes","matr","view","fromMat3","getAxisAngle","out_axis","bw","calculateW","slerp","omega","cosom","sinom","scale0","scale1","sqlerp","temp1","temp2","invDot","conjugate","fRoot","fTrace","k","description","homepage","bugs","main","author","license","engines","repository","url","dependencies","gl-matrix","css-element-queries","devDependencies","babel-core","babel-loader","babel-plugin-lodash","babel-preset-es2015","babel-preset-stage-0","eslint","http-server","json-loader","webpack","scripts","build","build:prod","build:dev","clean","lint-fix","lint","start","watch:dev","webpack:dev","test","pre-commit"],"mappings":"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","file":"mapd-draw.js","sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///mapd-draw.js","webpack:///webpack/bootstrap a290623d0632beba32ac","webpack:///./mapd-draw.js","webpack:///../~/gl-matrix/dist/gl-matrix.js","webpack:///./core/aabox2d.js","webpack:///./core/point2d.js","webpack:///./core/mat2d.js","webpack:///./math/math.js","webpack:///./shapes/base-shape.js","webpack:///./util/aggregation.js","webpack:///./style/basic-style.js","webpack:///./core/vec2d.js","webpack:///./shapes/poly-line.js","webpack:///./shapes/transform2d.js","webpack:///./util/event-handler.js","webpack:///./engine/draw-engine.js","webpack:///./math/convex-hull.js","webpack:///./shapes/rect.js","webpack:///./style/color-rgba.js","webpack:///./style/fill-style.js","webpack:///./style/stroke-style.js","webpack:///./engine/shape-builder.js","webpack:///./interactions/interact-utils.js","webpack:///./interactions/vert-editable-shape.js","webpack:///./interactions/xform-shape.js","webpack:///./shapes/circle.js","webpack:///./shapes/point.js","webpack:///./shapes/poly.js","webpack:///./util/canvas-utils.js","webpack:///./util/utils.js","webpack:///./view/camera2d.js","webpack:///../~/css-element-queries/src/ResizeSensor.js","webpack:///../package.json"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireWildcard","obj","__esModule","newObj","key","Object","prototype","hasOwnProperty","default","_interopRequireDefault","defineProperty","value","simpleHull_2D","Math","Point","PolyLine","Poly","Rect","Circle","Vec2d","BasicStyle","Mat2","Point2d","Mat2d","AABox2d","DrawEngine","ShapeBuilder","version","undefined","_package","enumerable","get","_glMatrix","mat2","_convexHull","_shapeBuilder","_shapeBuilder2","_drawEngine","_drawEngine2","_aabox2d","_AABox2d","_mat2d","_mat2d2","_point2d","_Point2d","_basicStyle","_basicStyle2","_vec2d","_vec2d2","_circle","_circle2","_rect","_rect2","_poly","_poly2","_polyLine","_polyLine2","_point","_point2","_math","_math2","t","n","self","r","a","e","i","l","d","o","Symbol","toStringTag","create","bind","s","setMatrixArrayType","ARRAY_TYPE","toRadian","equals","abs","max","EPSILON","Float32Array","Array","RANDOM","random","PI","u","sqrt","f","M","forEach","sqrLen","len","sqrDist","dist","div","mul","sub","clone","fromValues","copy","set","add","subtract","multiply","divide","ceil","floor","min","round","scale","scaleAndAdd","distance","squaredDistance","length","squaredLength","negate","inverse","normalize","dot","lerp","transformMat4","transformQuat","h","str","exactEquals","v","cross","hermite","bezier","cos","sin","transformMat3","b","rotateX","rotateY","rotateZ","angle","acos","setAxes","sqlerp","rotationTo","identity","setAxisAngle","getAxisAngle","calculateW","slerp","invert","conjugate","fromMat3","fromEuler","P","A","E","O","transpose","R","y","q","x","_","Y","L","S","adjoint","determinant","translate","rotate","w","I","fromTranslation","fromScaling","fromRotation","fromXRotation","fromYRotation","fromZRotation","fromRotationTranslation","fromQuat2","getTranslation","getScaling","getRotation","fromRotationTranslationScale","fromRotationTranslationScaleOrigin","N","g","T","fromQuat","frustum","perspective","tan","perspectiveFromFieldOfView","upDegrees","downDegrees","leftDegrees","rightDegrees","ortho","lookAt","targetTo","frob","pow","multiplyScalar","multiplyScalarAndAdd","fromMat4","fromMat2d","normalFromMat4","projection","transformMat2","transformMat2d","setReal","getReal","fromRotationTranslationValues","getDual","setDual","rotateByQuatAppend","rotateByQuatPrepend","rotateAroundAxis","LDU","vec4","vec3","vec2","quat2","quat","mat4","mat3","mat2d","glMatrix","out","minx","miny","maxx","maxy","MINX","Infinity","MINY","MAXX","MAXY","Constants","BOX_SIDES","box","initEmpty","initInfinity","initSizeFromOrigin","sizes","initSizeFromLocation","pt","initCenterExtents","center","isEmpty","isInfinite","isFinite","a0","a1","a2","a3","b0","b1","b2","b3","getSize","getExtents","getCenter","expand","expandSize","area","hull","intersection","boxToUse","minindex","maxindex","overlaps","contains","containsPt","encapsulatePt","pos","transform","mat","xformFunc","pt1","pt2","arguments","X","initFromValues","addVec2","Vec2","p1","p2","svd","outTranslate","outScale","outRotate","F","G","H","Q","atan2","clamp","minv","maxv","clamp01","f1","f2","EPS","quarter","half","two","QUATER_PI","HALF_PI","HALF_NPI","TWO_PI","NPI","NQUATER_PI","NHALF_PI","NTWO_PI","INV_PI","RAD_TO_DEG","DEG_TO_RAD","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","constructor","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","descriptor","protoProps","staticProps","_fillStyle","_fillStyle2","_strokeStyle","_strokeStyle2","_transform2d","_transform2d2","_aggregation2","_aggregation3","_eventHandler","_eventHandler2","CoreBaseShape","_EventHandler","opts","_this","getPrototypeOf","_aabox","_zIndex","zIndex","_visible","_geomDirty","_fullXform","Number","isInteger","Error","prev","fire","attr","prevVal","currVal","_updateAABox","visible","EventHandler","BaseShape","_aggregation","_this2","_stateStack","state","copyBasicStyle","push","pop","globalXform","width","height","screenPt","worldPt","worldToScreenMatrix","ctx","rtn","aabox","save","setTransform","beginPath","_draw","strokeStyle","lineWidth","strokeWidth","dashPattern","stroke","isFillVisible","isPointInPath","isStrokeVisible","isPointInStroke","restore","boundsStrokeStyle","setStrokeCtx","extents","rect","_boundsOutOfDate","styleState","doFill","doStroke","transformCtx","Boolean","setFillStyle","fill","setStrokeStyle","newStyle","assign","toJSON","Transform2d","shape1","shape2","zIndex1","zIndex2","FillStyle","compareFillStyle","StrokeStyle","compareStrokeStyle","createEventedTransform2dMixin","createEventedFillStyleMixin","createEventedStrokeStyleMixin","aggregation","base","_len","mixins","_key","aggregate","__Aggregate","_ref","_len2","args","_key2","apply","concat","mixin","initializer","_mixin$prototype$init","_base","copyProps","source","getOwnPropertyNames","getOwnPropertySymbols","prop","match","getOwnPropertyDescriptor","srcBasicStyle","dstBasicStyle","copyFillStyle","copyStrokeStyle","basicStyleObj","BaseBasicStyle","cross2d","v1","v2","angleFast","anglePosX","aaboxEncapsulatePt","ptIdx","extentIndices","buildCentroid","centroidPt","isArray","ArrayBuffer","isView","_get","object","property","receiver","Function","desc","parent","getter","_baseShape","_baseShape2","identityMatrix","_BaseShape","verts","_extentIndices","_localaabox","_verts","_centroid","signedArea","idx","pivot","map","val","_pivot","xform","localXform","setTransformations","vertIndex","newPt","_collapseVerts","_resetAABox","splice","insertVert","_this3","_this4","_rebuildAABox","tmppt","moveTo","lineTo","type","vertsRef","vert","buildXformMatrix","rdeg","dirtyChildren","children","child","_xformDirty","_children","eventName","EventedTransform2d","_pos","_lxformDirty","translation","_scale","scaleMult","deg","degToUse","_rotDeg","curral","tx","ty","sx","sy","attrs","prevVals","currVals","GLMatrix","position","setPosition","setScale","rotation","setRotation","_localXform","_globalXform","_parent","Set","_initTransformFromOptions","childXform","has","removeChild","delete","_localXformUpdated","_updatelocalxform","_globalXformUpdated","currMatrix","_updateglobalxform","xformObj","getPositionRef","getScaleRef","pivotRef","recursiveFire","currMap","subtypes","currIdx","fireData","cnt","data","listener","recursiveDelete","currNode","listeners","index","subnodes","nodelisteners","indexOf","node","arrayify","intype","arrayToUse","eventsToRegister","_listeners","Map","registerEvents","events","eventsToUse","event","subevents","split","types","typesToUse","subtype","keys","_this5","wrapper","off","on","_eventParent","listens","_eventParentData","addClass","element","className","createCanvas","canvasContainer","document","createElement","canvas","canvasContext","getContext","ratio","CanvasUtils","makeCanvasAutoHighDPI","style","pointerEvents","appendChild","addShapesToMap","newShapes","existingObjectsMap","currIds","reorderCb","redrawCb","shape","shapeObj","shapeId","shapeIdx","deleteShapesFromMap","shapes","idxs","shapeInfo","EventConstants","_canvasUtils","_utils","_camera2d","_camera2d2","_ResizeSensor","_ResizeSensor2","mouseevents","marginProps","MOUSEDOWN","MOUSEUP","MOUSEMOVE","CLICK","DBLCLICK","MOUSEOVER","MOUSEOUT","SHAPE_ADD","SHAPE_DELETE","TOUCHSTART","TOUCHEND","TOUCHMOVE","DrawStyleState","_BasicStyle","_defaults","packedFillColor","packedStrokeColor","lineJoin","lineCap","dashOffset","fillStyle","fillColor","strokeColor","_strokeWidth","_lineJoin","_lineCap","_dashPattern","diff","setLineDash","_dashOffset","lineDashOffset","setFillCtx","_EventHander","_init","_destroyCanvas","_objects","_reorderCb","_redrawCb","clear","_sortedObjs","_reorderedObjIdxs","offsetWidth","_margins","left","right","offsetHeight","top","bottom","_drawCanvas","_pixelRatio","_camera","projDims","projectionDimensions","Camera2d","flipY","cameraPosition","_rerenderCb","originalEvent","callbacks","addEventListener","removeEventListener","forceEvents","margins","_createCanvas","_container","_drawCtx","bindAll","_resize","_resizeSensor","ResizeSensor","enableEvents","_enableEvents","_disableEvents","detach","_renderFrameCb","renderAll","_renderRequestId","_ids","_initCanvas","_styleState","screenToWorldMatrix","proxyEvent","deleteShape","sortedShapes","slice","zindex","window","cancelAnimationFrame","requestAnimationFrame","_this6","changedShapes","changedShape","console","assert","drawShapes","camera","_this7","worldToScreenMat","render","clearRect","size","applyDefaults","_renderShapes","sort","shapeCompare","_this8","_this9","viewport","getPosition","EventHander","isLeft","P0","P1","P2","D","bot","_width","_height","getOpacity","packedRgbaColor","packOpacity","opacity","getRGBAString","getPackedColorRGBAFromString","color","packedColor","rgbRegex","parseInt","rgbaRegex","parseFloat","hexRegex","colorKeywords","createEventedColorRGBAClass","colorName","_ColorRGBA","EventedColorRGBA","initColorStr","eventHandler","newPackedColor","_color","prevOpacity","tmpcolor","_checkPackedColorChanged","currOpacity","newOpacity","ColorRGBA","FillColorClass","_colorRgba","EventedFillStyle","_fillColor","_initFillStyleFromOptions","_colorRgba2","fillOpacity","isTransparent","packedValue","srcStyle","dstStyle","fillStyleA","fillStyleB","valA","valB","fillStyleObj","validateStrokeWidth","validateLineJoin","lineJoinOpts","toLowerCase","join","validateLineCap","lineCapOpts","validateDashPattern","validateDashOffset","StrokeColorClass","EventedStrokeStyle","_strokeColor","JoinEnum","MITER","CapEnum","BUTT","_initStrokeStyleFromOptions","enumVal","BEVEL","ROUND","SQUARE","strokeOpacity","lineMiter","strokeStyleA","strokeStyleB","strokeStyleObj","getTouchCoordinates","clientX","touches","clientY","getBoundingClientRect","offsetX","offsetY","inCanvas","domrect","localX","localY","isInCanvas","clientLeft","clientWidth","clientTop","clientHeight","getLocalMousePos","elem","transformSelectedShape","selectedInfo","tmpPt1","tmpPt2","XformShape","InteractUtils","transformXformShape","VertEditableShape","translateVert","translateShape","addEventKeysToSelectedInfo","altKey","ctrlKey","shiftKey","metaKey","getSelectedObjsFromMap","selectionMap","selectedObjs","subshape","selectShape","selectedShape","currSelectedShapes","selectStyle","xformStyle","selectOpts","fireObject","unselectedShapes","clearSelectedShapes","maxZ","selected","newSelectShape","scalable","rotatable","defaultXformStyle","addChildXform","selectedShapes","selectedShapeMap","removeChildXform","clearSpecificShapes","clearedShapes","getMouseCoordinates","querySelector","coords","offsetLeft","offsetTop","appendCustomCursor","_event","cursorStyle","SVG_OFFSET","cursor","getElementById","mouse","newCursor","setAttribute","background","updateCursorPosition","removeCustomCursor","parentNode","_interactUtils","_vertEditableShape","_vertEditableShape2","_xformShape","_xformShape2","scaleSvg","rotateSvg","addSvg","removeSvg","repositionSvg","SELECTION_CHANGED","DRAG_BEGIN","DRAG_END","QUICK_CLICK_TIME","RIGHT_ANGLE","STRAIGHT_ANGLE","FORTY_FIVE_ANGLE","EventsTypes","DOUBLE_CLICK_DELAY","hideCursor","display","showCursor","hideCursorWithPointer","showCursorWithPointer","_DrawEngine","_mousedownCB","_mousemoveCB","_mouseupCB","setDenyMouseEventFlag","denyMouseEvent","previousEventObj","timer","performance","now","_selectedShapes","hitInfo","containsPoint","hit","controlIndex","numVerts","removeVert","invLocalXform","startObjPos","_dragInfo","startObjectPos","worldToObjectMatrix","startLocalPos","startLocalScale","getScale","startLocalRot","shapeWidth","shapeHeight","movable","startPos","startWorldPos","objectToWorldMatrix","stopImmediatePropagation","preventDefault","cancelable","selectable","selectEventObj","_selectStyle","_xformStyle","_makeParentElementMovable","Date","firstTapTime","_dblclickCB","buttons","flipy","isYFlipped","selectInfo","j","childNodes","nodeName","degrees","replace","editable","doXform","interactiveShape","_activated","enableInteractions","myevents","interacShape","select","newShape","uniformScaleOnly","centerScaleOnly","selectClearedShapes","clearSelection","rotateOBBox","parentShape","screenPos","worldPos","startDir","dir","objPos","deltaPos","deltaDims","uniformScale","centerScale","xAxisDir","yAxisDir","diagDir","axisToUse","mindist","sign","xScale","yScale","axisDir","transformDir","idx1","idx2","vec","setVertPosition","baseVertShape","_baseVertShape","_vertRadius","_transformedVerts","_baseaabox","_worldToScreenMatrix","pad","rtnObj","tmpPt","tmpVec","radius","objToScreenMatrix","arc","drawOBBoxModifierRect","objToScreenMat","modifierSize","modifierHalfSize","modifierRotation","isPointInOBBoxModifierRect","modifierPt","modifierMat","halfBoxSz","boxSz","padBoxSz","padBoxRadius","SIDES","_Rect","_interactiveBoxSize","_interactiveBoxPadding","vertexSize","_scalable","_rotatable","rot","boxPadding","halfWidth","halfHeight","padSz","padRadius","force","padding","_aaboxUpdated","_radius","diameter","cossqr","sinsqr","asqr","bsqr","B","_size","MINIMUM_POINTS","_PolyLine","closePath","getPixelRatio","canvasCtx","backingStore","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","devicePixelRatio","pixelRatio","allRatioArgs","funcName","_super","setTransformArgs","funcNames","thisArg","BaseCamera2d","_viewport","_projectionDimensions","_yflip","_screenMatrix","_screenDirty","_worldToScreenOutdated","_viewMatrix","_viewDirty","_projMatrix","_projDirty","flip","_matricesDirty","viewMatrix","projMatrix","screenMatrix","_screenToWorldOutdated","_screenToWorld","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","forEachElement","elements","callback","elementsType","toString","isCollectionTyped","jQuery","Elements","mozRequestAnimationFrame","webkitRequestAnimationFrame","fn","setTimeout","EventQueue","ev","remove","newQueue","getComputedStyle","currentStyle","getPropertyValue","attachResizeEvent","resized","resizedAttached","resizeSensor","styleChild","cssText","innerHTML","dirty","rafId","newWidth","newHeight","expandChild","shrink","lastWidth","lastHeight","reset","scrollLeft","scrollTop","onResized","onScroll","addEvent","el","name","cb","attachEvent","description","homepage","bugs","main","author","license","engines","repository","url","dependencies","gl-matrix","css-element-queries","devDependencies","babel-core","babel-eslint","babel-loader","babel-preset-es2015","babel-preset-stage-0","babel-register","chai","eslint","eslint-plugin-react","http-server","json-loader","mocha","pre-commit","webpack","scripts","build","build:prod","build:dev","clean","lint-fix","lint","start","watch:dev","webpack:dev","test"],"mappings":"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","file":"mapd-draw.js","sourceRoot":""} \ No newline at end of file diff --git a/src/engine/draw-engine.js b/src/engine/draw-engine.js index e4a9b9d..05f82e4 100644 --- a/src/engine/draw-engine.js +++ b/src/engine/draw-engine.js @@ -11,7 +11,7 @@ import Camera2d from "../view/camera2d" import EventHander from "../util/event-handler" import ResizeSensor from "css-element-queries/src/ResizeSensor" -const mouseevents = ["mousedown", "mouseup", "mousemove", "click", "dblclick", "mouseover", "mouseout"] +const mouseevents = ["mousedown", "mouseup", "mousemove", "click", "dblclick", "mouseover", "mouseout", "touchstart", "touchend", "touchmove"] const marginProps = ["top", "bottom", "left", "right"] export const EventConstants = { @@ -23,7 +23,10 @@ export const EventConstants = { MOUSEOVER: "mouseover", MOUSEOUT: "mouseout", SHAPE_ADD: "shape:add", - SHAPE_DELETE: "shape:delete" + SHAPE_DELETE: "shape:delete", + TOUCHSTART: "touchstart", + TOUCHEND: "touchend", + TOUCHMOVE: "touchmove" } class DrawStyleState extends BasicStyle { @@ -111,7 +114,7 @@ function createCanvas(parent) { const canvas = document.createElement("canvas") const canvasContext = canvas.getContext("2d") const ratio = CanvasUtils.makeCanvasAutoHighDPI(canvasContext) - // const ratio = 1 + // const ratio = 1 // add class? addClass(canvas, "mapd-draw-canvas") @@ -239,6 +242,15 @@ export default class DrawEngine extends EventHander { }) } + _touchstartCB(event) { + if (event.target !== this._parent) { + return + } + this.fire("touchstart", { + originalEvent: event + }) + } + _mouseupCB(event) { if (event.target !== this._parent) { return @@ -249,6 +261,16 @@ export default class DrawEngine extends EventHander { }) } + _touchendCB(event) { + if (event.target !== this._parent) { + return + } + + this.fire("touchend", { + originalEvent: event + }) + } + _mousemoveCB(event) { if (event.target !== this._parent) { return @@ -259,6 +281,16 @@ export default class DrawEngine extends EventHander { }) } + _touchmoveCB(event) { + if (event.target !== this._parent) { + return + } + + this.fire("touchmove", { + originalEvent: event + }) + } + _clickCB(event) { if (event.target !== this._parent) { return @@ -367,7 +399,7 @@ export default class DrawEngine extends EventHander { this.registerEvents([EventConstants.SHAPE_ADD, EventConstants.SHAPE_DELETE]) bindAll(["_reorderCb", "_rerenderCb"], this) - bindAll(["_mousedownCB", "_mouseupCB", "_mousemoveCB", "_clickCB", "_dblclickCB", "_mouseoverCB", "_mouseoutCB"], this) + bindAll(["_mousedownCB", "_mouseupCB", "_mousemoveCB", "_clickCB", "_dblclickCB", "_mouseoverCB", "_mouseoutCB", "_touchstartCB", "_touchendCB", "_touchmoveCB"], this) this._renderFrameCb = this.renderAll.bind(this) this._renderRequestId = 0 @@ -401,7 +433,7 @@ export default class DrawEngine extends EventHander { get sortedShapes() { if (this._reorderedObjIdxs.size) { console.assert(this._sortedObjs.length === this._objects.size, - `Size mismatch when rendering objets. Something got out of sync - sorted objs length: ${this._sortedObjs.length}, objects length: ${this._objects.size}`) + `Size mismatch when rendering objets. Something got out of sync - sorted objs length: ${this._sortedObjs.length}, objects length: ${this._objects.size}`) // if (this._reorderedObjIdxs.length / this._sortedObjs.length > 0.7) { // // might as well just resort the whole thing over @@ -578,7 +610,7 @@ export default class DrawEngine extends EventHander { renderAll() { const ctx = this._drawCtx - // ctx.clearRect(0, 0, this.width, this.height) + // ctx.clearRect(0, 0, this.width, this.height) ctx.clearRect(0, 0, this._drawCanvas.offsetWidth, this._drawCanvas.offsetHeight) if (!this._objects.size) { diff --git a/src/engine/shape-builder.js b/src/engine/shape-builder.js index 7b7953d..d2ba054 100644 --- a/src/engine/shape-builder.js +++ b/src/engine/shape-builder.js @@ -42,6 +42,27 @@ const defaultXformStyle = { strokeWidth: 2 } +const EventsTypes = { + MOUSEDOWN: "mousedown", + MOUSEUP: "mouseup", + MOUSEMOVE: "mousemove", + TOUCHSTART: "touchstart", + TOUCHEND: "touchend", + TOUCHMOVE: "touchmove" +} + +const DOUBLE_CLICK_DELAY = 600 // To detect the double click in case of touch screen + +// This method will Add clientX, clientY & offsetX and offsetY for Touch events +function getTouchCoordinates(event, canvas) { + event.clientX = event.touches[0].clientX + event.clientY = event.touches[0].clientY + const element = canvas.getBoundingClientRect() + event.offsetX = event.touches[0].clientX - element.left + event.offsetY = event.touches[0].clientY - element.top + return event +} + function inCanvas(canvas, x, y) { const domrect = canvas.getBoundingClientRect() let localX = 0 @@ -96,7 +117,7 @@ function selectShape(selectedShape, sortedShapes, currSelectedShapes, selectStyl selectedShape.zIndex = maxZ + 1 BasicStyle.copyBasicStyle(selectStyle, selectedShape) selectedShape.selected = true - // const dimensions = selectedShape.getDimensions() + // const dimensions = selectedShape.getDimensions() let newSelectShape = null if (selectOpts.scalable || selectOpts.rotatable) { @@ -208,7 +229,29 @@ function updateCursorPosition(_event, target) { } export default class ShapeBuilder extends DrawEngine { + + _touchstartCB(event) { + this._mousedownCB(event) + } + + _touchmoveCB(event) { + this._mousemoveCB(event) + } + + _touchendCB(event) { + this._mouseupCB(event) + } + _mousedownCB(event) { + this.setDenyMouseEventFlag(event) + if (this.denyMouseEvent && !event.touches) { + return + } + if (event.touches) { + event = getTouchCoordinates(event, this._drawCanvas) + this.previousEventObj = event // Assign event obj to variable to avoid the use it for touchend event + } + if (!inCanvas(this._drawCanvas, event.clientX, event.clientY)) { return } @@ -300,14 +343,27 @@ export default class ShapeBuilder extends DrawEngine { shapes: getSelectedObjsFromMap(this._selectedShapes) }) } - event.preventDefault() + if (!event.touches) { + event.preventDefault() + } } } _mouseupCB(event) { + if (this.denyMouseEvent && !event.touches) { + this.setDenyMouseEventFlag(event) + return // Returning on next line to avoid ESLint error + } + if (event.touches) { + // Use previously assigned event obj to get the offsetX & Y and clientX & Y calculation + event = this.previousEventObj + } + if (this._dragInfo && this._dragInfo.shape) { event.stopImmediatePropagation() - event.preventDefault() + if (event.cancelable) { + event.preventDefault() + } const canvas = document.querySelector(`${`#${this._parent.id} > canvas`}`) if (canvas === null) { this._parent.removeEventListener("mouseout", hideCursor) @@ -338,11 +394,34 @@ export default class ShapeBuilder extends DrawEngine { if (selectedShape && !selectedShape.selected) { const selectEventObj = selectShape(selectedShape, shapes, this._selectedShapes, this._selectStyle, this._xformStyle, selectedInfo) this.fire(EventConstants.SELECTION_CHANGED, selectEventObj) + } else { + // If user clicks anywhere outside then allow the movement of Base Map (Parents Container) + this._makeParentElementMovable() + } + } + // Added Support for Double click + if (event.touches) { + if (event.cancelable) { + event.preventDefault() + } + if ((Date.now() - this.firstTapTime) < DOUBLE_CLICK_DELAY) { + this._dblclickCB(event) } } + this.firstTapTime = Date.now() } _mousemoveCB(event) { + this.setDenyMouseEventFlag(event) + if (this.denyMouseEvent && !event.touches) { + return + } + + if (event.touches) { + event = getTouchCoordinates(event, this._drawCanvas) + this.previousEventObj = event // Assign event obj to variable to avoid the use it for touchend event + } + if (!(inCanvas(this._drawCanvas, event.clientX, event.clientY)) && !this._dragInfo) { return } @@ -352,7 +431,9 @@ export default class ShapeBuilder extends DrawEngine { addEventKeysToSelectedInfo(event, this._dragInfo) transformSelectedShape(this._drawCanvas, event, this._dragInfo, this._camera) event.stopImmediatePropagation() - event.preventDefault() + if (!event.touches) { + event.preventDefault() + } } else if (!event.buttons && this._selectedShapes.size) { Point2d.set(tmpPt1, event.offsetX, event.offsetY) Point2d.transformMat2d(tmpPt2, tmpPt1, this._camera.screenToWorldMatrix) @@ -522,7 +603,9 @@ export default class ShapeBuilder extends DrawEngine { } else { event.stopImmediatePropagation() } - event.preventDefault() + if (event.cancelable) { + event.preventDefault() + } } _mouseoverCB() { @@ -553,6 +636,19 @@ export default class ShapeBuilder extends DrawEngine { this.timer = 0 } + // This function allow the movement of Parent Container (In our case it is Map) when user clicks anywhere on Map except on Shape + // As well as it's changes the icon of mouse for Desktop devices + _makeParentElementMovable() { + removeCustomCursor() + this._parent.style.cursor = "default" // Change the Cursor icon for desktop device + for (let j = 0; j < this._parent.childNodes.length; j += 1) { + this._parent.childNodes[j].style.cursor = "default" // Change the Cursor icon for desktop device + if (this._parent.childNodes[j].nodeName.toLowerCase() !== "canvas") { + this._parent.childNodes[j].style.pointerEvents = "auto" // Allow movemnet of parent container i.e Map + } + } + } + _renderShapes(ctx, drawShapes, camera) { const worldToScreenMat = camera.worldToScreenMatrix drawShapes.forEach(shape => { @@ -704,6 +800,16 @@ export default class ShapeBuilder extends DrawEngine { this._activated = false return this } + + // This method is used to stop Mouse Event propagation Triggered from the Touch event + setDenyMouseEventFlag(event) { + if (event.touches) { + this.denyMouseEvent = true + } else if (event.type === EventsTypes.MOUSEUP) { + // set the Flag false at the end of mouse event i.e on MouseUp Event + this.denyMouseEvent = false + } + } } Object.assign(EventConstants, DrawEngine.EventConstants)