From c90a05ab0f21a1b9719881ef9be4adfe2283b8a1 Mon Sep 17 00:00:00 2001 From: Heejae Kim Date: Sun, 14 Jan 2018 16:34:18 +0900 Subject: [PATCH] skip: test fix --- dist/PanoViewer/view360.panoviewer.js | 4 +- dist/PanoViewer/view360.panoviewer.js.map | 2 +- dist/PanoViewer/view360.panoviewer.min.js | 2 +- dist/PanoViewer/view360.panoviewer.min.js.map | 2 +- dist/PanoViewer/view360.panoviewer.pkgd.js | 4 +- .../PanoViewer/view360.panoviewer.pkgd.js.map | 2 +- .../PanoViewer/view360.panoviewer.pkgd.min.js | 2 +- .../view360.panoviewer.pkgd.min.js.map | 2 +- dist/SpinViewer/view360.spinviewer.js.map | 2 +- .../SpinViewer/view360.spinviewer.pkgd.js.map | 2 +- dist/view360.js | 4 +- dist/view360.js.map | 2 +- dist/view360.min.js | 2 +- dist/view360.min.js.map | 2 +- dist/view360.pkgd.js | 4 +- dist/view360.pkgd.js.map | 2 +- dist/view360.pkgd.min.js | 2 +- dist/view360.pkgd.min.js.map | 2 +- src/PanoImageRenderer/ImageLoader.js | 8 +--- test/unit/PanoViewer/PanoViewer.spec.js | 46 +++++++++---------- 20 files changed, 47 insertions(+), 51 deletions(-) diff --git a/dist/PanoViewer/view360.panoviewer.js b/dist/PanoViewer/view360.panoviewer.js index 966bd46ea..d78ad548d 100644 --- a/dist/PanoViewer/view360.panoviewer.js +++ b/dist/PanoViewer/view360.panoviewer.js @@ -4081,7 +4081,7 @@ var ImageLoader = function () { res(_this._image); } else if (_this._loadStatus === STATUS.LOADING) { _this._once("load", function () { - res(_this._image); + return res(_this._image); }); _this._once("error", function () { return rej("ImageLoader: failed to load images."); @@ -4117,7 +4117,7 @@ var ImageLoader = function () { } this._once("load", function () { - _this2._loadStatus = STATUS.LOADED; + return _this2._loadStatus = STATUS.LOADED; }); this._once("error", function () { return _this2._loadStatus = STATUS.ERROR; diff --git a/dist/PanoViewer/view360.panoviewer.js.map b/dist/PanoViewer/view360.panoviewer.js.map index 9635d24e6..4eb84c1f1 100644 --- a/dist/PanoViewer/view360.panoviewer.js.map +++ b/dist/PanoViewer/view360.panoviewer.js.map @@ -1 +1 @@ -{"version":3,"file":"PanoViewer/view360.panoviewer.js","sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///webpack/bootstrap 93b3240e8d27dfb37e66?a5b7","webpack:///external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}?e192","webpack:///./src/utils/math-util.js?27c1","webpack:///./src/utils/mathUtil/common.js?a713","webpack:///./~/es6-promise/dist/es6-promise.js?b9ed","webpack:///./~/webvr-polyfill/src/math-util.js?82df","webpack:///./~/webvr-polyfill/src/util.js?0e76","webpack:///./src/YawPitchControl/browser.js?24af","webpack:///./src/YawPitchControl/consts.js?fc1d","webpack:///external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}?7a28","webpack:///./src/PanoImageRenderer/WebGLUtils.js?535a","webpack:///./src/PanoImageRenderer/renderer/Renderer.js?499b","webpack:///./src/YawPitchControl/utils.js?c9dd","webpack:///./~/@egjs/agent/dist/agent.js?962c","webpack:///./src/YawPitchControl/index.js?1223","webpack:///./src/PanoViewer/PanoViewer.js?5646","webpack:///./src/PanoViewer/index.js?01e9","webpack:///./src/PanoImageRenderer/ImageLoader.js?32e1","webpack:///./src/PanoImageRenderer/PanoImageRenderer.js?68c7","webpack:///./src/PanoImageRenderer/VideoLoader.js?f0df","webpack:///./src/PanoImageRenderer/index.js?a5de","webpack:///./src/PanoImageRenderer/renderer/CubeRenderer.js?3ce0","webpack:///./src/PanoImageRenderer/renderer/SphereRenderer.js?abff","webpack:///./src/PanoViewer/consts.js?23cd","webpack:///./src/YawPitchControl/YawPitchControl.js?b101","webpack:///./src/YawPitchControl/input/ComplementaryFilter.js?637c","webpack:///./src/YawPitchControl/input/DeviceMotion.js?5949","webpack:///./src/YawPitchControl/input/FusionPoseSensor.js?22ac","webpack:///./src/YawPitchControl/input/TiltMotionInput.js?5589","webpack:///./src/YawPitchControl/input/WheelInput.js?fd3c","webpack:///./src/utils/mathUtil/mat4.js?af84","webpack:///./src/utils/mathUtil/quat.js?e505","webpack:///./src/utils/mathUtil/vec2.js?c86a","webpack:///./src/utils/mathUtil/vec3.js?4f04","webpack:///./~/process/browser.js?8033","webpack:///(webpack)/buildin/global.js?bb44","webpack:///./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js?1298","webpack:///./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js?082d","webpack:///./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js?13d9","webpack:///vertx (ignored)?91aa"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [\"@egjs/component\", \"@egjs/axes\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory(root[\"eg\"][\"Component\"], root[\"eg\"][\"Axes\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 16);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 93b3240e8d27dfb37e66","module.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 14\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\tres(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\t_this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 19\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 35\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 36\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 37\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 39\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 40\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 41\n// module chunks = 0 1 2 3"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"PanoViewer/view360.panoviewer.js","sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///webpack/bootstrap e06ee2bc33cb3d5d9c75?ba38","webpack:///external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}?e192","webpack:///./src/utils/math-util.js?5785","webpack:///./src/utils/mathUtil/common.js?52fa","webpack:///./~/es6-promise/dist/es6-promise.js?c0b7","webpack:///./~/webvr-polyfill/src/math-util.js?aa89","webpack:///./~/webvr-polyfill/src/util.js?c430","webpack:///./src/YawPitchControl/browser.js?45cf","webpack:///./src/YawPitchControl/consts.js?0480","webpack:///external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}?7a28","webpack:///./src/PanoImageRenderer/WebGLUtils.js?e96c","webpack:///./src/PanoImageRenderer/renderer/Renderer.js?74b4","webpack:///./src/YawPitchControl/utils.js?b4ad","webpack:///./~/@egjs/agent/dist/agent.js?51f2","webpack:///./src/YawPitchControl/index.js?d12f","webpack:///./src/PanoViewer/PanoViewer.js?1c46","webpack:///./src/PanoViewer/index.js?96d4","webpack:///./src/PanoImageRenderer/ImageLoader.js?d617","webpack:///./src/PanoImageRenderer/PanoImageRenderer.js?7427","webpack:///./src/PanoImageRenderer/VideoLoader.js?affa","webpack:///./src/PanoImageRenderer/index.js?7af1","webpack:///./src/PanoImageRenderer/renderer/CubeRenderer.js?632d","webpack:///./src/PanoImageRenderer/renderer/SphereRenderer.js?abe1","webpack:///./src/PanoViewer/consts.js?2789","webpack:///./src/YawPitchControl/YawPitchControl.js?23fa","webpack:///./src/YawPitchControl/input/ComplementaryFilter.js?29ac","webpack:///./src/YawPitchControl/input/DeviceMotion.js?2539","webpack:///./src/YawPitchControl/input/FusionPoseSensor.js?15e7","webpack:///./src/YawPitchControl/input/TiltMotionInput.js?f32d","webpack:///./src/YawPitchControl/input/WheelInput.js?0817","webpack:///./src/utils/mathUtil/mat4.js?e300","webpack:///./src/utils/mathUtil/quat.js?a0f8","webpack:///./src/utils/mathUtil/vec2.js?35e7","webpack:///./src/utils/mathUtil/vec3.js?2014","webpack:///./~/process/browser.js?de5a","webpack:///(webpack)/buildin/global.js?a16c","webpack:///./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js?ad2c","webpack:///./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js?c59e","webpack:///./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js?17c6","webpack:///vertx (ignored)?91aa"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [\"@egjs/component\", \"@egjs/axes\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory(root[\"eg\"][\"Component\"], root[\"eg\"][\"Axes\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 16);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e06ee2bc33cb3d5d9c75","module.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 14\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\treturn res(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 19\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 35\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 36\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 37\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 39\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 40\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 41\n// module chunks = 0 1 2 3"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/PanoViewer/view360.panoviewer.min.js b/dist/PanoViewer/view360.panoviewer.min.js index ee93ed0cd..8fd53ee3b 100644 --- a/dist/PanoViewer/view360.panoviewer.min.js +++ b/dist/PanoViewer/view360.panoviewer.min.js @@ -7,5 +7,5 @@ * * @version 3.0.0-rc */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@egjs/component"),require("@egjs/axes")):"function"==typeof define&&define.amd?define("view360",["@egjs/component","@egjs/axes"],t):"object"==typeof exports?exports.view360=t(require("@egjs/component"),require("@egjs/axes")):(e.eg=e.eg||{},e.eg.view360=t(e.eg.Component,e.eg.Axes))}(this,function(e,t){return function(e){function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.l=!0,r.exports}var t={};return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.i=function(e){return e},__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=16)}([function(t,n){t.exports=e},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function quatToVec3(e){var t=a["default"].fromValues(0,0,1);return a["default"].transformQuat(t,t,e),t}function getRotationDelta(e,t,n){var r=a["default"].fromValues(p[n].targetAxis[0],p[n].targetAxis[1],p[n].targetAxis[2]),o=p[n].meshPoint,s=l["default"].clone(e),u=l["default"].clone(t);l["default"].normalize(s,s),l["default"].normalize(u,u);var c=a["default"].fromValues(0,0,1),h=a["default"].fromValues(0,0,1);a["default"].transformQuat(c,c,s),a["default"].transformQuat(h,h,u),a["default"].transformQuat(r,r,u);var f=a["default"].dot(r,a["default"].cross(a["default"].create(),c,h)),d=f>0?1:-1,_=a["default"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a["default"].fromValues(0,d,0):a["default"].fromValues(d,0,0),a["default"].transformQuat(_,_,u),a["default"].transformQuat(m,m,u);var v=_,g=m,y=a["default"].create();a["default"].cross(y,v,g),a["default"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(h,h,u),c=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a["default"].create();a["default"].subtract(T,c,a["default"].scale(a["default"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a["default"].length(T)*a["default"].length(h));x>1&&(x=1);var P=Math.acos(x),A=a["default"].cross(a["default"].create(),h,T);E=w*A[0]+R*A[1]+b*A[2];var C=void 0;C=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var I=P*C*d;return i["default"].toDegree(I)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return"number"!=typeof e?"Not a number":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l["default"].create();return l["default"].rotateY(n,n,i["default"].toRadian(e)),l["default"].rotateX(n,n,i["default"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i["default"].toDegree(d.extractYawFromQuat(e)),pitch:i["default"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i["default"],t.mat4=f["default"],t.quat=l["default"],t.vec2=u["default"],t.vec3=a["default"],t.ROTATE_CONSTANT=p},function(e,t,n){"use strict";var r={};r.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){"use strict";function objectOrFunction(e){var t=typeof e;return null!==e&&("object"===t||"function"===t)}function isFunction(e){return"function"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return"data:"+e+";base64,"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i="",o=0;o-1?e.split("/")[2]:e.split("/")[0],t=t.split(":")[0]},e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();r.Float32Array="undefined"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH="ontouchstart"in r,t.SUPPORT_DEVICEMOTION="ondevicemotion"in r},function(e,t,n){"use strict";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS="pinchstart pinchmove pinchend",t.KEYMAP=i},function(e,n){e.exports=t},,function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={0:"NO_ERROR",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",37442:"CONTEXT_LOST_WEBGL"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=["webgl","experimental-webgl","webkit-3d","moz-webgl"],n=null;e.addEventListener("webglcontextcreationerror",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o["default"].setUa(e);var t={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),"ios"===t.os.name&&t.browser.webview&&(t.browser.version="-1"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{"default":e}}(i);agent.VERSION="2.1.2",t["default"]=agent,e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){"use strict";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,"i").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i["default"].browser,i["default"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i["default"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i["default"].defaultString.browser.version,r=new RegExp("("+e+")","i").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i["default"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i["default"].os,e)}function getOsName(){return getIdentityStringFromArray(i["default"].os,i["default"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i["default"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp("("+a+")\\s([\\d_\\.]+|\\d_0)","i");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=void 0;t["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};t["default"]=r,e.exports=t["default"]}])})},function(e,t,n){"use strict";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(7);i["default"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i["default"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i["default"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i["default"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i["default"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i["default"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})["catch"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on("change",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){"boolean"==typeof e&&this._yawPitchControl.option("useZoom",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option("useKeyboard",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option("useGyro",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option("fovRange",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option("yawRange",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option("pitchRange",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option("showPolePoint",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option("pitchRange"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new a["default"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f["default"]:p["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement("canvas");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n("ImageLoader is not initialized");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension("WEBGL_lose_context");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*g,i=t*g;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+l["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l["default"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=l["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l["default"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l["default"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l["default"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,"aVertexPosition"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=e.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=e.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,"aTextureCoord"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l["default"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i["default"]);t["default"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=v},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if("object"===(void 0===e?"undefined":r(e))?(t=e.src,n=e.type):"string"==typeof e&&(t=e),!t)return!1;var i=document.createElement("source");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:"string"!=typeof e&&"object"!==(void 0===e?"undefined":r(e))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once("loadeddata",function(){return t(e._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t["default"]=a},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i["default"],t.WebGLUtils=a["default"]},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn("Image width("+r+") exceeds device limit("+i+"))");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,v=m+60+1;n.push(m,v,m+1,v,v+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i["default"]);t["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){"use strict";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return"string"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return"showPolePoint"===e||"fov"===e||"aspectRatio"===e||"yawRange"===e||"pitchRange"===e})&&this._updateControlScale(),e.some(function(e){return"fovRange"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return"useGyro"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return"useKeyboard"===e})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return"useZoom"===e})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);v.VERSION="3.0.0-rc",t["default"]=v},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i["default"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",i["default"].radToDeg*a["default"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i["default"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t["default"]=u["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf("Android"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener("deviceorientation",this._onDeviceOrientation),a.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener("deviceorientation",this._onDeviceOrientation),a.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i["default"]);t["default"]=s},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),v=.98,g=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p["default"],t.accelerometer=new u["default"].Vector3,t.gyroscope=new u["default"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m["default"](v),t.posePredictor=new a["default"](g),t.filterToWorldQ=new u["default"].Quaternion,t.isFirefoxAndroid=l["default"].isFirefoxAndroid(),t.isIOS=l["default"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u["default"].Quaternion,t.worldToScreenQ=new u["default"].Quaternion,t.originalPoseAdjustQ=new u["default"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l["default"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u["default"].Quaternion,t.deviceMotion.on("devicemotion",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger("change",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u["default"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i["default"]);t["default"]=y},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i["default"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i["default"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i["default"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n0?1:-1,_=a["default"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a["default"].fromValues(0,d,0):a["default"].fromValues(d,0,0),a["default"].transformQuat(_,_,u),a["default"].transformQuat(m,m,u);var v=_,g=m,y=a["default"].create();a["default"].cross(y,v,g),a["default"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(h,h,u),c=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a["default"].create();a["default"].subtract(T,c,a["default"].scale(a["default"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a["default"].length(T)*a["default"].length(h));x>1&&(x=1);var P=Math.acos(x),A=a["default"].cross(a["default"].create(),h,T);E=w*A[0]+R*A[1]+b*A[2];var C=void 0;C=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var I=P*C*d;return i["default"].toDegree(I)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return"number"!=typeof e?"Not a number":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l["default"].create();return l["default"].rotateY(n,n,i["default"].toRadian(e)),l["default"].rotateX(n,n,i["default"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i["default"].toDegree(d.extractYawFromQuat(e)),pitch:i["default"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i["default"],t.mat4=f["default"],t.quat=l["default"],t.vec2=u["default"],t.vec3=a["default"],t.ROTATE_CONSTANT=p},function(e,t,n){"use strict";var r={};r.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){"use strict";function objectOrFunction(e){var t=typeof e;return null!==e&&("object"===t||"function"===t)}function isFunction(e){return"function"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return"data:"+e+";base64,"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i="",o=0;o-1?e.split("/")[2]:e.split("/")[0],t=t.split(":")[0]},e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();r.Float32Array="undefined"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH="ontouchstart"in r,t.SUPPORT_DEVICEMOTION="ondevicemotion"in r},function(e,t,n){"use strict";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS="pinchstart pinchmove pinchend",t.KEYMAP=i},function(e,n){e.exports=t},,function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={0:"NO_ERROR",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",37442:"CONTEXT_LOST_WEBGL"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=["webgl","experimental-webgl","webkit-3d","moz-webgl"],n=null;e.addEventListener("webglcontextcreationerror",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o["default"].setUa(e);var t={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),"ios"===t.os.name&&t.browser.webview&&(t.browser.version="-1"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{"default":e}}(i);agent.VERSION="2.1.2",t["default"]=agent,e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){"use strict";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,"i").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i["default"].browser,i["default"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i["default"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i["default"].defaultString.browser.version,r=new RegExp("("+e+")","i").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i["default"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i["default"].os,e)}function getOsName(){return getIdentityStringFromArray(i["default"].os,i["default"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i["default"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp("("+a+")\\s([\\d_\\.]+|\\d_0)","i");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=void 0;t["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};t["default"]=r,e.exports=t["default"]}])})},function(e,t,n){"use strict";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(7);i["default"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i["default"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i["default"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i["default"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i["default"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i["default"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})["catch"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on("change",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){"boolean"==typeof e&&this._yawPitchControl.option("useZoom",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option("useKeyboard",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option("useGyro",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option("fovRange",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option("yawRange",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option("pitchRange",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option("showPolePoint",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option("pitchRange"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new a["default"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f["default"]:p["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement("canvas");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n("ImageLoader is not initialized");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension("WEBGL_lose_context");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*g,i=t*g;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+l["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l["default"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=l["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l["default"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l["default"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l["default"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,"aVertexPosition"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=e.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=e.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,"aTextureCoord"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l["default"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i["default"]);t["default"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=v},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if("object"===(void 0===e?"undefined":r(e))?(t=e.src,n=e.type):"string"==typeof e&&(t=e),!t)return!1;var i=document.createElement("source");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:"string"!=typeof e&&"object"!==(void 0===e?"undefined":r(e))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once("loadeddata",function(){return t(e._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t["default"]=a},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i["default"],t.WebGLUtils=a["default"]},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn("Image width("+r+") exceeds device limit("+i+"))");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,v=m+60+1;n.push(m,v,m+1,v,v+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i["default"]);t["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){"use strict";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return"string"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return"showPolePoint"===e||"fov"===e||"aspectRatio"===e||"yawRange"===e||"pitchRange"===e})&&this._updateControlScale(),e.some(function(e){return"fovRange"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return"useGyro"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return"useKeyboard"===e})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return"useZoom"===e})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);v.VERSION="3.0.0-rc",t["default"]=v},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i["default"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",i["default"].radToDeg*a["default"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i["default"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t["default"]=u["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf("Android"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener("deviceorientation",this._onDeviceOrientation),a.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener("deviceorientation",this._onDeviceOrientation),a.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i["default"]);t["default"]=s},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),v=.98,g=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p["default"],t.accelerometer=new u["default"].Vector3,t.gyroscope=new u["default"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m["default"](v),t.posePredictor=new a["default"](g),t.filterToWorldQ=new u["default"].Quaternion,t.isFirefoxAndroid=l["default"].isFirefoxAndroid(),t.isIOS=l["default"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u["default"].Quaternion,t.worldToScreenQ=new u["default"].Quaternion,t.originalPoseAdjustQ=new u["default"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l["default"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u["default"].Quaternion,t.deviceMotion.on("devicemotion",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger("change",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u["default"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i["default"]);t["default"]=y},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i["default"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i["default"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i["default"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n0?1:-1,_=a[\"default\"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a[\"default\"].fromValues(0,d,0):a[\"default\"].fromValues(d,0,0),a[\"default\"].transformQuat(_,_,u),a[\"default\"].transformQuat(m,m,u);var v=_,g=m,y=a[\"default\"].create();a[\"default\"].cross(y,v,g),a[\"default\"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(h,h,u),c=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a[\"default\"].create();a[\"default\"].subtract(T,c,a[\"default\"].scale(a[\"default\"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a[\"default\"].length(T)*a[\"default\"].length(h));x>1&&(x=1);var P=Math.acos(x),A=a[\"default\"].cross(a[\"default\"].create(),h,T);E=w*A[0]+R*A[1]+b*A[2];var C=void 0;C=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var I=P*C*d;return i[\"default\"].toDegree(I)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return\"number\"!=typeof e?\"Not a number\":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l[\"default\"].create();return l[\"default\"].rotateY(n,n,i[\"default\"].toRadian(e)),l[\"default\"].rotateX(n,n,i[\"default\"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i[\"default\"].toDegree(d.extractYawFromQuat(e)),pitch:i[\"default\"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i[\"default\"],t.mat4=f[\"default\"],t.quat=l[\"default\"],t.vec2=u[\"default\"],t.vec3=a[\"default\"],t.ROTATE_CONSTANT=p},function(e,t,n){\"use strict\";var r={};r.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){\"use strict\";function objectOrFunction(e){var t=typeof e;return null!==e&&(\"object\"===t||\"function\"===t)}function isFunction(e){return\"function\"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return\"data:\"+e+\";base64,\"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i=\"\",o=0;o-1?e.split(\"/\")[2]:e.split(\"/\")[0],t=t.split(\":\")[0]},e.exports=n},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();r.Float32Array=\"undefined\"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH=\"ontouchstart\"in r,t.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in r},function(e,t,n){\"use strict\";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",t.KEYMAP=i},function(e,n){e.exports=t},,function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={0:\"NO_ERROR\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",37442:\"CONTEXT_LOST_WEBGL\"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],n=null;e.addEventListener(\"webglcontextcreationerror\",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o[\"default\"].setUa(e);var t={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),\"ios\"===t.os.name&&t.browser.webview&&(t.browser.version=\"-1\"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{\"default\":e}}(i);agent.VERSION=\"2.1.2\",t[\"default\"]=agent,e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){\"use strict\";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,\"i\").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i[\"default\"].browser,i[\"default\"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i[\"default\"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i[\"default\"].defaultString.browser.version,r=new RegExp(\"(\"+e+\")\",\"i\").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i[\"default\"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i[\"default\"].os,e)}function getOsName(){return getIdentityStringFromArray(i[\"default\"].os,i[\"default\"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i[\"default\"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp(\"(\"+a+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=void 0;t[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};t[\"default\"]=r,e.exports=t[\"default\"]}])})},function(e,t,n){\"use strict\";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(7);i[\"default\"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i[\"default\"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i[\"default\"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i[\"default\"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i[\"default\"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i[\"default\"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})[\"catch\"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on(\"change\",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){\"boolean\"==typeof e&&this._yawPitchControl.option(\"useZoom\",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option(\"useKeyboard\",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option(\"useGyro\",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option(\"fovRange\",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option(\"yawRange\",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option(\"pitchRange\",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option(\"showPolePoint\",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option(\"pitchRange\"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new a[\"default\"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f[\"default\"]:p[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement(\"canvas\");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n(\"ImageLoader is not initialized\");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension(\"WEBGL_lose_context\");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*g,i=t*g;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+l[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l[\"default\"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=l[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l[\"default\"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l[\"default\"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l[\"default\"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,\"aVertexPosition\"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=e.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=e.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,\"aTextureCoord\"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l[\"default\"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i[\"default\"]);t[\"default\"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=v},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if(\"object\"===(void 0===e?\"undefined\":r(e))?(t=e.src,n=e.type):\"string\"==typeof e&&(t=e),!t)return!1;var i=document.createElement(\"source\");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:\"string\"!=typeof e&&\"object\"!==(void 0===e?\"undefined\":r(e))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once(\"loadeddata\",function(){return t(e._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t[\"default\"]=a},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i[\"default\"],t.WebGLUtils=a[\"default\"]},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn(\"Image width(\"+r+\") exceeds device limit(\"+i+\"))\");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,v=m+60+1;n.push(m,v,m+1,v,v+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i[\"default\"]);t[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){\"use strict\";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return\"string\"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return\"showPolePoint\"===e||\"fov\"===e||\"aspectRatio\"===e||\"yawRange\"===e||\"pitchRange\"===e})&&this._updateControlScale(),e.some(function(e){return\"fovRange\"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return\"useGyro\"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return\"useKeyboard\"===e})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return\"useZoom\"===e})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);v.VERSION=\"3.0.0-rc\",t[\"default\"]=v},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i[\"default\"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",i[\"default\"].radToDeg*a[\"default\"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t[\"default\"]=u[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf(\"Android\"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i[\"default\"]);t[\"default\"]=s},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),v=.98,g=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p[\"default\"],t.accelerometer=new u[\"default\"].Vector3,t.gyroscope=new u[\"default\"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m[\"default\"](v),t.posePredictor=new a[\"default\"](g),t.filterToWorldQ=new u[\"default\"].Quaternion,t.isFirefoxAndroid=l[\"default\"].isFirefoxAndroid(),t.isIOS=l[\"default\"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u[\"default\"].Quaternion,t.worldToScreenQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l[\"default\"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u[\"default\"].Quaternion,t.deviceMotion.on(\"devicemotion\",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger(\"change\",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u[\"default\"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i[\"default\"]);t[\"default\"]=y},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i[\"default\"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n0?1:-1,_=a[\"default\"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a[\"default\"].fromValues(0,d,0):a[\"default\"].fromValues(d,0,0),a[\"default\"].transformQuat(_,_,u),a[\"default\"].transformQuat(m,m,u);var v=_,g=m,y=a[\"default\"].create();a[\"default\"].cross(y,v,g),a[\"default\"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(h,h,u),c=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a[\"default\"].create();a[\"default\"].subtract(T,c,a[\"default\"].scale(a[\"default\"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a[\"default\"].length(T)*a[\"default\"].length(h));x>1&&(x=1);var P=Math.acos(x),A=a[\"default\"].cross(a[\"default\"].create(),h,T);E=w*A[0]+R*A[1]+b*A[2];var C=void 0;C=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var I=P*C*d;return i[\"default\"].toDegree(I)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return\"number\"!=typeof e?\"Not a number\":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l[\"default\"].create();return l[\"default\"].rotateY(n,n,i[\"default\"].toRadian(e)),l[\"default\"].rotateX(n,n,i[\"default\"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i[\"default\"].toDegree(d.extractYawFromQuat(e)),pitch:i[\"default\"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i[\"default\"],t.mat4=f[\"default\"],t.quat=l[\"default\"],t.vec2=u[\"default\"],t.vec3=a[\"default\"],t.ROTATE_CONSTANT=p},function(e,t,n){\"use strict\";var r={};r.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){\"use strict\";function objectOrFunction(e){var t=typeof e;return null!==e&&(\"object\"===t||\"function\"===t)}function isFunction(e){return\"function\"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return\"data:\"+e+\";base64,\"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i=\"\",o=0;o-1?e.split(\"/\")[2]:e.split(\"/\")[0],t=t.split(\":\")[0]},e.exports=n},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();r.Float32Array=\"undefined\"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH=\"ontouchstart\"in r,t.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in r},function(e,t,n){\"use strict\";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",t.KEYMAP=i},function(e,n){e.exports=t},,function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={0:\"NO_ERROR\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",37442:\"CONTEXT_LOST_WEBGL\"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],n=null;e.addEventListener(\"webglcontextcreationerror\",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o[\"default\"].setUa(e);var t={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),\"ios\"===t.os.name&&t.browser.webview&&(t.browser.version=\"-1\"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{\"default\":e}}(i);agent.VERSION=\"2.1.2\",t[\"default\"]=agent,e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){\"use strict\";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,\"i\").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i[\"default\"].browser,i[\"default\"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i[\"default\"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i[\"default\"].defaultString.browser.version,r=new RegExp(\"(\"+e+\")\",\"i\").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i[\"default\"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i[\"default\"].os,e)}function getOsName(){return getIdentityStringFromArray(i[\"default\"].os,i[\"default\"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i[\"default\"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp(\"(\"+a+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=void 0;t[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};t[\"default\"]=r,e.exports=t[\"default\"]}])})},function(e,t,n){\"use strict\";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(7);i[\"default\"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i[\"default\"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i[\"default\"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i[\"default\"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i[\"default\"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i[\"default\"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})[\"catch\"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on(\"change\",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){\"boolean\"==typeof e&&this._yawPitchControl.option(\"useZoom\",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option(\"useKeyboard\",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option(\"useGyro\",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option(\"fovRange\",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option(\"yawRange\",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option(\"pitchRange\",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option(\"showPolePoint\",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option(\"pitchRange\"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new a[\"default\"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f[\"default\"]:p[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement(\"canvas\");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n(\"ImageLoader is not initialized\");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension(\"WEBGL_lose_context\");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*g,i=t*g;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+l[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l[\"default\"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=l[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l[\"default\"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l[\"default\"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l[\"default\"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,\"aVertexPosition\"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=e.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=e.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,\"aTextureCoord\"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l[\"default\"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i[\"default\"]);t[\"default\"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=v},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if(\"object\"===(void 0===e?\"undefined\":r(e))?(t=e.src,n=e.type):\"string\"==typeof e&&(t=e),!t)return!1;var i=document.createElement(\"source\");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:\"string\"!=typeof e&&\"object\"!==(void 0===e?\"undefined\":r(e))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once(\"loadeddata\",function(){return t(e._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t[\"default\"]=a},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i[\"default\"],t.WebGLUtils=a[\"default\"]},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn(\"Image width(\"+r+\") exceeds device limit(\"+i+\"))\");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,v=m+60+1;n.push(m,v,m+1,v,v+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i[\"default\"]);t[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){\"use strict\";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return\"string\"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return\"showPolePoint\"===e||\"fov\"===e||\"aspectRatio\"===e||\"yawRange\"===e||\"pitchRange\"===e})&&this._updateControlScale(),e.some(function(e){return\"fovRange\"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return\"useGyro\"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return\"useKeyboard\"===e})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return\"useZoom\"===e})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);v.VERSION=\"3.0.0-rc\",t[\"default\"]=v},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i[\"default\"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",i[\"default\"].radToDeg*a[\"default\"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t[\"default\"]=u[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf(\"Android\"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i[\"default\"]);t[\"default\"]=s},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),v=.98,g=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p[\"default\"],t.accelerometer=new u[\"default\"].Vector3,t.gyroscope=new u[\"default\"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m[\"default\"](v),t.posePredictor=new a[\"default\"](g),t.filterToWorldQ=new u[\"default\"].Quaternion,t.isFirefoxAndroid=l[\"default\"].isFirefoxAndroid(),t.isIOS=l[\"default\"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u[\"default\"].Quaternion,t.worldToScreenQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l[\"default\"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u[\"default\"].Quaternion,t.deviceMotion.on(\"devicemotion\",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger(\"change\",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u[\"default\"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i[\"default\"]);t[\"default\"]=y},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i[\"default\"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n발생할 커스텀 이벤트의 이름\n * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터\n * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고\n * @example\n class Some extends eg.Component {\n some(){\n \tif(this.trigger(\"beforeHi\")){ // When event call to stop return false.\n \tthis.trigger(\"hi\");// fire hi event.\n \t}\n }\n }\n const some = new Some();\n some.on(\"beforeHi\", (e) => {\n if(condition){\n \te.stop(); // When event call to stop, `hi` event not call.\n }\n });\n some.on(\"hi\", (e) => {\n // `currentTarget` is component instance.\n console.log(some === e.currentTarget); // true\n });\n // If you want to more know event design. You can see article.\n // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F\n */\n\n\n\tComponent.prototype.trigger = function trigger(eventName) {\n\t\tvar customEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar handlerList = this._eventHandler[eventName] || [];\n\t\tvar hasHandlerList = handlerList.length > 0;\n\n\t\tif (!hasHandlerList) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If detach method call in handler in first time then handeler list calls.\n\t\thandlerList = handlerList.concat();\n\n\t\tcustomEvent.eventType = eventName;\n\n\t\tvar isCanceled = false;\n\t\tvar arg = [customEvent];\n\t\tvar i = 0;\n\n\t\tcustomEvent.stop = function () {\n\t\t\tisCanceled = true;\n\t\t};\n\t\tcustomEvent.currentTarget = this;\n\n\t\tfor (var _len = arguments.length, restParam = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t\t\trestParam[_key - 2] = arguments[_key];\n\t\t}\n\n\t\tif (restParam.length >= 1) {\n\t\t\targ = arg.concat(restParam);\n\t\t}\n\n\t\tfor (i = 0; handlerList[i]; i++) {\n\t\t\thandlerList[i].apply(this, arg);\n\t\t}\n\n\t\treturn !isCanceled;\n\t};\n\t/**\n * Executed event just one time.\n * @ko 이벤트가 한번만 실행된다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n alert(\"hi\");\n }\n thing() {\n this.once(\"hi\", this.hi);\n }\n }\n var some = new Some();\n some.thing();\n some.trigger(\"hi\");\n // fire alert(\"hi\");\n some.trigger(\"hi\");\n // Nothing happens\n */\n\n\n\tComponent.prototype.once = function once(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar i = void 0;\n\n\t\t\tfor (i in eventHash) {\n\t\t\t\tthis.once(i, eventHash[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar self = this;\n\n\t\t\tthis.on(eventName, function listener() {\n\t\t\t\tfor (var _len2 = arguments.length, arg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\t\targ[_key2] = arguments[_key2];\n\t\t\t\t}\n\n\t\t\t\thandlerToAttach.apply(self, arg);\n\t\t\t\tself.off(eventName, listener);\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n * Checks whether an event has been attached to a component.\n * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다.\n * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름\n * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부\n * @example\n class Some extends eg.Component {\n some() {\n this.hasOn(\"hi\");// check hi event.\n }\n }\n */\n\n\n\tComponent.prototype.hasOn = function hasOn(eventName) {\n\t\treturn !!this._eventHandler[eventName];\n\t};\n\n\t/**\n * Attaches an event to a component.\n * @ko 컴포넌트에 이벤트를 등록한다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.on(\"hi\",this.hi); //attach event\n }\n }\n */\n\n\n\tComponent.prototype.on = function on(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar name = void 0;\n\n\t\t\tfor (name in eventHash) {\n\t\t\t\tthis.on(name, eventHash[name]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\t\tif (typeof handlerList === \"undefined\") {\n\t\t\t\tthis._eventHandler[eventName] = [];\n\t\t\t\thandlerList = this._eventHandler[eventName];\n\t\t\t}\n\n\t\t\thandlerList.push(handlerToAttach);\n\t\t}\n\n\t\treturn this;\n\t};\n\t/**\n * Detaches an event from the component.\n * @ko 컴포넌트에 등록된 이벤트를 해제한다\n * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름\n * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.off(\"hi\",this.hi); //detach event\n }\n }\n */\n\n\n\tComponent.prototype.off = function off(eventName, handlerToDetach) {\n\t\t// All event detach.\n\t\tif (typeof eventName === \"undefined\") {\n\t\t\tthis._eventHandler = {};\n\t\t\treturn this;\n\t\t}\n\n\t\t// All handler of specific event detach.\n\t\tif (typeof handlerToDetach === \"undefined\") {\n\t\t\tif (typeof eventName === \"string\") {\n\t\t\t\tthis._eventHandler[eventName] = undefined;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar eventHash = eventName;\n\t\t\t\tvar name = void 0;\n\n\t\t\t\tfor (name in eventHash) {\n\t\t\t\t\tthis.off(name, eventHash[name]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// The handler of specific event detach.\n\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\tif (handlerList) {\n\t\t\tvar k = void 0;\n\t\t\tvar handlerFunction = void 0;\n\n\t\t\tfor (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) {\n\t\t\t\tif (handlerFunction === handlerToDetach) {\n\t\t\t\t\thandlerList = handlerList.splice(k, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\treturn Component;\n}();\n\nexports[\"default\"] = Component;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=component.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/component/dist/component.js\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/axes project is licensed under the MIT license\r\n * \r\n * @egjs/axes JavaScript library\r\n * https://github.com/naver/egjs-axes\r\n * \r\n * @version 2.3.3\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammerjs\", \"@egjs/component\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Axes\"] = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Axes\"] = factory(root[\"Hammer\"], root[\"eg\"][\"Component\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nfunction toArray(nodes) {\r\n // const el = Array.prototype.slice.call(nodes);\r\n // for IE8\r\n var el = [];\r\n for (var i = 0, len = nodes.length; i < len; i++) {\r\n el.push(nodes[i]);\r\n }\r\n return el;\r\n}\r\nexports.toArray = toArray;\r\nfunction $(param, multi) {\r\n if (multi === void 0) { multi = false; }\r\n var el;\r\n if (typeof param === \"string\") {\r\n // check if string is HTML tag format\r\n var match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\r\n // creating element\r\n if (match) {\r\n var dummy = document.createElement(\"div\");\r\n dummy.innerHTML = param;\r\n el = toArray(dummy.childNodes);\r\n }\r\n else {\r\n el = toArray(document.querySelectorAll(param));\r\n }\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n else if (param === window) {\r\n el = param;\r\n }\r\n else if (param.nodeName &&\r\n (param.nodeType === 1 || param.nodeType === 9)) {\r\n el = param;\r\n }\r\n else if ((\"jQuery\" in window && param instanceof jQuery) ||\r\n param.constructor.prototype.jquery) {\r\n el = multi ? param.toArray() : param.get(0);\r\n }\r\n else if (Array.isArray(param)) {\r\n el = param.map(function (v) { return $(v); });\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n return el;\r\n}\r\nexports.$ = $;\r\nvar raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame;\r\nvar caf = window.cancelAnimationFrame || window.webkitCancelAnimationFrame;\r\nif (raf && !caf) {\r\n var keyInfo_1 = {};\r\n var oldraf_1 = raf;\r\n raf = function (callback) {\r\n function wrapCallback(timestamp) {\r\n if (keyInfo_1[key]) {\r\n callback(timestamp);\r\n }\r\n }\r\n var key = oldraf_1(wrapCallback);\r\n keyInfo_1[key] = true;\r\n return key;\r\n };\r\n caf = function (key) {\r\n delete keyInfo_1[key];\r\n };\r\n}\r\nelse if (!(raf && caf)) {\r\n raf = function (callback) {\r\n return window.setTimeout(function () {\r\n callback(window.performance && window.performance.now && window.performance.now() || new Date().getTime());\r\n }, 16);\r\n };\r\n caf = window.clearTimeout;\r\n}\r\n/**\r\n * A polyfill for the window.requestAnimationFrame() method.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame\r\n * @private\r\n */\r\nfunction requestAnimationFrame(fp) {\r\n return raf(fp);\r\n}\r\nexports.requestAnimationFrame = requestAnimationFrame;\r\n;\r\n/**\r\n* A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method.\r\n* @param {Number} key −\tThe ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값\r\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame\r\n* @private\r\n*/\r\nfunction cancelAnimationFrame(key) {\r\n caf(key);\r\n}\r\nexports.cancelAnimationFrame = cancelAnimationFrame;\r\n;\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nexports.SUPPORT_TOUCH = \"ontouchstart\" in window;\r\nexports.UNIQUEKEY = \"_EGJS_AXES_INPUTTYPE_\";\r\nfunction toAxis(source, offset) {\r\n return offset.reduce(function (acc, v, i) {\r\n if (source[i]) {\r\n acc[source[i]] = v;\r\n }\r\n return acc;\r\n }, {});\r\n}\r\nexports.toAxis = toAxis;\r\n;\r\nfunction createHammer(element, options) {\r\n try {\r\n // create Hammer\r\n return new Hammer.Manager(element, __assign({}, options));\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\nexports.createHammer = createHammer;\r\n;\r\nfunction convertInputType(inputType) {\r\n if (inputType === void 0) { inputType = []; }\r\n var hasTouch = false;\r\n var hasMouse = false;\r\n inputType.forEach(function (v) {\r\n switch (v) {\r\n case \"mouse\":\r\n hasMouse = true;\r\n break;\r\n case \"touch\": hasTouch = exports.SUPPORT_TOUCH;\r\n }\r\n });\r\n return (hasTouch && Hammer.TouchInput) ||\r\n (hasMouse && Hammer.MouseInput) || null;\r\n}\r\nexports.convertInputType = convertInputType;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar Coordinate = {\r\n getInsidePosition: function (destPos, range, circular, bounce) {\r\n var toDestPos = destPos;\r\n var targetRange = [\r\n circular[0] ? range[0] : (bounce ? range[0] - bounce[0] : range[0]),\r\n circular[1] ? range[1] : (bounce ? range[1] + bounce[1] : range[1])\r\n ];\r\n toDestPos = Math.max(targetRange[0], toDestPos);\r\n toDestPos = Math.min(targetRange[1], toDestPos);\r\n return +toDestPos.toFixed(5);\r\n },\r\n // determine outside\r\n isOutside: function (pos, range) {\r\n return pos < range[0] || pos > range[1];\r\n },\r\n getDuration: function (distance, deceleration) {\r\n var duration = Math.sqrt(distance / deceleration * 2);\r\n // when duration is under 100, then value is zero\r\n return duration < 100 ? 0 : duration;\r\n },\r\n isCircularable: function (destPos, range, circular) {\r\n return (circular[1] && destPos > range[1]) ||\r\n (circular[0] && destPos < range[0]);\r\n },\r\n getCirculatedPos: function (pos, range, circular) {\r\n var toPos = pos;\r\n var min = range[0];\r\n var max = range[1];\r\n var length = max - min;\r\n if (circular[1] && pos > max) {\r\n toPos = (toPos - max) % length + min;\r\n }\r\n if (circular[0] && pos < min) {\r\n toPos = (toPos - min) % length + max;\r\n }\r\n return +toPos.toFixed(5);\r\n }\r\n};\r\nexports[\"default\"] = Coordinate;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\n;\r\nvar AxisManager = /** @class */ (function () {\r\n function AxisManager(axis, options) {\r\n var _this = this;\r\n this.axis = axis;\r\n this.options = options;\r\n this._complementOptions();\r\n this._pos = Object.keys(this.axis).reduce(function (acc, v) {\r\n acc[v] = _this.axis[v].range[0];\r\n return acc;\r\n }, {});\r\n }\r\n AxisManager.equal = function (target, base) {\r\n for (var k in target) {\r\n if (target[k] !== base[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * set up 'css' expression\r\n * @private\r\n */\r\n AxisManager.prototype._complementOptions = function () {\r\n var _this = this;\r\n Object.keys(this.axis).forEach(function (axis) {\r\n _this.axis[axis] = __assign({\r\n range: [0, 100],\r\n bounce: [0, 0],\r\n circular: [false, false]\r\n }, _this.axis[axis]);\r\n [\"bounce\", \"circular\"].forEach(function (v) {\r\n var axisOption = _this.axis;\r\n var key = axisOption[axis][v];\r\n if (/string|number|boolean/.test(typeof key)) {\r\n axisOption[axis][v] = [key, key];\r\n }\r\n });\r\n });\r\n };\r\n AxisManager.prototype.getDelta = function (depaPos, destPos) {\r\n var fullDepaPos = this.get(depaPos);\r\n return this.map(this.get(destPos), function (v, k) { return v - fullDepaPos[k]; });\r\n };\r\n AxisManager.prototype.get = function (axes) {\r\n var _this = this;\r\n if (axes && Array.isArray(axes)) {\r\n return axes.reduce(function (acc, v) {\r\n if (v && (v in _this._pos)) {\r\n acc[v] = _this._pos[v];\r\n }\r\n return acc;\r\n }, {});\r\n }\r\n else {\r\n return __assign({}, this._pos, (axes || {}));\r\n }\r\n };\r\n AxisManager.prototype.moveTo = function (pos) {\r\n var _this = this;\r\n var delta = this.map(this._pos, function (v, key) {\r\n return pos[key] ? pos[key] - _this._pos[key] : 0;\r\n });\r\n this.set(pos);\r\n return {\r\n pos: __assign({}, this._pos),\r\n delta: delta\r\n };\r\n };\r\n AxisManager.prototype.set = function (pos) {\r\n for (var k in pos) {\r\n if (k && (k in this._pos)) {\r\n this._pos[k] = pos[k];\r\n }\r\n }\r\n };\r\n AxisManager.prototype.every = function (pos, callback) {\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n if (!callback(pos[k], k, axisOptions[k])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n AxisManager.prototype.filter = function (pos, callback) {\r\n var filtered = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n callback(pos[k], k, axisOptions[k]) && (filtered[k] = pos[k]);\r\n }\r\n }\r\n return filtered;\r\n };\r\n AxisManager.prototype.map = function (pos, callback) {\r\n var tranformed = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n tranformed[k] = callback(pos[k], k, axisOptions[k]);\r\n }\r\n }\r\n return tranformed;\r\n };\r\n AxisManager.prototype.isOutside = function (axes) {\r\n return !this.every(axes ? this.get(axes) : this._pos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); });\r\n };\r\n return AxisManager;\r\n}());\r\nexports.AxisManager = AxisManager;\r\n;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"DIRECTION_NONE\"] = 1] = \"DIRECTION_NONE\";\r\n DIRECTION[DIRECTION[\"DIRECTION_LEFT\"] = 2] = \"DIRECTION_LEFT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_RIGHT\"] = 4] = \"DIRECTION_RIGHT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_HORIZONTAL\"] = 6] = \"DIRECTION_HORIZONTAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_UP\"] = 8] = \"DIRECTION_UP\";\r\n DIRECTION[DIRECTION[\"DIRECTION_DOWN\"] = 16] = \"DIRECTION_DOWN\";\r\n DIRECTION[DIRECTION[\"DIRECTION_VERTICAL\"] = 24] = \"DIRECTION_VERTICAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_ALL\"] = 30] = \"DIRECTION_ALL\";\r\n})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));\r\nexports.TRANSFORM = (function () {\r\n var bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\r\n var target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\r\n for (var i = 0, len = target.length; i < len; i++) {\r\n if (target[i] in bodyStyle) {\r\n return target[i];\r\n }\r\n }\r\n return \"\";\r\n})();\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar Axes_1 = __webpack_require__(7);\r\nvar PanInput_1 = __webpack_require__(13);\r\nvar PinchInput_1 = __webpack_require__(14);\r\nvar WheelInput_1 = __webpack_require__(15);\r\nvar MoveKeyInput_1 = __webpack_require__(16);\r\nAxes_1[\"default\"].PanInput = PanInput_1.PanInput;\r\nAxes_1[\"default\"].PinchInput = PinchInput_1.PinchInput;\r\nAxes_1[\"default\"].WheelInput = WheelInput_1.WheelInput;\r\nAxes_1[\"default\"].MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\r\nmodule.exports = Axes_1[\"default\"];\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Component = __webpack_require__(8);\r\nvar AnimationManager_1 = __webpack_require__(9);\r\nvar EventManager_1 = __webpack_require__(10);\r\nvar InterruptManager_1 = __webpack_require__(11);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar InputObserver_1 = __webpack_require__(12);\r\nvar const_1 = __webpack_require__(5);\r\n/**\r\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\r\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @property {Number[]} [range] The coordinate of range 좌표 범위\r\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\r\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\r\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\r\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\r\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\r\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\r\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\r\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\r\n**/\r\n/**\r\n * @typedef {Object} AxesOption The option object of the eg.Axes module\r\n * @ko eg.Axes 모듈의 옵션 객체\r\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\r\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\r\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\r\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\r\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
\r\n**/\r\n/**\r\n * @class eg.Axes\r\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\r\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\r\n * @extends eg.Component\r\n *\r\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\r\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\r\n *\r\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\r\n * @example\r\n *\r\n * // 1. Initialize eg.Axes\r\n * const axes = new eg.Axes({\r\n *\tsomething1: {\r\n *\t\trange: [0, 150],\r\n *\t\tbounce: 50\r\n *\t},\r\n *\tsomething2: {\r\n *\t\trange: [0, 200],\r\n *\t\tbounce: 100\r\n *\t},\r\n *\tsomethingN: {\r\n *\t\trange: [1, 10],\r\n *\t}\r\n * }, {\r\n * deceleration : 0.0024\r\n * });\r\n *\r\n * // 2. attach event handler\r\n * axes.on({\r\n *\t\"hold\" : function(evt) {\r\n *\t},\r\n *\t\"release\" : function(evt) {\r\n *\t},\r\n *\t\"animationStart\" : function(evt) {\r\n *\t},\r\n *\t\"animationEnd\" : function(evt) {\r\n *\t},\r\n *\t\"change\" : function(evt) {\r\n *\t}\r\n * });\r\n *\r\n * // 3. Initialize inputTypes\r\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\r\n *\tscale: [0.5, 1]\r\n * });\r\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\r\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\r\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\r\n *\tscale: 1.5\r\n * });\r\n *\r\n * // 4. Connect eg.Axes and InputTypes\r\n * // [PanInput] When the mouse or touchscreen is down and moved.\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\r\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\r\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\r\n *\r\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something2\", pinchInputArea);\r\n */\r\nvar Axes = /** @class */ (function (_super) {\r\n __extends(Axes, _super);\r\n function Axes(axis, options, startPos) {\r\n if (axis === void 0) { axis = {}; }\r\n var _this = _super.call(this) || this;\r\n _this.axis = axis;\r\n _this._inputs = [];\r\n _this.options = __assign({\r\n easing: function easeOutCubic(x) {\r\n return 1 - Math.pow(1 - x, 3);\r\n },\r\n interruptable: true,\r\n maximumDuration: Infinity,\r\n minimumDuration: 0,\r\n deceleration: 0.0006\r\n }, options);\r\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\r\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\r\n _this.em = new EventManager_1.EventManager(_this);\r\n _this.am = new AnimationManager_1.AnimationManager(_this);\r\n _this.io = new InputObserver_1.InputObserver(_this);\r\n _this.em.setAnimationManager(_this.am);\r\n startPos && _this.em.triggerChange(startPos);\r\n return _this;\r\n }\r\n /**\r\n * Connect the axis of eg.Axes to the inputType.\r\n * @ko eg.Axes의 축과 inputType을 연결한다\r\n * @method eg.Axes#connect\r\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\r\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\r\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\r\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\r\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\r\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\r\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\r\n */\r\n Axes.prototype.connect = function (axes, inputType) {\r\n var mapped;\r\n if (typeof axes === \"string\") {\r\n mapped = axes.split(\" \");\r\n }\r\n else {\r\n mapped = axes.concat();\r\n }\r\n // check same instance\r\n if (~this._inputs.indexOf(inputType)) {\r\n this.disconnect(inputType);\r\n }\r\n // check same element in hammer type for share\r\n if (\"hammer\" in inputType) {\r\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\r\n if (targets.length) {\r\n inputType.hammer = targets[0].hammer;\r\n }\r\n }\r\n inputType.mapAxes(mapped);\r\n inputType.connect(this.io);\r\n this._inputs.push(inputType);\r\n return this;\r\n };\r\n /**\r\n * Disconnect the axis of eg.Axes from the inputType.\r\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\r\n * @method eg.Axes#disconnect\r\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * const input1 = new eg.Axes.PanInput(\"#area1\");\r\n * const input2 = new eg.Axes.PanInput(\"#area2\");\r\n * const input3 = new eg.Axes.PanInput(\"#area3\");\r\n *\r\n * axes.connect(\"x\", input1);\r\n * .connect(\"x xOther\", input2)\r\n * .connect([\"xOther\", \"x\"], input3);\r\n *\r\n * axes.disconnect(input1); // disconnects input1\r\n * axes.disconnect(); // disconnects all of them\r\n */\r\n Axes.prototype.disconnect = function (inputType) {\r\n if (inputType) {\r\n var index = this._inputs.indexOf(inputType);\r\n if (index >= 0) {\r\n this._inputs[index].disconnect();\r\n this._inputs.splice(index, 1);\r\n }\r\n }\r\n else {\r\n this._inputs.forEach(function (v) { return v.disconnect(); });\r\n this._inputs = [];\r\n }\r\n return this;\r\n };\r\n /**\r\n * Returns the current position of the coordinates.\r\n * @ko 좌표의 현재 위치를 반환한다\r\n * @method eg.Axes#get\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Object.} Axis coordinate information 축 좌표 정보\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\r\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\r\n */\r\n Axes.prototype.get = function (axes) {\r\n return this.axm.get(axes);\r\n };\r\n /**\r\n * Moves an axis to specific coordinates.\r\n * @ko 좌표를 이동한다.\r\n * @method eg.Axes#setTo\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setTo({\"x\": 30, \"zoom\": 60});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\r\n */\r\n Axes.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setTo(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Moves an axis from the current coordinates to specific coordinates.\r\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\r\n * @method eg.Axes#setBy\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setBy({\"x\": 30, \"zoom\": 10});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\r\n */\r\n Axes.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setBy(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Returns whether there is a coordinate in the bounce area of ​​the target axis.\r\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\r\n * @method eg.Axes#isBounceArea\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.isBounceArea([\"x\"]);\r\n * axes.isBounceArea([\"x\", \"zoom\"]);\r\n * axes.isBounceArea();\r\n */\r\n Axes.prototype.isBounceArea = function (axes) {\r\n return this.axm.isOutside(axes);\r\n };\r\n /**\r\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\r\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\r\n * @method eg.Axes#destroy\r\n */\r\n Axes.prototype.destroy = function () {\r\n this.disconnect();\r\n this.em.destroy();\r\n };\r\n Axes.VERSION = \"3.0.0-rc\";\r\n /**\r\n * @name eg.Axes.TRANSFORM\r\n * @desc Returns the transform attribute with CSS vendor prefixes.\r\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\r\n *\r\n * @constant\r\n * @type {String}\r\n * @example\r\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\r\n */\r\n Axes.TRANSFORM = const_1.TRANSFORM;\r\n /**\r\n * @name eg.Axes.DIRECTION_NONE\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\r\n /**\r\n * @name eg.Axes.DIRECTION_LEFT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\r\n /**\r\n * @name eg.Axes.DIRECTION_RIGHT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\r\n /**\r\n * @name eg.Axes.DIRECTION_UP\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\r\n /**\r\n * @name eg.Axes.DIRECTION_DOWN\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\r\n /**\r\n * @name eg.Axes.DIRECTION_HORIZONTAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_VERTICAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_ALL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\r\n return Axes;\r\n}(Component));\r\nexports[\"default\"] = Axes;\r\n;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar utils_1 = __webpack_require__(0);\r\nvar AnimationManager = /** @class */ (function () {\r\n function AnimationManager(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.animationEnd = this.animationEnd.bind(this);\r\n }\r\n AnimationManager.getDuration = function (duration, min, max) {\r\n return Math.max(Math.min(duration, max), min);\r\n };\r\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\r\n var _this = this;\r\n var duration;\r\n if (typeof wishDuration !== \"undefined\") {\r\n duration = wishDuration;\r\n }\r\n else {\r\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\r\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\r\n }\r\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\r\n };\r\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\r\n var depaPos = this.axm.get();\r\n var destPos = pos;\r\n var inputEvent = option && option.event || null;\r\n return {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: inputEvent,\r\n input: option && option.input || null,\r\n isTrusted: !!inputEvent,\r\n done: this.animationEnd\r\n };\r\n };\r\n AnimationManager.prototype.grab = function (axes, option) {\r\n if (this._animateParam && axes.length) {\r\n var orgPos_1 = this.axm.get(axes);\r\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\r\n this.em.triggerChange(pos, option, !!option);\r\n }\r\n this._animateParam = null;\r\n this._raf && utils_1.cancelAnimationFrame(this._raf);\r\n this._raf = null;\r\n this.em.triggerAnimationEnd(!!(option && option.event));\r\n }\r\n };\r\n AnimationManager.prototype.getEventInfo = function () {\r\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\r\n return {\r\n input: this._animateParam.input,\r\n event: this._animateParam.inputEvent\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n AnimationManager.prototype.restore = function (option) {\r\n var pos = this.axm.get();\r\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\r\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\r\n };\r\n AnimationManager.prototype.animationEnd = function () {\r\n var beforeParam = this.getEventInfo();\r\n this._animateParam = null;\r\n // for Circular\r\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\r\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\r\n this.itm.setInterrupt(false);\r\n this.em.triggerAnimationEnd(!!beforeParam);\r\n if (this.axm.isOutside()) {\r\n this.restore(beforeParam);\r\n }\r\n else {\r\n this.em.triggerFinish(!!beforeParam);\r\n }\r\n };\r\n AnimationManager.prototype.animateLoop = function (param, complete) {\r\n this._animateParam = __assign({}, param);\r\n this._animateParam.startTime = new Date().getTime();\r\n if (param.duration) {\r\n var info_1 = this._animateParam;\r\n var self_1 = this;\r\n (function loop() {\r\n self_1._raf = null;\r\n if (self_1.frame(info_1) >= 1) {\r\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\r\n self_1.em.triggerChange(param.destPos);\r\n }\r\n complete();\r\n return;\r\n } // animationEnd\r\n self_1._raf = utils_1.requestAnimationFrame(loop);\r\n })();\r\n }\r\n else {\r\n this.em.triggerChange(param.destPos);\r\n complete();\r\n }\r\n };\r\n AnimationManager.prototype.getUserControll = function (param) {\r\n var userWish = param.setTo();\r\n userWish.destPos = this.axm.get(userWish.destPos);\r\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\r\n return userWish;\r\n };\r\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\r\n var _this = this;\r\n var param = this.createAnimationParam(destPos, duration, option);\r\n var depaPos = __assign({}, param.depaPos);\r\n var retTrigger = this.em.triggerAnimationStart(param);\r\n // to control\r\n var userWish = this.getUserControll(param);\r\n // You can't stop the 'animationStart' event when 'circular' is true.\r\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\r\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\r\n }\r\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\r\n var inputEvent = option && option.event || null;\r\n this.animateLoop({\r\n depaPos: depaPos,\r\n destPos: userWish.destPos,\r\n duration: userWish.duration,\r\n delta: this.axm.getDelta(depaPos, userWish.destPos),\r\n isTrusted: !!inputEvent,\r\n inputEvent: inputEvent,\r\n input: option && option.input || null\r\n }, function () { return _this.animationEnd(); });\r\n }\r\n };\r\n // animation frame (0~1)\r\n AnimationManager.prototype.frame = function (param) {\r\n var curTime = new Date().getTime() - param.startTime;\r\n var easingPer = this.easing(curTime / param.duration);\r\n var toPos = param.depaPos;\r\n toPos = this.axm.map(toPos, function (v, k, opt) {\r\n v += param.delta[k] * easingPer;\r\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n });\r\n this.em.triggerChange(toPos);\r\n return easingPer;\r\n };\r\n AnimationManager.prototype.easing = function (p) {\r\n return p > 1 ? 1 : this.options.easing(p);\r\n };\r\n AnimationManager.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n var axes = Object.keys(pos);\r\n this.grab(axes);\r\n var orgPos = this.axm.get(axes);\r\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\r\n return this;\r\n }\r\n this.itm.setInterrupt(true);\r\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\r\n if (!Object.keys(movedPos).length) {\r\n return this;\r\n }\r\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\r\n }\r\n });\r\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\r\n return this;\r\n }\r\n if (duration > 0) {\r\n this.animateTo(movedPos, duration);\r\n }\r\n else {\r\n this.em.triggerChange(movedPos);\r\n this.itm.setInterrupt(false);\r\n }\r\n return this;\r\n };\r\n AnimationManager.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\r\n };\r\n return AnimationManager;\r\n}());\r\nexports.AnimationManager = AnimationManager;\r\n;\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(axes) {\r\n this.axes = axes;\r\n }\r\n /**\r\n * This event is fired when a user holds an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\r\n * @name eg.Axes#hold\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos coordinate 좌표 정보\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"hold\", function(event) {\r\n * // event.pos\r\n * // event.input\r\n * // event.inputEvent\r\n * // isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerHold = function (pos, option) {\r\n this.axes.trigger(\"hold\", {\r\n pos: pos,\r\n input: option.input || null,\r\n inputEvent: option.event || null,\r\n isTrusted: true\r\n });\r\n };\r\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\r\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\r\n * @name set\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\r\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\r\n * @name setTo\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationStart\", function(event) {\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n /**\r\n * This event is fired when a user release an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\r\n * @name eg.Axes#release\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'release' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerRelease = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n this.axes.trigger(\"release\", param);\r\n };\r\n /**\r\n * This event is fired when coordinate changes.\r\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\r\n * @name eg.Axes#change\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos The coordinate 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * // event.pos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.holding\r\n * // event.set\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the coordinates to move after the 'change' event.\r\n * // it works when the holding value of the change event is true.\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n EventManager.prototype.triggerChange = function (pos, option, holding) {\r\n if (option === void 0) { option = null; }\r\n if (holding === void 0) { holding = false; }\r\n var eventInfo = this.am.getEventInfo();\r\n var moveTo = this.am.axm.moveTo(pos);\r\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\r\n var param = {\r\n pos: moveTo.pos,\r\n delta: moveTo.delta,\r\n holding: holding,\r\n inputEvent: inputEvent,\r\n isTrusted: !!inputEvent,\r\n input: option && option.input || eventInfo && eventInfo.input || null,\r\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\r\n };\r\n this.axes.trigger(\"change\", param);\r\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\r\n };\r\n /**\r\n * This event is fired when animation starts.\r\n * @ko 에니메이션이 시작할 때 발생한다.\r\n * @name eg.Axes#animationStart\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationStart = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n return this.axes.trigger(\"animationStart\", param);\r\n };\r\n /**\r\n * This event is fired when animation ends.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#animationEnd\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationEnd\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"animationEnd\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n /**\r\n * This event is fired when all actions have been completed.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#finish\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"finish\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerFinish = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"finish\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n EventManager.prototype.createUserControll = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n // to controll\r\n var userControl = {\r\n destPos: __assign({}, pos),\r\n duration: duration\r\n };\r\n return function (toPos, userDuration) {\r\n toPos && (userControl.destPos = __assign({}, toPos));\r\n (userDuration !== undefined) && (userControl.duration = userDuration);\r\n return userControl;\r\n };\r\n };\r\n EventManager.prototype.setAnimationManager = function (am) {\r\n this.am = am;\r\n };\r\n EventManager.prototype.destroy = function () {\r\n this.axes.off();\r\n };\r\n return EventManager;\r\n}());\r\nexports.EventManager = EventManager;\r\n;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar InterruptManager = /** @class */ (function () {\r\n function InterruptManager(options) {\r\n this.options = options;\r\n this._prevented = false; // check whether the animation event was prevented\r\n }\r\n InterruptManager.prototype.isInterrupting = function () {\r\n // when interruptable is 'true', return value is always 'true'.\r\n return this.options.interruptable || this._prevented;\r\n };\r\n InterruptManager.prototype.isInterrupted = function () {\r\n return !this.options.interruptable && this._prevented;\r\n };\r\n InterruptManager.prototype.setInterrupt = function (prevented) {\r\n !this.options.interruptable && (this._prevented = prevented);\r\n };\r\n return InterruptManager;\r\n}());\r\nexports.InterruptManager = InterruptManager;\r\n;\r\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar InputObserver = /** @class */ (function () {\r\n function InputObserver(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\r\n this.isOutside = false;\r\n this.moveDistance = null;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.am = am;\r\n }\r\n // when move pointer is held in outside\r\n InputObserver.prototype.atOutside = function (pos) {\r\n var _this = this;\r\n if (this.isOutside) {\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var tn = opt.range[0] - opt.bounce[0];\r\n var tx = opt.range[1] + opt.bounce[1];\r\n return v > tx ? tx : (v < tn ? tn : v);\r\n });\r\n }\r\n else {\r\n // when start pointer is held in inside\r\n // get a initialization slope value to prevent smooth animation.\r\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var min = opt.range[0];\r\n var max = opt.range[1];\r\n var out = opt.bounce;\r\n if (v < min) {\r\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\r\n }\r\n else if (v > max) {\r\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\r\n }\r\n return v;\r\n });\r\n }\r\n };\r\n InputObserver.prototype.get = function (input) {\r\n return this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.hold = function (input, event) {\r\n if (this.itm.isInterrupted() || !input.axes.length) {\r\n return;\r\n }\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n this.itm.setInterrupt(true);\r\n this.am.grab(input.axes, changeOption);\r\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\r\n this.isOutside = this.axm.isOutside(input.axes);\r\n this.moveDistance = this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.change = function (input, event, offset) {\r\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\r\n return;\r\n }\r\n var depaPos = this.axm.get(input.axes);\r\n var destPos;\r\n // for outside logic\r\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\r\n this.moveDistance && (this.moveDistance = destPos);\r\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n // from outside to inside\r\n if (this.isOutside &&\r\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\r\n this.isOutside = false;\r\n }\r\n destPos = this.atOutside(destPos);\r\n this.em.triggerChange(destPos, {\r\n input: input,\r\n event: event\r\n }, true);\r\n };\r\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\r\n if (!this.itm.isInterrupting()) {\r\n return;\r\n }\r\n if (!this.moveDistance) {\r\n return;\r\n }\r\n var pos = this.axm.get(input.axes);\r\n var depaPos = this.axm.get();\r\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return pos[k] + v;\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\r\n }\r\n }));\r\n var duration = this.am.getDuration(destPos, pos, inputDuration);\r\n if (duration === 0) {\r\n destPos = __assign({}, depaPos);\r\n }\r\n // prepare params\r\n var param = {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: duration,\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: event,\r\n input: input,\r\n isTrusted: true\r\n };\r\n this.em.triggerRelease(param);\r\n this.moveDistance = null;\r\n // to contol\r\n var userWish = this.am.getUserControll(param);\r\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n if (isEqual || userWish.duration === 0) {\r\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\r\n this.itm.setInterrupt(false);\r\n if (this.axm.isOutside()) {\r\n this.am.restore(changeOption);\r\n }\r\n else {\r\n this.em.triggerFinish(true);\r\n }\r\n }\r\n else {\r\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\r\n }\r\n };\r\n return InputObserver;\r\n}());\r\nexports.InputObserver = InputObserver;\r\n;\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar const_1 = __webpack_require__(5);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\r\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\r\n * @property {String[]} [inputType=[\"touch\",\"mouse\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
\r\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\r\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\r\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\r\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PanInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\r\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\r\n *\r\n * @example\r\n * const pan = new eg.Axes.PanInput(\"#area\", {\r\n * \t\tinputType: [\"touch\"],\r\n * \t\tscale: [1, 1.3],\r\n * });\r\n *\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\r\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\r\n */\r\nvar PanInput = /** @class */ (function () {\r\n function PanInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n inputType: [\"touch\", \"mouse\"],\r\n scale: [1, 1],\r\n thresholdAngle: 45,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onHammerInput = this.onHammerInput.bind(this);\r\n this.onPanmove = this.onPanmove.bind(this);\r\n this.onPanend = this.onPanend.bind(this);\r\n }\r\n // get user's direction\r\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\r\n if (thresholdAngle < 0 || thresholdAngle > 90) {\r\n return const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n var toAngle = Math.abs(angle);\r\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\r\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n };\r\n PanInput.getNextOffset = function (speeds, deceleration) {\r\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\r\n var duration = Math.abs(normalSpeed / -deceleration);\r\n return [\r\n speeds[0] / 2 * duration,\r\n speeds[1] / 2 * duration\r\n ];\r\n };\r\n PanInput.useDirection = function (checkType, direction, userDirection) {\r\n if (userDirection) {\r\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\r\n ((direction & checkType) && (userDirection & checkType)));\r\n }\r\n else {\r\n return !!(direction & checkType);\r\n }\r\n };\r\n PanInput.prototype.mapAxes = function (axes) {\r\n var useHorizontal = !!axes[0];\r\n var useVertical = !!axes[1];\r\n if (useHorizontal && useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\r\n }\r\n else if (useHorizontal) {\r\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n }\r\n else if (useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n }\r\n else {\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n this.axes = axes;\r\n };\r\n PanInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n direction: this._direction,\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PanRecognizer.\r\n this.hammer.add(new Hammer.Pan(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer && this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n var inputClass = InputType_1.convertInputType(this.options.inputType);\r\n if (!inputClass) {\r\n throw new Error(\"Wrong inputType parameter!\");\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pan, hammerOption],\r\n ],\r\n inputClass: inputClass\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PanInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PanInput#destroy\r\n */\r\n PanInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PanInput#enable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PanInput#disable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PanInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PanInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\r\n };\r\n PanInput.prototype.onHammerInput = function (event) {\r\n if (this.isEnable()) {\r\n if (event.isFirst) {\r\n this.observer.hold(this, event);\r\n }\r\n else if (event.isFinal) {\r\n this.onPanend(event);\r\n }\r\n }\r\n };\r\n PanInput.prototype.onPanmove = function (event) {\r\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\r\n // not support offset properties in Hammerjs - start\r\n var prevInput = this.hammer.session.prevInput;\r\n /* eslint-disable no-param-reassign */\r\n if (prevInput) {\r\n event.offsetX = event.deltaX - prevInput.deltaX;\r\n event.offsetY = event.deltaY - prevInput.deltaY;\r\n }\r\n else {\r\n event.offsetX = 0;\r\n event.offsetY = 0;\r\n }\r\n var offset = this.getOffset([event.offsetX, event.offsetY], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\r\n ]);\r\n var prevent = offset.some(function (v) { return v !== 0; });\r\n if (prevent) {\r\n event.srcEvent.preventDefault();\r\n event.srcEvent.stopPropagation();\r\n }\r\n event.preventSystemEvent = prevent;\r\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.onPanend = function (event) {\r\n var offset = this.getOffset([\r\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\r\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\r\n ], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\r\n ]);\r\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"hammer.input\", this.onHammerInput)\r\n .on(\"panstart panmove\", this.onPanmove);\r\n };\r\n PanInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"hammer.input\", this.onHammerInput)\r\n .off(\"panstart panmove\", this.onPanmove);\r\n this.observer = null;\r\n };\r\n PanInput.prototype.getOffset = function (properties, useDirection) {\r\n var offset = [0, 0];\r\n var scale = this.options.scale;\r\n if (useDirection[0]) {\r\n offset[0] = (properties[0] * scale[0]);\r\n }\r\n if (useDirection[1]) {\r\n offset[1] = (properties[1] * scale[1]);\r\n }\r\n return offset;\r\n };\r\n return PanInput;\r\n}());\r\nexports.PanInput = PanInput;\r\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\r\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PinchInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\r\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n * @example\r\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something\", pinch);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\r\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\r\n */\r\nvar PinchInput = /** @class */ (function () {\r\n function PinchInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n this._base = null;\r\n this._prev = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onPinchStart = this.onPinchStart.bind(this);\r\n this.onPinchMove = this.onPinchMove.bind(this);\r\n this.onPinchEnd = this.onPinchEnd.bind(this);\r\n }\r\n PinchInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n PinchInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PinchRecognizer.\r\n this.hammer.add(new Hammer.Pinch(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pinch, hammerOption],\r\n ],\r\n inputClass: Hammer.TouchInput\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PinchInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PinchInput#destroy\r\n */\r\n PinchInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n PinchInput.prototype.onPinchStart = function (event) {\r\n this._base = this.observer.get(this)[this.axes[0]];\r\n var offset = this.getOffset(event.scale);\r\n this.observer.hold(this, event);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchMove = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchEnd = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\r\n this._base = null;\r\n this._prev = null;\r\n };\r\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\r\n if (prev === void 0) { prev = 1; }\r\n return this._base * (pinchScale - prev) * this.options.scale;\r\n };\r\n PinchInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"pinchstart\", this.onPinchStart)\r\n .on(\"pinchmove\", this.onPinchMove)\r\n .on(\"pinchend\", this.onPinchEnd);\r\n };\r\n PinchInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"pinchstart\", this.onPinchStart)\r\n .off(\"pinchmove\", this.onPinchMove)\r\n .off(\"pinchend\", this.onPinchEnd);\r\n this.observer = null;\r\n this._prev = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PinchInput#enable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PinchInput#disable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PinchInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PinchInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\r\n };\r\n return PinchInput;\r\n}());\r\nexports.PinchInput = PinchInput;\r\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\r\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.WheelInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\r\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when the mousewheel is moved.\r\n * axes.connect(\"something\", wheel);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\r\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\r\n */\r\nvar WheelInput = /** @class */ (function () {\r\n function WheelInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this._timer = null;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1\r\n }, options);\r\n this.onWheel = this.onWheel.bind(this);\r\n }\r\n WheelInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n WheelInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n WheelInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.WheelInput#destroy\r\n */\r\n WheelInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n WheelInput.prototype.onWheel = function (event) {\r\n var _this = this;\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n if (!this._isHolded) {\r\n this.observer.hold(this, event);\r\n this._isHolded = true;\r\n }\r\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale;\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(function () {\r\n if (_this._isHolded) {\r\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\r\n _this._isHolded = false;\r\n }\r\n }, 50);\r\n };\r\n WheelInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = true;\r\n };\r\n WheelInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.WheelInput#enable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.WheelInput#disable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.WheelInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n WheelInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return WheelInput;\r\n}());\r\nexports.WheelInput = WheelInput;\r\n;\r\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\nexports.KEYMAP = {\r\n LEFT_ARROW: 37,\r\n A: 65,\r\n UP_ARROW: 38,\r\n W: 87,\r\n RIGHT_ARROW: 39,\r\n D: 68,\r\n DOWN_ARROW: 40,\r\n S: 83\r\n};\r\n/**\r\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\r\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\r\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.MoveKeyInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\r\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\r\n * \t\tscale: [1, 1]\r\n * });\r\n *\r\n * // Connect 'x', 'y' axes when the moveKey is pressed.\r\n * axes.connect([\"x\", \"y\"], moveKey);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\r\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n */\r\nvar MoveKeyInput = /** @class */ (function () {\r\n function MoveKeyInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: [1, 1]\r\n }, options);\r\n this.onKeydown = this.onKeydown.bind(this);\r\n }\r\n MoveKeyInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n MoveKeyInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n // add tabindex=\"0\" to the container for making it focusable\r\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\r\n this.element.setAttribute(\"tabindex\", \"0\");\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n MoveKeyInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.MoveKeyInput#destroy\r\n */\r\n MoveKeyInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n MoveKeyInput.prototype.onKeydown = function (event) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n var isMoveKey = true;\r\n var offsets;\r\n var e = event;\r\n switch (e.keyCode) {\r\n case exports.KEYMAP.LEFT_ARROW:\r\n case exports.KEYMAP.A:\r\n offsets = [-this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.RIGHT_ARROW:\r\n case exports.KEYMAP.D:\r\n offsets = [this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.UP_ARROW:\r\n case exports.KEYMAP.W:\r\n offsets = [0, this.options.scale[1]];\r\n break;\r\n case exports.KEYMAP.DOWN_ARROW:\r\n case exports.KEYMAP.S:\r\n offsets = [0, -this.options.scale[1]];\r\n break;\r\n default:\r\n isMoveKey = false;\r\n }\r\n if (isMoveKey) {\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\r\n // Suppress \"double action\" if event handled\r\n e.preventDefault();\r\n }\r\n };\r\n MoveKeyInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = true;\r\n };\r\n MoveKeyInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.MoveKeyInput#enable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.MoveKeyInput#disable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.MoveKeyInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n MoveKeyInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return MoveKeyInput;\r\n}());\r\nexports.MoveKeyInput = MoveKeyInput;\r\n;\r\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=axes.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/axes/dist/axes.js\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 14\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 17\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\tres(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\t_this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 35\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 36\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 37\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 39\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 40\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 41\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 42\n// module chunks = 0 1 2 3"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACr2EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACllFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"PanoViewer/view360.panoviewer.pkgd.js","sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///webpack/bootstrap 300fcddb410135c43d6f?8ae8","webpack:///./~/@egjs/component/dist/component.js?12fb","webpack:///./src/utils/math-util.js?5f4c","webpack:///./src/utils/mathUtil/common.js?f2d8","webpack:///./~/es6-promise/dist/es6-promise.js?2ccc","webpack:///./~/webvr-polyfill/src/math-util.js?1e28","webpack:///./~/webvr-polyfill/src/util.js?9a11","webpack:///./src/YawPitchControl/browser.js?b792","webpack:///./src/YawPitchControl/consts.js?b730","webpack:///./~/@egjs/axes/dist/axes.js?7d52","webpack:///./src/PanoImageRenderer/WebGLUtils.js?259d","webpack:///./src/PanoImageRenderer/renderer/Renderer.js?3594","webpack:///./src/YawPitchControl/utils.js?b169","webpack:///./~/@egjs/agent/dist/agent.js?a320","webpack:///./~/hammerjs/hammer.js?bc14","webpack:///./src/YawPitchControl/index.js?64c7","webpack:///./src/PanoViewer/PanoViewer.js?cd43","webpack:///./src/PanoViewer/index.js?2b64","webpack:///./src/PanoImageRenderer/ImageLoader.js?075b","webpack:///./src/PanoImageRenderer/PanoImageRenderer.js?8b4d","webpack:///./src/PanoImageRenderer/VideoLoader.js?0b3d","webpack:///./src/PanoImageRenderer/index.js?3d43","webpack:///./src/PanoImageRenderer/renderer/CubeRenderer.js?ba0a","webpack:///./src/PanoImageRenderer/renderer/SphereRenderer.js?6515","webpack:///./src/PanoViewer/consts.js?bd19","webpack:///./src/YawPitchControl/YawPitchControl.js?020a","webpack:///./src/YawPitchControl/input/ComplementaryFilter.js?9426","webpack:///./src/YawPitchControl/input/DeviceMotion.js?1a09","webpack:///./src/YawPitchControl/input/FusionPoseSensor.js?03ef","webpack:///./src/YawPitchControl/input/TiltMotionInput.js?754f","webpack:///./src/YawPitchControl/input/WheelInput.js?66eb","webpack:///./src/utils/mathUtil/mat4.js?2494","webpack:///./src/utils/mathUtil/quat.js?9257","webpack:///./src/utils/mathUtil/vec2.js?40af","webpack:///./src/utils/mathUtil/vec3.js?b7f4","webpack:///./~/process/browser.js?8418","webpack:///(webpack)/buildin/global.js?e416","webpack:///./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js?232e","webpack:///./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js?7db6","webpack:///./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js?5a18","webpack:///vertx (ignored)?91aa"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 300fcddb410135c43d6f","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/component project is licensed under the MIT license\r\n * \r\n * @egjs/component JavaScript library\r\n * http://naver.github.io/egjs/component\r\n * \r\n * @version 2.1.0\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Component\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Component\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _Component = __webpack_require__(1);\n\nvar _Component2 = _interopRequireDefault(_Component);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_Component2[\"default\"].VERSION = \"2.1.0\";\nmodule.exports = _Component2[\"default\"];\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * A class used to manage events and options in a component\n * @ko 컴포넌트의 이벤트와 옵션을 관리할 수 있게 하는 클래스\n * @alias eg.Component\n */\nvar Component = function () {\n\t/**\n * @support {\"ie\": \"7+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.1+ (except 3.x)\"}\n */\n\tfunction Component() {\n\t\t_classCallCheck(this, Component);\n\n\t\tthis._eventHandler = {};\n\t\tthis.options = {};\n\t}\n\t/**\n * Triggers a custom event.\n * @ko 커스텀 이벤트를 발생시킨다\n * @param {String} eventName The name of the custom event to be triggered 발생할 커스텀 이벤트의 이름\n * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터\n * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고\n * @example\n class Some extends eg.Component {\n some(){\n \tif(this.trigger(\"beforeHi\")){ // When event call to stop return false.\n \tthis.trigger(\"hi\");// fire hi event.\n \t}\n }\n }\n const some = new Some();\n some.on(\"beforeHi\", (e) => {\n if(condition){\n \te.stop(); // When event call to stop, `hi` event not call.\n }\n });\n some.on(\"hi\", (e) => {\n // `currentTarget` is component instance.\n console.log(some === e.currentTarget); // true\n });\n // If you want to more know event design. You can see article.\n // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F\n */\n\n\n\tComponent.prototype.trigger = function trigger(eventName) {\n\t\tvar customEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar handlerList = this._eventHandler[eventName] || [];\n\t\tvar hasHandlerList = handlerList.length > 0;\n\n\t\tif (!hasHandlerList) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If detach method call in handler in first time then handeler list calls.\n\t\thandlerList = handlerList.concat();\n\n\t\tcustomEvent.eventType = eventName;\n\n\t\tvar isCanceled = false;\n\t\tvar arg = [customEvent];\n\t\tvar i = 0;\n\n\t\tcustomEvent.stop = function () {\n\t\t\tisCanceled = true;\n\t\t};\n\t\tcustomEvent.currentTarget = this;\n\n\t\tfor (var _len = arguments.length, restParam = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t\t\trestParam[_key - 2] = arguments[_key];\n\t\t}\n\n\t\tif (restParam.length >= 1) {\n\t\t\targ = arg.concat(restParam);\n\t\t}\n\n\t\tfor (i = 0; handlerList[i]; i++) {\n\t\t\thandlerList[i].apply(this, arg);\n\t\t}\n\n\t\treturn !isCanceled;\n\t};\n\t/**\n * Executed event just one time.\n * @ko 이벤트가 한번만 실행된다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n alert(\"hi\");\n }\n thing() {\n this.once(\"hi\", this.hi);\n }\n }\n var some = new Some();\n some.thing();\n some.trigger(\"hi\");\n // fire alert(\"hi\");\n some.trigger(\"hi\");\n // Nothing happens\n */\n\n\n\tComponent.prototype.once = function once(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar i = void 0;\n\n\t\t\tfor (i in eventHash) {\n\t\t\t\tthis.once(i, eventHash[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar self = this;\n\n\t\t\tthis.on(eventName, function listener() {\n\t\t\t\tfor (var _len2 = arguments.length, arg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\t\targ[_key2] = arguments[_key2];\n\t\t\t\t}\n\n\t\t\t\thandlerToAttach.apply(self, arg);\n\t\t\t\tself.off(eventName, listener);\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n * Checks whether an event has been attached to a component.\n * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다.\n * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름\n * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부\n * @example\n class Some extends eg.Component {\n some() {\n this.hasOn(\"hi\");// check hi event.\n }\n }\n */\n\n\n\tComponent.prototype.hasOn = function hasOn(eventName) {\n\t\treturn !!this._eventHandler[eventName];\n\t};\n\n\t/**\n * Attaches an event to a component.\n * @ko 컴포넌트에 이벤트를 등록한다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.on(\"hi\",this.hi); //attach event\n }\n }\n */\n\n\n\tComponent.prototype.on = function on(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar name = void 0;\n\n\t\t\tfor (name in eventHash) {\n\t\t\t\tthis.on(name, eventHash[name]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\t\tif (typeof handlerList === \"undefined\") {\n\t\t\t\tthis._eventHandler[eventName] = [];\n\t\t\t\thandlerList = this._eventHandler[eventName];\n\t\t\t}\n\n\t\t\thandlerList.push(handlerToAttach);\n\t\t}\n\n\t\treturn this;\n\t};\n\t/**\n * Detaches an event from the component.\n * @ko 컴포넌트에 등록된 이벤트를 해제한다\n * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름\n * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.off(\"hi\",this.hi); //detach event\n }\n }\n */\n\n\n\tComponent.prototype.off = function off(eventName, handlerToDetach) {\n\t\t// All event detach.\n\t\tif (typeof eventName === \"undefined\") {\n\t\t\tthis._eventHandler = {};\n\t\t\treturn this;\n\t\t}\n\n\t\t// All handler of specific event detach.\n\t\tif (typeof handlerToDetach === \"undefined\") {\n\t\t\tif (typeof eventName === \"string\") {\n\t\t\t\tthis._eventHandler[eventName] = undefined;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar eventHash = eventName;\n\t\t\t\tvar name = void 0;\n\n\t\t\t\tfor (name in eventHash) {\n\t\t\t\t\tthis.off(name, eventHash[name]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// The handler of specific event detach.\n\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\tif (handlerList) {\n\t\t\tvar k = void 0;\n\t\t\tvar handlerFunction = void 0;\n\n\t\t\tfor (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) {\n\t\t\t\tif (handlerFunction === handlerToDetach) {\n\t\t\t\t\thandlerList = handlerList.splice(k, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\treturn Component;\n}();\n\nexports[\"default\"] = Component;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=component.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/component/dist/component.js\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/axes project is licensed under the MIT license\r\n * \r\n * @egjs/axes JavaScript library\r\n * https://github.com/naver/egjs-axes\r\n * \r\n * @version 2.3.3\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammerjs\", \"@egjs/component\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Axes\"] = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Axes\"] = factory(root[\"Hammer\"], root[\"eg\"][\"Component\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nfunction toArray(nodes) {\r\n // const el = Array.prototype.slice.call(nodes);\r\n // for IE8\r\n var el = [];\r\n for (var i = 0, len = nodes.length; i < len; i++) {\r\n el.push(nodes[i]);\r\n }\r\n return el;\r\n}\r\nexports.toArray = toArray;\r\nfunction $(param, multi) {\r\n if (multi === void 0) { multi = false; }\r\n var el;\r\n if (typeof param === \"string\") {\r\n // check if string is HTML tag format\r\n var match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\r\n // creating element\r\n if (match) {\r\n var dummy = document.createElement(\"div\");\r\n dummy.innerHTML = param;\r\n el = toArray(dummy.childNodes);\r\n }\r\n else {\r\n el = toArray(document.querySelectorAll(param));\r\n }\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n else if (param === window) {\r\n el = param;\r\n }\r\n else if (param.nodeName &&\r\n (param.nodeType === 1 || param.nodeType === 9)) {\r\n el = param;\r\n }\r\n else if ((\"jQuery\" in window && param instanceof jQuery) ||\r\n param.constructor.prototype.jquery) {\r\n el = multi ? param.toArray() : param.get(0);\r\n }\r\n else if (Array.isArray(param)) {\r\n el = param.map(function (v) { return $(v); });\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n return el;\r\n}\r\nexports.$ = $;\r\nvar raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame;\r\nvar caf = window.cancelAnimationFrame || window.webkitCancelAnimationFrame;\r\nif (raf && !caf) {\r\n var keyInfo_1 = {};\r\n var oldraf_1 = raf;\r\n raf = function (callback) {\r\n function wrapCallback(timestamp) {\r\n if (keyInfo_1[key]) {\r\n callback(timestamp);\r\n }\r\n }\r\n var key = oldraf_1(wrapCallback);\r\n keyInfo_1[key] = true;\r\n return key;\r\n };\r\n caf = function (key) {\r\n delete keyInfo_1[key];\r\n };\r\n}\r\nelse if (!(raf && caf)) {\r\n raf = function (callback) {\r\n return window.setTimeout(function () {\r\n callback(window.performance && window.performance.now && window.performance.now() || new Date().getTime());\r\n }, 16);\r\n };\r\n caf = window.clearTimeout;\r\n}\r\n/**\r\n * A polyfill for the window.requestAnimationFrame() method.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame\r\n * @private\r\n */\r\nfunction requestAnimationFrame(fp) {\r\n return raf(fp);\r\n}\r\nexports.requestAnimationFrame = requestAnimationFrame;\r\n;\r\n/**\r\n* A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method.\r\n* @param {Number} key −\tThe ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값\r\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame\r\n* @private\r\n*/\r\nfunction cancelAnimationFrame(key) {\r\n caf(key);\r\n}\r\nexports.cancelAnimationFrame = cancelAnimationFrame;\r\n;\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nexports.SUPPORT_TOUCH = \"ontouchstart\" in window;\r\nexports.UNIQUEKEY = \"_EGJS_AXES_INPUTTYPE_\";\r\nfunction toAxis(source, offset) {\r\n return offset.reduce(function (acc, v, i) {\r\n if (source[i]) {\r\n acc[source[i]] = v;\r\n }\r\n return acc;\r\n }, {});\r\n}\r\nexports.toAxis = toAxis;\r\n;\r\nfunction createHammer(element, options) {\r\n try {\r\n // create Hammer\r\n return new Hammer.Manager(element, __assign({}, options));\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\nexports.createHammer = createHammer;\r\n;\r\nfunction convertInputType(inputType) {\r\n if (inputType === void 0) { inputType = []; }\r\n var hasTouch = false;\r\n var hasMouse = false;\r\n inputType.forEach(function (v) {\r\n switch (v) {\r\n case \"mouse\":\r\n hasMouse = true;\r\n break;\r\n case \"touch\": hasTouch = exports.SUPPORT_TOUCH;\r\n }\r\n });\r\n return (hasTouch && Hammer.TouchInput) ||\r\n (hasMouse && Hammer.MouseInput) || null;\r\n}\r\nexports.convertInputType = convertInputType;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar Coordinate = {\r\n getInsidePosition: function (destPos, range, circular, bounce) {\r\n var toDestPos = destPos;\r\n var targetRange = [\r\n circular[0] ? range[0] : (bounce ? range[0] - bounce[0] : range[0]),\r\n circular[1] ? range[1] : (bounce ? range[1] + bounce[1] : range[1])\r\n ];\r\n toDestPos = Math.max(targetRange[0], toDestPos);\r\n toDestPos = Math.min(targetRange[1], toDestPos);\r\n return +toDestPos.toFixed(5);\r\n },\r\n // determine outside\r\n isOutside: function (pos, range) {\r\n return pos < range[0] || pos > range[1];\r\n },\r\n getDuration: function (distance, deceleration) {\r\n var duration = Math.sqrt(distance / deceleration * 2);\r\n // when duration is under 100, then value is zero\r\n return duration < 100 ? 0 : duration;\r\n },\r\n isCircularable: function (destPos, range, circular) {\r\n return (circular[1] && destPos > range[1]) ||\r\n (circular[0] && destPos < range[0]);\r\n },\r\n getCirculatedPos: function (pos, range, circular) {\r\n var toPos = pos;\r\n var min = range[0];\r\n var max = range[1];\r\n var length = max - min;\r\n if (circular[1] && pos > max) {\r\n toPos = (toPos - max) % length + min;\r\n }\r\n if (circular[0] && pos < min) {\r\n toPos = (toPos - min) % length + max;\r\n }\r\n return +toPos.toFixed(5);\r\n }\r\n};\r\nexports[\"default\"] = Coordinate;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\n;\r\nvar AxisManager = /** @class */ (function () {\r\n function AxisManager(axis, options) {\r\n var _this = this;\r\n this.axis = axis;\r\n this.options = options;\r\n this._complementOptions();\r\n this._pos = Object.keys(this.axis).reduce(function (acc, v) {\r\n acc[v] = _this.axis[v].range[0];\r\n return acc;\r\n }, {});\r\n }\r\n AxisManager.equal = function (target, base) {\r\n for (var k in target) {\r\n if (target[k] !== base[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * set up 'css' expression\r\n * @private\r\n */\r\n AxisManager.prototype._complementOptions = function () {\r\n var _this = this;\r\n Object.keys(this.axis).forEach(function (axis) {\r\n _this.axis[axis] = __assign({\r\n range: [0, 100],\r\n bounce: [0, 0],\r\n circular: [false, false]\r\n }, _this.axis[axis]);\r\n [\"bounce\", \"circular\"].forEach(function (v) {\r\n var axisOption = _this.axis;\r\n var key = axisOption[axis][v];\r\n if (/string|number|boolean/.test(typeof key)) {\r\n axisOption[axis][v] = [key, key];\r\n }\r\n });\r\n });\r\n };\r\n AxisManager.prototype.getDelta = function (depaPos, destPos) {\r\n var fullDepaPos = this.get(depaPos);\r\n return this.map(this.get(destPos), function (v, k) { return v - fullDepaPos[k]; });\r\n };\r\n AxisManager.prototype.get = function (axes) {\r\n var _this = this;\r\n if (axes && Array.isArray(axes)) {\r\n return axes.reduce(function (acc, v) {\r\n if (v && (v in _this._pos)) {\r\n acc[v] = _this._pos[v];\r\n }\r\n return acc;\r\n }, {});\r\n }\r\n else {\r\n return __assign({}, this._pos, (axes || {}));\r\n }\r\n };\r\n AxisManager.prototype.moveTo = function (pos) {\r\n var _this = this;\r\n var delta = this.map(this._pos, function (v, key) {\r\n return pos[key] ? pos[key] - _this._pos[key] : 0;\r\n });\r\n this.set(pos);\r\n return {\r\n pos: __assign({}, this._pos),\r\n delta: delta\r\n };\r\n };\r\n AxisManager.prototype.set = function (pos) {\r\n for (var k in pos) {\r\n if (k && (k in this._pos)) {\r\n this._pos[k] = pos[k];\r\n }\r\n }\r\n };\r\n AxisManager.prototype.every = function (pos, callback) {\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n if (!callback(pos[k], k, axisOptions[k])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n AxisManager.prototype.filter = function (pos, callback) {\r\n var filtered = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n callback(pos[k], k, axisOptions[k]) && (filtered[k] = pos[k]);\r\n }\r\n }\r\n return filtered;\r\n };\r\n AxisManager.prototype.map = function (pos, callback) {\r\n var tranformed = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n tranformed[k] = callback(pos[k], k, axisOptions[k]);\r\n }\r\n }\r\n return tranformed;\r\n };\r\n AxisManager.prototype.isOutside = function (axes) {\r\n return !this.every(axes ? this.get(axes) : this._pos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); });\r\n };\r\n return AxisManager;\r\n}());\r\nexports.AxisManager = AxisManager;\r\n;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"DIRECTION_NONE\"] = 1] = \"DIRECTION_NONE\";\r\n DIRECTION[DIRECTION[\"DIRECTION_LEFT\"] = 2] = \"DIRECTION_LEFT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_RIGHT\"] = 4] = \"DIRECTION_RIGHT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_HORIZONTAL\"] = 6] = \"DIRECTION_HORIZONTAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_UP\"] = 8] = \"DIRECTION_UP\";\r\n DIRECTION[DIRECTION[\"DIRECTION_DOWN\"] = 16] = \"DIRECTION_DOWN\";\r\n DIRECTION[DIRECTION[\"DIRECTION_VERTICAL\"] = 24] = \"DIRECTION_VERTICAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_ALL\"] = 30] = \"DIRECTION_ALL\";\r\n})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));\r\nexports.TRANSFORM = (function () {\r\n var bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\r\n var target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\r\n for (var i = 0, len = target.length; i < len; i++) {\r\n if (target[i] in bodyStyle) {\r\n return target[i];\r\n }\r\n }\r\n return \"\";\r\n})();\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar Axes_1 = __webpack_require__(7);\r\nvar PanInput_1 = __webpack_require__(13);\r\nvar PinchInput_1 = __webpack_require__(14);\r\nvar WheelInput_1 = __webpack_require__(15);\r\nvar MoveKeyInput_1 = __webpack_require__(16);\r\nAxes_1[\"default\"].PanInput = PanInput_1.PanInput;\r\nAxes_1[\"default\"].PinchInput = PinchInput_1.PinchInput;\r\nAxes_1[\"default\"].WheelInput = WheelInput_1.WheelInput;\r\nAxes_1[\"default\"].MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\r\nmodule.exports = Axes_1[\"default\"];\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Component = __webpack_require__(8);\r\nvar AnimationManager_1 = __webpack_require__(9);\r\nvar EventManager_1 = __webpack_require__(10);\r\nvar InterruptManager_1 = __webpack_require__(11);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar InputObserver_1 = __webpack_require__(12);\r\nvar const_1 = __webpack_require__(5);\r\n/**\r\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\r\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @property {Number[]} [range] The coordinate of range 좌표 범위\r\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\r\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\r\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\r\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\r\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\r\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\r\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\r\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\r\n**/\r\n/**\r\n * @typedef {Object} AxesOption The option object of the eg.Axes module\r\n * @ko eg.Axes 모듈의 옵션 객체\r\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\r\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\r\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\r\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\r\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
\r\n**/\r\n/**\r\n * @class eg.Axes\r\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\r\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\r\n * @extends eg.Component\r\n *\r\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\r\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\r\n *\r\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\r\n * @example\r\n *\r\n * // 1. Initialize eg.Axes\r\n * const axes = new eg.Axes({\r\n *\tsomething1: {\r\n *\t\trange: [0, 150],\r\n *\t\tbounce: 50\r\n *\t},\r\n *\tsomething2: {\r\n *\t\trange: [0, 200],\r\n *\t\tbounce: 100\r\n *\t},\r\n *\tsomethingN: {\r\n *\t\trange: [1, 10],\r\n *\t}\r\n * }, {\r\n * deceleration : 0.0024\r\n * });\r\n *\r\n * // 2. attach event handler\r\n * axes.on({\r\n *\t\"hold\" : function(evt) {\r\n *\t},\r\n *\t\"release\" : function(evt) {\r\n *\t},\r\n *\t\"animationStart\" : function(evt) {\r\n *\t},\r\n *\t\"animationEnd\" : function(evt) {\r\n *\t},\r\n *\t\"change\" : function(evt) {\r\n *\t}\r\n * });\r\n *\r\n * // 3. Initialize inputTypes\r\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\r\n *\tscale: [0.5, 1]\r\n * });\r\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\r\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\r\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\r\n *\tscale: 1.5\r\n * });\r\n *\r\n * // 4. Connect eg.Axes and InputTypes\r\n * // [PanInput] When the mouse or touchscreen is down and moved.\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\r\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\r\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\r\n *\r\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something2\", pinchInputArea);\r\n */\r\nvar Axes = /** @class */ (function (_super) {\r\n __extends(Axes, _super);\r\n function Axes(axis, options, startPos) {\r\n if (axis === void 0) { axis = {}; }\r\n var _this = _super.call(this) || this;\r\n _this.axis = axis;\r\n _this._inputs = [];\r\n _this.options = __assign({\r\n easing: function easeOutCubic(x) {\r\n return 1 - Math.pow(1 - x, 3);\r\n },\r\n interruptable: true,\r\n maximumDuration: Infinity,\r\n minimumDuration: 0,\r\n deceleration: 0.0006\r\n }, options);\r\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\r\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\r\n _this.em = new EventManager_1.EventManager(_this);\r\n _this.am = new AnimationManager_1.AnimationManager(_this);\r\n _this.io = new InputObserver_1.InputObserver(_this);\r\n _this.em.setAnimationManager(_this.am);\r\n startPos && _this.em.triggerChange(startPos);\r\n return _this;\r\n }\r\n /**\r\n * Connect the axis of eg.Axes to the inputType.\r\n * @ko eg.Axes의 축과 inputType을 연결한다\r\n * @method eg.Axes#connect\r\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\r\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\r\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\r\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\r\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\r\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\r\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\r\n */\r\n Axes.prototype.connect = function (axes, inputType) {\r\n var mapped;\r\n if (typeof axes === \"string\") {\r\n mapped = axes.split(\" \");\r\n }\r\n else {\r\n mapped = axes.concat();\r\n }\r\n // check same instance\r\n if (~this._inputs.indexOf(inputType)) {\r\n this.disconnect(inputType);\r\n }\r\n // check same element in hammer type for share\r\n if (\"hammer\" in inputType) {\r\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\r\n if (targets.length) {\r\n inputType.hammer = targets[0].hammer;\r\n }\r\n }\r\n inputType.mapAxes(mapped);\r\n inputType.connect(this.io);\r\n this._inputs.push(inputType);\r\n return this;\r\n };\r\n /**\r\n * Disconnect the axis of eg.Axes from the inputType.\r\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\r\n * @method eg.Axes#disconnect\r\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * const input1 = new eg.Axes.PanInput(\"#area1\");\r\n * const input2 = new eg.Axes.PanInput(\"#area2\");\r\n * const input3 = new eg.Axes.PanInput(\"#area3\");\r\n *\r\n * axes.connect(\"x\", input1);\r\n * .connect(\"x xOther\", input2)\r\n * .connect([\"xOther\", \"x\"], input3);\r\n *\r\n * axes.disconnect(input1); // disconnects input1\r\n * axes.disconnect(); // disconnects all of them\r\n */\r\n Axes.prototype.disconnect = function (inputType) {\r\n if (inputType) {\r\n var index = this._inputs.indexOf(inputType);\r\n if (index >= 0) {\r\n this._inputs[index].disconnect();\r\n this._inputs.splice(index, 1);\r\n }\r\n }\r\n else {\r\n this._inputs.forEach(function (v) { return v.disconnect(); });\r\n this._inputs = [];\r\n }\r\n return this;\r\n };\r\n /**\r\n * Returns the current position of the coordinates.\r\n * @ko 좌표의 현재 위치를 반환한다\r\n * @method eg.Axes#get\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Object.} Axis coordinate information 축 좌표 정보\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\r\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\r\n */\r\n Axes.prototype.get = function (axes) {\r\n return this.axm.get(axes);\r\n };\r\n /**\r\n * Moves an axis to specific coordinates.\r\n * @ko 좌표를 이동한다.\r\n * @method eg.Axes#setTo\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setTo({\"x\": 30, \"zoom\": 60});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\r\n */\r\n Axes.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setTo(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Moves an axis from the current coordinates to specific coordinates.\r\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\r\n * @method eg.Axes#setBy\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setBy({\"x\": 30, \"zoom\": 10});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\r\n */\r\n Axes.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setBy(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Returns whether there is a coordinate in the bounce area of ​​the target axis.\r\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\r\n * @method eg.Axes#isBounceArea\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.isBounceArea([\"x\"]);\r\n * axes.isBounceArea([\"x\", \"zoom\"]);\r\n * axes.isBounceArea();\r\n */\r\n Axes.prototype.isBounceArea = function (axes) {\r\n return this.axm.isOutside(axes);\r\n };\r\n /**\r\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\r\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\r\n * @method eg.Axes#destroy\r\n */\r\n Axes.prototype.destroy = function () {\r\n this.disconnect();\r\n this.em.destroy();\r\n };\r\n Axes.VERSION = \"3.0.0-rc\";\r\n /**\r\n * @name eg.Axes.TRANSFORM\r\n * @desc Returns the transform attribute with CSS vendor prefixes.\r\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\r\n *\r\n * @constant\r\n * @type {String}\r\n * @example\r\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\r\n */\r\n Axes.TRANSFORM = const_1.TRANSFORM;\r\n /**\r\n * @name eg.Axes.DIRECTION_NONE\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\r\n /**\r\n * @name eg.Axes.DIRECTION_LEFT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\r\n /**\r\n * @name eg.Axes.DIRECTION_RIGHT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\r\n /**\r\n * @name eg.Axes.DIRECTION_UP\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\r\n /**\r\n * @name eg.Axes.DIRECTION_DOWN\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\r\n /**\r\n * @name eg.Axes.DIRECTION_HORIZONTAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_VERTICAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_ALL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\r\n return Axes;\r\n}(Component));\r\nexports[\"default\"] = Axes;\r\n;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar utils_1 = __webpack_require__(0);\r\nvar AnimationManager = /** @class */ (function () {\r\n function AnimationManager(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.animationEnd = this.animationEnd.bind(this);\r\n }\r\n AnimationManager.getDuration = function (duration, min, max) {\r\n return Math.max(Math.min(duration, max), min);\r\n };\r\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\r\n var _this = this;\r\n var duration;\r\n if (typeof wishDuration !== \"undefined\") {\r\n duration = wishDuration;\r\n }\r\n else {\r\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\r\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\r\n }\r\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\r\n };\r\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\r\n var depaPos = this.axm.get();\r\n var destPos = pos;\r\n var inputEvent = option && option.event || null;\r\n return {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: inputEvent,\r\n input: option && option.input || null,\r\n isTrusted: !!inputEvent,\r\n done: this.animationEnd\r\n };\r\n };\r\n AnimationManager.prototype.grab = function (axes, option) {\r\n if (this._animateParam && axes.length) {\r\n var orgPos_1 = this.axm.get(axes);\r\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\r\n this.em.triggerChange(pos, option, !!option);\r\n }\r\n this._animateParam = null;\r\n this._raf && utils_1.cancelAnimationFrame(this._raf);\r\n this._raf = null;\r\n this.em.triggerAnimationEnd(!!(option && option.event));\r\n }\r\n };\r\n AnimationManager.prototype.getEventInfo = function () {\r\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\r\n return {\r\n input: this._animateParam.input,\r\n event: this._animateParam.inputEvent\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n AnimationManager.prototype.restore = function (option) {\r\n var pos = this.axm.get();\r\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\r\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\r\n };\r\n AnimationManager.prototype.animationEnd = function () {\r\n var beforeParam = this.getEventInfo();\r\n this._animateParam = null;\r\n // for Circular\r\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\r\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\r\n this.itm.setInterrupt(false);\r\n this.em.triggerAnimationEnd(!!beforeParam);\r\n if (this.axm.isOutside()) {\r\n this.restore(beforeParam);\r\n }\r\n else {\r\n this.em.triggerFinish(!!beforeParam);\r\n }\r\n };\r\n AnimationManager.prototype.animateLoop = function (param, complete) {\r\n this._animateParam = __assign({}, param);\r\n this._animateParam.startTime = new Date().getTime();\r\n if (param.duration) {\r\n var info_1 = this._animateParam;\r\n var self_1 = this;\r\n (function loop() {\r\n self_1._raf = null;\r\n if (self_1.frame(info_1) >= 1) {\r\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\r\n self_1.em.triggerChange(param.destPos);\r\n }\r\n complete();\r\n return;\r\n } // animationEnd\r\n self_1._raf = utils_1.requestAnimationFrame(loop);\r\n })();\r\n }\r\n else {\r\n this.em.triggerChange(param.destPos);\r\n complete();\r\n }\r\n };\r\n AnimationManager.prototype.getUserControll = function (param) {\r\n var userWish = param.setTo();\r\n userWish.destPos = this.axm.get(userWish.destPos);\r\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\r\n return userWish;\r\n };\r\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\r\n var _this = this;\r\n var param = this.createAnimationParam(destPos, duration, option);\r\n var depaPos = __assign({}, param.depaPos);\r\n var retTrigger = this.em.triggerAnimationStart(param);\r\n // to control\r\n var userWish = this.getUserControll(param);\r\n // You can't stop the 'animationStart' event when 'circular' is true.\r\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\r\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\r\n }\r\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\r\n var inputEvent = option && option.event || null;\r\n this.animateLoop({\r\n depaPos: depaPos,\r\n destPos: userWish.destPos,\r\n duration: userWish.duration,\r\n delta: this.axm.getDelta(depaPos, userWish.destPos),\r\n isTrusted: !!inputEvent,\r\n inputEvent: inputEvent,\r\n input: option && option.input || null\r\n }, function () { return _this.animationEnd(); });\r\n }\r\n };\r\n // animation frame (0~1)\r\n AnimationManager.prototype.frame = function (param) {\r\n var curTime = new Date().getTime() - param.startTime;\r\n var easingPer = this.easing(curTime / param.duration);\r\n var toPos = param.depaPos;\r\n toPos = this.axm.map(toPos, function (v, k, opt) {\r\n v += param.delta[k] * easingPer;\r\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n });\r\n this.em.triggerChange(toPos);\r\n return easingPer;\r\n };\r\n AnimationManager.prototype.easing = function (p) {\r\n return p > 1 ? 1 : this.options.easing(p);\r\n };\r\n AnimationManager.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n var axes = Object.keys(pos);\r\n this.grab(axes);\r\n var orgPos = this.axm.get(axes);\r\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\r\n return this;\r\n }\r\n this.itm.setInterrupt(true);\r\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\r\n if (!Object.keys(movedPos).length) {\r\n return this;\r\n }\r\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\r\n }\r\n });\r\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\r\n return this;\r\n }\r\n if (duration > 0) {\r\n this.animateTo(movedPos, duration);\r\n }\r\n else {\r\n this.em.triggerChange(movedPos);\r\n this.itm.setInterrupt(false);\r\n }\r\n return this;\r\n };\r\n AnimationManager.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\r\n };\r\n return AnimationManager;\r\n}());\r\nexports.AnimationManager = AnimationManager;\r\n;\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(axes) {\r\n this.axes = axes;\r\n }\r\n /**\r\n * This event is fired when a user holds an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\r\n * @name eg.Axes#hold\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos coordinate 좌표 정보\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"hold\", function(event) {\r\n * // event.pos\r\n * // event.input\r\n * // event.inputEvent\r\n * // isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerHold = function (pos, option) {\r\n this.axes.trigger(\"hold\", {\r\n pos: pos,\r\n input: option.input || null,\r\n inputEvent: option.event || null,\r\n isTrusted: true\r\n });\r\n };\r\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\r\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\r\n * @name set\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\r\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\r\n * @name setTo\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationStart\", function(event) {\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n /**\r\n * This event is fired when a user release an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\r\n * @name eg.Axes#release\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'release' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerRelease = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n this.axes.trigger(\"release\", param);\r\n };\r\n /**\r\n * This event is fired when coordinate changes.\r\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\r\n * @name eg.Axes#change\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos The coordinate 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * // event.pos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.holding\r\n * // event.set\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the coordinates to move after the 'change' event.\r\n * // it works when the holding value of the change event is true.\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n EventManager.prototype.triggerChange = function (pos, option, holding) {\r\n if (option === void 0) { option = null; }\r\n if (holding === void 0) { holding = false; }\r\n var eventInfo = this.am.getEventInfo();\r\n var moveTo = this.am.axm.moveTo(pos);\r\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\r\n var param = {\r\n pos: moveTo.pos,\r\n delta: moveTo.delta,\r\n holding: holding,\r\n inputEvent: inputEvent,\r\n isTrusted: !!inputEvent,\r\n input: option && option.input || eventInfo && eventInfo.input || null,\r\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\r\n };\r\n this.axes.trigger(\"change\", param);\r\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\r\n };\r\n /**\r\n * This event is fired when animation starts.\r\n * @ko 에니메이션이 시작할 때 발생한다.\r\n * @name eg.Axes#animationStart\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationStart = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n return this.axes.trigger(\"animationStart\", param);\r\n };\r\n /**\r\n * This event is fired when animation ends.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#animationEnd\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationEnd\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"animationEnd\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n /**\r\n * This event is fired when all actions have been completed.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#finish\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"finish\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerFinish = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"finish\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n EventManager.prototype.createUserControll = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n // to controll\r\n var userControl = {\r\n destPos: __assign({}, pos),\r\n duration: duration\r\n };\r\n return function (toPos, userDuration) {\r\n toPos && (userControl.destPos = __assign({}, toPos));\r\n (userDuration !== undefined) && (userControl.duration = userDuration);\r\n return userControl;\r\n };\r\n };\r\n EventManager.prototype.setAnimationManager = function (am) {\r\n this.am = am;\r\n };\r\n EventManager.prototype.destroy = function () {\r\n this.axes.off();\r\n };\r\n return EventManager;\r\n}());\r\nexports.EventManager = EventManager;\r\n;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar InterruptManager = /** @class */ (function () {\r\n function InterruptManager(options) {\r\n this.options = options;\r\n this._prevented = false; // check whether the animation event was prevented\r\n }\r\n InterruptManager.prototype.isInterrupting = function () {\r\n // when interruptable is 'true', return value is always 'true'.\r\n return this.options.interruptable || this._prevented;\r\n };\r\n InterruptManager.prototype.isInterrupted = function () {\r\n return !this.options.interruptable && this._prevented;\r\n };\r\n InterruptManager.prototype.setInterrupt = function (prevented) {\r\n !this.options.interruptable && (this._prevented = prevented);\r\n };\r\n return InterruptManager;\r\n}());\r\nexports.InterruptManager = InterruptManager;\r\n;\r\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar InputObserver = /** @class */ (function () {\r\n function InputObserver(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\r\n this.isOutside = false;\r\n this.moveDistance = null;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.am = am;\r\n }\r\n // when move pointer is held in outside\r\n InputObserver.prototype.atOutside = function (pos) {\r\n var _this = this;\r\n if (this.isOutside) {\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var tn = opt.range[0] - opt.bounce[0];\r\n var tx = opt.range[1] + opt.bounce[1];\r\n return v > tx ? tx : (v < tn ? tn : v);\r\n });\r\n }\r\n else {\r\n // when start pointer is held in inside\r\n // get a initialization slope value to prevent smooth animation.\r\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var min = opt.range[0];\r\n var max = opt.range[1];\r\n var out = opt.bounce;\r\n if (v < min) {\r\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\r\n }\r\n else if (v > max) {\r\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\r\n }\r\n return v;\r\n });\r\n }\r\n };\r\n InputObserver.prototype.get = function (input) {\r\n return this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.hold = function (input, event) {\r\n if (this.itm.isInterrupted() || !input.axes.length) {\r\n return;\r\n }\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n this.itm.setInterrupt(true);\r\n this.am.grab(input.axes, changeOption);\r\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\r\n this.isOutside = this.axm.isOutside(input.axes);\r\n this.moveDistance = this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.change = function (input, event, offset) {\r\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\r\n return;\r\n }\r\n var depaPos = this.axm.get(input.axes);\r\n var destPos;\r\n // for outside logic\r\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\r\n this.moveDistance && (this.moveDistance = destPos);\r\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n // from outside to inside\r\n if (this.isOutside &&\r\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\r\n this.isOutside = false;\r\n }\r\n destPos = this.atOutside(destPos);\r\n this.em.triggerChange(destPos, {\r\n input: input,\r\n event: event\r\n }, true);\r\n };\r\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\r\n if (!this.itm.isInterrupting()) {\r\n return;\r\n }\r\n if (!this.moveDistance) {\r\n return;\r\n }\r\n var pos = this.axm.get(input.axes);\r\n var depaPos = this.axm.get();\r\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return pos[k] + v;\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\r\n }\r\n }));\r\n var duration = this.am.getDuration(destPos, pos, inputDuration);\r\n if (duration === 0) {\r\n destPos = __assign({}, depaPos);\r\n }\r\n // prepare params\r\n var param = {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: duration,\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: event,\r\n input: input,\r\n isTrusted: true\r\n };\r\n this.em.triggerRelease(param);\r\n this.moveDistance = null;\r\n // to contol\r\n var userWish = this.am.getUserControll(param);\r\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n if (isEqual || userWish.duration === 0) {\r\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\r\n this.itm.setInterrupt(false);\r\n if (this.axm.isOutside()) {\r\n this.am.restore(changeOption);\r\n }\r\n else {\r\n this.em.triggerFinish(true);\r\n }\r\n }\r\n else {\r\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\r\n }\r\n };\r\n return InputObserver;\r\n}());\r\nexports.InputObserver = InputObserver;\r\n;\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar const_1 = __webpack_require__(5);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\r\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\r\n * @property {String[]} [inputType=[\"touch\",\"mouse\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
\r\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\r\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\r\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\r\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PanInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\r\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\r\n *\r\n * @example\r\n * const pan = new eg.Axes.PanInput(\"#area\", {\r\n * \t\tinputType: [\"touch\"],\r\n * \t\tscale: [1, 1.3],\r\n * });\r\n *\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\r\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\r\n */\r\nvar PanInput = /** @class */ (function () {\r\n function PanInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n inputType: [\"touch\", \"mouse\"],\r\n scale: [1, 1],\r\n thresholdAngle: 45,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onHammerInput = this.onHammerInput.bind(this);\r\n this.onPanmove = this.onPanmove.bind(this);\r\n this.onPanend = this.onPanend.bind(this);\r\n }\r\n // get user's direction\r\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\r\n if (thresholdAngle < 0 || thresholdAngle > 90) {\r\n return const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n var toAngle = Math.abs(angle);\r\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\r\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n };\r\n PanInput.getNextOffset = function (speeds, deceleration) {\r\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\r\n var duration = Math.abs(normalSpeed / -deceleration);\r\n return [\r\n speeds[0] / 2 * duration,\r\n speeds[1] / 2 * duration\r\n ];\r\n };\r\n PanInput.useDirection = function (checkType, direction, userDirection) {\r\n if (userDirection) {\r\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\r\n ((direction & checkType) && (userDirection & checkType)));\r\n }\r\n else {\r\n return !!(direction & checkType);\r\n }\r\n };\r\n PanInput.prototype.mapAxes = function (axes) {\r\n var useHorizontal = !!axes[0];\r\n var useVertical = !!axes[1];\r\n if (useHorizontal && useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\r\n }\r\n else if (useHorizontal) {\r\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n }\r\n else if (useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n }\r\n else {\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n this.axes = axes;\r\n };\r\n PanInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n direction: this._direction,\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PanRecognizer.\r\n this.hammer.add(new Hammer.Pan(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer && this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n var inputClass = InputType_1.convertInputType(this.options.inputType);\r\n if (!inputClass) {\r\n throw new Error(\"Wrong inputType parameter!\");\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pan, hammerOption],\r\n ],\r\n inputClass: inputClass\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PanInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PanInput#destroy\r\n */\r\n PanInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PanInput#enable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PanInput#disable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PanInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PanInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\r\n };\r\n PanInput.prototype.onHammerInput = function (event) {\r\n if (this.isEnable()) {\r\n if (event.isFirst) {\r\n this.observer.hold(this, event);\r\n }\r\n else if (event.isFinal) {\r\n this.onPanend(event);\r\n }\r\n }\r\n };\r\n PanInput.prototype.onPanmove = function (event) {\r\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\r\n // not support offset properties in Hammerjs - start\r\n var prevInput = this.hammer.session.prevInput;\r\n /* eslint-disable no-param-reassign */\r\n if (prevInput) {\r\n event.offsetX = event.deltaX - prevInput.deltaX;\r\n event.offsetY = event.deltaY - prevInput.deltaY;\r\n }\r\n else {\r\n event.offsetX = 0;\r\n event.offsetY = 0;\r\n }\r\n var offset = this.getOffset([event.offsetX, event.offsetY], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\r\n ]);\r\n var prevent = offset.some(function (v) { return v !== 0; });\r\n if (prevent) {\r\n event.srcEvent.preventDefault();\r\n event.srcEvent.stopPropagation();\r\n }\r\n event.preventSystemEvent = prevent;\r\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.onPanend = function (event) {\r\n var offset = this.getOffset([\r\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\r\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\r\n ], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\r\n ]);\r\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"hammer.input\", this.onHammerInput)\r\n .on(\"panstart panmove\", this.onPanmove);\r\n };\r\n PanInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"hammer.input\", this.onHammerInput)\r\n .off(\"panstart panmove\", this.onPanmove);\r\n this.observer = null;\r\n };\r\n PanInput.prototype.getOffset = function (properties, useDirection) {\r\n var offset = [0, 0];\r\n var scale = this.options.scale;\r\n if (useDirection[0]) {\r\n offset[0] = (properties[0] * scale[0]);\r\n }\r\n if (useDirection[1]) {\r\n offset[1] = (properties[1] * scale[1]);\r\n }\r\n return offset;\r\n };\r\n return PanInput;\r\n}());\r\nexports.PanInput = PanInput;\r\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\r\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PinchInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\r\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n * @example\r\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something\", pinch);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\r\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\r\n */\r\nvar PinchInput = /** @class */ (function () {\r\n function PinchInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n this._base = null;\r\n this._prev = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onPinchStart = this.onPinchStart.bind(this);\r\n this.onPinchMove = this.onPinchMove.bind(this);\r\n this.onPinchEnd = this.onPinchEnd.bind(this);\r\n }\r\n PinchInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n PinchInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PinchRecognizer.\r\n this.hammer.add(new Hammer.Pinch(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pinch, hammerOption],\r\n ],\r\n inputClass: Hammer.TouchInput\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PinchInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PinchInput#destroy\r\n */\r\n PinchInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n PinchInput.prototype.onPinchStart = function (event) {\r\n this._base = this.observer.get(this)[this.axes[0]];\r\n var offset = this.getOffset(event.scale);\r\n this.observer.hold(this, event);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchMove = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchEnd = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\r\n this._base = null;\r\n this._prev = null;\r\n };\r\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\r\n if (prev === void 0) { prev = 1; }\r\n return this._base * (pinchScale - prev) * this.options.scale;\r\n };\r\n PinchInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"pinchstart\", this.onPinchStart)\r\n .on(\"pinchmove\", this.onPinchMove)\r\n .on(\"pinchend\", this.onPinchEnd);\r\n };\r\n PinchInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"pinchstart\", this.onPinchStart)\r\n .off(\"pinchmove\", this.onPinchMove)\r\n .off(\"pinchend\", this.onPinchEnd);\r\n this.observer = null;\r\n this._prev = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PinchInput#enable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PinchInput#disable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PinchInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PinchInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\r\n };\r\n return PinchInput;\r\n}());\r\nexports.PinchInput = PinchInput;\r\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\r\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.WheelInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\r\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when the mousewheel is moved.\r\n * axes.connect(\"something\", wheel);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\r\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\r\n */\r\nvar WheelInput = /** @class */ (function () {\r\n function WheelInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this._timer = null;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1\r\n }, options);\r\n this.onWheel = this.onWheel.bind(this);\r\n }\r\n WheelInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n WheelInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n WheelInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.WheelInput#destroy\r\n */\r\n WheelInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n WheelInput.prototype.onWheel = function (event) {\r\n var _this = this;\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n if (!this._isHolded) {\r\n this.observer.hold(this, event);\r\n this._isHolded = true;\r\n }\r\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale;\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(function () {\r\n if (_this._isHolded) {\r\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\r\n _this._isHolded = false;\r\n }\r\n }, 50);\r\n };\r\n WheelInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = true;\r\n };\r\n WheelInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.WheelInput#enable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.WheelInput#disable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.WheelInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n WheelInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return WheelInput;\r\n}());\r\nexports.WheelInput = WheelInput;\r\n;\r\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\nexports.KEYMAP = {\r\n LEFT_ARROW: 37,\r\n A: 65,\r\n UP_ARROW: 38,\r\n W: 87,\r\n RIGHT_ARROW: 39,\r\n D: 68,\r\n DOWN_ARROW: 40,\r\n S: 83\r\n};\r\n/**\r\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\r\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\r\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.MoveKeyInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\r\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\r\n * \t\tscale: [1, 1]\r\n * });\r\n *\r\n * // Connect 'x', 'y' axes when the moveKey is pressed.\r\n * axes.connect([\"x\", \"y\"], moveKey);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\r\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n */\r\nvar MoveKeyInput = /** @class */ (function () {\r\n function MoveKeyInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: [1, 1]\r\n }, options);\r\n this.onKeydown = this.onKeydown.bind(this);\r\n }\r\n MoveKeyInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n MoveKeyInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n // add tabindex=\"0\" to the container for making it focusable\r\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\r\n this.element.setAttribute(\"tabindex\", \"0\");\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n MoveKeyInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.MoveKeyInput#destroy\r\n */\r\n MoveKeyInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n MoveKeyInput.prototype.onKeydown = function (event) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n var isMoveKey = true;\r\n var offsets;\r\n var e = event;\r\n switch (e.keyCode) {\r\n case exports.KEYMAP.LEFT_ARROW:\r\n case exports.KEYMAP.A:\r\n offsets = [-this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.RIGHT_ARROW:\r\n case exports.KEYMAP.D:\r\n offsets = [this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.UP_ARROW:\r\n case exports.KEYMAP.W:\r\n offsets = [0, this.options.scale[1]];\r\n break;\r\n case exports.KEYMAP.DOWN_ARROW:\r\n case exports.KEYMAP.S:\r\n offsets = [0, -this.options.scale[1]];\r\n break;\r\n default:\r\n isMoveKey = false;\r\n }\r\n if (isMoveKey) {\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\r\n // Suppress \"double action\" if event handled\r\n e.preventDefault();\r\n }\r\n };\r\n MoveKeyInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = true;\r\n };\r\n MoveKeyInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.MoveKeyInput#enable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.MoveKeyInput#disable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.MoveKeyInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n MoveKeyInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return MoveKeyInput;\r\n}());\r\nexports.MoveKeyInput = MoveKeyInput;\r\n;\r\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=axes.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/axes/dist/axes.js\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 14\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 17\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\treturn res(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 35\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 36\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 37\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 39\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 40\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 41\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 42\n// module chunks = 0 1 2 3"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACr2EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACllFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/PanoViewer/view360.panoviewer.pkgd.min.js b/dist/PanoViewer/view360.panoviewer.pkgd.min.js index 5c96bc897..bb1e99cb3 100644 --- a/dist/PanoViewer/view360.panoviewer.pkgd.min.js +++ b/dist/PanoViewer/view360.panoviewer.pkgd.min.js @@ -11,5 +11,5 @@ * NOTE: This is not an official distribution file and is only for user convenience. * */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("view360",[],e):"object"==typeof exports?exports.view360=e():(t.eg=t.eg||{},t.eg.view360=e())}(this,function(){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.i=function(t){return t},__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=17)}([function(t,e,n){!function(e,n){t.exports=n()}(0,function(){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=0)}([function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);r["default"].VERSION="2.1.0",t.exports=r["default"]},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=function(){function Component(){_classCallCheck(this,Component),this._eventHandler={},this.options={}}return Component.prototype.trigger=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var s=arguments.length,a=Array(s>2?s-2:0),u=2;u=1&&(r=r.concat(a)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if("object"===(void 0===t?"undefined":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if("string"==typeof t&&"function"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,m=s["default"].fromValues(o[0],o[1],o[2]),_=void 0;_=n!==d.YAW_DELTA_BY_YAW?s["default"].fromValues(0,f,0):s["default"].fromValues(f,0,0),s["default"].transformQuat(m,m,u),s["default"].transformQuat(_,_,u);var v=m,g=_,y=s["default"].create();s["default"].cross(y,v,g),s["default"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=s["default"].fromValues(o[0],o[1],o[2]),s["default"].transformQuat(l,l,u),c=s["default"].fromValues(o[0],o[1],o[2]),s["default"].transformQuat(c,c,a);var b=Math.abs(c[0]*w+c[1]*E+c[2]*T),I=s["default"].create();s["default"].subtract(I,c,s["default"].scale(s["default"].create(),y,b));var R=(I[0]*l[0]+I[1]*l[1]+I[2]*l[2])/(s["default"].length(I)*s["default"].length(l));R>1&&(R=1);var x=Math.acos(R),P=s["default"].cross(s["default"].create(),l,I);b=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?b>0?1:-1:b<0?1:-1;var O=x*A*f;return r["default"].toDegree(O)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),s=_interopRequireDefault(o),a=n(35),u=_interopRequireDefault(a),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return"number"!=typeof t?"Not a number":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h["default"].create();return h["default"].rotateY(n,n,r["default"].toRadian(t)),h["default"].rotateX(n,n,r["default"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r["default"].toDegree(f.extractYawFromQuat(t)),pitch:r["default"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r["default"],e.mat4=p["default"],e.quat=h["default"],e.vec2=u["default"],e.vec3=s["default"],e.ROTATE_CONSTANT=d},function(t,e,n){"use strict";var i={};i.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){"use strict";function objectOrFunction(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}function isFunction(t){return"function"==typeof t}function setScheduler(t){a=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==s?function(){s(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var a=Math.acos(s),u=Math.sqrt(1-s*s);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*a)/u,h=Math.sin(e*a)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return"data:"+t+";base64,"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var s=t.createProgram();t.attachShader(s,r),t.attachShader(s,o);for(var a in i)t.bindAttribLocation(s,i[a],a);return t.linkProgram(s),t.deleteShader(r),t.deleteShader(o),s},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r="",o=0;o-1?t.split("/")[2]:t.split("/")[0],e=e.split(":")[0]},t.exports=n},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();i.Float32Array="undefined"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH="ontouchstart"in i,e.SUPPORT_DEVICEMOTION="ondevicemotion"in i},function(t,e,n){"use strict";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS="pinchstart pinchmove pinchend",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}("undefined"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){"use strict";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement("div");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?"jQuery"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},s=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=s(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){"use strict";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case"mouse":i=!0;break;case"touch":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%s+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION="3.0.0-rc",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e["default"]=p},function(t,n){t.exports=e},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r["default"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=s.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var s=this,a=this.createAnimationParam(t,e,n),u=i({},a.depaPos),c=this.em.triggerAnimationStart(a),h=this.getUserControll(a);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r["default"].isCircularable(t,n.range,n.circular)})&&console.warn("You can't stop the 'animation' event when 'circular' is true."),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return s.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r["default"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var s=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(s).length?(s=this.axm.map(s,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r["default"].getCirculatedPos(t,i.range,i.circular):r["default"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(s,i)?this:(e>0?this.animateTo(s,e):(this.em.triggerChange(s),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=a},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ts?s+e.am.easing((t-s)/(a[1]*n))*a[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o["default"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o["default"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,s){if(this.itm.isInterrupting()&&this.moveDistance){var a=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?a[e]+t:o["default"].getInsidePosition(a[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,a,s);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=s},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[a.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=a.convertInputType(this.options.inputType);if(!o)throw new Error("Wrong inputType parameter!");this.hammer=a.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[a.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[a.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get("pan").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,a.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,a.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on("hammer.input",this.onHammerInput).on("panstart panmove",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off("hammer.input",this.onHammerInput).off("panstart panmove",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener("wheel",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener("wheel",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=s},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o["default"].setUa(t);var e={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),"ios"===e.os.name&&e.browser.webview&&(e.browser.version="-1"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{"default":t}}(r);agent.VERSION="2.1.2",e["default"]=agent,t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){"use strict";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,"i").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r["default"].browser,r["default"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r["default"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r["default"].defaultString.browser.version,i=new RegExp("("+t+")","i").exec(e);if(!i)return n;var o=i.index,s=i[0];if(o>-1){var a=o+s.length+1;n=e.substring(a).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r["default"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r["default"].os,t)}function getOsName(){return getIdentityStringFromArray(r["default"].os,r["default"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r["default"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var s=e.versionSearch||t,a=new RegExp("("+s+")\\s([\\d_\\.]+|\\d_0)","i");return a.exec(o)&&(i=a.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=void 0;e["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};e["default"]=i,t.exports=e["default"]}])})},function(t,e,n){var i;!function(r,o,s,a){"use strict";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==a)for(i=0;i\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||a:a,e):t}function ifUndefined(t,e){return t===a?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,s=n.firstMultiple,a=s?s.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(a,u),e.distance=getDistance(a,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=s?getScale(s.pointers,i):1,e.rotation=s?getRotation(s.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==b&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,s=t.lastInterval||e,u=e.timeStamp-s.timeStamp;if(e.eventType!=x&&(u>T||s.velocity===a)){var c=e.deltaX-s.deltaX,h=e.deltaY-s.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=s.velocity,i=s.velocityX,r=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:O:e<0?C:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=Y,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),"identifier",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(b|I)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,s=toArray(t.changedTouches),a=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===b)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&st||!(this.state&st)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&st)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&b)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&st)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=r,_possibleConstructorReturn(r,o)}if(!a.WebGLUtils.isWebGLAvailable()){var s;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),s=r,_possibleConstructorReturn(r,s)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new a.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})["catch"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new s.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on("change",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){"boolean"==typeof t&&this._yawPitchControl.option("useZoom",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option("useKeyboard",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option("useGyro",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option("fovRange",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option("yawRange",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option("pitchRange",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option("showPolePoint",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option("pitchRange"),o=r[1]-r[0],s=t.fov!==undefined?t.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var s=_possibleConstructorReturn(this,t.call(this));return s.sphericalConfig=o,s.fieldOfView=o.fieldOfView,s.width=n,s.height=i,s._lastQuaternion=null,s._lastYaw=null,s._lastPitch=null,s._lastFieldOfView=null,s.pMatrix=m.mat4.create(),s.mvMatrix=m.mat4.create(),m.mat4.perspective(s.pMatrix,m.glMatrix.toRadian(s.fieldOfView),n/i,.1,100),s.textureCoordBuffer=null,s.vertexBuffer=null,s.indexBuffer=null,s.canvas=s._initCanvas(n,i),s._image=null,s._imageIsReady=!1,s._keepUpdate=!1,s._onContentLoad=s._onContentLoad.bind(s),s._onContentError=s._onContentError.bind(s),e&&s.setImage({image:e,imageType:o.imageType,isVideo:r}),s}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new s["default"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p["default"]:d["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement("canvas");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new _(function(e,n){if(!t._contentLoader)return void n("ImageLoader is not initialized");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension("WEBGL_lose_context");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*g,r=e*g;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){m.mat4.perspective(this.pMatrix,m.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+h["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h["default"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=h["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h["default"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h["default"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h["default"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,"aVertexPosition"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=t.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=t.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,"aTextureCoord"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h["default"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&m.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=m.quat.rotateY(m.quat.create(),m.quat.create(),m.glMatrix.toRadian(-90));n=m.quat.multiply(m.quat.create(),i,t)}this.mvMatrix=m.mat4.fromQuat(m.mat4.create(),m.quat.conjugate(m.quat.create(),n)),this._draw(),this._lastQuaternion=m.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),m.mat4.identity(this.mvMatrix),m.mat4.rotateX(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(e)),m.mat4.rotateY(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r["default"]);e["default"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=v},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},s=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if("object"===(void 0===t?"undefined":i(t))?(e=t.src,n=t.type):"string"==typeof t&&(e=t),!e)return!1;var r=document.createElement("source");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:"string"!=typeof t&&"object"!==(void 0===t?"undefined":i(t))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once("loadeddata",function(){return e(t._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e["default"]=s},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),s=_interopRequireDefault(o);e.PanoImageRenderer=r["default"],e.WebGLUtils=s["default"]},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),s=_interopRequireDefault(o),a=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn("Image width("+i+") exceeds device limit("+r+"))");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,s=Math.sin(o),a=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*a,p=s,f=c*a,d=r/60,m=i/60;if(t.push(d,m),e.push(2*l,2*p,2*f),60!==r&&60!==i){var _=61*i+r,v=_+60+1;n.push(_,v,_+1,v,v+1,_+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r["default"]);e["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){"use strict";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(a.push(e[0]),s[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(s)),this._applyOptions(a,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return"string"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return"showPolePoint"===t||"fov"===t||"aspectRatio"===t||"yawRange"===t||"pitchRange"===t})&&this._updateControlScale(),t.some(function(t){return"fovRange"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return"useGyro"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return"useKeyboard"===t})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return"useZoom"===t})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||m},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||_},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),s=o.yaw,a=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],sr[1]&&(s=r[1]),ai[1]&&(a=i[1]),t&&t.set({yaw:s,pitch:a}),this.axes.setTo({yaw:s,pitch:a},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),s=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+s,t[1]*r-s].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],s=e[i+1],a=n[i],u=n[i+1];return YawPitchControl.lerp(a,u,(t-o)/(s-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),s=n===undefined?0:n-o.yaw,a=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:s,pitch:a,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);v.VERSION="3.0.0-rc",e["default"]=v},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),s=_interopRequireDefault(o),a=n(39),u=_interopRequireDefault(a);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r["default"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),s["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",r["default"].radToDeg*s["default"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r["default"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e["default"]=u["default"]},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=n(1),s=n(6),a=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==s.window.navigator.userAgent.indexOf("Android"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&s.window.addEventListener("deviceorientation",this._onDeviceOrientation),s.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&s.window.removeEventListener("deviceorientation",this._onDeviceOrientation),s.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r["default"]);e["default"]=a},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),s=_interopRequireDefault(o),a=n(4),u=_interopRequireDefault(a),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),m=n(28),_=_interopRequireDefault(m),v=.98,g=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d["default"],e.accelerometer=new u["default"].Vector3,e.gyroscope=new u["default"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new _["default"](v),e.posePredictor=new s["default"](g),e.filterToWorldQ=new u["default"].Quaternion,e.isFirefoxAndroid=h["default"].isFirefoxAndroid(),e.isIOS=h["default"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u["default"].Quaternion,e.worldToScreenQ=new u["default"].Quaternion,e.originalPoseAdjustQ=new u["default"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h["default"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u["default"].Quaternion,e.deviceMotion.on("devicemotion",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger("change",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u["default"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r["default"]);e["default"]=y},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(s=1/Math.sqrt(s),t[0]=n*s,t[1]=i*s,t[2]=r*s,t[3]=o*s),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],s=t[3],a=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-a)<=r["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-u)<=r["default"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(s-h)<=r["default"].EPSILON*Math.max(1,Math.abs(s),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r["default"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2];return t[0]=r*u-o*a,t[1]=o*s-i*u,t[2]=i*a-r*s,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2],c=n[3],h=c*i+a*o-u*r,l=c*r+u*i-s*o,p=c*o+s*r-a*i,f=-s*i-a*r-u*o;return t[0]=h*c+f*-s+l*-u-p*-a,t[1]=l*c+f*-a+p*-s-h*-u,t[2]=p*c+f*-u+h*-a-l*-s,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){a&&o&&(a=!1,o.length?s=o.concat(s):u=-1,s.length&&drainQueue())}function drainQueue(){if(!a){var t=runTimeout(cleanUpNextTick);a=!0;for(var e=s.length;e;){for(o=s,s=[];++u1)for(var n=1;n1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var s=arguments.length,a=Array(s>2?s-2:0),u=2;u=1&&(r=r.concat(a)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if("object"===(void 0===t?"undefined":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if("string"==typeof t&&"function"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,m=s["default"].fromValues(o[0],o[1],o[2]),_=void 0;_=n!==d.YAW_DELTA_BY_YAW?s["default"].fromValues(0,f,0):s["default"].fromValues(f,0,0),s["default"].transformQuat(m,m,u),s["default"].transformQuat(_,_,u);var v=m,g=_,y=s["default"].create();s["default"].cross(y,v,g),s["default"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=s["default"].fromValues(o[0],o[1],o[2]),s["default"].transformQuat(l,l,u),c=s["default"].fromValues(o[0],o[1],o[2]),s["default"].transformQuat(c,c,a);var b=Math.abs(c[0]*w+c[1]*E+c[2]*T),I=s["default"].create();s["default"].subtract(I,c,s["default"].scale(s["default"].create(),y,b));var R=(I[0]*l[0]+I[1]*l[1]+I[2]*l[2])/(s["default"].length(I)*s["default"].length(l));R>1&&(R=1);var x=Math.acos(R),P=s["default"].cross(s["default"].create(),l,I);b=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?b>0?1:-1:b<0?1:-1;var O=x*A*f;return r["default"].toDegree(O)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),s=_interopRequireDefault(o),a=n(35),u=_interopRequireDefault(a),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return"number"!=typeof t?"Not a number":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h["default"].create();return h["default"].rotateY(n,n,r["default"].toRadian(t)),h["default"].rotateX(n,n,r["default"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r["default"].toDegree(f.extractYawFromQuat(t)),pitch:r["default"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r["default"],e.mat4=p["default"],e.quat=h["default"],e.vec2=u["default"],e.vec3=s["default"],e.ROTATE_CONSTANT=d},function(t,e,n){"use strict";var i={};i.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){"use strict";function objectOrFunction(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}function isFunction(t){return"function"==typeof t}function setScheduler(t){a=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==s?function(){s(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var a=Math.acos(s),u=Math.sqrt(1-s*s);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*a)/u,h=Math.sin(e*a)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return"data:"+t+";base64,"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var s=t.createProgram();t.attachShader(s,r),t.attachShader(s,o);for(var a in i)t.bindAttribLocation(s,i[a],a);return t.linkProgram(s),t.deleteShader(r),t.deleteShader(o),s},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r="",o=0;o-1?t.split("/")[2]:t.split("/")[0],e=e.split(":")[0]},t.exports=n},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();i.Float32Array="undefined"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH="ontouchstart"in i,e.SUPPORT_DEVICEMOTION="ondevicemotion"in i},function(t,e,n){"use strict";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS="pinchstart pinchmove pinchend",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}("undefined"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){"use strict";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement("div");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?"jQuery"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},s=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=s(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){"use strict";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case"mouse":i=!0;break;case"touch":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%s+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION="3.0.0-rc",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e["default"]=p},function(t,n){t.exports=e},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r["default"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=s.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var s=this,a=this.createAnimationParam(t,e,n),u=i({},a.depaPos),c=this.em.triggerAnimationStart(a),h=this.getUserControll(a);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r["default"].isCircularable(t,n.range,n.circular)})&&console.warn("You can't stop the 'animation' event when 'circular' is true."),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return s.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r["default"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var s=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(s).length?(s=this.axm.map(s,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r["default"].getCirculatedPos(t,i.range,i.circular):r["default"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(s,i)?this:(e>0?this.animateTo(s,e):(this.em.triggerChange(s),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=a},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ts?s+e.am.easing((t-s)/(a[1]*n))*a[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o["default"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o["default"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,s){if(this.itm.isInterrupting()&&this.moveDistance){var a=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?a[e]+t:o["default"].getInsidePosition(a[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,a,s);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=s},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[a.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=a.convertInputType(this.options.inputType);if(!o)throw new Error("Wrong inputType parameter!");this.hammer=a.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[a.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[a.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get("pan").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,a.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,a.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on("hammer.input",this.onHammerInput).on("panstart panmove",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off("hammer.input",this.onHammerInput).off("panstart panmove",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener("wheel",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener("wheel",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=s},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o["default"].setUa(t);var e={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),"ios"===e.os.name&&e.browser.webview&&(e.browser.version="-1"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{"default":t}}(r);agent.VERSION="2.1.2",e["default"]=agent,t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){"use strict";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,"i").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r["default"].browser,r["default"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r["default"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r["default"].defaultString.browser.version,i=new RegExp("("+t+")","i").exec(e);if(!i)return n;var o=i.index,s=i[0];if(o>-1){var a=o+s.length+1;n=e.substring(a).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r["default"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r["default"].os,t)}function getOsName(){return getIdentityStringFromArray(r["default"].os,r["default"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r["default"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var s=e.versionSearch||t,a=new RegExp("("+s+")\\s([\\d_\\.]+|\\d_0)","i");return a.exec(o)&&(i=a.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=void 0;e["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};e["default"]=i,t.exports=e["default"]}])})},function(t,e,n){var i;!function(r,o,s,a){"use strict";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==a)for(i=0;i\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||a:a,e):t}function ifUndefined(t,e){return t===a?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,s=n.firstMultiple,a=s?s.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(a,u),e.distance=getDistance(a,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=s?getScale(s.pointers,i):1,e.rotation=s?getRotation(s.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==b&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,s=t.lastInterval||e,u=e.timeStamp-s.timeStamp;if(e.eventType!=x&&(u>T||s.velocity===a)){var c=e.deltaX-s.deltaX,h=e.deltaY-s.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=s.velocity,i=s.velocityX,r=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:O:e<0?C:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=Y,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),"identifier",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(b|I)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,s=toArray(t.changedTouches),a=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===b)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&st||!(this.state&st)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&st)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&b)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&st)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=r,_possibleConstructorReturn(r,o)}if(!a.WebGLUtils.isWebGLAvailable()){var s;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),s=r,_possibleConstructorReturn(r,s)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new a.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})["catch"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new s.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on("change",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){"boolean"==typeof t&&this._yawPitchControl.option("useZoom",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option("useKeyboard",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option("useGyro",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option("fovRange",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option("yawRange",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option("pitchRange",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option("showPolePoint",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option("pitchRange"),o=r[1]-r[0],s=t.fov!==undefined?t.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var s=_possibleConstructorReturn(this,t.call(this));return s.sphericalConfig=o,s.fieldOfView=o.fieldOfView,s.width=n,s.height=i,s._lastQuaternion=null,s._lastYaw=null,s._lastPitch=null,s._lastFieldOfView=null,s.pMatrix=m.mat4.create(),s.mvMatrix=m.mat4.create(),m.mat4.perspective(s.pMatrix,m.glMatrix.toRadian(s.fieldOfView),n/i,.1,100),s.textureCoordBuffer=null,s.vertexBuffer=null,s.indexBuffer=null,s.canvas=s._initCanvas(n,i),s._image=null,s._imageIsReady=!1,s._keepUpdate=!1,s._onContentLoad=s._onContentLoad.bind(s),s._onContentError=s._onContentError.bind(s),e&&s.setImage({image:e,imageType:o.imageType,isVideo:r}),s}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new s["default"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p["default"]:d["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement("canvas");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new _(function(e,n){if(!t._contentLoader)return void n("ImageLoader is not initialized");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension("WEBGL_lose_context");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*g,r=e*g;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){m.mat4.perspective(this.pMatrix,m.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+h["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h["default"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=h["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h["default"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h["default"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h["default"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,"aVertexPosition"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=t.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=t.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,"aTextureCoord"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h["default"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&m.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=m.quat.rotateY(m.quat.create(),m.quat.create(),m.glMatrix.toRadian(-90));n=m.quat.multiply(m.quat.create(),i,t)}this.mvMatrix=m.mat4.fromQuat(m.mat4.create(),m.quat.conjugate(m.quat.create(),n)),this._draw(),this._lastQuaternion=m.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),m.mat4.identity(this.mvMatrix),m.mat4.rotateX(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(e)),m.mat4.rotateY(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r["default"]);e["default"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=v},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},s=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if("object"===(void 0===t?"undefined":i(t))?(e=t.src,n=t.type):"string"==typeof t&&(e=t),!e)return!1;var r=document.createElement("source");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:"string"!=typeof t&&"object"!==(void 0===t?"undefined":i(t))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once("loadeddata",function(){return e(t._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e["default"]=s},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),s=_interopRequireDefault(o);e.PanoImageRenderer=r["default"],e.WebGLUtils=s["default"]},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),s=_interopRequireDefault(o),a=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn("Image width("+i+") exceeds device limit("+r+"))");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,s=Math.sin(o),a=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*a,p=s,f=c*a,d=r/60,m=i/60;if(t.push(d,m),e.push(2*l,2*p,2*f),60!==r&&60!==i){var _=61*i+r,v=_+60+1;n.push(_,v,_+1,v,v+1,_+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r["default"]);e["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){"use strict";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(a.push(e[0]),s[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(s)),this._applyOptions(a,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return"string"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return"showPolePoint"===t||"fov"===t||"aspectRatio"===t||"yawRange"===t||"pitchRange"===t})&&this._updateControlScale(),t.some(function(t){return"fovRange"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return"useGyro"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return"useKeyboard"===t})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return"useZoom"===t})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||m},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||_},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),s=o.yaw,a=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],sr[1]&&(s=r[1]),ai[1]&&(a=i[1]),t&&t.set({yaw:s,pitch:a}),this.axes.setTo({yaw:s,pitch:a},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),s=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+s,t[1]*r-s].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],s=e[i+1],a=n[i],u=n[i+1];return YawPitchControl.lerp(a,u,(t-o)/(s-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),s=n===undefined?0:n-o.yaw,a=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:s,pitch:a,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);v.VERSION="3.0.0-rc",e["default"]=v},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),s=_interopRequireDefault(o),a=n(39),u=_interopRequireDefault(a);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r["default"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),s["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",r["default"].radToDeg*s["default"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r["default"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e["default"]=u["default"]},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=n(1),s=n(6),a=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==s.window.navigator.userAgent.indexOf("Android"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&s.window.addEventListener("deviceorientation",this._onDeviceOrientation),s.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&s.window.removeEventListener("deviceorientation",this._onDeviceOrientation),s.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r["default"]);e["default"]=a},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),s=_interopRequireDefault(o),a=n(4),u=_interopRequireDefault(a),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),m=n(28),_=_interopRequireDefault(m),v=.98,g=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d["default"],e.accelerometer=new u["default"].Vector3,e.gyroscope=new u["default"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new _["default"](v),e.posePredictor=new s["default"](g),e.filterToWorldQ=new u["default"].Quaternion,e.isFirefoxAndroid=h["default"].isFirefoxAndroid(),e.isIOS=h["default"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u["default"].Quaternion,e.worldToScreenQ=new u["default"].Quaternion,e.originalPoseAdjustQ=new u["default"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h["default"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u["default"].Quaternion,e.deviceMotion.on("devicemotion",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger("change",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u["default"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r["default"]);e["default"]=y},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(s=1/Math.sqrt(s),t[0]=n*s,t[1]=i*s,t[2]=r*s,t[3]=o*s),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],s=t[3],a=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-a)<=r["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-u)<=r["default"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(s-h)<=r["default"].EPSILON*Math.max(1,Math.abs(s),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r["default"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2];return t[0]=r*u-o*a,t[1]=o*s-i*u,t[2]=i*a-r*s,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2],c=n[3],h=c*i+a*o-u*r,l=c*r+u*i-s*o,p=c*o+s*r-a*i,f=-s*i-a*r-u*o;return t[0]=h*c+f*-s+l*-u-p*-a,t[1]=l*c+f*-a+p*-s-h*-u,t[2]=p*c+f*-u+h*-a-l*-s,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){a&&o&&(a=!1,o.length?s=o.concat(s):u=-1,s.length&&drainQueue())}function drainQueue(){if(!a){var t=runTimeout(cleanUpNextTick);a=!0;for(var e=s.length;e;){for(o=s,s=[];++u1)for(var n=1;n1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var s=arguments.length,a=Array(s>2?s-2:0),u=2;u=1&&(r=r.concat(a)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if(\"object\"===(void 0===t?\"undefined\":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if(\"string\"==typeof t&&\"function\"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,m=s[\"default\"].fromValues(o[0],o[1],o[2]),_=void 0;_=n!==d.YAW_DELTA_BY_YAW?s[\"default\"].fromValues(0,f,0):s[\"default\"].fromValues(f,0,0),s[\"default\"].transformQuat(m,m,u),s[\"default\"].transformQuat(_,_,u);var v=m,g=_,y=s[\"default\"].create();s[\"default\"].cross(y,v,g),s[\"default\"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=s[\"default\"].fromValues(o[0],o[1],o[2]),s[\"default\"].transformQuat(l,l,u),c=s[\"default\"].fromValues(o[0],o[1],o[2]),s[\"default\"].transformQuat(c,c,a);var b=Math.abs(c[0]*w+c[1]*E+c[2]*T),I=s[\"default\"].create();s[\"default\"].subtract(I,c,s[\"default\"].scale(s[\"default\"].create(),y,b));var R=(I[0]*l[0]+I[1]*l[1]+I[2]*l[2])/(s[\"default\"].length(I)*s[\"default\"].length(l));R>1&&(R=1);var x=Math.acos(R),P=s[\"default\"].cross(s[\"default\"].create(),l,I);b=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?b>0?1:-1:b<0?1:-1;var O=x*A*f;return r[\"default\"].toDegree(O)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),s=_interopRequireDefault(o),a=n(35),u=_interopRequireDefault(a),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return\"number\"!=typeof t?\"Not a number\":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h[\"default\"].create();return h[\"default\"].rotateY(n,n,r[\"default\"].toRadian(t)),h[\"default\"].rotateX(n,n,r[\"default\"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r[\"default\"].toDegree(f.extractYawFromQuat(t)),pitch:r[\"default\"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r[\"default\"],e.mat4=p[\"default\"],e.quat=h[\"default\"],e.vec2=u[\"default\"],e.vec3=s[\"default\"],e.ROTATE_CONSTANT=d},function(t,e,n){\"use strict\";var i={};i.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){\"use strict\";function objectOrFunction(t){var e=typeof t;return null!==t&&(\"object\"===e||\"function\"===e)}function isFunction(t){return\"function\"==typeof t}function setScheduler(t){a=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==s?function(){s(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var a=Math.acos(s),u=Math.sqrt(1-s*s);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*a)/u,h=Math.sin(e*a)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return\"data:\"+t+\";base64,\"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var s=t.createProgram();t.attachShader(s,r),t.attachShader(s,o);for(var a in i)t.bindAttribLocation(s,i[a],a);return t.linkProgram(s),t.deleteShader(r),t.deleteShader(o),s},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r=\"\",o=0;o-1?t.split(\"/\")[2]:t.split(\"/\")[0],e=e.split(\":\")[0]},t.exports=n},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();i.Float32Array=\"undefined\"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH=\"ontouchstart\"in i,e.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in i},function(t,e,n){\"use strict\";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}(\"undefined\"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t[\"default\"]}:function(){return t};return __webpack_require__.d(e,\"a\",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p=\"\",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){\"use strict\";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement(\"div\");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?\"jQuery\"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},s=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=s(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){\"use strict\";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case\"mouse\":i=!0;break;case\"touch\":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%s+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION=\"3.0.0-rc\",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e[\"default\"]=p},function(t,n){t.exports=e},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r[\"default\"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=s.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var s=this,a=this.createAnimationParam(t,e,n),u=i({},a.depaPos),c=this.em.triggerAnimationStart(a),h=this.getUserControll(a);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r[\"default\"].isCircularable(t,n.range,n.circular)})&&console.warn(\"You can't stop the 'animation' event when 'circular' is true.\"),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return s.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r[\"default\"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var s=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(s).length?(s=this.axm.map(s,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r[\"default\"].getCirculatedPos(t,i.range,i.circular):r[\"default\"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(s,i)?this:(e>0?this.animateTo(s,e):(this.em.triggerChange(s),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=a},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ts?s+e.am.easing((t-s)/(a[1]*n))*a[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o[\"default\"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o[\"default\"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,s){if(this.itm.isInterrupting()&&this.moveDistance){var a=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?a[e]+t:o[\"default\"].getInsidePosition(a[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,a,s);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=s},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[a.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=a.convertInputType(this.options.inputType);if(!o)throw new Error(\"Wrong inputType parameter!\");this.hammer=a.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[a.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[a.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get(\"pan\").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,a.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,a.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on(\"hammer.input\",this.onHammerInput).on(\"panstart panmove\",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off(\"hammer.input\",this.onHammerInput).off(\"panstart panmove\",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener(\"wheel\",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener(\"wheel\",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=s},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o[\"default\"].setUa(t);var e={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),\"ios\"===e.os.name&&e.browser.webview&&(e.browser.version=\"-1\"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{\"default\":t}}(r);agent.VERSION=\"2.1.2\",e[\"default\"]=agent,t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){\"use strict\";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,\"i\").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r[\"default\"].browser,r[\"default\"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r[\"default\"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r[\"default\"].defaultString.browser.version,i=new RegExp(\"(\"+t+\")\",\"i\").exec(e);if(!i)return n;var o=i.index,s=i[0];if(o>-1){var a=o+s.length+1;n=e.substring(a).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r[\"default\"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r[\"default\"].os,t)}function getOsName(){return getIdentityStringFromArray(r[\"default\"].os,r[\"default\"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r[\"default\"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var s=e.versionSearch||t,a=new RegExp(\"(\"+s+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return a.exec(o)&&(i=a.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=void 0;e[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};e[\"default\"]=i,t.exports=e[\"default\"]}])})},function(t,e,n){var i;!function(r,o,s,a){\"use strict\";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==a)for(i=0;i\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||a:a,e):t}function ifUndefined(t,e){return t===a?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,s=n.firstMultiple,a=s?s.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(a,u),e.distance=getDistance(a,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=s?getScale(s.pointers,i):1,e.rotation=s?getRotation(s.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==b&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,s=t.lastInterval||e,u=e.timeStamp-s.timeStamp;if(e.eventType!=x&&(u>T||s.velocity===a)){var c=e.deltaX-s.deltaX,h=e.deltaY-s.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=s.velocity,i=s.velocityX,r=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:O:e<0?C:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=Y,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),\"identifier\",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(b|I)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,s=toArray(t.changedTouches),a=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===b)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&st||!(this.state&st)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&st)},emit:function(t){if(1!==t.scale){var e=t.scale<1?\"in\":\"out\";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&b)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+\"up\",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&st)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=r,_possibleConstructorReturn(r,o)}if(!a.WebGLUtils.isWebGLAvailable()){var s;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),s=r,_possibleConstructorReturn(r,s)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new a.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})[\"catch\"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new s.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on(\"change\",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){\"boolean\"==typeof t&&this._yawPitchControl.option(\"useZoom\",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option(\"useKeyboard\",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option(\"useGyro\",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option(\"fovRange\",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option(\"yawRange\",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option(\"pitchRange\",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option(\"showPolePoint\",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option(\"pitchRange\"),o=r[1]-r[0],s=t.fov!==undefined?t.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var s=_possibleConstructorReturn(this,t.call(this));return s.sphericalConfig=o,s.fieldOfView=o.fieldOfView,s.width=n,s.height=i,s._lastQuaternion=null,s._lastYaw=null,s._lastPitch=null,s._lastFieldOfView=null,s.pMatrix=m.mat4.create(),s.mvMatrix=m.mat4.create(),m.mat4.perspective(s.pMatrix,m.glMatrix.toRadian(s.fieldOfView),n/i,.1,100),s.textureCoordBuffer=null,s.vertexBuffer=null,s.indexBuffer=null,s.canvas=s._initCanvas(n,i),s._image=null,s._imageIsReady=!1,s._keepUpdate=!1,s._onContentLoad=s._onContentLoad.bind(s),s._onContentError=s._onContentError.bind(s),e&&s.setImage({image:e,imageType:o.imageType,isVideo:r}),s}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new s[\"default\"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p[\"default\"]:d[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement(\"canvas\");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new _(function(e,n){if(!t._contentLoader)return void n(\"ImageLoader is not initialized\");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension(\"WEBGL_lose_context\");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*g,r=e*g;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){m.mat4.perspective(this.pMatrix,m.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+h[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h[\"default\"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=h[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h[\"default\"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h[\"default\"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h[\"default\"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,\"aVertexPosition\"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=t.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=t.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,\"aTextureCoord\"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h[\"default\"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&m.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=m.quat.rotateY(m.quat.create(),m.quat.create(),m.glMatrix.toRadian(-90));n=m.quat.multiply(m.quat.create(),i,t)}this.mvMatrix=m.mat4.fromQuat(m.mat4.create(),m.quat.conjugate(m.quat.create(),n)),this._draw(),this._lastQuaternion=m.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),m.mat4.identity(this.mvMatrix),m.mat4.rotateX(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(e)),m.mat4.rotateY(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r[\"default\"]);e[\"default\"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=v},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}e.__esModule=!0;var i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},r=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},s=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if(\"object\"===(void 0===t?\"undefined\":i(t))?(e=t.src,n=t.type):\"string\"==typeof t&&(e=t),!e)return!1;var r=document.createElement(\"source\");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:\"string\"!=typeof t&&\"object\"!==(void 0===t?\"undefined\":i(t))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once(\"loadeddata\",function(){return e(t._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e[\"default\"]=s},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),s=_interopRequireDefault(o);e.PanoImageRenderer=r[\"default\"],e.WebGLUtils=s[\"default\"]},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),s=_interopRequireDefault(o),a=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn(\"Image width(\"+i+\") exceeds device limit(\"+r+\"))\");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,s=Math.sin(o),a=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*a,p=s,f=c*a,d=r/60,m=i/60;if(t.push(d,m),e.push(2*l,2*p,2*f),60!==r&&60!==i){var _=61*i+r,v=_+60+1;n.push(_,v,_+1,v,v+1,_+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r[\"default\"]);e[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){\"use strict\";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(a.push(e[0]),s[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(s)),this._applyOptions(a,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return\"string\"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return\"showPolePoint\"===t||\"fov\"===t||\"aspectRatio\"===t||\"yawRange\"===t||\"pitchRange\"===t})&&this._updateControlScale(),t.some(function(t){return\"fovRange\"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return\"useGyro\"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return\"useKeyboard\"===t})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return\"useZoom\"===t})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||m},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||_},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),s=o.yaw,a=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],sr[1]&&(s=r[1]),ai[1]&&(a=i[1]),t&&t.set({yaw:s,pitch:a}),this.axes.setTo({yaw:s,pitch:a},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),s=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+s,t[1]*r-s].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],s=e[i+1],a=n[i],u=n[i+1];return YawPitchControl.lerp(a,u,(t-o)/(s-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),s=n===undefined?0:n-o.yaw,a=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:s,pitch:a,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);v.VERSION=\"3.0.0-rc\",e[\"default\"]=v},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),s=_interopRequireDefault(o),a=n(39),u=_interopRequireDefault(a);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r[\"default\"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),s[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",r[\"default\"].radToDeg*s[\"default\"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e[\"default\"]=u[\"default\"]},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=n(1),s=n(6),a=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==s.window.navigator.userAgent.indexOf(\"Android\"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&s.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),s.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&s.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),s.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r[\"default\"]);e[\"default\"]=a},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),s=_interopRequireDefault(o),a=n(4),u=_interopRequireDefault(a),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),m=n(28),_=_interopRequireDefault(m),v=.98,g=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d[\"default\"],e.accelerometer=new u[\"default\"].Vector3,e.gyroscope=new u[\"default\"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new _[\"default\"](v),e.posePredictor=new s[\"default\"](g),e.filterToWorldQ=new u[\"default\"].Quaternion,e.isFirefoxAndroid=h[\"default\"].isFirefoxAndroid(),e.isIOS=h[\"default\"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u[\"default\"].Quaternion,e.worldToScreenQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h[\"default\"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u[\"default\"].Quaternion,e.deviceMotion.on(\"devicemotion\",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger(\"change\",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u[\"default\"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r[\"default\"]);e[\"default\"]=y},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(s=1/Math.sqrt(s),t[0]=n*s,t[1]=i*s,t[2]=r*s,t[3]=o*s),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],s=t[3],a=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-a)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-u)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(s-h)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(s),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r[\"default\"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2];return t[0]=r*u-o*a,t[1]=o*s-i*u,t[2]=i*a-r*s,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2],c=n[3],h=c*i+a*o-u*r,l=c*r+u*i-s*o,p=c*o+s*r-a*i,f=-s*i-a*r-u*o;return t[0]=h*c+f*-s+l*-u-p*-a,t[1]=l*c+f*-a+p*-s-h*-u,t[2]=p*c+f*-u+h*-a-l*-s,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){a&&o&&(a=!1,o.length?s=o.concat(s):u=-1,s.length&&drainQueue())}function drainQueue(){if(!a){var t=runTimeout(cleanUpNextTick);a=!0;for(var e=s.length;e;){for(o=s,s=[];++u1)for(var n=1;n1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var s=arguments.length,a=Array(s>2?s-2:0),u=2;u=1&&(r=r.concat(a)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if(\"object\"===(void 0===t?\"undefined\":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if(\"string\"==typeof t&&\"function\"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,m=s[\"default\"].fromValues(o[0],o[1],o[2]),_=void 0;_=n!==d.YAW_DELTA_BY_YAW?s[\"default\"].fromValues(0,f,0):s[\"default\"].fromValues(f,0,0),s[\"default\"].transformQuat(m,m,u),s[\"default\"].transformQuat(_,_,u);var v=m,g=_,y=s[\"default\"].create();s[\"default\"].cross(y,v,g),s[\"default\"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=s[\"default\"].fromValues(o[0],o[1],o[2]),s[\"default\"].transformQuat(l,l,u),c=s[\"default\"].fromValues(o[0],o[1],o[2]),s[\"default\"].transformQuat(c,c,a);var b=Math.abs(c[0]*w+c[1]*E+c[2]*T),I=s[\"default\"].create();s[\"default\"].subtract(I,c,s[\"default\"].scale(s[\"default\"].create(),y,b));var R=(I[0]*l[0]+I[1]*l[1]+I[2]*l[2])/(s[\"default\"].length(I)*s[\"default\"].length(l));R>1&&(R=1);var x=Math.acos(R),P=s[\"default\"].cross(s[\"default\"].create(),l,I);b=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?b>0?1:-1:b<0?1:-1;var O=x*A*f;return r[\"default\"].toDegree(O)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),s=_interopRequireDefault(o),a=n(35),u=_interopRequireDefault(a),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return\"number\"!=typeof t?\"Not a number\":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h[\"default\"].create();return h[\"default\"].rotateY(n,n,r[\"default\"].toRadian(t)),h[\"default\"].rotateX(n,n,r[\"default\"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r[\"default\"].toDegree(f.extractYawFromQuat(t)),pitch:r[\"default\"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r[\"default\"],e.mat4=p[\"default\"],e.quat=h[\"default\"],e.vec2=u[\"default\"],e.vec3=s[\"default\"],e.ROTATE_CONSTANT=d},function(t,e,n){\"use strict\";var i={};i.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){\"use strict\";function objectOrFunction(t){var e=typeof t;return null!==t&&(\"object\"===e||\"function\"===e)}function isFunction(t){return\"function\"==typeof t}function setScheduler(t){a=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==s?function(){s(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var a=Math.acos(s),u=Math.sqrt(1-s*s);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*a)/u,h=Math.sin(e*a)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return\"data:\"+t+\";base64,\"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var s=t.createProgram();t.attachShader(s,r),t.attachShader(s,o);for(var a in i)t.bindAttribLocation(s,i[a],a);return t.linkProgram(s),t.deleteShader(r),t.deleteShader(o),s},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r=\"\",o=0;o-1?t.split(\"/\")[2]:t.split(\"/\")[0],e=e.split(\":\")[0]},t.exports=n},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();i.Float32Array=\"undefined\"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH=\"ontouchstart\"in i,e.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in i},function(t,e,n){\"use strict\";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}(\"undefined\"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t[\"default\"]}:function(){return t};return __webpack_require__.d(e,\"a\",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p=\"\",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){\"use strict\";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement(\"div\");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?\"jQuery\"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},s=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=s(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){\"use strict\";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case\"mouse\":i=!0;break;case\"touch\":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%s+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION=\"3.0.0-rc\",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e[\"default\"]=p},function(t,n){t.exports=e},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r[\"default\"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=s.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var s=this,a=this.createAnimationParam(t,e,n),u=i({},a.depaPos),c=this.em.triggerAnimationStart(a),h=this.getUserControll(a);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r[\"default\"].isCircularable(t,n.range,n.circular)})&&console.warn(\"You can't stop the 'animation' event when 'circular' is true.\"),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return s.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r[\"default\"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var s=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(s).length?(s=this.axm.map(s,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r[\"default\"].getCirculatedPos(t,i.range,i.circular):r[\"default\"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(s,i)?this:(e>0?this.animateTo(s,e):(this.em.triggerChange(s),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=a},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ts?s+e.am.easing((t-s)/(a[1]*n))*a[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o[\"default\"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o[\"default\"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,s){if(this.itm.isInterrupting()&&this.moveDistance){var a=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?a[e]+t:o[\"default\"].getInsidePosition(a[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,a,s);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=s},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[a.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=a.convertInputType(this.options.inputType);if(!o)throw new Error(\"Wrong inputType parameter!\");this.hammer=a.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[a.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[a.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get(\"pan\").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,a.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,a.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on(\"hammer.input\",this.onHammerInput).on(\"panstart panmove\",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off(\"hammer.input\",this.onHammerInput).off(\"panstart panmove\",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener(\"wheel\",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener(\"wheel\",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=s},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o[\"default\"].setUa(t);var e={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),\"ios\"===e.os.name&&e.browser.webview&&(e.browser.version=\"-1\"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{\"default\":t}}(r);agent.VERSION=\"2.1.2\",e[\"default\"]=agent,t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){\"use strict\";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,\"i\").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r[\"default\"].browser,r[\"default\"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r[\"default\"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r[\"default\"].defaultString.browser.version,i=new RegExp(\"(\"+t+\")\",\"i\").exec(e);if(!i)return n;var o=i.index,s=i[0];if(o>-1){var a=o+s.length+1;n=e.substring(a).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r[\"default\"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r[\"default\"].os,t)}function getOsName(){return getIdentityStringFromArray(r[\"default\"].os,r[\"default\"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r[\"default\"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var s=e.versionSearch||t,a=new RegExp(\"(\"+s+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return a.exec(o)&&(i=a.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=void 0;e[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};e[\"default\"]=i,t.exports=e[\"default\"]}])})},function(t,e,n){var i;!function(r,o,s,a){\"use strict\";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==a)for(i=0;i\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||a:a,e):t}function ifUndefined(t,e){return t===a?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,s=n.firstMultiple,a=s?s.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(a,u),e.distance=getDistance(a,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=s?getScale(s.pointers,i):1,e.rotation=s?getRotation(s.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==b&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,s=t.lastInterval||e,u=e.timeStamp-s.timeStamp;if(e.eventType!=x&&(u>T||s.velocity===a)){var c=e.deltaX-s.deltaX,h=e.deltaY-s.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=s.velocity,i=s.velocityX,r=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:O:e<0?C:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=Y,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),\"identifier\",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(b|I)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,s=toArray(t.changedTouches),a=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===b)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&st||!(this.state&st)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&st)},emit:function(t){if(1!==t.scale){var e=t.scale<1?\"in\":\"out\";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&b)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+\"up\",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&st)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=r,_possibleConstructorReturn(r,o)}if(!a.WebGLUtils.isWebGLAvailable()){var s;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),s=r,_possibleConstructorReturn(r,s)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||a.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new a.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})[\"catch\"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(a.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new s.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on(\"change\",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){\"boolean\"==typeof t&&this._yawPitchControl.option(\"useZoom\",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option(\"useKeyboard\",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option(\"useGyro\",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option(\"fovRange\",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option(\"yawRange\",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option(\"pitchRange\",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option(\"showPolePoint\",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option(\"pitchRange\"),o=r[1]-r[0],s=t.fov!==undefined?t.fov:this._fov;o2&&(g=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var s=_possibleConstructorReturn(this,t.call(this));return s.sphericalConfig=o,s.fieldOfView=o.fieldOfView,s.width=n,s.height=i,s._lastQuaternion=null,s._lastYaw=null,s._lastPitch=null,s._lastFieldOfView=null,s.pMatrix=m.mat4.create(),s.mvMatrix=m.mat4.create(),m.mat4.perspective(s.pMatrix,m.glMatrix.toRadian(s.fieldOfView),n/i,.1,100),s.textureCoordBuffer=null,s.vertexBuffer=null,s.indexBuffer=null,s.canvas=s._initCanvas(n,i),s._image=null,s._imageIsReady=!1,s._keepUpdate=!1,s._onContentLoad=s._onContentLoad.bind(s),s._onContentError=s._onContentError.bind(s),e&&s.setImage({image:e,imageType:o.imageType,isVideo:r}),s}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new s[\"default\"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===v.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p[\"default\"]:d[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement(\"canvas\");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new _(function(e,n){if(!t._contentLoader)return void n(\"ImageLoader is not initialized\");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension(\"WEBGL_lose_context\");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*g,r=e*g;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){m.mat4.perspective(this.pMatrix,m.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+h[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h[\"default\"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=h[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h[\"default\"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h[\"default\"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h[\"default\"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,\"aVertexPosition\"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=t.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=t.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,\"aTextureCoord\"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h[\"default\"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&m.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=m.quat.rotateY(m.quat.create(),m.quat.create(),m.glMatrix.toRadian(-90));n=m.quat.multiply(m.quat.create(),i,t)}this.mvMatrix=m.mat4.fromQuat(m.mat4.create(),m.quat.conjugate(m.quat.create(),n)),this._draw(),this._lastQuaternion=m.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),m.mat4.identity(this.mvMatrix),m.mat4.rotateX(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(e)),m.mat4.rotateY(this.mvMatrix,this.mvMatrix,-m.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r[\"default\"]);e[\"default\"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=v},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}e.__esModule=!0;var i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},r=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},s=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if(\"object\"===(void 0===t?\"undefined\":i(t))?(e=t.src,n=t.type):\"string\"==typeof t&&(e=t),!e)return!1;var r=document.createElement(\"source\");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:\"string\"!=typeof t&&\"object\"!==(void 0===t?\"undefined\":i(t))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once(\"loadeddata\",function(){return e(t._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e[\"default\"]=s},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),s=_interopRequireDefault(o);e.PanoImageRenderer=r[\"default\"],e.WebGLUtils=s[\"default\"]},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),s=_interopRequireDefault(o),a=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn(\"Image width(\"+i+\") exceeds device limit(\"+r+\"))\");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,s=Math.sin(o),a=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*a,p=s,f=c*a,d=r/60,m=i/60;if(t.push(d,m),e.push(2*l,2*p,2*f),60!==r&&60!==i){var _=61*i+r,v=_+60+1;n.push(_,v,_+1,v,v+1,_+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r[\"default\"]);e[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){\"use strict\";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(a.push(e[0]),s[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(s)),this._applyOptions(a,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return\"string\"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return\"showPolePoint\"===t||\"fov\"===t||\"aspectRatio\"===t||\"yawRange\"===t||\"pitchRange\"===t})&&this._updateControlScale(),t.some(function(t){return\"fovRange\"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return\"useGyro\"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return\"useKeyboard\"===t})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return\"useZoom\"===t})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||m},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||_},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),s=o.yaw,a=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],sr[1]&&(s=r[1]),ai[1]&&(a=i[1]),t&&t.set({yaw:s,pitch:a}),this.axes.setTo({yaw:s,pitch:a},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),s=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+s,t[1]*r-s].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],s=e[i+1],a=n[i],u=n[i+1];return YawPitchControl.lerp(a,u,(t-o)/(s-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),s=n===undefined?0:n-o.yaw,a=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:s,pitch:a,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);v.VERSION=\"3.0.0-rc\",e[\"default\"]=v},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),s=_interopRequireDefault(o),a=n(39),u=_interopRequireDefault(a);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r[\"default\"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),s[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",r[\"default\"].radToDeg*s[\"default\"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e[\"default\"]=u[\"default\"]},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=n(1),s=n(6),a=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==s.window.navigator.userAgent.indexOf(\"Android\"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&s.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),s.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&s.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),s.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r[\"default\"]);e[\"default\"]=a},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),s=_interopRequireDefault(o),a=n(4),u=_interopRequireDefault(a),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),m=n(28),_=_interopRequireDefault(m),v=.98,g=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d[\"default\"],e.accelerometer=new u[\"default\"].Vector3,e.gyroscope=new u[\"default\"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new _[\"default\"](v),e.posePredictor=new s[\"default\"](g),e.filterToWorldQ=new u[\"default\"].Quaternion,e.isFirefoxAndroid=h[\"default\"].isFirefoxAndroid(),e.isIOS=h[\"default\"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u[\"default\"].Quaternion,e.worldToScreenQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h[\"default\"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u[\"default\"].Quaternion,e.deviceMotion.on(\"devicemotion\",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger(\"change\",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u[\"default\"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r[\"default\"]);e[\"default\"]=y},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(s=1/Math.sqrt(s),t[0]=n*s,t[1]=i*s,t[2]=r*s,t[3]=o*s),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],s=t[3],a=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-a)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-u)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(s-h)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(s),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r[\"default\"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2];return t[0]=r*u-o*a,t[1]=o*s-i*u,t[2]=i*a-r*s,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],s=n[0],a=n[1],u=n[2],c=n[3],h=c*i+a*o-u*r,l=c*r+u*i-s*o,p=c*o+s*r-a*i,f=-s*i-a*r-u*o;return t[0]=h*c+f*-s+l*-u-p*-a,t[1]=l*c+f*-a+p*-s-h*-u,t[2]=p*c+f*-u+h*-a-l*-s,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){a&&o&&(a=!1,o.length?s=o.concat(s):u=-1,s.length&&drainQueue())}function drainQueue(){if(!a){var t=runTimeout(cleanUpNextTick);a=!0;for(var e=s.length;e;){for(o=s,s=[];++u1)for(var n=1;n이미지를 보여줄 대상 요소
\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 17\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 18\n// module chunks = 0 1 4 5","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChEA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"SpinViewer/view360.spinviewer.js","sources":["webpack:///webpack/universalModuleDefinition?5ca6*","webpack:///webpack/bootstrap e06ee2bc33cb3d5d9c75?ba38*","webpack:///external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}?e192*","webpack:///./src/SpinViewer/SpinViewer.js?dab8","webpack:///./src/SpinViewer/index.js?9d62","webpack:///external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}?7a28*","webpack:///./src/SpinViewer/SpriteImage.js?28df"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [\"@egjs/component\", \"@egjs/axes\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory(root[\"eg\"][\"Component\"], root[\"eg\"][\"Axes\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 18);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e06ee2bc33cb3d5d9c75","module.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 17\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 18\n// module chunks = 0 1 4 5","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChEA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/SpinViewer/view360.spinviewer.pkgd.js.map b/dist/SpinViewer/view360.spinviewer.pkgd.js.map index c22e27381..46c72a3c2 100644 --- a/dist/SpinViewer/view360.spinviewer.pkgd.js.map +++ b/dist/SpinViewer/view360.spinviewer.pkgd.js.map @@ -1 +1 @@ -{"version":3,"file":"SpinViewer/view360.spinviewer.pkgd.js","sources":["webpack:///webpack/universalModuleDefinition?5ca6*","webpack:///webpack/bootstrap 74018a142f3edb9c679e?0648*","webpack:///./~/@egjs/component/dist/component.js?010f*","webpack:///./~/@egjs/axes/dist/axes.js?9266*","webpack:///./src/SpinViewer/SpriteImage.js?b495","webpack:///./~/hammerjs/hammer.js?a194*","webpack:///./src/SpinViewer/SpinViewer.js?f7f2","webpack:///./src/SpinViewer/index.js?5f28"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 19);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 74018a142f3edb9c679e","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/component project is licensed under the MIT license\r\n * \r\n * @egjs/component JavaScript library\r\n * http://naver.github.io/egjs/component\r\n * \r\n * @version 2.1.0\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Component\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Component\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _Component = __webpack_require__(1);\n\nvar _Component2 = _interopRequireDefault(_Component);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_Component2[\"default\"].VERSION = \"2.1.0\";\nmodule.exports = _Component2[\"default\"];\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * A class used to manage events and options in a component\n * @ko 컴포넌트의 이벤트와 옵션을 관리할 수 있게 하는 클래스\n * @alias eg.Component\n */\nvar Component = function () {\n\t/**\n * @support {\"ie\": \"7+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.1+ (except 3.x)\"}\n */\n\tfunction Component() {\n\t\t_classCallCheck(this, Component);\n\n\t\tthis._eventHandler = {};\n\t\tthis.options = {};\n\t}\n\t/**\n * Triggers a custom event.\n * @ko 커스텀 이벤트를 발생시킨다\n * @param {String} eventName The name of the custom event to be triggered 발생할 커스텀 이벤트의 이름\n * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터\n * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고\n * @example\n class Some extends eg.Component {\n some(){\n \tif(this.trigger(\"beforeHi\")){ // When event call to stop return false.\n \tthis.trigger(\"hi\");// fire hi event.\n \t}\n }\n }\n const some = new Some();\n some.on(\"beforeHi\", (e) => {\n if(condition){\n \te.stop(); // When event call to stop, `hi` event not call.\n }\n });\n some.on(\"hi\", (e) => {\n // `currentTarget` is component instance.\n console.log(some === e.currentTarget); // true\n });\n // If you want to more know event design. You can see article.\n // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F\n */\n\n\n\tComponent.prototype.trigger = function trigger(eventName) {\n\t\tvar customEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar handlerList = this._eventHandler[eventName] || [];\n\t\tvar hasHandlerList = handlerList.length > 0;\n\n\t\tif (!hasHandlerList) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If detach method call in handler in first time then handeler list calls.\n\t\thandlerList = handlerList.concat();\n\n\t\tcustomEvent.eventType = eventName;\n\n\t\tvar isCanceled = false;\n\t\tvar arg = [customEvent];\n\t\tvar i = 0;\n\n\t\tcustomEvent.stop = function () {\n\t\t\tisCanceled = true;\n\t\t};\n\t\tcustomEvent.currentTarget = this;\n\n\t\tfor (var _len = arguments.length, restParam = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t\t\trestParam[_key - 2] = arguments[_key];\n\t\t}\n\n\t\tif (restParam.length >= 1) {\n\t\t\targ = arg.concat(restParam);\n\t\t}\n\n\t\tfor (i = 0; handlerList[i]; i++) {\n\t\t\thandlerList[i].apply(this, arg);\n\t\t}\n\n\t\treturn !isCanceled;\n\t};\n\t/**\n * Executed event just one time.\n * @ko 이벤트가 한번만 실행된다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n alert(\"hi\");\n }\n thing() {\n this.once(\"hi\", this.hi);\n }\n }\n var some = new Some();\n some.thing();\n some.trigger(\"hi\");\n // fire alert(\"hi\");\n some.trigger(\"hi\");\n // Nothing happens\n */\n\n\n\tComponent.prototype.once = function once(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar i = void 0;\n\n\t\t\tfor (i in eventHash) {\n\t\t\t\tthis.once(i, eventHash[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar self = this;\n\n\t\t\tthis.on(eventName, function listener() {\n\t\t\t\tfor (var _len2 = arguments.length, arg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\t\targ[_key2] = arguments[_key2];\n\t\t\t\t}\n\n\t\t\t\thandlerToAttach.apply(self, arg);\n\t\t\t\tself.off(eventName, listener);\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n * Checks whether an event has been attached to a component.\n * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다.\n * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름\n * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부\n * @example\n class Some extends eg.Component {\n some() {\n this.hasOn(\"hi\");// check hi event.\n }\n }\n */\n\n\n\tComponent.prototype.hasOn = function hasOn(eventName) {\n\t\treturn !!this._eventHandler[eventName];\n\t};\n\n\t/**\n * Attaches an event to a component.\n * @ko 컴포넌트에 이벤트를 등록한다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.on(\"hi\",this.hi); //attach event\n }\n }\n */\n\n\n\tComponent.prototype.on = function on(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar name = void 0;\n\n\t\t\tfor (name in eventHash) {\n\t\t\t\tthis.on(name, eventHash[name]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\t\tif (typeof handlerList === \"undefined\") {\n\t\t\t\tthis._eventHandler[eventName] = [];\n\t\t\t\thandlerList = this._eventHandler[eventName];\n\t\t\t}\n\n\t\t\thandlerList.push(handlerToAttach);\n\t\t}\n\n\t\treturn this;\n\t};\n\t/**\n * Detaches an event from the component.\n * @ko 컴포넌트에 등록된 이벤트를 해제한다\n * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름\n * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.off(\"hi\",this.hi); //detach event\n }\n }\n */\n\n\n\tComponent.prototype.off = function off(eventName, handlerToDetach) {\n\t\t// All event detach.\n\t\tif (typeof eventName === \"undefined\") {\n\t\t\tthis._eventHandler = {};\n\t\t\treturn this;\n\t\t}\n\n\t\t// All handler of specific event detach.\n\t\tif (typeof handlerToDetach === \"undefined\") {\n\t\t\tif (typeof eventName === \"string\") {\n\t\t\t\tthis._eventHandler[eventName] = undefined;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar eventHash = eventName;\n\t\t\t\tvar name = void 0;\n\n\t\t\t\tfor (name in eventHash) {\n\t\t\t\t\tthis.off(name, eventHash[name]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// The handler of specific event detach.\n\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\tif (handlerList) {\n\t\t\tvar k = void 0;\n\t\t\tvar handlerFunction = void 0;\n\n\t\t\tfor (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) {\n\t\t\t\tif (handlerFunction === handlerToDetach) {\n\t\t\t\t\thandlerList = handlerList.splice(k, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\treturn Component;\n}();\n\nexports[\"default\"] = Component;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=component.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/component/dist/component.js\n// module id = 0\n// module chunks = 0 1 2 3 4 5","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/axes project is licensed under the MIT license\r\n * \r\n * @egjs/axes JavaScript library\r\n * https://github.com/naver/egjs-axes\r\n * \r\n * @version 2.3.3\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammerjs\", \"@egjs/component\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Axes\"] = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Axes\"] = factory(root[\"Hammer\"], root[\"eg\"][\"Component\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nfunction toArray(nodes) {\r\n // const el = Array.prototype.slice.call(nodes);\r\n // for IE8\r\n var el = [];\r\n for (var i = 0, len = nodes.length; i < len; i++) {\r\n el.push(nodes[i]);\r\n }\r\n return el;\r\n}\r\nexports.toArray = toArray;\r\nfunction $(param, multi) {\r\n if (multi === void 0) { multi = false; }\r\n var el;\r\n if (typeof param === \"string\") {\r\n // check if string is HTML tag format\r\n var match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\r\n // creating element\r\n if (match) {\r\n var dummy = document.createElement(\"div\");\r\n dummy.innerHTML = param;\r\n el = toArray(dummy.childNodes);\r\n }\r\n else {\r\n el = toArray(document.querySelectorAll(param));\r\n }\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n else if (param === window) {\r\n el = param;\r\n }\r\n else if (param.nodeName &&\r\n (param.nodeType === 1 || param.nodeType === 9)) {\r\n el = param;\r\n }\r\n else if ((\"jQuery\" in window && param instanceof jQuery) ||\r\n param.constructor.prototype.jquery) {\r\n el = multi ? param.toArray() : param.get(0);\r\n }\r\n else if (Array.isArray(param)) {\r\n el = param.map(function (v) { return $(v); });\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n return el;\r\n}\r\nexports.$ = $;\r\nvar raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame;\r\nvar caf = window.cancelAnimationFrame || window.webkitCancelAnimationFrame;\r\nif (raf && !caf) {\r\n var keyInfo_1 = {};\r\n var oldraf_1 = raf;\r\n raf = function (callback) {\r\n function wrapCallback(timestamp) {\r\n if (keyInfo_1[key]) {\r\n callback(timestamp);\r\n }\r\n }\r\n var key = oldraf_1(wrapCallback);\r\n keyInfo_1[key] = true;\r\n return key;\r\n };\r\n caf = function (key) {\r\n delete keyInfo_1[key];\r\n };\r\n}\r\nelse if (!(raf && caf)) {\r\n raf = function (callback) {\r\n return window.setTimeout(function () {\r\n callback(window.performance && window.performance.now && window.performance.now() || new Date().getTime());\r\n }, 16);\r\n };\r\n caf = window.clearTimeout;\r\n}\r\n/**\r\n * A polyfill for the window.requestAnimationFrame() method.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame\r\n * @private\r\n */\r\nfunction requestAnimationFrame(fp) {\r\n return raf(fp);\r\n}\r\nexports.requestAnimationFrame = requestAnimationFrame;\r\n;\r\n/**\r\n* A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method.\r\n* @param {Number} key −\tThe ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값\r\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame\r\n* @private\r\n*/\r\nfunction cancelAnimationFrame(key) {\r\n caf(key);\r\n}\r\nexports.cancelAnimationFrame = cancelAnimationFrame;\r\n;\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nexports.SUPPORT_TOUCH = \"ontouchstart\" in window;\r\nexports.UNIQUEKEY = \"_EGJS_AXES_INPUTTYPE_\";\r\nfunction toAxis(source, offset) {\r\n return offset.reduce(function (acc, v, i) {\r\n if (source[i]) {\r\n acc[source[i]] = v;\r\n }\r\n return acc;\r\n }, {});\r\n}\r\nexports.toAxis = toAxis;\r\n;\r\nfunction createHammer(element, options) {\r\n try {\r\n // create Hammer\r\n return new Hammer.Manager(element, __assign({}, options));\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\nexports.createHammer = createHammer;\r\n;\r\nfunction convertInputType(inputType) {\r\n if (inputType === void 0) { inputType = []; }\r\n var hasTouch = false;\r\n var hasMouse = false;\r\n inputType.forEach(function (v) {\r\n switch (v) {\r\n case \"mouse\":\r\n hasMouse = true;\r\n break;\r\n case \"touch\": hasTouch = exports.SUPPORT_TOUCH;\r\n }\r\n });\r\n return (hasTouch && Hammer.TouchInput) ||\r\n (hasMouse && Hammer.MouseInput) || null;\r\n}\r\nexports.convertInputType = convertInputType;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar Coordinate = {\r\n getInsidePosition: function (destPos, range, circular, bounce) {\r\n var toDestPos = destPos;\r\n var targetRange = [\r\n circular[0] ? range[0] : (bounce ? range[0] - bounce[0] : range[0]),\r\n circular[1] ? range[1] : (bounce ? range[1] + bounce[1] : range[1])\r\n ];\r\n toDestPos = Math.max(targetRange[0], toDestPos);\r\n toDestPos = Math.min(targetRange[1], toDestPos);\r\n return +toDestPos.toFixed(5);\r\n },\r\n // determine outside\r\n isOutside: function (pos, range) {\r\n return pos < range[0] || pos > range[1];\r\n },\r\n getDuration: function (distance, deceleration) {\r\n var duration = Math.sqrt(distance / deceleration * 2);\r\n // when duration is under 100, then value is zero\r\n return duration < 100 ? 0 : duration;\r\n },\r\n isCircularable: function (destPos, range, circular) {\r\n return (circular[1] && destPos > range[1]) ||\r\n (circular[0] && destPos < range[0]);\r\n },\r\n getCirculatedPos: function (pos, range, circular) {\r\n var toPos = pos;\r\n var min = range[0];\r\n var max = range[1];\r\n var length = max - min;\r\n if (circular[1] && pos > max) {\r\n toPos = (toPos - max) % length + min;\r\n }\r\n if (circular[0] && pos < min) {\r\n toPos = (toPos - min) % length + max;\r\n }\r\n return +toPos.toFixed(5);\r\n }\r\n};\r\nexports[\"default\"] = Coordinate;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\n;\r\nvar AxisManager = /** @class */ (function () {\r\n function AxisManager(axis, options) {\r\n var _this = this;\r\n this.axis = axis;\r\n this.options = options;\r\n this._complementOptions();\r\n this._pos = Object.keys(this.axis).reduce(function (acc, v) {\r\n acc[v] = _this.axis[v].range[0];\r\n return acc;\r\n }, {});\r\n }\r\n AxisManager.equal = function (target, base) {\r\n for (var k in target) {\r\n if (target[k] !== base[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * set up 'css' expression\r\n * @private\r\n */\r\n AxisManager.prototype._complementOptions = function () {\r\n var _this = this;\r\n Object.keys(this.axis).forEach(function (axis) {\r\n _this.axis[axis] = __assign({\r\n range: [0, 100],\r\n bounce: [0, 0],\r\n circular: [false, false]\r\n }, _this.axis[axis]);\r\n [\"bounce\", \"circular\"].forEach(function (v) {\r\n var axisOption = _this.axis;\r\n var key = axisOption[axis][v];\r\n if (/string|number|boolean/.test(typeof key)) {\r\n axisOption[axis][v] = [key, key];\r\n }\r\n });\r\n });\r\n };\r\n AxisManager.prototype.getDelta = function (depaPos, destPos) {\r\n var fullDepaPos = this.get(depaPos);\r\n return this.map(this.get(destPos), function (v, k) { return v - fullDepaPos[k]; });\r\n };\r\n AxisManager.prototype.get = function (axes) {\r\n var _this = this;\r\n if (axes && Array.isArray(axes)) {\r\n return axes.reduce(function (acc, v) {\r\n if (v && (v in _this._pos)) {\r\n acc[v] = _this._pos[v];\r\n }\r\n return acc;\r\n }, {});\r\n }\r\n else {\r\n return __assign({}, this._pos, (axes || {}));\r\n }\r\n };\r\n AxisManager.prototype.moveTo = function (pos) {\r\n var _this = this;\r\n var delta = this.map(this._pos, function (v, key) {\r\n return pos[key] ? pos[key] - _this._pos[key] : 0;\r\n });\r\n this.set(pos);\r\n return {\r\n pos: __assign({}, this._pos),\r\n delta: delta\r\n };\r\n };\r\n AxisManager.prototype.set = function (pos) {\r\n for (var k in pos) {\r\n if (k && (k in this._pos)) {\r\n this._pos[k] = pos[k];\r\n }\r\n }\r\n };\r\n AxisManager.prototype.every = function (pos, callback) {\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n if (!callback(pos[k], k, axisOptions[k])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n AxisManager.prototype.filter = function (pos, callback) {\r\n var filtered = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n callback(pos[k], k, axisOptions[k]) && (filtered[k] = pos[k]);\r\n }\r\n }\r\n return filtered;\r\n };\r\n AxisManager.prototype.map = function (pos, callback) {\r\n var tranformed = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n tranformed[k] = callback(pos[k], k, axisOptions[k]);\r\n }\r\n }\r\n return tranformed;\r\n };\r\n AxisManager.prototype.isOutside = function (axes) {\r\n return !this.every(axes ? this.get(axes) : this._pos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); });\r\n };\r\n return AxisManager;\r\n}());\r\nexports.AxisManager = AxisManager;\r\n;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"DIRECTION_NONE\"] = 1] = \"DIRECTION_NONE\";\r\n DIRECTION[DIRECTION[\"DIRECTION_LEFT\"] = 2] = \"DIRECTION_LEFT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_RIGHT\"] = 4] = \"DIRECTION_RIGHT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_HORIZONTAL\"] = 6] = \"DIRECTION_HORIZONTAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_UP\"] = 8] = \"DIRECTION_UP\";\r\n DIRECTION[DIRECTION[\"DIRECTION_DOWN\"] = 16] = \"DIRECTION_DOWN\";\r\n DIRECTION[DIRECTION[\"DIRECTION_VERTICAL\"] = 24] = \"DIRECTION_VERTICAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_ALL\"] = 30] = \"DIRECTION_ALL\";\r\n})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));\r\nexports.TRANSFORM = (function () {\r\n var bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\r\n var target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\r\n for (var i = 0, len = target.length; i < len; i++) {\r\n if (target[i] in bodyStyle) {\r\n return target[i];\r\n }\r\n }\r\n return \"\";\r\n})();\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar Axes_1 = __webpack_require__(7);\r\nvar PanInput_1 = __webpack_require__(13);\r\nvar PinchInput_1 = __webpack_require__(14);\r\nvar WheelInput_1 = __webpack_require__(15);\r\nvar MoveKeyInput_1 = __webpack_require__(16);\r\nAxes_1[\"default\"].PanInput = PanInput_1.PanInput;\r\nAxes_1[\"default\"].PinchInput = PinchInput_1.PinchInput;\r\nAxes_1[\"default\"].WheelInput = WheelInput_1.WheelInput;\r\nAxes_1[\"default\"].MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\r\nmodule.exports = Axes_1[\"default\"];\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Component = __webpack_require__(8);\r\nvar AnimationManager_1 = __webpack_require__(9);\r\nvar EventManager_1 = __webpack_require__(10);\r\nvar InterruptManager_1 = __webpack_require__(11);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar InputObserver_1 = __webpack_require__(12);\r\nvar const_1 = __webpack_require__(5);\r\n/**\r\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\r\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @property {Number[]} [range] The coordinate of range 좌표 범위\r\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\r\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\r\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\r\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\r\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\r\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\r\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\r\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\r\n**/\r\n/**\r\n * @typedef {Object} AxesOption The option object of the eg.Axes module\r\n * @ko eg.Axes 모듈의 옵션 객체\r\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\r\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\r\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\r\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\r\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
\r\n**/\r\n/**\r\n * @class eg.Axes\r\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\r\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\r\n * @extends eg.Component\r\n *\r\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\r\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\r\n *\r\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\r\n * @example\r\n *\r\n * // 1. Initialize eg.Axes\r\n * const axes = new eg.Axes({\r\n *\tsomething1: {\r\n *\t\trange: [0, 150],\r\n *\t\tbounce: 50\r\n *\t},\r\n *\tsomething2: {\r\n *\t\trange: [0, 200],\r\n *\t\tbounce: 100\r\n *\t},\r\n *\tsomethingN: {\r\n *\t\trange: [1, 10],\r\n *\t}\r\n * }, {\r\n * deceleration : 0.0024\r\n * });\r\n *\r\n * // 2. attach event handler\r\n * axes.on({\r\n *\t\"hold\" : function(evt) {\r\n *\t},\r\n *\t\"release\" : function(evt) {\r\n *\t},\r\n *\t\"animationStart\" : function(evt) {\r\n *\t},\r\n *\t\"animationEnd\" : function(evt) {\r\n *\t},\r\n *\t\"change\" : function(evt) {\r\n *\t}\r\n * });\r\n *\r\n * // 3. Initialize inputTypes\r\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\r\n *\tscale: [0.5, 1]\r\n * });\r\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\r\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\r\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\r\n *\tscale: 1.5\r\n * });\r\n *\r\n * // 4. Connect eg.Axes and InputTypes\r\n * // [PanInput] When the mouse or touchscreen is down and moved.\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\r\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\r\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\r\n *\r\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something2\", pinchInputArea);\r\n */\r\nvar Axes = /** @class */ (function (_super) {\r\n __extends(Axes, _super);\r\n function Axes(axis, options, startPos) {\r\n if (axis === void 0) { axis = {}; }\r\n var _this = _super.call(this) || this;\r\n _this.axis = axis;\r\n _this._inputs = [];\r\n _this.options = __assign({\r\n easing: function easeOutCubic(x) {\r\n return 1 - Math.pow(1 - x, 3);\r\n },\r\n interruptable: true,\r\n maximumDuration: Infinity,\r\n minimumDuration: 0,\r\n deceleration: 0.0006\r\n }, options);\r\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\r\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\r\n _this.em = new EventManager_1.EventManager(_this);\r\n _this.am = new AnimationManager_1.AnimationManager(_this);\r\n _this.io = new InputObserver_1.InputObserver(_this);\r\n _this.em.setAnimationManager(_this.am);\r\n startPos && _this.em.triggerChange(startPos);\r\n return _this;\r\n }\r\n /**\r\n * Connect the axis of eg.Axes to the inputType.\r\n * @ko eg.Axes의 축과 inputType을 연결한다\r\n * @method eg.Axes#connect\r\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\r\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\r\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\r\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\r\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\r\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\r\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\r\n */\r\n Axes.prototype.connect = function (axes, inputType) {\r\n var mapped;\r\n if (typeof axes === \"string\") {\r\n mapped = axes.split(\" \");\r\n }\r\n else {\r\n mapped = axes.concat();\r\n }\r\n // check same instance\r\n if (~this._inputs.indexOf(inputType)) {\r\n this.disconnect(inputType);\r\n }\r\n // check same element in hammer type for share\r\n if (\"hammer\" in inputType) {\r\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\r\n if (targets.length) {\r\n inputType.hammer = targets[0].hammer;\r\n }\r\n }\r\n inputType.mapAxes(mapped);\r\n inputType.connect(this.io);\r\n this._inputs.push(inputType);\r\n return this;\r\n };\r\n /**\r\n * Disconnect the axis of eg.Axes from the inputType.\r\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\r\n * @method eg.Axes#disconnect\r\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * const input1 = new eg.Axes.PanInput(\"#area1\");\r\n * const input2 = new eg.Axes.PanInput(\"#area2\");\r\n * const input3 = new eg.Axes.PanInput(\"#area3\");\r\n *\r\n * axes.connect(\"x\", input1);\r\n * .connect(\"x xOther\", input2)\r\n * .connect([\"xOther\", \"x\"], input3);\r\n *\r\n * axes.disconnect(input1); // disconnects input1\r\n * axes.disconnect(); // disconnects all of them\r\n */\r\n Axes.prototype.disconnect = function (inputType) {\r\n if (inputType) {\r\n var index = this._inputs.indexOf(inputType);\r\n if (index >= 0) {\r\n this._inputs[index].disconnect();\r\n this._inputs.splice(index, 1);\r\n }\r\n }\r\n else {\r\n this._inputs.forEach(function (v) { return v.disconnect(); });\r\n this._inputs = [];\r\n }\r\n return this;\r\n };\r\n /**\r\n * Returns the current position of the coordinates.\r\n * @ko 좌표의 현재 위치를 반환한다\r\n * @method eg.Axes#get\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Object.} Axis coordinate information 축 좌표 정보\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\r\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\r\n */\r\n Axes.prototype.get = function (axes) {\r\n return this.axm.get(axes);\r\n };\r\n /**\r\n * Moves an axis to specific coordinates.\r\n * @ko 좌표를 이동한다.\r\n * @method eg.Axes#setTo\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setTo({\"x\": 30, \"zoom\": 60});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\r\n */\r\n Axes.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setTo(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Moves an axis from the current coordinates to specific coordinates.\r\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\r\n * @method eg.Axes#setBy\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setBy({\"x\": 30, \"zoom\": 10});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\r\n */\r\n Axes.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setBy(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Returns whether there is a coordinate in the bounce area of ​​the target axis.\r\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\r\n * @method eg.Axes#isBounceArea\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.isBounceArea([\"x\"]);\r\n * axes.isBounceArea([\"x\", \"zoom\"]);\r\n * axes.isBounceArea();\r\n */\r\n Axes.prototype.isBounceArea = function (axes) {\r\n return this.axm.isOutside(axes);\r\n };\r\n /**\r\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\r\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\r\n * @method eg.Axes#destroy\r\n */\r\n Axes.prototype.destroy = function () {\r\n this.disconnect();\r\n this.em.destroy();\r\n };\r\n Axes.VERSION = \"3.0.0-rc\";\r\n /**\r\n * @name eg.Axes.TRANSFORM\r\n * @desc Returns the transform attribute with CSS vendor prefixes.\r\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\r\n *\r\n * @constant\r\n * @type {String}\r\n * @example\r\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\r\n */\r\n Axes.TRANSFORM = const_1.TRANSFORM;\r\n /**\r\n * @name eg.Axes.DIRECTION_NONE\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\r\n /**\r\n * @name eg.Axes.DIRECTION_LEFT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\r\n /**\r\n * @name eg.Axes.DIRECTION_RIGHT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\r\n /**\r\n * @name eg.Axes.DIRECTION_UP\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\r\n /**\r\n * @name eg.Axes.DIRECTION_DOWN\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\r\n /**\r\n * @name eg.Axes.DIRECTION_HORIZONTAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_VERTICAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_ALL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\r\n return Axes;\r\n}(Component));\r\nexports[\"default\"] = Axes;\r\n;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar utils_1 = __webpack_require__(0);\r\nvar AnimationManager = /** @class */ (function () {\r\n function AnimationManager(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.animationEnd = this.animationEnd.bind(this);\r\n }\r\n AnimationManager.getDuration = function (duration, min, max) {\r\n return Math.max(Math.min(duration, max), min);\r\n };\r\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\r\n var _this = this;\r\n var duration;\r\n if (typeof wishDuration !== \"undefined\") {\r\n duration = wishDuration;\r\n }\r\n else {\r\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\r\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\r\n }\r\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\r\n };\r\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\r\n var depaPos = this.axm.get();\r\n var destPos = pos;\r\n var inputEvent = option && option.event || null;\r\n return {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: inputEvent,\r\n input: option && option.input || null,\r\n isTrusted: !!inputEvent,\r\n done: this.animationEnd\r\n };\r\n };\r\n AnimationManager.prototype.grab = function (axes, option) {\r\n if (this._animateParam && axes.length) {\r\n var orgPos_1 = this.axm.get(axes);\r\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\r\n this.em.triggerChange(pos, option, !!option);\r\n }\r\n this._animateParam = null;\r\n this._raf && utils_1.cancelAnimationFrame(this._raf);\r\n this._raf = null;\r\n this.em.triggerAnimationEnd(!!(option && option.event));\r\n }\r\n };\r\n AnimationManager.prototype.getEventInfo = function () {\r\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\r\n return {\r\n input: this._animateParam.input,\r\n event: this._animateParam.inputEvent\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n AnimationManager.prototype.restore = function (option) {\r\n var pos = this.axm.get();\r\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\r\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\r\n };\r\n AnimationManager.prototype.animationEnd = function () {\r\n var beforeParam = this.getEventInfo();\r\n this._animateParam = null;\r\n // for Circular\r\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\r\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\r\n this.itm.setInterrupt(false);\r\n this.em.triggerAnimationEnd(!!beforeParam);\r\n if (this.axm.isOutside()) {\r\n this.restore(beforeParam);\r\n }\r\n else {\r\n this.em.triggerFinish(!!beforeParam);\r\n }\r\n };\r\n AnimationManager.prototype.animateLoop = function (param, complete) {\r\n this._animateParam = __assign({}, param);\r\n this._animateParam.startTime = new Date().getTime();\r\n if (param.duration) {\r\n var info_1 = this._animateParam;\r\n var self_1 = this;\r\n (function loop() {\r\n self_1._raf = null;\r\n if (self_1.frame(info_1) >= 1) {\r\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\r\n self_1.em.triggerChange(param.destPos);\r\n }\r\n complete();\r\n return;\r\n } // animationEnd\r\n self_1._raf = utils_1.requestAnimationFrame(loop);\r\n })();\r\n }\r\n else {\r\n this.em.triggerChange(param.destPos);\r\n complete();\r\n }\r\n };\r\n AnimationManager.prototype.getUserControll = function (param) {\r\n var userWish = param.setTo();\r\n userWish.destPos = this.axm.get(userWish.destPos);\r\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\r\n return userWish;\r\n };\r\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\r\n var _this = this;\r\n var param = this.createAnimationParam(destPos, duration, option);\r\n var depaPos = __assign({}, param.depaPos);\r\n var retTrigger = this.em.triggerAnimationStart(param);\r\n // to control\r\n var userWish = this.getUserControll(param);\r\n // You can't stop the 'animationStart' event when 'circular' is true.\r\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\r\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\r\n }\r\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\r\n var inputEvent = option && option.event || null;\r\n this.animateLoop({\r\n depaPos: depaPos,\r\n destPos: userWish.destPos,\r\n duration: userWish.duration,\r\n delta: this.axm.getDelta(depaPos, userWish.destPos),\r\n isTrusted: !!inputEvent,\r\n inputEvent: inputEvent,\r\n input: option && option.input || null\r\n }, function () { return _this.animationEnd(); });\r\n }\r\n };\r\n // animation frame (0~1)\r\n AnimationManager.prototype.frame = function (param) {\r\n var curTime = new Date().getTime() - param.startTime;\r\n var easingPer = this.easing(curTime / param.duration);\r\n var toPos = param.depaPos;\r\n toPos = this.axm.map(toPos, function (v, k, opt) {\r\n v += param.delta[k] * easingPer;\r\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n });\r\n this.em.triggerChange(toPos);\r\n return easingPer;\r\n };\r\n AnimationManager.prototype.easing = function (p) {\r\n return p > 1 ? 1 : this.options.easing(p);\r\n };\r\n AnimationManager.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n var axes = Object.keys(pos);\r\n this.grab(axes);\r\n var orgPos = this.axm.get(axes);\r\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\r\n return this;\r\n }\r\n this.itm.setInterrupt(true);\r\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\r\n if (!Object.keys(movedPos).length) {\r\n return this;\r\n }\r\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\r\n }\r\n });\r\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\r\n return this;\r\n }\r\n if (duration > 0) {\r\n this.animateTo(movedPos, duration);\r\n }\r\n else {\r\n this.em.triggerChange(movedPos);\r\n this.itm.setInterrupt(false);\r\n }\r\n return this;\r\n };\r\n AnimationManager.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\r\n };\r\n return AnimationManager;\r\n}());\r\nexports.AnimationManager = AnimationManager;\r\n;\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(axes) {\r\n this.axes = axes;\r\n }\r\n /**\r\n * This event is fired when a user holds an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\r\n * @name eg.Axes#hold\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos coordinate 좌표 정보\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"hold\", function(event) {\r\n * // event.pos\r\n * // event.input\r\n * // event.inputEvent\r\n * // isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerHold = function (pos, option) {\r\n this.axes.trigger(\"hold\", {\r\n pos: pos,\r\n input: option.input || null,\r\n inputEvent: option.event || null,\r\n isTrusted: true\r\n });\r\n };\r\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\r\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\r\n * @name set\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\r\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\r\n * @name setTo\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationStart\", function(event) {\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n /**\r\n * This event is fired when a user release an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\r\n * @name eg.Axes#release\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'release' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerRelease = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n this.axes.trigger(\"release\", param);\r\n };\r\n /**\r\n * This event is fired when coordinate changes.\r\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\r\n * @name eg.Axes#change\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos The coordinate 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * // event.pos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.holding\r\n * // event.set\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the coordinates to move after the 'change' event.\r\n * // it works when the holding value of the change event is true.\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n EventManager.prototype.triggerChange = function (pos, option, holding) {\r\n if (option === void 0) { option = null; }\r\n if (holding === void 0) { holding = false; }\r\n var eventInfo = this.am.getEventInfo();\r\n var moveTo = this.am.axm.moveTo(pos);\r\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\r\n var param = {\r\n pos: moveTo.pos,\r\n delta: moveTo.delta,\r\n holding: holding,\r\n inputEvent: inputEvent,\r\n isTrusted: !!inputEvent,\r\n input: option && option.input || eventInfo && eventInfo.input || null,\r\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\r\n };\r\n this.axes.trigger(\"change\", param);\r\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\r\n };\r\n /**\r\n * This event is fired when animation starts.\r\n * @ko 에니메이션이 시작할 때 발생한다.\r\n * @name eg.Axes#animationStart\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationStart = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n return this.axes.trigger(\"animationStart\", param);\r\n };\r\n /**\r\n * This event is fired when animation ends.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#animationEnd\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationEnd\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"animationEnd\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n /**\r\n * This event is fired when all actions have been completed.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#finish\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"finish\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerFinish = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"finish\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n EventManager.prototype.createUserControll = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n // to controll\r\n var userControl = {\r\n destPos: __assign({}, pos),\r\n duration: duration\r\n };\r\n return function (toPos, userDuration) {\r\n toPos && (userControl.destPos = __assign({}, toPos));\r\n (userDuration !== undefined) && (userControl.duration = userDuration);\r\n return userControl;\r\n };\r\n };\r\n EventManager.prototype.setAnimationManager = function (am) {\r\n this.am = am;\r\n };\r\n EventManager.prototype.destroy = function () {\r\n this.axes.off();\r\n };\r\n return EventManager;\r\n}());\r\nexports.EventManager = EventManager;\r\n;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar InterruptManager = /** @class */ (function () {\r\n function InterruptManager(options) {\r\n this.options = options;\r\n this._prevented = false; // check whether the animation event was prevented\r\n }\r\n InterruptManager.prototype.isInterrupting = function () {\r\n // when interruptable is 'true', return value is always 'true'.\r\n return this.options.interruptable || this._prevented;\r\n };\r\n InterruptManager.prototype.isInterrupted = function () {\r\n return !this.options.interruptable && this._prevented;\r\n };\r\n InterruptManager.prototype.setInterrupt = function (prevented) {\r\n !this.options.interruptable && (this._prevented = prevented);\r\n };\r\n return InterruptManager;\r\n}());\r\nexports.InterruptManager = InterruptManager;\r\n;\r\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar InputObserver = /** @class */ (function () {\r\n function InputObserver(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\r\n this.isOutside = false;\r\n this.moveDistance = null;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.am = am;\r\n }\r\n // when move pointer is held in outside\r\n InputObserver.prototype.atOutside = function (pos) {\r\n var _this = this;\r\n if (this.isOutside) {\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var tn = opt.range[0] - opt.bounce[0];\r\n var tx = opt.range[1] + opt.bounce[1];\r\n return v > tx ? tx : (v < tn ? tn : v);\r\n });\r\n }\r\n else {\r\n // when start pointer is held in inside\r\n // get a initialization slope value to prevent smooth animation.\r\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var min = opt.range[0];\r\n var max = opt.range[1];\r\n var out = opt.bounce;\r\n if (v < min) {\r\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\r\n }\r\n else if (v > max) {\r\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\r\n }\r\n return v;\r\n });\r\n }\r\n };\r\n InputObserver.prototype.get = function (input) {\r\n return this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.hold = function (input, event) {\r\n if (this.itm.isInterrupted() || !input.axes.length) {\r\n return;\r\n }\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n this.itm.setInterrupt(true);\r\n this.am.grab(input.axes, changeOption);\r\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\r\n this.isOutside = this.axm.isOutside(input.axes);\r\n this.moveDistance = this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.change = function (input, event, offset) {\r\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\r\n return;\r\n }\r\n var depaPos = this.axm.get(input.axes);\r\n var destPos;\r\n // for outside logic\r\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\r\n this.moveDistance && (this.moveDistance = destPos);\r\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n // from outside to inside\r\n if (this.isOutside &&\r\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\r\n this.isOutside = false;\r\n }\r\n destPos = this.atOutside(destPos);\r\n this.em.triggerChange(destPos, {\r\n input: input,\r\n event: event\r\n }, true);\r\n };\r\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\r\n if (!this.itm.isInterrupting()) {\r\n return;\r\n }\r\n if (!this.moveDistance) {\r\n return;\r\n }\r\n var pos = this.axm.get(input.axes);\r\n var depaPos = this.axm.get();\r\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return pos[k] + v;\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\r\n }\r\n }));\r\n var duration = this.am.getDuration(destPos, pos, inputDuration);\r\n if (duration === 0) {\r\n destPos = __assign({}, depaPos);\r\n }\r\n // prepare params\r\n var param = {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: duration,\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: event,\r\n input: input,\r\n isTrusted: true\r\n };\r\n this.em.triggerRelease(param);\r\n this.moveDistance = null;\r\n // to contol\r\n var userWish = this.am.getUserControll(param);\r\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n if (isEqual || userWish.duration === 0) {\r\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\r\n this.itm.setInterrupt(false);\r\n if (this.axm.isOutside()) {\r\n this.am.restore(changeOption);\r\n }\r\n else {\r\n this.em.triggerFinish(true);\r\n }\r\n }\r\n else {\r\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\r\n }\r\n };\r\n return InputObserver;\r\n}());\r\nexports.InputObserver = InputObserver;\r\n;\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar const_1 = __webpack_require__(5);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\r\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\r\n * @property {String[]} [inputType=[\"touch\",\"mouse\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
\r\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\r\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\r\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\r\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PanInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\r\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\r\n *\r\n * @example\r\n * const pan = new eg.Axes.PanInput(\"#area\", {\r\n * \t\tinputType: [\"touch\"],\r\n * \t\tscale: [1, 1.3],\r\n * });\r\n *\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\r\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\r\n */\r\nvar PanInput = /** @class */ (function () {\r\n function PanInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n inputType: [\"touch\", \"mouse\"],\r\n scale: [1, 1],\r\n thresholdAngle: 45,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onHammerInput = this.onHammerInput.bind(this);\r\n this.onPanmove = this.onPanmove.bind(this);\r\n this.onPanend = this.onPanend.bind(this);\r\n }\r\n // get user's direction\r\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\r\n if (thresholdAngle < 0 || thresholdAngle > 90) {\r\n return const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n var toAngle = Math.abs(angle);\r\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\r\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n };\r\n PanInput.getNextOffset = function (speeds, deceleration) {\r\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\r\n var duration = Math.abs(normalSpeed / -deceleration);\r\n return [\r\n speeds[0] / 2 * duration,\r\n speeds[1] / 2 * duration\r\n ];\r\n };\r\n PanInput.useDirection = function (checkType, direction, userDirection) {\r\n if (userDirection) {\r\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\r\n ((direction & checkType) && (userDirection & checkType)));\r\n }\r\n else {\r\n return !!(direction & checkType);\r\n }\r\n };\r\n PanInput.prototype.mapAxes = function (axes) {\r\n var useHorizontal = !!axes[0];\r\n var useVertical = !!axes[1];\r\n if (useHorizontal && useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\r\n }\r\n else if (useHorizontal) {\r\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n }\r\n else if (useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n }\r\n else {\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n this.axes = axes;\r\n };\r\n PanInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n direction: this._direction,\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PanRecognizer.\r\n this.hammer.add(new Hammer.Pan(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer && this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n var inputClass = InputType_1.convertInputType(this.options.inputType);\r\n if (!inputClass) {\r\n throw new Error(\"Wrong inputType parameter!\");\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pan, hammerOption],\r\n ],\r\n inputClass: inputClass\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PanInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PanInput#destroy\r\n */\r\n PanInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PanInput#enable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PanInput#disable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PanInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PanInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\r\n };\r\n PanInput.prototype.onHammerInput = function (event) {\r\n if (this.isEnable()) {\r\n if (event.isFirst) {\r\n this.observer.hold(this, event);\r\n }\r\n else if (event.isFinal) {\r\n this.onPanend(event);\r\n }\r\n }\r\n };\r\n PanInput.prototype.onPanmove = function (event) {\r\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\r\n // not support offset properties in Hammerjs - start\r\n var prevInput = this.hammer.session.prevInput;\r\n /* eslint-disable no-param-reassign */\r\n if (prevInput) {\r\n event.offsetX = event.deltaX - prevInput.deltaX;\r\n event.offsetY = event.deltaY - prevInput.deltaY;\r\n }\r\n else {\r\n event.offsetX = 0;\r\n event.offsetY = 0;\r\n }\r\n var offset = this.getOffset([event.offsetX, event.offsetY], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\r\n ]);\r\n var prevent = offset.some(function (v) { return v !== 0; });\r\n if (prevent) {\r\n event.srcEvent.preventDefault();\r\n event.srcEvent.stopPropagation();\r\n }\r\n event.preventSystemEvent = prevent;\r\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.onPanend = function (event) {\r\n var offset = this.getOffset([\r\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\r\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\r\n ], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\r\n ]);\r\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"hammer.input\", this.onHammerInput)\r\n .on(\"panstart panmove\", this.onPanmove);\r\n };\r\n PanInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"hammer.input\", this.onHammerInput)\r\n .off(\"panstart panmove\", this.onPanmove);\r\n this.observer = null;\r\n };\r\n PanInput.prototype.getOffset = function (properties, useDirection) {\r\n var offset = [0, 0];\r\n var scale = this.options.scale;\r\n if (useDirection[0]) {\r\n offset[0] = (properties[0] * scale[0]);\r\n }\r\n if (useDirection[1]) {\r\n offset[1] = (properties[1] * scale[1]);\r\n }\r\n return offset;\r\n };\r\n return PanInput;\r\n}());\r\nexports.PanInput = PanInput;\r\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\r\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PinchInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\r\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n * @example\r\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something\", pinch);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\r\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\r\n */\r\nvar PinchInput = /** @class */ (function () {\r\n function PinchInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n this._base = null;\r\n this._prev = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onPinchStart = this.onPinchStart.bind(this);\r\n this.onPinchMove = this.onPinchMove.bind(this);\r\n this.onPinchEnd = this.onPinchEnd.bind(this);\r\n }\r\n PinchInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n PinchInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PinchRecognizer.\r\n this.hammer.add(new Hammer.Pinch(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pinch, hammerOption],\r\n ],\r\n inputClass: Hammer.TouchInput\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PinchInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PinchInput#destroy\r\n */\r\n PinchInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n PinchInput.prototype.onPinchStart = function (event) {\r\n this._base = this.observer.get(this)[this.axes[0]];\r\n var offset = this.getOffset(event.scale);\r\n this.observer.hold(this, event);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchMove = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchEnd = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\r\n this._base = null;\r\n this._prev = null;\r\n };\r\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\r\n if (prev === void 0) { prev = 1; }\r\n return this._base * (pinchScale - prev) * this.options.scale;\r\n };\r\n PinchInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"pinchstart\", this.onPinchStart)\r\n .on(\"pinchmove\", this.onPinchMove)\r\n .on(\"pinchend\", this.onPinchEnd);\r\n };\r\n PinchInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"pinchstart\", this.onPinchStart)\r\n .off(\"pinchmove\", this.onPinchMove)\r\n .off(\"pinchend\", this.onPinchEnd);\r\n this.observer = null;\r\n this._prev = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PinchInput#enable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PinchInput#disable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PinchInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PinchInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\r\n };\r\n return PinchInput;\r\n}());\r\nexports.PinchInput = PinchInput;\r\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\r\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.WheelInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\r\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when the mousewheel is moved.\r\n * axes.connect(\"something\", wheel);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\r\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\r\n */\r\nvar WheelInput = /** @class */ (function () {\r\n function WheelInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this._timer = null;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1\r\n }, options);\r\n this.onWheel = this.onWheel.bind(this);\r\n }\r\n WheelInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n WheelInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n WheelInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.WheelInput#destroy\r\n */\r\n WheelInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n WheelInput.prototype.onWheel = function (event) {\r\n var _this = this;\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n if (!this._isHolded) {\r\n this.observer.hold(this, event);\r\n this._isHolded = true;\r\n }\r\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale;\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(function () {\r\n if (_this._isHolded) {\r\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\r\n _this._isHolded = false;\r\n }\r\n }, 50);\r\n };\r\n WheelInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = true;\r\n };\r\n WheelInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.WheelInput#enable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.WheelInput#disable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.WheelInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n WheelInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return WheelInput;\r\n}());\r\nexports.WheelInput = WheelInput;\r\n;\r\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\nexports.KEYMAP = {\r\n LEFT_ARROW: 37,\r\n A: 65,\r\n UP_ARROW: 38,\r\n W: 87,\r\n RIGHT_ARROW: 39,\r\n D: 68,\r\n DOWN_ARROW: 40,\r\n S: 83\r\n};\r\n/**\r\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\r\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\r\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.MoveKeyInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\r\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\r\n * \t\tscale: [1, 1]\r\n * });\r\n *\r\n * // Connect 'x', 'y' axes when the moveKey is pressed.\r\n * axes.connect([\"x\", \"y\"], moveKey);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\r\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n */\r\nvar MoveKeyInput = /** @class */ (function () {\r\n function MoveKeyInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: [1, 1]\r\n }, options);\r\n this.onKeydown = this.onKeydown.bind(this);\r\n }\r\n MoveKeyInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n MoveKeyInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n // add tabindex=\"0\" to the container for making it focusable\r\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\r\n this.element.setAttribute(\"tabindex\", \"0\");\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n MoveKeyInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.MoveKeyInput#destroy\r\n */\r\n MoveKeyInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n MoveKeyInput.prototype.onKeydown = function (event) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n var isMoveKey = true;\r\n var offsets;\r\n var e = event;\r\n switch (e.keyCode) {\r\n case exports.KEYMAP.LEFT_ARROW:\r\n case exports.KEYMAP.A:\r\n offsets = [-this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.RIGHT_ARROW:\r\n case exports.KEYMAP.D:\r\n offsets = [this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.UP_ARROW:\r\n case exports.KEYMAP.W:\r\n offsets = [0, this.options.scale[1]];\r\n break;\r\n case exports.KEYMAP.DOWN_ARROW:\r\n case exports.KEYMAP.S:\r\n offsets = [0, -this.options.scale[1]];\r\n break;\r\n default:\r\n isMoveKey = false;\r\n }\r\n if (isMoveKey) {\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\r\n // Suppress \"double action\" if event handled\r\n e.preventDefault();\r\n }\r\n };\r\n MoveKeyInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = true;\r\n };\r\n MoveKeyInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.MoveKeyInput#enable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.MoveKeyInput#disable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.MoveKeyInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n MoveKeyInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return MoveKeyInput;\r\n}());\r\nexports.MoveKeyInput = MoveKeyInput;\r\n;\r\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=axes.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/axes/dist/axes.js\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 14\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 18\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 19\n// module chunks = 0 1 4 5"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACr2EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACllFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"SpinViewer/view360.spinviewer.pkgd.js","sources":["webpack:///webpack/universalModuleDefinition?5ca6*","webpack:///webpack/bootstrap 300fcddb410135c43d6f?8ae8*","webpack:///./~/@egjs/component/dist/component.js?12fb*","webpack:///./~/@egjs/axes/dist/axes.js?7d52*","webpack:///./src/SpinViewer/SpriteImage.js?e3b2","webpack:///./~/hammerjs/hammer.js?bc14*","webpack:///./src/SpinViewer/SpinViewer.js?0aed","webpack:///./src/SpinViewer/index.js?7db1"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 19);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 300fcddb410135c43d6f","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/component project is licensed under the MIT license\r\n * \r\n * @egjs/component JavaScript library\r\n * http://naver.github.io/egjs/component\r\n * \r\n * @version 2.1.0\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Component\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Component\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _Component = __webpack_require__(1);\n\nvar _Component2 = _interopRequireDefault(_Component);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_Component2[\"default\"].VERSION = \"2.1.0\";\nmodule.exports = _Component2[\"default\"];\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * A class used to manage events and options in a component\n * @ko 컴포넌트의 이벤트와 옵션을 관리할 수 있게 하는 클래스\n * @alias eg.Component\n */\nvar Component = function () {\n\t/**\n * @support {\"ie\": \"7+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.1+ (except 3.x)\"}\n */\n\tfunction Component() {\n\t\t_classCallCheck(this, Component);\n\n\t\tthis._eventHandler = {};\n\t\tthis.options = {};\n\t}\n\t/**\n * Triggers a custom event.\n * @ko 커스텀 이벤트를 발생시킨다\n * @param {String} eventName The name of the custom event to be triggered 발생할 커스텀 이벤트의 이름\n * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터\n * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고\n * @example\n class Some extends eg.Component {\n some(){\n \tif(this.trigger(\"beforeHi\")){ // When event call to stop return false.\n \tthis.trigger(\"hi\");// fire hi event.\n \t}\n }\n }\n const some = new Some();\n some.on(\"beforeHi\", (e) => {\n if(condition){\n \te.stop(); // When event call to stop, `hi` event not call.\n }\n });\n some.on(\"hi\", (e) => {\n // `currentTarget` is component instance.\n console.log(some === e.currentTarget); // true\n });\n // If you want to more know event design. You can see article.\n // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F\n */\n\n\n\tComponent.prototype.trigger = function trigger(eventName) {\n\t\tvar customEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar handlerList = this._eventHandler[eventName] || [];\n\t\tvar hasHandlerList = handlerList.length > 0;\n\n\t\tif (!hasHandlerList) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If detach method call in handler in first time then handeler list calls.\n\t\thandlerList = handlerList.concat();\n\n\t\tcustomEvent.eventType = eventName;\n\n\t\tvar isCanceled = false;\n\t\tvar arg = [customEvent];\n\t\tvar i = 0;\n\n\t\tcustomEvent.stop = function () {\n\t\t\tisCanceled = true;\n\t\t};\n\t\tcustomEvent.currentTarget = this;\n\n\t\tfor (var _len = arguments.length, restParam = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t\t\trestParam[_key - 2] = arguments[_key];\n\t\t}\n\n\t\tif (restParam.length >= 1) {\n\t\t\targ = arg.concat(restParam);\n\t\t}\n\n\t\tfor (i = 0; handlerList[i]; i++) {\n\t\t\thandlerList[i].apply(this, arg);\n\t\t}\n\n\t\treturn !isCanceled;\n\t};\n\t/**\n * Executed event just one time.\n * @ko 이벤트가 한번만 실행된다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n alert(\"hi\");\n }\n thing() {\n this.once(\"hi\", this.hi);\n }\n }\n var some = new Some();\n some.thing();\n some.trigger(\"hi\");\n // fire alert(\"hi\");\n some.trigger(\"hi\");\n // Nothing happens\n */\n\n\n\tComponent.prototype.once = function once(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar i = void 0;\n\n\t\t\tfor (i in eventHash) {\n\t\t\t\tthis.once(i, eventHash[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar self = this;\n\n\t\t\tthis.on(eventName, function listener() {\n\t\t\t\tfor (var _len2 = arguments.length, arg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\t\targ[_key2] = arguments[_key2];\n\t\t\t\t}\n\n\t\t\t\thandlerToAttach.apply(self, arg);\n\t\t\t\tself.off(eventName, listener);\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n * Checks whether an event has been attached to a component.\n * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다.\n * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름\n * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부\n * @example\n class Some extends eg.Component {\n some() {\n this.hasOn(\"hi\");// check hi event.\n }\n }\n */\n\n\n\tComponent.prototype.hasOn = function hasOn(eventName) {\n\t\treturn !!this._eventHandler[eventName];\n\t};\n\n\t/**\n * Attaches an event to a component.\n * @ko 컴포넌트에 이벤트를 등록한다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.on(\"hi\",this.hi); //attach event\n }\n }\n */\n\n\n\tComponent.prototype.on = function on(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar name = void 0;\n\n\t\t\tfor (name in eventHash) {\n\t\t\t\tthis.on(name, eventHash[name]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\t\tif (typeof handlerList === \"undefined\") {\n\t\t\t\tthis._eventHandler[eventName] = [];\n\t\t\t\thandlerList = this._eventHandler[eventName];\n\t\t\t}\n\n\t\t\thandlerList.push(handlerToAttach);\n\t\t}\n\n\t\treturn this;\n\t};\n\t/**\n * Detaches an event from the component.\n * @ko 컴포넌트에 등록된 이벤트를 해제한다\n * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름\n * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.off(\"hi\",this.hi); //detach event\n }\n }\n */\n\n\n\tComponent.prototype.off = function off(eventName, handlerToDetach) {\n\t\t// All event detach.\n\t\tif (typeof eventName === \"undefined\") {\n\t\t\tthis._eventHandler = {};\n\t\t\treturn this;\n\t\t}\n\n\t\t// All handler of specific event detach.\n\t\tif (typeof handlerToDetach === \"undefined\") {\n\t\t\tif (typeof eventName === \"string\") {\n\t\t\t\tthis._eventHandler[eventName] = undefined;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar eventHash = eventName;\n\t\t\t\tvar name = void 0;\n\n\t\t\t\tfor (name in eventHash) {\n\t\t\t\t\tthis.off(name, eventHash[name]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// The handler of specific event detach.\n\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\tif (handlerList) {\n\t\t\tvar k = void 0;\n\t\t\tvar handlerFunction = void 0;\n\n\t\t\tfor (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) {\n\t\t\t\tif (handlerFunction === handlerToDetach) {\n\t\t\t\t\thandlerList = handlerList.splice(k, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\treturn Component;\n}();\n\nexports[\"default\"] = Component;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=component.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/component/dist/component.js\n// module id = 0\n// module chunks = 0 1 2 3 4 5","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/axes project is licensed under the MIT license\r\n * \r\n * @egjs/axes JavaScript library\r\n * https://github.com/naver/egjs-axes\r\n * \r\n * @version 2.3.3\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammerjs\", \"@egjs/component\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Axes\"] = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Axes\"] = factory(root[\"Hammer\"], root[\"eg\"][\"Component\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nfunction toArray(nodes) {\r\n // const el = Array.prototype.slice.call(nodes);\r\n // for IE8\r\n var el = [];\r\n for (var i = 0, len = nodes.length; i < len; i++) {\r\n el.push(nodes[i]);\r\n }\r\n return el;\r\n}\r\nexports.toArray = toArray;\r\nfunction $(param, multi) {\r\n if (multi === void 0) { multi = false; }\r\n var el;\r\n if (typeof param === \"string\") {\r\n // check if string is HTML tag format\r\n var match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\r\n // creating element\r\n if (match) {\r\n var dummy = document.createElement(\"div\");\r\n dummy.innerHTML = param;\r\n el = toArray(dummy.childNodes);\r\n }\r\n else {\r\n el = toArray(document.querySelectorAll(param));\r\n }\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n else if (param === window) {\r\n el = param;\r\n }\r\n else if (param.nodeName &&\r\n (param.nodeType === 1 || param.nodeType === 9)) {\r\n el = param;\r\n }\r\n else if ((\"jQuery\" in window && param instanceof jQuery) ||\r\n param.constructor.prototype.jquery) {\r\n el = multi ? param.toArray() : param.get(0);\r\n }\r\n else if (Array.isArray(param)) {\r\n el = param.map(function (v) { return $(v); });\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n return el;\r\n}\r\nexports.$ = $;\r\nvar raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame;\r\nvar caf = window.cancelAnimationFrame || window.webkitCancelAnimationFrame;\r\nif (raf && !caf) {\r\n var keyInfo_1 = {};\r\n var oldraf_1 = raf;\r\n raf = function (callback) {\r\n function wrapCallback(timestamp) {\r\n if (keyInfo_1[key]) {\r\n callback(timestamp);\r\n }\r\n }\r\n var key = oldraf_1(wrapCallback);\r\n keyInfo_1[key] = true;\r\n return key;\r\n };\r\n caf = function (key) {\r\n delete keyInfo_1[key];\r\n };\r\n}\r\nelse if (!(raf && caf)) {\r\n raf = function (callback) {\r\n return window.setTimeout(function () {\r\n callback(window.performance && window.performance.now && window.performance.now() || new Date().getTime());\r\n }, 16);\r\n };\r\n caf = window.clearTimeout;\r\n}\r\n/**\r\n * A polyfill for the window.requestAnimationFrame() method.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame\r\n * @private\r\n */\r\nfunction requestAnimationFrame(fp) {\r\n return raf(fp);\r\n}\r\nexports.requestAnimationFrame = requestAnimationFrame;\r\n;\r\n/**\r\n* A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method.\r\n* @param {Number} key −\tThe ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값\r\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame\r\n* @private\r\n*/\r\nfunction cancelAnimationFrame(key) {\r\n caf(key);\r\n}\r\nexports.cancelAnimationFrame = cancelAnimationFrame;\r\n;\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nexports.SUPPORT_TOUCH = \"ontouchstart\" in window;\r\nexports.UNIQUEKEY = \"_EGJS_AXES_INPUTTYPE_\";\r\nfunction toAxis(source, offset) {\r\n return offset.reduce(function (acc, v, i) {\r\n if (source[i]) {\r\n acc[source[i]] = v;\r\n }\r\n return acc;\r\n }, {});\r\n}\r\nexports.toAxis = toAxis;\r\n;\r\nfunction createHammer(element, options) {\r\n try {\r\n // create Hammer\r\n return new Hammer.Manager(element, __assign({}, options));\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\nexports.createHammer = createHammer;\r\n;\r\nfunction convertInputType(inputType) {\r\n if (inputType === void 0) { inputType = []; }\r\n var hasTouch = false;\r\n var hasMouse = false;\r\n inputType.forEach(function (v) {\r\n switch (v) {\r\n case \"mouse\":\r\n hasMouse = true;\r\n break;\r\n case \"touch\": hasTouch = exports.SUPPORT_TOUCH;\r\n }\r\n });\r\n return (hasTouch && Hammer.TouchInput) ||\r\n (hasMouse && Hammer.MouseInput) || null;\r\n}\r\nexports.convertInputType = convertInputType;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar Coordinate = {\r\n getInsidePosition: function (destPos, range, circular, bounce) {\r\n var toDestPos = destPos;\r\n var targetRange = [\r\n circular[0] ? range[0] : (bounce ? range[0] - bounce[0] : range[0]),\r\n circular[1] ? range[1] : (bounce ? range[1] + bounce[1] : range[1])\r\n ];\r\n toDestPos = Math.max(targetRange[0], toDestPos);\r\n toDestPos = Math.min(targetRange[1], toDestPos);\r\n return +toDestPos.toFixed(5);\r\n },\r\n // determine outside\r\n isOutside: function (pos, range) {\r\n return pos < range[0] || pos > range[1];\r\n },\r\n getDuration: function (distance, deceleration) {\r\n var duration = Math.sqrt(distance / deceleration * 2);\r\n // when duration is under 100, then value is zero\r\n return duration < 100 ? 0 : duration;\r\n },\r\n isCircularable: function (destPos, range, circular) {\r\n return (circular[1] && destPos > range[1]) ||\r\n (circular[0] && destPos < range[0]);\r\n },\r\n getCirculatedPos: function (pos, range, circular) {\r\n var toPos = pos;\r\n var min = range[0];\r\n var max = range[1];\r\n var length = max - min;\r\n if (circular[1] && pos > max) {\r\n toPos = (toPos - max) % length + min;\r\n }\r\n if (circular[0] && pos < min) {\r\n toPos = (toPos - min) % length + max;\r\n }\r\n return +toPos.toFixed(5);\r\n }\r\n};\r\nexports[\"default\"] = Coordinate;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\n;\r\nvar AxisManager = /** @class */ (function () {\r\n function AxisManager(axis, options) {\r\n var _this = this;\r\n this.axis = axis;\r\n this.options = options;\r\n this._complementOptions();\r\n this._pos = Object.keys(this.axis).reduce(function (acc, v) {\r\n acc[v] = _this.axis[v].range[0];\r\n return acc;\r\n }, {});\r\n }\r\n AxisManager.equal = function (target, base) {\r\n for (var k in target) {\r\n if (target[k] !== base[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * set up 'css' expression\r\n * @private\r\n */\r\n AxisManager.prototype._complementOptions = function () {\r\n var _this = this;\r\n Object.keys(this.axis).forEach(function (axis) {\r\n _this.axis[axis] = __assign({\r\n range: [0, 100],\r\n bounce: [0, 0],\r\n circular: [false, false]\r\n }, _this.axis[axis]);\r\n [\"bounce\", \"circular\"].forEach(function (v) {\r\n var axisOption = _this.axis;\r\n var key = axisOption[axis][v];\r\n if (/string|number|boolean/.test(typeof key)) {\r\n axisOption[axis][v] = [key, key];\r\n }\r\n });\r\n });\r\n };\r\n AxisManager.prototype.getDelta = function (depaPos, destPos) {\r\n var fullDepaPos = this.get(depaPos);\r\n return this.map(this.get(destPos), function (v, k) { return v - fullDepaPos[k]; });\r\n };\r\n AxisManager.prototype.get = function (axes) {\r\n var _this = this;\r\n if (axes && Array.isArray(axes)) {\r\n return axes.reduce(function (acc, v) {\r\n if (v && (v in _this._pos)) {\r\n acc[v] = _this._pos[v];\r\n }\r\n return acc;\r\n }, {});\r\n }\r\n else {\r\n return __assign({}, this._pos, (axes || {}));\r\n }\r\n };\r\n AxisManager.prototype.moveTo = function (pos) {\r\n var _this = this;\r\n var delta = this.map(this._pos, function (v, key) {\r\n return pos[key] ? pos[key] - _this._pos[key] : 0;\r\n });\r\n this.set(pos);\r\n return {\r\n pos: __assign({}, this._pos),\r\n delta: delta\r\n };\r\n };\r\n AxisManager.prototype.set = function (pos) {\r\n for (var k in pos) {\r\n if (k && (k in this._pos)) {\r\n this._pos[k] = pos[k];\r\n }\r\n }\r\n };\r\n AxisManager.prototype.every = function (pos, callback) {\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n if (!callback(pos[k], k, axisOptions[k])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n AxisManager.prototype.filter = function (pos, callback) {\r\n var filtered = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n callback(pos[k], k, axisOptions[k]) && (filtered[k] = pos[k]);\r\n }\r\n }\r\n return filtered;\r\n };\r\n AxisManager.prototype.map = function (pos, callback) {\r\n var tranformed = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n tranformed[k] = callback(pos[k], k, axisOptions[k]);\r\n }\r\n }\r\n return tranformed;\r\n };\r\n AxisManager.prototype.isOutside = function (axes) {\r\n return !this.every(axes ? this.get(axes) : this._pos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); });\r\n };\r\n return AxisManager;\r\n}());\r\nexports.AxisManager = AxisManager;\r\n;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"DIRECTION_NONE\"] = 1] = \"DIRECTION_NONE\";\r\n DIRECTION[DIRECTION[\"DIRECTION_LEFT\"] = 2] = \"DIRECTION_LEFT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_RIGHT\"] = 4] = \"DIRECTION_RIGHT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_HORIZONTAL\"] = 6] = \"DIRECTION_HORIZONTAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_UP\"] = 8] = \"DIRECTION_UP\";\r\n DIRECTION[DIRECTION[\"DIRECTION_DOWN\"] = 16] = \"DIRECTION_DOWN\";\r\n DIRECTION[DIRECTION[\"DIRECTION_VERTICAL\"] = 24] = \"DIRECTION_VERTICAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_ALL\"] = 30] = \"DIRECTION_ALL\";\r\n})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));\r\nexports.TRANSFORM = (function () {\r\n var bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\r\n var target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\r\n for (var i = 0, len = target.length; i < len; i++) {\r\n if (target[i] in bodyStyle) {\r\n return target[i];\r\n }\r\n }\r\n return \"\";\r\n})();\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar Axes_1 = __webpack_require__(7);\r\nvar PanInput_1 = __webpack_require__(13);\r\nvar PinchInput_1 = __webpack_require__(14);\r\nvar WheelInput_1 = __webpack_require__(15);\r\nvar MoveKeyInput_1 = __webpack_require__(16);\r\nAxes_1[\"default\"].PanInput = PanInput_1.PanInput;\r\nAxes_1[\"default\"].PinchInput = PinchInput_1.PinchInput;\r\nAxes_1[\"default\"].WheelInput = WheelInput_1.WheelInput;\r\nAxes_1[\"default\"].MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\r\nmodule.exports = Axes_1[\"default\"];\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Component = __webpack_require__(8);\r\nvar AnimationManager_1 = __webpack_require__(9);\r\nvar EventManager_1 = __webpack_require__(10);\r\nvar InterruptManager_1 = __webpack_require__(11);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar InputObserver_1 = __webpack_require__(12);\r\nvar const_1 = __webpack_require__(5);\r\n/**\r\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\r\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @property {Number[]} [range] The coordinate of range 좌표 범위\r\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\r\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\r\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\r\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\r\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\r\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\r\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\r\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\r\n**/\r\n/**\r\n * @typedef {Object} AxesOption The option object of the eg.Axes module\r\n * @ko eg.Axes 모듈의 옵션 객체\r\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\r\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\r\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\r\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\r\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
\r\n**/\r\n/**\r\n * @class eg.Axes\r\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\r\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\r\n * @extends eg.Component\r\n *\r\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\r\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\r\n *\r\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\r\n * @example\r\n *\r\n * // 1. Initialize eg.Axes\r\n * const axes = new eg.Axes({\r\n *\tsomething1: {\r\n *\t\trange: [0, 150],\r\n *\t\tbounce: 50\r\n *\t},\r\n *\tsomething2: {\r\n *\t\trange: [0, 200],\r\n *\t\tbounce: 100\r\n *\t},\r\n *\tsomethingN: {\r\n *\t\trange: [1, 10],\r\n *\t}\r\n * }, {\r\n * deceleration : 0.0024\r\n * });\r\n *\r\n * // 2. attach event handler\r\n * axes.on({\r\n *\t\"hold\" : function(evt) {\r\n *\t},\r\n *\t\"release\" : function(evt) {\r\n *\t},\r\n *\t\"animationStart\" : function(evt) {\r\n *\t},\r\n *\t\"animationEnd\" : function(evt) {\r\n *\t},\r\n *\t\"change\" : function(evt) {\r\n *\t}\r\n * });\r\n *\r\n * // 3. Initialize inputTypes\r\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\r\n *\tscale: [0.5, 1]\r\n * });\r\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\r\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\r\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\r\n *\tscale: 1.5\r\n * });\r\n *\r\n * // 4. Connect eg.Axes and InputTypes\r\n * // [PanInput] When the mouse or touchscreen is down and moved.\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\r\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\r\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\r\n *\r\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something2\", pinchInputArea);\r\n */\r\nvar Axes = /** @class */ (function (_super) {\r\n __extends(Axes, _super);\r\n function Axes(axis, options, startPos) {\r\n if (axis === void 0) { axis = {}; }\r\n var _this = _super.call(this) || this;\r\n _this.axis = axis;\r\n _this._inputs = [];\r\n _this.options = __assign({\r\n easing: function easeOutCubic(x) {\r\n return 1 - Math.pow(1 - x, 3);\r\n },\r\n interruptable: true,\r\n maximumDuration: Infinity,\r\n minimumDuration: 0,\r\n deceleration: 0.0006\r\n }, options);\r\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\r\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\r\n _this.em = new EventManager_1.EventManager(_this);\r\n _this.am = new AnimationManager_1.AnimationManager(_this);\r\n _this.io = new InputObserver_1.InputObserver(_this);\r\n _this.em.setAnimationManager(_this.am);\r\n startPos && _this.em.triggerChange(startPos);\r\n return _this;\r\n }\r\n /**\r\n * Connect the axis of eg.Axes to the inputType.\r\n * @ko eg.Axes의 축과 inputType을 연결한다\r\n * @method eg.Axes#connect\r\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\r\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\r\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\r\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\r\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\r\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\r\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\r\n */\r\n Axes.prototype.connect = function (axes, inputType) {\r\n var mapped;\r\n if (typeof axes === \"string\") {\r\n mapped = axes.split(\" \");\r\n }\r\n else {\r\n mapped = axes.concat();\r\n }\r\n // check same instance\r\n if (~this._inputs.indexOf(inputType)) {\r\n this.disconnect(inputType);\r\n }\r\n // check same element in hammer type for share\r\n if (\"hammer\" in inputType) {\r\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\r\n if (targets.length) {\r\n inputType.hammer = targets[0].hammer;\r\n }\r\n }\r\n inputType.mapAxes(mapped);\r\n inputType.connect(this.io);\r\n this._inputs.push(inputType);\r\n return this;\r\n };\r\n /**\r\n * Disconnect the axis of eg.Axes from the inputType.\r\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\r\n * @method eg.Axes#disconnect\r\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * const input1 = new eg.Axes.PanInput(\"#area1\");\r\n * const input2 = new eg.Axes.PanInput(\"#area2\");\r\n * const input3 = new eg.Axes.PanInput(\"#area3\");\r\n *\r\n * axes.connect(\"x\", input1);\r\n * .connect(\"x xOther\", input2)\r\n * .connect([\"xOther\", \"x\"], input3);\r\n *\r\n * axes.disconnect(input1); // disconnects input1\r\n * axes.disconnect(); // disconnects all of them\r\n */\r\n Axes.prototype.disconnect = function (inputType) {\r\n if (inputType) {\r\n var index = this._inputs.indexOf(inputType);\r\n if (index >= 0) {\r\n this._inputs[index].disconnect();\r\n this._inputs.splice(index, 1);\r\n }\r\n }\r\n else {\r\n this._inputs.forEach(function (v) { return v.disconnect(); });\r\n this._inputs = [];\r\n }\r\n return this;\r\n };\r\n /**\r\n * Returns the current position of the coordinates.\r\n * @ko 좌표의 현재 위치를 반환한다\r\n * @method eg.Axes#get\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Object.} Axis coordinate information 축 좌표 정보\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\r\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\r\n */\r\n Axes.prototype.get = function (axes) {\r\n return this.axm.get(axes);\r\n };\r\n /**\r\n * Moves an axis to specific coordinates.\r\n * @ko 좌표를 이동한다.\r\n * @method eg.Axes#setTo\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setTo({\"x\": 30, \"zoom\": 60});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\r\n */\r\n Axes.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setTo(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Moves an axis from the current coordinates to specific coordinates.\r\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\r\n * @method eg.Axes#setBy\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setBy({\"x\": 30, \"zoom\": 10});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\r\n */\r\n Axes.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setBy(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Returns whether there is a coordinate in the bounce area of ​​the target axis.\r\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\r\n * @method eg.Axes#isBounceArea\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.isBounceArea([\"x\"]);\r\n * axes.isBounceArea([\"x\", \"zoom\"]);\r\n * axes.isBounceArea();\r\n */\r\n Axes.prototype.isBounceArea = function (axes) {\r\n return this.axm.isOutside(axes);\r\n };\r\n /**\r\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\r\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\r\n * @method eg.Axes#destroy\r\n */\r\n Axes.prototype.destroy = function () {\r\n this.disconnect();\r\n this.em.destroy();\r\n };\r\n Axes.VERSION = \"3.0.0-rc\";\r\n /**\r\n * @name eg.Axes.TRANSFORM\r\n * @desc Returns the transform attribute with CSS vendor prefixes.\r\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\r\n *\r\n * @constant\r\n * @type {String}\r\n * @example\r\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\r\n */\r\n Axes.TRANSFORM = const_1.TRANSFORM;\r\n /**\r\n * @name eg.Axes.DIRECTION_NONE\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\r\n /**\r\n * @name eg.Axes.DIRECTION_LEFT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\r\n /**\r\n * @name eg.Axes.DIRECTION_RIGHT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\r\n /**\r\n * @name eg.Axes.DIRECTION_UP\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\r\n /**\r\n * @name eg.Axes.DIRECTION_DOWN\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\r\n /**\r\n * @name eg.Axes.DIRECTION_HORIZONTAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_VERTICAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_ALL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\r\n return Axes;\r\n}(Component));\r\nexports[\"default\"] = Axes;\r\n;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar utils_1 = __webpack_require__(0);\r\nvar AnimationManager = /** @class */ (function () {\r\n function AnimationManager(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.animationEnd = this.animationEnd.bind(this);\r\n }\r\n AnimationManager.getDuration = function (duration, min, max) {\r\n return Math.max(Math.min(duration, max), min);\r\n };\r\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\r\n var _this = this;\r\n var duration;\r\n if (typeof wishDuration !== \"undefined\") {\r\n duration = wishDuration;\r\n }\r\n else {\r\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\r\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\r\n }\r\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\r\n };\r\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\r\n var depaPos = this.axm.get();\r\n var destPos = pos;\r\n var inputEvent = option && option.event || null;\r\n return {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: inputEvent,\r\n input: option && option.input || null,\r\n isTrusted: !!inputEvent,\r\n done: this.animationEnd\r\n };\r\n };\r\n AnimationManager.prototype.grab = function (axes, option) {\r\n if (this._animateParam && axes.length) {\r\n var orgPos_1 = this.axm.get(axes);\r\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\r\n this.em.triggerChange(pos, option, !!option);\r\n }\r\n this._animateParam = null;\r\n this._raf && utils_1.cancelAnimationFrame(this._raf);\r\n this._raf = null;\r\n this.em.triggerAnimationEnd(!!(option && option.event));\r\n }\r\n };\r\n AnimationManager.prototype.getEventInfo = function () {\r\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\r\n return {\r\n input: this._animateParam.input,\r\n event: this._animateParam.inputEvent\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n AnimationManager.prototype.restore = function (option) {\r\n var pos = this.axm.get();\r\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\r\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\r\n };\r\n AnimationManager.prototype.animationEnd = function () {\r\n var beforeParam = this.getEventInfo();\r\n this._animateParam = null;\r\n // for Circular\r\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\r\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\r\n this.itm.setInterrupt(false);\r\n this.em.triggerAnimationEnd(!!beforeParam);\r\n if (this.axm.isOutside()) {\r\n this.restore(beforeParam);\r\n }\r\n else {\r\n this.em.triggerFinish(!!beforeParam);\r\n }\r\n };\r\n AnimationManager.prototype.animateLoop = function (param, complete) {\r\n this._animateParam = __assign({}, param);\r\n this._animateParam.startTime = new Date().getTime();\r\n if (param.duration) {\r\n var info_1 = this._animateParam;\r\n var self_1 = this;\r\n (function loop() {\r\n self_1._raf = null;\r\n if (self_1.frame(info_1) >= 1) {\r\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\r\n self_1.em.triggerChange(param.destPos);\r\n }\r\n complete();\r\n return;\r\n } // animationEnd\r\n self_1._raf = utils_1.requestAnimationFrame(loop);\r\n })();\r\n }\r\n else {\r\n this.em.triggerChange(param.destPos);\r\n complete();\r\n }\r\n };\r\n AnimationManager.prototype.getUserControll = function (param) {\r\n var userWish = param.setTo();\r\n userWish.destPos = this.axm.get(userWish.destPos);\r\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\r\n return userWish;\r\n };\r\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\r\n var _this = this;\r\n var param = this.createAnimationParam(destPos, duration, option);\r\n var depaPos = __assign({}, param.depaPos);\r\n var retTrigger = this.em.triggerAnimationStart(param);\r\n // to control\r\n var userWish = this.getUserControll(param);\r\n // You can't stop the 'animationStart' event when 'circular' is true.\r\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\r\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\r\n }\r\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\r\n var inputEvent = option && option.event || null;\r\n this.animateLoop({\r\n depaPos: depaPos,\r\n destPos: userWish.destPos,\r\n duration: userWish.duration,\r\n delta: this.axm.getDelta(depaPos, userWish.destPos),\r\n isTrusted: !!inputEvent,\r\n inputEvent: inputEvent,\r\n input: option && option.input || null\r\n }, function () { return _this.animationEnd(); });\r\n }\r\n };\r\n // animation frame (0~1)\r\n AnimationManager.prototype.frame = function (param) {\r\n var curTime = new Date().getTime() - param.startTime;\r\n var easingPer = this.easing(curTime / param.duration);\r\n var toPos = param.depaPos;\r\n toPos = this.axm.map(toPos, function (v, k, opt) {\r\n v += param.delta[k] * easingPer;\r\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n });\r\n this.em.triggerChange(toPos);\r\n return easingPer;\r\n };\r\n AnimationManager.prototype.easing = function (p) {\r\n return p > 1 ? 1 : this.options.easing(p);\r\n };\r\n AnimationManager.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n var axes = Object.keys(pos);\r\n this.grab(axes);\r\n var orgPos = this.axm.get(axes);\r\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\r\n return this;\r\n }\r\n this.itm.setInterrupt(true);\r\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\r\n if (!Object.keys(movedPos).length) {\r\n return this;\r\n }\r\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\r\n }\r\n });\r\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\r\n return this;\r\n }\r\n if (duration > 0) {\r\n this.animateTo(movedPos, duration);\r\n }\r\n else {\r\n this.em.triggerChange(movedPos);\r\n this.itm.setInterrupt(false);\r\n }\r\n return this;\r\n };\r\n AnimationManager.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\r\n };\r\n return AnimationManager;\r\n}());\r\nexports.AnimationManager = AnimationManager;\r\n;\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(axes) {\r\n this.axes = axes;\r\n }\r\n /**\r\n * This event is fired when a user holds an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\r\n * @name eg.Axes#hold\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos coordinate 좌표 정보\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"hold\", function(event) {\r\n * // event.pos\r\n * // event.input\r\n * // event.inputEvent\r\n * // isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerHold = function (pos, option) {\r\n this.axes.trigger(\"hold\", {\r\n pos: pos,\r\n input: option.input || null,\r\n inputEvent: option.event || null,\r\n isTrusted: true\r\n });\r\n };\r\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\r\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\r\n * @name set\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\r\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\r\n * @name setTo\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationStart\", function(event) {\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n /**\r\n * This event is fired when a user release an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\r\n * @name eg.Axes#release\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'release' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerRelease = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n this.axes.trigger(\"release\", param);\r\n };\r\n /**\r\n * This event is fired when coordinate changes.\r\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\r\n * @name eg.Axes#change\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos The coordinate 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * // event.pos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.holding\r\n * // event.set\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the coordinates to move after the 'change' event.\r\n * // it works when the holding value of the change event is true.\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n EventManager.prototype.triggerChange = function (pos, option, holding) {\r\n if (option === void 0) { option = null; }\r\n if (holding === void 0) { holding = false; }\r\n var eventInfo = this.am.getEventInfo();\r\n var moveTo = this.am.axm.moveTo(pos);\r\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\r\n var param = {\r\n pos: moveTo.pos,\r\n delta: moveTo.delta,\r\n holding: holding,\r\n inputEvent: inputEvent,\r\n isTrusted: !!inputEvent,\r\n input: option && option.input || eventInfo && eventInfo.input || null,\r\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\r\n };\r\n this.axes.trigger(\"change\", param);\r\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\r\n };\r\n /**\r\n * This event is fired when animation starts.\r\n * @ko 에니메이션이 시작할 때 발생한다.\r\n * @name eg.Axes#animationStart\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationStart = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n return this.axes.trigger(\"animationStart\", param);\r\n };\r\n /**\r\n * This event is fired when animation ends.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#animationEnd\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationEnd\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"animationEnd\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n /**\r\n * This event is fired when all actions have been completed.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#finish\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"finish\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerFinish = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"finish\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n EventManager.prototype.createUserControll = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n // to controll\r\n var userControl = {\r\n destPos: __assign({}, pos),\r\n duration: duration\r\n };\r\n return function (toPos, userDuration) {\r\n toPos && (userControl.destPos = __assign({}, toPos));\r\n (userDuration !== undefined) && (userControl.duration = userDuration);\r\n return userControl;\r\n };\r\n };\r\n EventManager.prototype.setAnimationManager = function (am) {\r\n this.am = am;\r\n };\r\n EventManager.prototype.destroy = function () {\r\n this.axes.off();\r\n };\r\n return EventManager;\r\n}());\r\nexports.EventManager = EventManager;\r\n;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar InterruptManager = /** @class */ (function () {\r\n function InterruptManager(options) {\r\n this.options = options;\r\n this._prevented = false; // check whether the animation event was prevented\r\n }\r\n InterruptManager.prototype.isInterrupting = function () {\r\n // when interruptable is 'true', return value is always 'true'.\r\n return this.options.interruptable || this._prevented;\r\n };\r\n InterruptManager.prototype.isInterrupted = function () {\r\n return !this.options.interruptable && this._prevented;\r\n };\r\n InterruptManager.prototype.setInterrupt = function (prevented) {\r\n !this.options.interruptable && (this._prevented = prevented);\r\n };\r\n return InterruptManager;\r\n}());\r\nexports.InterruptManager = InterruptManager;\r\n;\r\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar InputObserver = /** @class */ (function () {\r\n function InputObserver(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\r\n this.isOutside = false;\r\n this.moveDistance = null;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.am = am;\r\n }\r\n // when move pointer is held in outside\r\n InputObserver.prototype.atOutside = function (pos) {\r\n var _this = this;\r\n if (this.isOutside) {\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var tn = opt.range[0] - opt.bounce[0];\r\n var tx = opt.range[1] + opt.bounce[1];\r\n return v > tx ? tx : (v < tn ? tn : v);\r\n });\r\n }\r\n else {\r\n // when start pointer is held in inside\r\n // get a initialization slope value to prevent smooth animation.\r\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var min = opt.range[0];\r\n var max = opt.range[1];\r\n var out = opt.bounce;\r\n if (v < min) {\r\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\r\n }\r\n else if (v > max) {\r\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\r\n }\r\n return v;\r\n });\r\n }\r\n };\r\n InputObserver.prototype.get = function (input) {\r\n return this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.hold = function (input, event) {\r\n if (this.itm.isInterrupted() || !input.axes.length) {\r\n return;\r\n }\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n this.itm.setInterrupt(true);\r\n this.am.grab(input.axes, changeOption);\r\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\r\n this.isOutside = this.axm.isOutside(input.axes);\r\n this.moveDistance = this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.change = function (input, event, offset) {\r\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\r\n return;\r\n }\r\n var depaPos = this.axm.get(input.axes);\r\n var destPos;\r\n // for outside logic\r\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\r\n this.moveDistance && (this.moveDistance = destPos);\r\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n // from outside to inside\r\n if (this.isOutside &&\r\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\r\n this.isOutside = false;\r\n }\r\n destPos = this.atOutside(destPos);\r\n this.em.triggerChange(destPos, {\r\n input: input,\r\n event: event\r\n }, true);\r\n };\r\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\r\n if (!this.itm.isInterrupting()) {\r\n return;\r\n }\r\n if (!this.moveDistance) {\r\n return;\r\n }\r\n var pos = this.axm.get(input.axes);\r\n var depaPos = this.axm.get();\r\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return pos[k] + v;\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\r\n }\r\n }));\r\n var duration = this.am.getDuration(destPos, pos, inputDuration);\r\n if (duration === 0) {\r\n destPos = __assign({}, depaPos);\r\n }\r\n // prepare params\r\n var param = {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: duration,\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: event,\r\n input: input,\r\n isTrusted: true\r\n };\r\n this.em.triggerRelease(param);\r\n this.moveDistance = null;\r\n // to contol\r\n var userWish = this.am.getUserControll(param);\r\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n if (isEqual || userWish.duration === 0) {\r\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\r\n this.itm.setInterrupt(false);\r\n if (this.axm.isOutside()) {\r\n this.am.restore(changeOption);\r\n }\r\n else {\r\n this.em.triggerFinish(true);\r\n }\r\n }\r\n else {\r\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\r\n }\r\n };\r\n return InputObserver;\r\n}());\r\nexports.InputObserver = InputObserver;\r\n;\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar const_1 = __webpack_require__(5);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\r\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\r\n * @property {String[]} [inputType=[\"touch\",\"mouse\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
\r\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\r\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\r\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\r\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PanInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\r\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\r\n *\r\n * @example\r\n * const pan = new eg.Axes.PanInput(\"#area\", {\r\n * \t\tinputType: [\"touch\"],\r\n * \t\tscale: [1, 1.3],\r\n * });\r\n *\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\r\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\r\n */\r\nvar PanInput = /** @class */ (function () {\r\n function PanInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n inputType: [\"touch\", \"mouse\"],\r\n scale: [1, 1],\r\n thresholdAngle: 45,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onHammerInput = this.onHammerInput.bind(this);\r\n this.onPanmove = this.onPanmove.bind(this);\r\n this.onPanend = this.onPanend.bind(this);\r\n }\r\n // get user's direction\r\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\r\n if (thresholdAngle < 0 || thresholdAngle > 90) {\r\n return const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n var toAngle = Math.abs(angle);\r\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\r\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n };\r\n PanInput.getNextOffset = function (speeds, deceleration) {\r\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\r\n var duration = Math.abs(normalSpeed / -deceleration);\r\n return [\r\n speeds[0] / 2 * duration,\r\n speeds[1] / 2 * duration\r\n ];\r\n };\r\n PanInput.useDirection = function (checkType, direction, userDirection) {\r\n if (userDirection) {\r\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\r\n ((direction & checkType) && (userDirection & checkType)));\r\n }\r\n else {\r\n return !!(direction & checkType);\r\n }\r\n };\r\n PanInput.prototype.mapAxes = function (axes) {\r\n var useHorizontal = !!axes[0];\r\n var useVertical = !!axes[1];\r\n if (useHorizontal && useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\r\n }\r\n else if (useHorizontal) {\r\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n }\r\n else if (useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n }\r\n else {\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n this.axes = axes;\r\n };\r\n PanInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n direction: this._direction,\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PanRecognizer.\r\n this.hammer.add(new Hammer.Pan(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer && this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n var inputClass = InputType_1.convertInputType(this.options.inputType);\r\n if (!inputClass) {\r\n throw new Error(\"Wrong inputType parameter!\");\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pan, hammerOption],\r\n ],\r\n inputClass: inputClass\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PanInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PanInput#destroy\r\n */\r\n PanInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PanInput#enable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PanInput#disable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PanInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PanInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\r\n };\r\n PanInput.prototype.onHammerInput = function (event) {\r\n if (this.isEnable()) {\r\n if (event.isFirst) {\r\n this.observer.hold(this, event);\r\n }\r\n else if (event.isFinal) {\r\n this.onPanend(event);\r\n }\r\n }\r\n };\r\n PanInput.prototype.onPanmove = function (event) {\r\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\r\n // not support offset properties in Hammerjs - start\r\n var prevInput = this.hammer.session.prevInput;\r\n /* eslint-disable no-param-reassign */\r\n if (prevInput) {\r\n event.offsetX = event.deltaX - prevInput.deltaX;\r\n event.offsetY = event.deltaY - prevInput.deltaY;\r\n }\r\n else {\r\n event.offsetX = 0;\r\n event.offsetY = 0;\r\n }\r\n var offset = this.getOffset([event.offsetX, event.offsetY], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\r\n ]);\r\n var prevent = offset.some(function (v) { return v !== 0; });\r\n if (prevent) {\r\n event.srcEvent.preventDefault();\r\n event.srcEvent.stopPropagation();\r\n }\r\n event.preventSystemEvent = prevent;\r\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.onPanend = function (event) {\r\n var offset = this.getOffset([\r\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\r\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\r\n ], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\r\n ]);\r\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"hammer.input\", this.onHammerInput)\r\n .on(\"panstart panmove\", this.onPanmove);\r\n };\r\n PanInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"hammer.input\", this.onHammerInput)\r\n .off(\"panstart panmove\", this.onPanmove);\r\n this.observer = null;\r\n };\r\n PanInput.prototype.getOffset = function (properties, useDirection) {\r\n var offset = [0, 0];\r\n var scale = this.options.scale;\r\n if (useDirection[0]) {\r\n offset[0] = (properties[0] * scale[0]);\r\n }\r\n if (useDirection[1]) {\r\n offset[1] = (properties[1] * scale[1]);\r\n }\r\n return offset;\r\n };\r\n return PanInput;\r\n}());\r\nexports.PanInput = PanInput;\r\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\r\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PinchInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\r\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n * @example\r\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something\", pinch);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\r\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\r\n */\r\nvar PinchInput = /** @class */ (function () {\r\n function PinchInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n this._base = null;\r\n this._prev = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onPinchStart = this.onPinchStart.bind(this);\r\n this.onPinchMove = this.onPinchMove.bind(this);\r\n this.onPinchEnd = this.onPinchEnd.bind(this);\r\n }\r\n PinchInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n PinchInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PinchRecognizer.\r\n this.hammer.add(new Hammer.Pinch(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pinch, hammerOption],\r\n ],\r\n inputClass: Hammer.TouchInput\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PinchInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PinchInput#destroy\r\n */\r\n PinchInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n PinchInput.prototype.onPinchStart = function (event) {\r\n this._base = this.observer.get(this)[this.axes[0]];\r\n var offset = this.getOffset(event.scale);\r\n this.observer.hold(this, event);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchMove = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchEnd = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\r\n this._base = null;\r\n this._prev = null;\r\n };\r\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\r\n if (prev === void 0) { prev = 1; }\r\n return this._base * (pinchScale - prev) * this.options.scale;\r\n };\r\n PinchInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"pinchstart\", this.onPinchStart)\r\n .on(\"pinchmove\", this.onPinchMove)\r\n .on(\"pinchend\", this.onPinchEnd);\r\n };\r\n PinchInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"pinchstart\", this.onPinchStart)\r\n .off(\"pinchmove\", this.onPinchMove)\r\n .off(\"pinchend\", this.onPinchEnd);\r\n this.observer = null;\r\n this._prev = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PinchInput#enable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PinchInput#disable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PinchInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PinchInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\r\n };\r\n return PinchInput;\r\n}());\r\nexports.PinchInput = PinchInput;\r\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\r\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.WheelInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\r\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when the mousewheel is moved.\r\n * axes.connect(\"something\", wheel);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\r\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\r\n */\r\nvar WheelInput = /** @class */ (function () {\r\n function WheelInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this._timer = null;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1\r\n }, options);\r\n this.onWheel = this.onWheel.bind(this);\r\n }\r\n WheelInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n WheelInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n WheelInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.WheelInput#destroy\r\n */\r\n WheelInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n WheelInput.prototype.onWheel = function (event) {\r\n var _this = this;\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n if (!this._isHolded) {\r\n this.observer.hold(this, event);\r\n this._isHolded = true;\r\n }\r\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale;\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(function () {\r\n if (_this._isHolded) {\r\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\r\n _this._isHolded = false;\r\n }\r\n }, 50);\r\n };\r\n WheelInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = true;\r\n };\r\n WheelInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.WheelInput#enable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.WheelInput#disable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.WheelInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n WheelInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return WheelInput;\r\n}());\r\nexports.WheelInput = WheelInput;\r\n;\r\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\nexports.KEYMAP = {\r\n LEFT_ARROW: 37,\r\n A: 65,\r\n UP_ARROW: 38,\r\n W: 87,\r\n RIGHT_ARROW: 39,\r\n D: 68,\r\n DOWN_ARROW: 40,\r\n S: 83\r\n};\r\n/**\r\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\r\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\r\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.MoveKeyInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\r\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\r\n * \t\tscale: [1, 1]\r\n * });\r\n *\r\n * // Connect 'x', 'y' axes when the moveKey is pressed.\r\n * axes.connect([\"x\", \"y\"], moveKey);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\r\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n */\r\nvar MoveKeyInput = /** @class */ (function () {\r\n function MoveKeyInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: [1, 1]\r\n }, options);\r\n this.onKeydown = this.onKeydown.bind(this);\r\n }\r\n MoveKeyInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n MoveKeyInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n // add tabindex=\"0\" to the container for making it focusable\r\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\r\n this.element.setAttribute(\"tabindex\", \"0\");\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n MoveKeyInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.MoveKeyInput#destroy\r\n */\r\n MoveKeyInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n MoveKeyInput.prototype.onKeydown = function (event) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n var isMoveKey = true;\r\n var offsets;\r\n var e = event;\r\n switch (e.keyCode) {\r\n case exports.KEYMAP.LEFT_ARROW:\r\n case exports.KEYMAP.A:\r\n offsets = [-this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.RIGHT_ARROW:\r\n case exports.KEYMAP.D:\r\n offsets = [this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.UP_ARROW:\r\n case exports.KEYMAP.W:\r\n offsets = [0, this.options.scale[1]];\r\n break;\r\n case exports.KEYMAP.DOWN_ARROW:\r\n case exports.KEYMAP.S:\r\n offsets = [0, -this.options.scale[1]];\r\n break;\r\n default:\r\n isMoveKey = false;\r\n }\r\n if (isMoveKey) {\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\r\n // Suppress \"double action\" if event handled\r\n e.preventDefault();\r\n }\r\n };\r\n MoveKeyInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = true;\r\n };\r\n MoveKeyInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.MoveKeyInput#enable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.MoveKeyInput#disable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.MoveKeyInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n MoveKeyInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return MoveKeyInput;\r\n}());\r\nexports.MoveKeyInput = MoveKeyInput;\r\n;\r\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=axes.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/axes/dist/axes.js\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 14\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 18\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 19\n// module chunks = 0 1 4 5"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACr2EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACllFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/view360.js b/dist/view360.js index d356e3c58..7a8fa086f 100644 --- a/dist/view360.js +++ b/dist/view360.js @@ -4682,7 +4682,7 @@ var ImageLoader = function () { res(_this._image); } else if (_this._loadStatus === STATUS.LOADING) { _this._once("load", function () { - res(_this._image); + return res(_this._image); }); _this._once("error", function () { return rej("ImageLoader: failed to load images."); @@ -4718,7 +4718,7 @@ var ImageLoader = function () { } this._once("load", function () { - _this2._loadStatus = STATUS.LOADED; + return _this2._loadStatus = STATUS.LOADED; }); this._once("error", function () { return _this2._loadStatus = STATUS.ERROR; diff --git a/dist/view360.js.map b/dist/view360.js.map index 0f3b8d6af..e2aeb5e5c 100644 --- a/dist/view360.js.map +++ b/dist/view360.js.map @@ -1 +1 @@ -{"version":3,"file":"view360.js","sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 93b3240e8d27dfb37e66","webpack:///external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}","webpack:///./src/utils/math-util.js","webpack:///./src/utils/mathUtil/common.js","webpack:///./~/es6-promise/dist/es6-promise.js","webpack:///./~/webvr-polyfill/src/math-util.js","webpack:///./~/webvr-polyfill/src/util.js","webpack:///./src/YawPitchControl/browser.js","webpack:///./src/YawPitchControl/consts.js","webpack:///external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}","webpack:///./src/SpinViewer/SpriteImage.js","webpack:///./src/PanoImageRenderer/WebGLUtils.js","webpack:///./src/PanoImageRenderer/renderer/Renderer.js","webpack:///./src/YawPitchControl/utils.js","webpack:///./~/@egjs/agent/dist/agent.js","webpack:///./src/YawPitchControl/index.js","webpack:///./src/PanoViewer/PanoViewer.js","webpack:///./src/PanoViewer/index.js","webpack:///./src/SpinViewer/SpinViewer.js","webpack:///./src/SpinViewer/index.js","webpack:///./src/PanoImageRenderer/ImageLoader.js","webpack:///./src/PanoImageRenderer/PanoImageRenderer.js","webpack:///./src/PanoImageRenderer/VideoLoader.js","webpack:///./src/PanoImageRenderer/index.js","webpack:///./src/PanoImageRenderer/renderer/CubeRenderer.js","webpack:///./src/PanoImageRenderer/renderer/SphereRenderer.js","webpack:///./src/PanoViewer/consts.js","webpack:///./src/YawPitchControl/YawPitchControl.js","webpack:///./src/YawPitchControl/input/ComplementaryFilter.js","webpack:///./src/YawPitchControl/input/DeviceMotion.js","webpack:///./src/YawPitchControl/input/FusionPoseSensor.js","webpack:///./src/YawPitchControl/input/TiltMotionInput.js","webpack:///./src/YawPitchControl/input/WheelInput.js","webpack:///./src/utils/mathUtil/mat4.js","webpack:///./src/utils/mathUtil/quat.js","webpack:///./src/utils/mathUtil/vec2.js","webpack:///./src/utils/mathUtil/vec3.js","webpack:///./~/process/browser.js","webpack:///(webpack)/buildin/global.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js","webpack:///vertx (ignored)","webpack:///./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [\"@egjs/component\", \"@egjs/axes\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory(root[\"eg\"][\"Component\"], root[\"eg\"][\"Axes\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 42);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 93b3240e8d27dfb37e66","module.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 14\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 17\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 18\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\tres(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\t_this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 19\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 35\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 36\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 37\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 39\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 40\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 41\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.VERSION = exports.SpriteImage = exports.SpinViewer = exports.PanoViewer = exports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar VERSION = \"3.0.0-rc\";\n\nexports.YawPitchControl = _YawPitchControl.YawPitchControl;\nexports.PanoViewer = _PanoViewer.PanoViewer;\nexports.SpinViewer = _SpinViewer.SpinViewer;\nexports.SpriteImage = _SpinViewer.SpriteImage;\nexports.VERSION = VERSION;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/index.js\n// module id = 42\n// module chunks = 0 1"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"view360.js","sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap e06ee2bc33cb3d5d9c75","webpack:///external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}","webpack:///./src/utils/math-util.js","webpack:///./src/utils/mathUtil/common.js","webpack:///./~/es6-promise/dist/es6-promise.js","webpack:///./~/webvr-polyfill/src/math-util.js","webpack:///./~/webvr-polyfill/src/util.js","webpack:///./src/YawPitchControl/browser.js","webpack:///./src/YawPitchControl/consts.js","webpack:///external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}","webpack:///./src/SpinViewer/SpriteImage.js","webpack:///./src/PanoImageRenderer/WebGLUtils.js","webpack:///./src/PanoImageRenderer/renderer/Renderer.js","webpack:///./src/YawPitchControl/utils.js","webpack:///./~/@egjs/agent/dist/agent.js","webpack:///./src/YawPitchControl/index.js","webpack:///./src/PanoViewer/PanoViewer.js","webpack:///./src/PanoViewer/index.js","webpack:///./src/SpinViewer/SpinViewer.js","webpack:///./src/SpinViewer/index.js","webpack:///./src/PanoImageRenderer/ImageLoader.js","webpack:///./src/PanoImageRenderer/PanoImageRenderer.js","webpack:///./src/PanoImageRenderer/VideoLoader.js","webpack:///./src/PanoImageRenderer/index.js","webpack:///./src/PanoImageRenderer/renderer/CubeRenderer.js","webpack:///./src/PanoImageRenderer/renderer/SphereRenderer.js","webpack:///./src/PanoViewer/consts.js","webpack:///./src/YawPitchControl/YawPitchControl.js","webpack:///./src/YawPitchControl/input/ComplementaryFilter.js","webpack:///./src/YawPitchControl/input/DeviceMotion.js","webpack:///./src/YawPitchControl/input/FusionPoseSensor.js","webpack:///./src/YawPitchControl/input/TiltMotionInput.js","webpack:///./src/YawPitchControl/input/WheelInput.js","webpack:///./src/utils/mathUtil/mat4.js","webpack:///./src/utils/mathUtil/quat.js","webpack:///./src/utils/mathUtil/vec2.js","webpack:///./src/utils/mathUtil/vec3.js","webpack:///./~/process/browser.js","webpack:///(webpack)/buildin/global.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js","webpack:///vertx (ignored)","webpack:///./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [\"@egjs/component\", \"@egjs/axes\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory(require(\"@egjs/component\"), require(\"@egjs/axes\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory(root[\"eg\"][\"Component\"], root[\"eg\"][\"Axes\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 42);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e06ee2bc33cb3d5d9c75","module.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/component\",\"commonjs2\":\"@egjs/component\",\"amd\":\"@egjs/component\",\"root\":[\"eg\",\"Component\"]}\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external {\"commonjs\":\"@egjs/axes\",\"commonjs2\":\"@egjs/axes\",\"amd\":\"@egjs/axes\",\"root\":[\"eg\",\"Axes\"]}\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 14\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 17\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 18\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\treturn res(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 19\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 35\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 36\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 37\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 39\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 40\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 41\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.VERSION = exports.SpriteImage = exports.SpinViewer = exports.PanoViewer = exports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar VERSION = \"3.0.0-rc\";\n\nexports.YawPitchControl = _YawPitchControl.YawPitchControl;\nexports.PanoViewer = _PanoViewer.PanoViewer;\nexports.SpinViewer = _SpinViewer.SpinViewer;\nexports.SpriteImage = _SpinViewer.SpriteImage;\nexports.VERSION = VERSION;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/index.js\n// module id = 42\n// module chunks = 0 1"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/view360.min.js b/dist/view360.min.js index 53a69a199..455cb50ca 100644 --- a/dist/view360.min.js +++ b/dist/view360.min.js @@ -7,5 +7,5 @@ * * @version 3.0.0-rc */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@egjs/component"),require("@egjs/axes")):"function"==typeof define&&define.amd?define("view360",["@egjs/component","@egjs/axes"],t):"object"==typeof exports?exports.view360=t(require("@egjs/component"),require("@egjs/axes")):(e.eg=e.eg||{},e.eg.view360=t(e.eg.Component,e.eg.Axes))}(this,function(e,t){return function(e){function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.l=!0,r.exports}var t={};return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.i=function(e){return e},__webpack_require__.d=function(e,t,n){__webpack_require__.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=42)}([function(t,n){t.exports=e},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function quatToVec3(e){var t=a["default"].fromValues(0,0,1);return a["default"].transformQuat(t,t,e),t}function getRotationDelta(e,t,n){var r=a["default"].fromValues(p[n].targetAxis[0],p[n].targetAxis[1],p[n].targetAxis[2]),o=p[n].meshPoint,s=l["default"].clone(e),u=l["default"].clone(t);l["default"].normalize(s,s),l["default"].normalize(u,u);var c=a["default"].fromValues(0,0,1),h=a["default"].fromValues(0,0,1);a["default"].transformQuat(c,c,s),a["default"].transformQuat(h,h,u),a["default"].transformQuat(r,r,u);var f=a["default"].dot(r,a["default"].cross(a["default"].create(),c,h)),d=f>0?1:-1,_=a["default"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a["default"].fromValues(0,d,0):a["default"].fromValues(d,0,0),a["default"].transformQuat(_,_,u),a["default"].transformQuat(m,m,u);var g=_,v=m,y=a["default"].create();a["default"].cross(y,g,v),a["default"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(h,h,u),c=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a["default"].create();a["default"].subtract(T,c,a["default"].scale(a["default"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a["default"].length(T)*a["default"].length(h));x>1&&(x=1);var P=Math.acos(x),C=a["default"].cross(a["default"].create(),h,T);E=w*C[0]+R*C[1]+b*C[2];var I=void 0;I=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var S=P*I*d;return i["default"].toDegree(S)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return"number"!=typeof e?"Not a number":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l["default"].create();return l["default"].rotateY(n,n,i["default"].toRadian(e)),l["default"].rotateX(n,n,i["default"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i["default"].toDegree(d.extractYawFromQuat(e)),pitch:i["default"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i["default"],t.mat4=f["default"],t.quat=l["default"],t.vec2=u["default"],t.vec3=a["default"],t.ROTATE_CONSTANT=p},function(e,t,n){"use strict";var r={};r.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){"use strict";function objectOrFunction(e){var t=typeof e;return null!==e&&("object"===t||"function"===t)}function isFunction(e){return"function"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return"data:"+e+";base64,"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i="",o=0;o-1?e.split("/")[2]:e.split("/")[0],t=t.split(":")[0]},e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();r.Float32Array="undefined"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH="ontouchstart"in r,t.SUPPORT_DEVICEMOTION="ondevicemotion"in r},function(e,t,n){"use strict";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS="pinchstart pinchmove pinchend",t.KEYMAP=i},function(e,n){e.exports=t},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=function(e){function SpriteImage(t,n){_classCallCheck(this,SpriteImage);var r=_possibleConstructorReturn(this,e.call(this)),i=n||{};return r._el=t,r._rowCount=i.rowCount||1,r._colCount=i.colCount||1,r._totalCount=r._rowCount*r._colCount,r._width=i.width||"auto",r._height=i.height||"auto",r._autoHeight=null!=i.autoHeight?i.autoHeight:"true",r._colRow=[0,0],i.colRow?r._colRow=i.colRow:i.frameIndex&&r.setFrameIndex(i.frameIndex),r._el.style.width=SpriteImage._getSizeString(r._width),r._el.style.height=SpriteImage._getSizeString(r._height),i.imageUrl?(r._image=new Image,r._image.onload=function(){r._bg=SpriteImage._createBgDiv(r._image,r._rowCount,r._colCount,r._autoHeight),r._el.appendChild(r._bg),r.setColRow(r._colRow[0],r._colRow[1]),r.trigger("load",{target:r._el,bgElement:r._bg}),r._autoPlayReservedInfo&&(r.play(r._autoPlayReservedInfo),r._autoPlayReservedInfo=null)},r._image.onerror=function(e){r.trigger("imageError",{imageUrl:i.imageUrl})},r._image.src=i.imageUrl,r):(setTimeout(function(){r.trigger("imageError",{imageUrl:i.imageUrl})},0),_possibleConstructorReturn(r))}return _inherits(SpriteImage,e),SpriteImage._createBgDiv=function(e,t,n,r){var i=document.createElement("div");i.style.backgroundImage="url("+e.src+")",i.style.backgroundSize=100*n+"% "+100*t+"%";var o=e.width/n,a=e.height/t;if(r){var s=a/o;i.style.paddingBottom=100*s+"%"}else i.style.height="100%";return i},SpriteImage.prototype.setFrameIndex=function(e){var t=this.toColRow(e);this.setColRow(t[0],t[1])},SpriteImage.prototype.getFrameIndex=function(){return this._colRow[1]*this._colCount+this._colRow[0]},SpriteImage.prototype.setColRow=function(e,t){t>this._rowCount-1||e>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-e+"% "+100*-t+"%"),this._colRow=[e,t])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(e){return"number"==typeof e?e+"px":e},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var e=this,t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=t.interval,r=t.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:r});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var i=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){i%=e._totalCount;var t=e.toColRow(i);e.setColRow(t[0],t[1]),i++,++a===e._totalCount&&(a=0,o++),r>0&&o===r&&clearInterval(e._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(e){var t=this._colCount,n=this._rowCount;return e<0?[0,0]:e>=this._totalCount?[t-1,n-1]:[e%t,Math.floor(e/t)]},SpriteImage}(i["default"]);t["default"]=o},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={0:"NO_ERROR",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",37442:"CONTEXT_LOST_WEBGL"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=["webgl","experimental-webgl","webkit-3d","moz-webgl"],n=null;e.addEventListener("webglcontextcreationerror",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o["default"].setUa(e);var t={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),"ios"===t.os.name&&t.browser.webview&&(t.browser.version="-1"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{"default":e}}(i);agent.VERSION="2.1.2",t["default"]=agent,e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){"use strict";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,"i").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i["default"].browser,i["default"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i["default"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i["default"].defaultString.browser.version,r=new RegExp("("+e+")","i").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i["default"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i["default"].os,e)}function getOsName(){return getIdentityStringFromArray(i["default"].os,i["default"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i["default"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp("("+a+")\\s([\\d_\\.]+|\\d_0)","i");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=void 0;t["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};t["default"]=r,e.exports=t["default"]}])})},function(e,t,n){"use strict";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(7);i["default"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i["default"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i["default"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i["default"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i["default"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i["default"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})["catch"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on("change",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){"boolean"==typeof e&&this._yawPitchControl.option("useZoom",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option("useKeyboard",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option("useGyro",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option("fovRange",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option("yawRange",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option("pitchRange",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option("showPolePoint",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option("pitchRange"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new a["default"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f["default"]:p["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement("canvas");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n("ImageLoader is not initialized");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension("WEBGL_lose_context");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*v,i=t*v;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+l["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l["default"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=l["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l["default"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l["default"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l["default"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,"aVertexPosition"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=e.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=e.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,"aTextureCoord"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l["default"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i["default"]);t["default"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=g},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if("object"===(void 0===e?"undefined":r(e))?(t=e.src,n=e.type):"string"==typeof e&&(t=e),!t)return!1;var i=document.createElement("source");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:"string"!=typeof e&&"object"!==(void 0===e?"undefined":r(e))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once("loadeddata",function(){return t(e._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t["default"]=a},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i["default"],t.WebGLUtils=a["default"]},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn("Image width("+r+") exceeds device limit("+i+"))");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i["default"]);t["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){"use strict";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return"string"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return"showPolePoint"===e||"fov"===e||"aspectRatio"===e||"yawRange"===e||"pitchRange"===e})&&this._updateControlScale(),e.some(function(e){return"fovRange"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return"useGyro"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return"useKeyboard"===e})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return"useZoom"===e})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);g.VERSION="3.0.0-rc",t["default"]=g},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i["default"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",i["default"].radToDeg*a["default"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i["default"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t["default"]=u["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf("Android"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener("deviceorientation",this._onDeviceOrientation),a.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener("deviceorientation",this._onDeviceOrientation),a.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i["default"]);t["default"]=s},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),g=.98,v=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p["default"],t.accelerometer=new u["default"].Vector3,t.gyroscope=new u["default"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m["default"](g),t.posePredictor=new a["default"](v),t.filterToWorldQ=new u["default"].Quaternion,t.isFirefoxAndroid=l["default"].isFirefoxAndroid(),t.isIOS=l["default"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u["default"].Quaternion,t.worldToScreenQ=new u["default"].Quaternion,t.originalPoseAdjustQ=new u["default"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l["default"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u["default"].Quaternion,t.deviceMotion.on("devicemotion",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger("change",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u["default"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i["default"]);t["default"]=y},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i["default"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i["default"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i["default"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n0?1:-1,_=a["default"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a["default"].fromValues(0,d,0):a["default"].fromValues(d,0,0),a["default"].transformQuat(_,_,u),a["default"].transformQuat(m,m,u);var g=_,v=m,y=a["default"].create();a["default"].cross(y,g,v),a["default"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(h,h,u),c=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a["default"].create();a["default"].subtract(T,c,a["default"].scale(a["default"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a["default"].length(T)*a["default"].length(h));x>1&&(x=1);var P=Math.acos(x),C=a["default"].cross(a["default"].create(),h,T);E=w*C[0]+R*C[1]+b*C[2];var I=void 0;I=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var S=P*I*d;return i["default"].toDegree(S)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return"number"!=typeof e?"Not a number":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l["default"].create();return l["default"].rotateY(n,n,i["default"].toRadian(e)),l["default"].rotateX(n,n,i["default"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i["default"].toDegree(d.extractYawFromQuat(e)),pitch:i["default"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i["default"],t.mat4=f["default"],t.quat=l["default"],t.vec2=u["default"],t.vec3=a["default"],t.ROTATE_CONSTANT=p},function(e,t,n){"use strict";var r={};r.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){"use strict";function objectOrFunction(e){var t=typeof e;return null!==e&&("object"===t||"function"===t)}function isFunction(e){return"function"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return"data:"+e+";base64,"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i="",o=0;o-1?e.split("/")[2]:e.split("/")[0],t=t.split(":")[0]},e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();r.Float32Array="undefined"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH="ontouchstart"in r,t.SUPPORT_DEVICEMOTION="ondevicemotion"in r},function(e,t,n){"use strict";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS="pinchstart pinchmove pinchend",t.KEYMAP=i},function(e,n){e.exports=t},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=function(e){function SpriteImage(t,n){_classCallCheck(this,SpriteImage);var r=_possibleConstructorReturn(this,e.call(this)),i=n||{};return r._el=t,r._rowCount=i.rowCount||1,r._colCount=i.colCount||1,r._totalCount=r._rowCount*r._colCount,r._width=i.width||"auto",r._height=i.height||"auto",r._autoHeight=null!=i.autoHeight?i.autoHeight:"true",r._colRow=[0,0],i.colRow?r._colRow=i.colRow:i.frameIndex&&r.setFrameIndex(i.frameIndex),r._el.style.width=SpriteImage._getSizeString(r._width),r._el.style.height=SpriteImage._getSizeString(r._height),i.imageUrl?(r._image=new Image,r._image.onload=function(){r._bg=SpriteImage._createBgDiv(r._image,r._rowCount,r._colCount,r._autoHeight),r._el.appendChild(r._bg),r.setColRow(r._colRow[0],r._colRow[1]),r.trigger("load",{target:r._el,bgElement:r._bg}),r._autoPlayReservedInfo&&(r.play(r._autoPlayReservedInfo),r._autoPlayReservedInfo=null)},r._image.onerror=function(e){r.trigger("imageError",{imageUrl:i.imageUrl})},r._image.src=i.imageUrl,r):(setTimeout(function(){r.trigger("imageError",{imageUrl:i.imageUrl})},0),_possibleConstructorReturn(r))}return _inherits(SpriteImage,e),SpriteImage._createBgDiv=function(e,t,n,r){var i=document.createElement("div");i.style.backgroundImage="url("+e.src+")",i.style.backgroundSize=100*n+"% "+100*t+"%";var o=e.width/n,a=e.height/t;if(r){var s=a/o;i.style.paddingBottom=100*s+"%"}else i.style.height="100%";return i},SpriteImage.prototype.setFrameIndex=function(e){var t=this.toColRow(e);this.setColRow(t[0],t[1])},SpriteImage.prototype.getFrameIndex=function(){return this._colRow[1]*this._colCount+this._colRow[0]},SpriteImage.prototype.setColRow=function(e,t){t>this._rowCount-1||e>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-e+"% "+100*-t+"%"),this._colRow=[e,t])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(e){return"number"==typeof e?e+"px":e},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var e=this,t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=t.interval,r=t.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:r});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var i=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){i%=e._totalCount;var t=e.toColRow(i);e.setColRow(t[0],t[1]),i++,++a===e._totalCount&&(a=0,o++),r>0&&o===r&&clearInterval(e._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(e){var t=this._colCount,n=this._rowCount;return e<0?[0,0]:e>=this._totalCount?[t-1,n-1]:[e%t,Math.floor(e/t)]},SpriteImage}(i["default"]);t["default"]=o},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={0:"NO_ERROR",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",37442:"CONTEXT_LOST_WEBGL"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=["webgl","experimental-webgl","webkit-3d","moz-webgl"],n=null;e.addEventListener("webglcontextcreationerror",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o["default"].setUa(e);var t={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),"ios"===t.os.name&&t.browser.webview&&(t.browser.version="-1"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{"default":e}}(i);agent.VERSION="2.1.2",t["default"]=agent,e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r="undefined"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){"use strict";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,"i").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i["default"].browser,i["default"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i["default"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i["default"].defaultString.browser.version,r=new RegExp("("+e+")","i").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i["default"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i["default"].os,e)}function getOsName(){return getIdentityStringFromArray(i["default"].os,i["default"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i["default"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp("("+a+")\\s([\\d_\\.]+|\\d_0)","i");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=void 0;t["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t["default"]},function(e,t,n){"use strict";t.__esModule=!0;var r={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};t["default"]=r,e.exports=t["default"]}])})},function(e,t,n){"use strict";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(7);i["default"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i["default"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i["default"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i["default"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i["default"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i["default"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})["catch"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on("change",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){"boolean"==typeof e&&this._yawPitchControl.option("useZoom",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option("useKeyboard",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option("useGyro",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option("fovRange",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option("yawRange",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option("pitchRange",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option("showPolePoint",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option("pitchRange"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new a["default"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f["default"]:p["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement("canvas");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n("ImageLoader is not initialized");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension("WEBGL_lose_context");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*v,i=t*v;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+l["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l["default"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=l["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l["default"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l["default"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l["default"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,"aVertexPosition"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=e.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=e.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,"aTextureCoord"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l["default"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l["default"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i["default"]);t["default"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=g},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if("object"===(void 0===e?"undefined":r(e))?(t=e.src,n=e.type):"string"==typeof e&&(t=e),!t)return!1;var i=document.createElement("source");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:"string"!=typeof e&&"object"!==(void 0===e?"undefined":r(e))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once("loadeddata",function(){return t(e._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t["default"]=a},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i["default"],t.WebGLUtils=a["default"]},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn("Image width("+r+") exceeds device limit("+i+"))");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i["default"]);t["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){"use strict";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return"string"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return"showPolePoint"===e||"fov"===e||"aspectRatio"===e||"yawRange"===e||"pitchRange"===e})&&this._updateControlScale(),e.some(function(e){return"fovRange"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return"useGyro"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return"useKeyboard"===e})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return"useZoom"===e})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);g.VERSION="3.0.0-rc",t["default"]=g},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i["default"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",i["default"].radToDeg*a["default"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i["default"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t["default"]=u["default"]},function(e,t,n){"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf("Android"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener("deviceorientation",this._onDeviceOrientation),a.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener("deviceorientation",this._onDeviceOrientation),a.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i["default"]);t["default"]=s},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),g=.98,v=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p["default"],t.accelerometer=new u["default"].Vector3,t.gyroscope=new u["default"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m["default"](g),t.posePredictor=new a["default"](v),t.filterToWorldQ=new u["default"].Quaternion,t.isFirefoxAndroid=l["default"].isFirefoxAndroid(),t.isIOS=l["default"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u["default"].Quaternion,t.worldToScreenQ=new u["default"].Quaternion,t.originalPoseAdjustQ=new u["default"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l["default"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u["default"].Quaternion,t.deviceMotion.on("devicemotion",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger("change",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u["default"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i["default"]);t["default"]=y},function(e,t,n){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i["default"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i["default"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){"use strict";var r=n(2),i=function(e){return e&&e.__esModule?e:{"default":e}}(r),o={};o.create=function(){var e=new i["default"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i["default"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n0?1:-1,_=a[\"default\"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a[\"default\"].fromValues(0,d,0):a[\"default\"].fromValues(d,0,0),a[\"default\"].transformQuat(_,_,u),a[\"default\"].transformQuat(m,m,u);var g=_,v=m,y=a[\"default\"].create();a[\"default\"].cross(y,g,v),a[\"default\"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(h,h,u),c=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a[\"default\"].create();a[\"default\"].subtract(T,c,a[\"default\"].scale(a[\"default\"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a[\"default\"].length(T)*a[\"default\"].length(h));x>1&&(x=1);var P=Math.acos(x),C=a[\"default\"].cross(a[\"default\"].create(),h,T);E=w*C[0]+R*C[1]+b*C[2];var I=void 0;I=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var S=P*I*d;return i[\"default\"].toDegree(S)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return\"number\"!=typeof e?\"Not a number\":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l[\"default\"].create();return l[\"default\"].rotateY(n,n,i[\"default\"].toRadian(e)),l[\"default\"].rotateX(n,n,i[\"default\"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i[\"default\"].toDegree(d.extractYawFromQuat(e)),pitch:i[\"default\"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i[\"default\"],t.mat4=f[\"default\"],t.quat=l[\"default\"],t.vec2=u[\"default\"],t.vec3=a[\"default\"],t.ROTATE_CONSTANT=p},function(e,t,n){\"use strict\";var r={};r.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){\"use strict\";function objectOrFunction(e){var t=typeof e;return null!==e&&(\"object\"===t||\"function\"===t)}function isFunction(e){return\"function\"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return\"data:\"+e+\";base64,\"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i=\"\",o=0;o-1?e.split(\"/\")[2]:e.split(\"/\")[0],t=t.split(\":\")[0]},e.exports=n},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();r.Float32Array=\"undefined\"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH=\"ontouchstart\"in r,t.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in r},function(e,t,n){\"use strict\";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",t.KEYMAP=i},function(e,n){e.exports=t},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=function(e){function SpriteImage(t,n){_classCallCheck(this,SpriteImage);var r=_possibleConstructorReturn(this,e.call(this)),i=n||{};return r._el=t,r._rowCount=i.rowCount||1,r._colCount=i.colCount||1,r._totalCount=r._rowCount*r._colCount,r._width=i.width||\"auto\",r._height=i.height||\"auto\",r._autoHeight=null!=i.autoHeight?i.autoHeight:\"true\",r._colRow=[0,0],i.colRow?r._colRow=i.colRow:i.frameIndex&&r.setFrameIndex(i.frameIndex),r._el.style.width=SpriteImage._getSizeString(r._width),r._el.style.height=SpriteImage._getSizeString(r._height),i.imageUrl?(r._image=new Image,r._image.onload=function(){r._bg=SpriteImage._createBgDiv(r._image,r._rowCount,r._colCount,r._autoHeight),r._el.appendChild(r._bg),r.setColRow(r._colRow[0],r._colRow[1]),r.trigger(\"load\",{target:r._el,bgElement:r._bg}),r._autoPlayReservedInfo&&(r.play(r._autoPlayReservedInfo),r._autoPlayReservedInfo=null)},r._image.onerror=function(e){r.trigger(\"imageError\",{imageUrl:i.imageUrl})},r._image.src=i.imageUrl,r):(setTimeout(function(){r.trigger(\"imageError\",{imageUrl:i.imageUrl})},0),_possibleConstructorReturn(r))}return _inherits(SpriteImage,e),SpriteImage._createBgDiv=function(e,t,n,r){var i=document.createElement(\"div\");i.style.backgroundImage=\"url(\"+e.src+\")\",i.style.backgroundSize=100*n+\"% \"+100*t+\"%\";var o=e.width/n,a=e.height/t;if(r){var s=a/o;i.style.paddingBottom=100*s+\"%\"}else i.style.height=\"100%\";return i},SpriteImage.prototype.setFrameIndex=function(e){var t=this.toColRow(e);this.setColRow(t[0],t[1])},SpriteImage.prototype.getFrameIndex=function(){return this._colRow[1]*this._colCount+this._colRow[0]},SpriteImage.prototype.setColRow=function(e,t){t>this._rowCount-1||e>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-e+\"% \"+100*-t+\"%\"),this._colRow=[e,t])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(e){return\"number\"==typeof e?e+\"px\":e},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var e=this,t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=t.interval,r=t.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:r});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var i=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){i%=e._totalCount;var t=e.toColRow(i);e.setColRow(t[0],t[1]),i++,++a===e._totalCount&&(a=0,o++),r>0&&o===r&&clearInterval(e._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(e){var t=this._colCount,n=this._rowCount;return e<0?[0,0]:e>=this._totalCount?[t-1,n-1]:[e%t,Math.floor(e/t)]},SpriteImage}(i[\"default\"]);t[\"default\"]=o},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={0:\"NO_ERROR\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",37442:\"CONTEXT_LOST_WEBGL\"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],n=null;e.addEventListener(\"webglcontextcreationerror\",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o[\"default\"].setUa(e);var t={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),\"ios\"===t.os.name&&t.browser.webview&&(t.browser.version=\"-1\"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{\"default\":e}}(i);agent.VERSION=\"2.1.2\",t[\"default\"]=agent,e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){\"use strict\";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,\"i\").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i[\"default\"].browser,i[\"default\"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i[\"default\"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i[\"default\"].defaultString.browser.version,r=new RegExp(\"(\"+e+\")\",\"i\").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i[\"default\"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i[\"default\"].os,e)}function getOsName(){return getIdentityStringFromArray(i[\"default\"].os,i[\"default\"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i[\"default\"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp(\"(\"+a+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=void 0;t[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};t[\"default\"]=r,e.exports=t[\"default\"]}])})},function(e,t,n){\"use strict\";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(7);i[\"default\"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i[\"default\"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i[\"default\"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i[\"default\"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i[\"default\"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i[\"default\"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})[\"catch\"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on(\"change\",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){\"boolean\"==typeof e&&this._yawPitchControl.option(\"useZoom\",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option(\"useKeyboard\",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option(\"useGyro\",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option(\"fovRange\",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option(\"yawRange\",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option(\"pitchRange\",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option(\"showPolePoint\",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option(\"pitchRange\"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new a[\"default\"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f[\"default\"]:p[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement(\"canvas\");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n(\"ImageLoader is not initialized\");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension(\"WEBGL_lose_context\");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*v,i=t*v;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+l[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l[\"default\"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=l[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l[\"default\"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l[\"default\"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l[\"default\"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,\"aVertexPosition\"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=e.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=e.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,\"aTextureCoord\"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l[\"default\"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i[\"default\"]);t[\"default\"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=g},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if(\"object\"===(void 0===e?\"undefined\":r(e))?(t=e.src,n=e.type):\"string\"==typeof e&&(t=e),!t)return!1;var i=document.createElement(\"source\");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:\"string\"!=typeof e&&\"object\"!==(void 0===e?\"undefined\":r(e))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once(\"loadeddata\",function(){return t(e._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t[\"default\"]=a},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i[\"default\"],t.WebGLUtils=a[\"default\"]},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn(\"Image width(\"+r+\") exceeds device limit(\"+i+\"))\");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i[\"default\"]);t[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){\"use strict\";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return\"string\"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return\"showPolePoint\"===e||\"fov\"===e||\"aspectRatio\"===e||\"yawRange\"===e||\"pitchRange\"===e})&&this._updateControlScale(),e.some(function(e){return\"fovRange\"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return\"useGyro\"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return\"useKeyboard\"===e})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return\"useZoom\"===e})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);g.VERSION=\"3.0.0-rc\",t[\"default\"]=g},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i[\"default\"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",i[\"default\"].radToDeg*a[\"default\"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t[\"default\"]=u[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf(\"Android\"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i[\"default\"]);t[\"default\"]=s},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),g=.98,v=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p[\"default\"],t.accelerometer=new u[\"default\"].Vector3,t.gyroscope=new u[\"default\"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m[\"default\"](g),t.posePredictor=new a[\"default\"](v),t.filterToWorldQ=new u[\"default\"].Quaternion,t.isFirefoxAndroid=l[\"default\"].isFirefoxAndroid(),t.isIOS=l[\"default\"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u[\"default\"].Quaternion,t.worldToScreenQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l[\"default\"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u[\"default\"].Quaternion,t.deviceMotion.on(\"devicemotion\",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger(\"change\",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u[\"default\"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i[\"default\"]);t[\"default\"]=y},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i[\"default\"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n0?1:-1,_=a[\"default\"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==p.YAW_DELTA_BY_YAW?a[\"default\"].fromValues(0,d,0):a[\"default\"].fromValues(d,0,0),a[\"default\"].transformQuat(_,_,u),a[\"default\"].transformQuat(m,m,u);var g=_,v=m,y=a[\"default\"].create();a[\"default\"].cross(y,g,v),a[\"default\"].normalize(y,y);var w=y[0],R=y[1],b=y[2];h=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(h,h,u),c=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(c,c,s);var E=Math.abs(c[0]*w+c[1]*R+c[2]*b),T=a[\"default\"].create();a[\"default\"].subtract(T,c,a[\"default\"].scale(a[\"default\"].create(),y,E));var x=(T[0]*h[0]+T[1]*h[1]+T[2]*h[2])/(a[\"default\"].length(T)*a[\"default\"].length(h));x>1&&(x=1);var P=Math.acos(x),C=a[\"default\"].cross(a[\"default\"].create(),h,T);E=w*C[0]+R*C[1]+b*C[2];var I=void 0;I=n!==p.YAW_DELTA_BY_YAW?E>0?1:-1:E<0?1:-1;var S=P*I*d;return i[\"default\"].toDegree(S)}t.__esModule=!0,t.ROTATE_CONSTANT=t.vec3=t.vec2=t.quat=t.mat4=t.glMatrix=t.util=undefined;var r=n(2),i=_interopRequireDefault(r),o=n(35),a=_interopRequireDefault(o),s=n(34),u=_interopRequireDefault(s),c=n(33),l=_interopRequireDefault(c),h=n(32),f=_interopRequireDefault(h),d={};d.isPowerOfTwo=function(e){return\"number\"!=typeof e?\"Not a number\":e&&0==(e&e-1)},d.extractYawFromQuat=function(e){var t=quatToVec3(e);return 1*Math.atan2(t[0],t[2])},d.extractPitchFromQuat=function(e){var t=quatToVec3(e);return-1*Math.atan2(t[1],Math.sqrt(Math.pow(t[0],2)+Math.pow(t[2],2)))},d.getQuaternionWithYawPitch=function(e,t){var n=l[\"default\"].create();return l[\"default\"].rotateY(n,n,i[\"default\"].toRadian(e)),l[\"default\"].rotateX(n,n,i[\"default\"].toRadian(t)),n},d.quatToYawPitch=function(e){return{yaw:i[\"default\"].toDegree(d.extractYawFromQuat(e)),pitch:i[\"default\"].toDegree(d.extractPitchFromQuat(e))}},d.yawPitchToPoint=function(e,t){return[Math.tan(e)/Math.cos(t),Math.tan(t)]};var p={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};p[p.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},p[p.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},p[p.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},d.getRotationDelta=getRotationDelta,t.util=d,t.glMatrix=i[\"default\"],t.mat4=f[\"default\"],t.quat=l[\"default\"],t.vec2=u[\"default\"],t.vec3=a[\"default\"],t.ROTATE_CONSTANT=p},function(e,t,n){\"use strict\";var r={};r.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var i=Math.PI/180;r.toRadian=function(e){return e*i},r.toDegree=function(e){return e/i},r.EPSILON=1e-4,e.exports=r},function(e,t,n){(function(t,r){!function(t,n){e.exports=n()}(0,function(){\"use strict\";function objectOrFunction(e){var t=typeof e;return null!==e&&(\"object\"===t||\"function\"===t)}function isFunction(e){return\"function\"==typeof e}function setScheduler(e){s=e}function setAsap(e){u=e}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var e=setTimeout;return function(){return e(flush,1)}}function flush(){for(var e=0;e=1)return this.w=o,this.x=n,this.y=r,this.z=i,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(r+this.y),this.z=.5*(i+this.z),this;var c=Math.sin((1-t)*s)/u,l=Math.sin(t*s)/u;return this.w=o*c+this.w*l,this.x=n*c+this.x*l,this.y=r*c+this.y*l,this.z=i*c+this.z*l,this},setFromUnitVectors:function(){var e,t;return function(r,i){return e===undefined&&(e=new n.Vector3),t=r.dot(i)+1,t<1e-6?(t=0,Math.abs(r.x)>Math.abs(r.z)?e.set(-r.y,r.x,0):e.set(0,-r.z,r.y)):e.crossVectors(r,i),this.x=e.x,this.y=e.y,this.z=e.z,this.w=t,this.normalize(),this}}()},e.exports=n},function(e,t){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(e,t){return\"data:\"+e+\";base64,\"+t},n.clamp=function(e,t,n){return Math.min(Math.max(t,e),n)},n.lerp=function(e,t,n){return e+(t-e)*n},n.race=function(e){return Promise.race?Promise.race(e):new Promise(function(t,n){for(var r=0;rn.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(e){if(n.isWebViewAndroid())return!1;if(e.requestFullscreen)e.requestFullscreen();else if(e.webkitRequestFullscreen)e.webkitRequestFullscreen();else if(e.mozRequestFullScreen)e.mozRequestFullScreen();else{if(!e.msRequestFullscreen)return!1;e.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(e,t,n,r){var i=e.createShader(e.VERTEX_SHADER);e.shaderSource(i,t),e.compileShader(i);var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,n),e.compileShader(o);var a=e.createProgram();e.attachShader(a,i),e.attachShader(a,o);for(var s in r)e.bindAttribLocation(a,r[s],s);return e.linkProgram(a),e.deleteShader(i),e.deleteShader(o),a},n.getProgramUniforms=function(e,t){for(var n={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),i=\"\",o=0;o-1?e.split(\"/\")[2]:e.split(\"/\")[0],t=t.split(\":\")[0]},e.exports=n},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();r.Float32Array=\"undefined\"!=typeof r.Float32Array?r.Float32Array:r.Array,t.window=r;t.document=r.document,t.Float32Array=r.Float32Array,t.getComputedStyle=r.getComputedStyle,t.SUPPORT_TOUCH=\"ontouchstart\"in r,t.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in r},function(e,t,n){\"use strict\";t.__esModule=!0;var r=[.2,.2],i={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};t.GYRO_MODE=o,t.CONTROL_MODE_VR=1,t.CONTROL_MODE_YAWPITCH=2,t.TOUCH_DIRECTION_NONE=1,t.TOUCH_DIRECTION_YAW=2,t.TOUCH_DIRECTION_PITCH=4,t.TOUCH_DIRECTION_ALL=6,t.MC_DECELERATION=.0014,t.MC_MAXIMUM_DURATION=1e3,t.MC_BIND_SCALE=r,t.MIN_FIELD_OF_VIEW=20,t.MAX_FIELD_OF_VIEW=110,t.PAN_SCALE=320,t.DELTA_THRESHOLD=.0375,t.YAW_RANGE_HALF=180,t.PITCH_RANGE_HALF=90,t.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",t.KEYMAP=i},function(e,n){e.exports=t},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=function(e){function SpriteImage(t,n){_classCallCheck(this,SpriteImage);var r=_possibleConstructorReturn(this,e.call(this)),i=n||{};return r._el=t,r._rowCount=i.rowCount||1,r._colCount=i.colCount||1,r._totalCount=r._rowCount*r._colCount,r._width=i.width||\"auto\",r._height=i.height||\"auto\",r._autoHeight=null!=i.autoHeight?i.autoHeight:\"true\",r._colRow=[0,0],i.colRow?r._colRow=i.colRow:i.frameIndex&&r.setFrameIndex(i.frameIndex),r._el.style.width=SpriteImage._getSizeString(r._width),r._el.style.height=SpriteImage._getSizeString(r._height),i.imageUrl?(r._image=new Image,r._image.onload=function(){r._bg=SpriteImage._createBgDiv(r._image,r._rowCount,r._colCount,r._autoHeight),r._el.appendChild(r._bg),r.setColRow(r._colRow[0],r._colRow[1]),r.trigger(\"load\",{target:r._el,bgElement:r._bg}),r._autoPlayReservedInfo&&(r.play(r._autoPlayReservedInfo),r._autoPlayReservedInfo=null)},r._image.onerror=function(e){r.trigger(\"imageError\",{imageUrl:i.imageUrl})},r._image.src=i.imageUrl,r):(setTimeout(function(){r.trigger(\"imageError\",{imageUrl:i.imageUrl})},0),_possibleConstructorReturn(r))}return _inherits(SpriteImage,e),SpriteImage._createBgDiv=function(e,t,n,r){var i=document.createElement(\"div\");i.style.backgroundImage=\"url(\"+e.src+\")\",i.style.backgroundSize=100*n+\"% \"+100*t+\"%\";var o=e.width/n,a=e.height/t;if(r){var s=a/o;i.style.paddingBottom=100*s+\"%\"}else i.style.height=\"100%\";return i},SpriteImage.prototype.setFrameIndex=function(e){var t=this.toColRow(e);this.setColRow(t[0],t[1])},SpriteImage.prototype.getFrameIndex=function(){return this._colRow[1]*this._colCount+this._colRow[0]},SpriteImage.prototype.setColRow=function(e,t){t>this._rowCount-1||e>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-e+\"% \"+100*-t+\"%\"),this._colRow=[e,t])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(e){return\"number\"==typeof e?e+\"px\":e},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var e=this,t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=t.interval,r=t.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:r});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var i=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){i%=e._totalCount;var t=e.toColRow(i);e.setColRow(t[0],t[1]),i++,++a===e._totalCount&&(a=0,o++),r>0&&o===r&&clearInterval(e._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(e){var t=this._colCount,n=this._rowCount;return e<0?[0,0]:e>=this._totalCount?[t-1,n-1]:[e%t,Math.floor(e/t)]},SpriteImage}(i[\"default\"]);t[\"default\"]=o},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=n(13),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={0:\"NO_ERROR\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",37442:\"CONTEXT_LOST_WEBGL\"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)},WebGLUtils.createProgram=function(e,t,n){var r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(e.deleteProgram(r),null)},WebGLUtils.initBuffer=function(e,t,n,r,i){var o=e.createBuffer();return e.bindBuffer(t,o),e.bufferData(t,n,e.STATIC_DRAW),o&&(o.itemSize=r,o.numItems=n.length/r),i!==undefined&&(e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o.itemSize,e.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(e,t,n){null!==t&&null!==n&&(e.bindBuffer(e.ARRAY_BUFFER,t),e.vertexAttribPointer(n,t.itemSize,e.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(e){function onWebglcontextcreationerror(e){return e.statusMessage}var t=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],n=null;e.addEventListener(\"webglcontextcreationerror\",onWebglcontextcreationerror);for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:r.navigator.userAgent;o[\"default\"].setUa(e);var t={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return t.browser.name=t.browser.name.toLowerCase(),t.os.name=t.os.name.toLowerCase(),t.os.version=t.os.version.toLowerCase(),\"ios\"===t.os.name&&t.browser.webview&&(t.browser.version=\"-1\"),t}t.__esModule=!0;var r=n(2),i=n(3),o=function(e){return e&&e.__esModule?e:{\"default\":e}}(i);agent.VERSION=\"2.1.2\",t[\"default\"]=agent,e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r=\"undefined\"!=typeof window&&window||{};t.RegExp=r.RegExp,t.navigator=r.navigator},function(e,t,n){\"use strict\";function setUa(e){o=e}function isMatched(e,t){return t&&t.test?!!t.test(e):e.indexOf(t)>-1}function getIdentityStringFromArray(e,t){var n=e.filter(function(e){return isMatched(o,e.criteria)})[0];return n&&n.identity||t.name}function getRule(e,t){return e.filter(function(e){var n=e.criteria,r=new RegExp(e.identity,\"i\").test(t);return!!(n?r&&isMatched(o,n):r)})[0]}function getBrowserName(){return getIdentityStringFromArray(i[\"default\"].browser,i[\"default\"].defaultString.browser)}function getBrowserRule(e){var t=getRule(i[\"default\"].browser,e);return t||(t={criteria:e,versionSearch:e,identity:e}),t}function extractBrowserVersion(e,t){var n=i[\"default\"].defaultString.browser.version,r=new RegExp(\"(\"+e+\")\",\"i\").exec(t);if(!r)return n;var o=r.index,a=r[0];if(o>-1){var s=o+a.length+1;n=t.substring(s).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(e){return e?extractBrowserVersion(getBrowserRule(e).versionSearch||e,o):undefined}function isWebview(){var e=i[\"default\"].webview,t=void 0;return e.filter(function(e){return isMatched(o,e.criteria)}).some(function(e){return t=extractBrowserVersion(e.browserVersionSearch,o),!(!isMatched(o,e.webviewToken)&&!isMatched(t,e.webviewBrowserVersion))})}function getOSRule(e){return getRule(i[\"default\"].os,e)}function getOsName(){return getIdentityStringFromArray(i[\"default\"].os,i[\"default\"].defaultString.os)}function getOsVersion(e){var t=getOSRule(e)||{},n=i[\"default\"].defaultString.os.version,r=void 0;if(!e)return undefined;if(t.versionAlias)return t.versionAlias;var a=t.versionSearch||e,s=new RegExp(\"(\"+a+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return s.exec(o)&&(r=s.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),r||n}function getOs(){var e=getOsName();return{name:e,version:getOsVersion(e)}}function getBrowser(){var e=getBrowserName();return{name:e,version:getBrowserVersion(e),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}t.__esModule=!0;var r=n(4),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=void 0;t[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},e.exports=t[\"default\"]},function(e,t,n){\"use strict\";t.__esModule=!0;var r={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};t[\"default\"]=r,e.exports=t[\"default\"]}])})},function(e,t,n){\"use strict\";t.__esModule=!0,t.YawPitchControl=undefined;var r=n(26),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(7);i[\"default\"].CONTROL_MODE_VR=o.CONTROL_MODE_VR,i[\"default\"].CONTROL_MODE_YAWPITCH=o.CONTROL_MODE_YAWPITCH,i[\"default\"].TOUCH_DIRECTION_ALL=o.TOUCH_DIRECTION_ALL,i[\"default\"].TOUCH_DIRECTION_YAW=o.TOUCH_DIRECTION_YAW,i[\"default\"].TOUCH_DIRECTION_PITCH=o.TOUCH_DIRECTION_PITCH,i[\"default\"].TOUCH_DIRECTION_NONE=o.TOUCH_DIRECTION_NONE,t.YawPitchControl=i[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var i=_possibleConstructorReturn(this,e.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=i,_possibleConstructorReturn(i,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),a=i,_possibleConstructorReturn(i,a)}if(n.image&&n.video){var c;return setTimeout(function(){i.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=i,_possibleConstructorReturn(i,c)}i._container=t,i._image=n.image||n.video,i._isVideo=!!n.video,i._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i._width=n.width||parseInt(window.getComputedStyle(t).width,10),i._height=n.height||parseInt(window.getComputedStyle(t).height,10),i._yaw=n.yaw||0,i._pitch=n.pitch||0,i._fov=n.fov||65,i._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,i._aspectRatio=i._width/i._height;var l=n.fovRange||[30,110],h=r(n,{element:t,yaw:i._yaw,pitch:i._pitch,fov:i._fov,useGyro:i._useGyro,fovRange:l,aspectRatio:i._aspectRatio});return i._isReady=!1,i._initYawPitchControl(h),i._initRenderer(i._yaw,i._pitch,i._fov,i._projectionType),i}return _inherits(PanoViewer,e),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return e?(this.setImage(e,{projectionType:t.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=t.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r=t.isVideo||!1;return this._image&&r!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):e?(this._image=e,this._isVideo=r,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(e){return this._photoSphereRenderer.keepUpdate(e),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(e,t,n,r){var i=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:e,initialPitch:t,fieldOfView:n,imageType:r}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return i._activate()})[\"catch\"](function(){i._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var e=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(t){e.trigger(u.EVENTS.CONTENT_LOADED,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(t){e.trigger(u.EVENTS.ERROR,t)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(t){e._deactivate(),e.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(e){var t=this;this._yawPitchControl=new a.YawPitchControl(e),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(e){t._triggerEvent(u.EVENTS.ANIMATION_END,e)}),this._yawPitchControl.on(\"change\",function(e){t._yaw=e.yaw,t._pitch=e.pitch,t._fov=e.fov,t._triggerEvent(u.EVENTS.VIEW_CHANGE,e)})},PanoViewer.prototype._triggerEvent=function(e,t){var n=t||{};return this.trigger(e,n)},PanoViewer.prototype.setUseZoom=function(e){\"boolean\"==typeof e&&this._yawPitchControl.option(\"useZoom\",e)},PanoViewer.prototype.setUseKeyboard=function(e){this._yawPitchControl.option(\"useKeyboard\",e)},PanoViewer.prototype.setUseGyro=function(e){this._yawPitchControl.option(\"useGyro\",e)},PanoViewer.prototype.setFovRange=function(e){this._yawPitchControl.option(\"fovRange\",e)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(e){this._isReady&&(this._width=e&&e.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=e&&e.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(e){return this._yawPitchControl.option(\"yawRange\",e)},PanoViewer.prototype.setPitchRange=function(e){return this._yawPitchControl.option(\"pitchRange\",e)},PanoViewer.prototype.setShowPolePoint=function(e){return this._yawPitchControl.option(\"showPolePoint\",e)},PanoViewer.prototype.lookAt=function(e,t){if(this._isReady){var n=e.yaw!==undefined?e.yaw:this._yaw,r=e.pitch!==undefined?e.pitch:this._pitch,i=this._yawPitchControl.option(\"pitchRange\"),o=i[1]-i[0],a=e.fov!==undefined?e.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},R=function(e){function PanoImageRenderer(t,n,r,i,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,e.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=r,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/r,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,r),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),t&&a.setImage({image:t,imageType:o.imageType,isVideo:i}),a}return _inherits(PanoImageRenderer,e),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(e){var t=e.image,n=e.imageType,r=e.isVideo,i=r!==undefined&&r;return this._imageIsReady=!1,this._isVideo=i,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),i?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new a[\"default\"],this._keepUpdate=!1),this._contentLoader.set(t),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(e){e&&this._imageType!==e&&(this._imageType=e,this._isCubeStrip=e===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?f[\"default\"]:p[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(e,t){var n=document.createElement(\"canvas\");return n.width=e,n.height=t,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(e){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(e){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var e=this;return new m(function(t,n){if(!e._contentLoader)return void n(\"ImageLoader is not initialized\");e._contentLoader.get().then(function(){return e._bindTexture()},n).then(t)})},PanoImageRenderer.prototype.attachTo=function(e){this.detach(),e.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var e=this.context.getExtension(\"WEBGL_lose_context\");e&&e.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(e){e.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(e){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(e){this.fieldOfView!==e&&(this.fieldOfView=e,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(e,t){var n=!1;this.width=e,this.height=t;var r=e*v,i=t*v;r!==this.canvas.width&&(this.canvas.width=r,n=!0),i!==this.canvas.height&&(this.canvas.height=i,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+l[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(t){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var e=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=l[\"default\"].createTexture(this.context,e)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=l[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(e){var t=this._renderer.getVertexShaderSource(),n=l[\"default\"].createShader(e,e.VERTEX_SHADER,t);if(!n)return!1;var r=this._renderer.getFragmentShaderSource(),i=l[\"default\"].createShader(e,e.FRAGMENT_SHADER,r);if(!i)return!1;var o=l[\"default\"].createProgram(e,n,i);return o?(e.useProgram(o),o.vertexPositionAttribute=e.getAttribLocation(o,\"aVertexPosition\"),e.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=e.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=e.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=e.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=e.getAttribLocation(o,\"aTextureCoord\"),e.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var e=this._renderer.getVertexPositionData(),t=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),r=this.context;this.vertexBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(e),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=l[\"default\"].initBuffer(r,r.ELEMENT_ARRAY_BUFFER,new Uint16Array(t),1),null!==n&&(this.textureCoordBuffer=l[\"default\"].initBuffer(r,r.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(e,t){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,e)&&this.fieldOfView&&this.fieldOfView===t&&!1===this._shouldForceDraw))){t!==undefined&&t!==this.fieldOfView&&this.updateFieldOfView(t);var n=void 0;if(this._isCubeStrip)n=e;else{var r=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),r,e)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(e),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(e){e&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=e},PanoImageRenderer.prototype.render=function(e,t,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===e&&null!==this._lastPitch&&this._lastPitch===t&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=e,this._lastPitch=t,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var e=this.context;e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT),e.uniform1i(this.shaderProgram.samplerUniform,0),e.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&e.drawElements(e.TRIANGLES,this.indexBuffer.numItems,e.UNSIGNED_SHORT,0)},PanoImageRenderer}(i[\"default\"]);t[\"default\"]=R,R.EVENTS=y,R.ERROR_TYPE=w,R.ImageType=g},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(e){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,e&&this.set(e)}return VideoLoader.prototype._appendSourceElement=function(e){var t=void 0,n=void 0;if(\"object\"===(void 0===e?\"undefined\":r(e))?(t=e.src,n=e.type):\"string\"==typeof e&&(t=e),!t)return!1;var i=document.createElement(\"source\");return i.src=t,n&&(i.type=n),this._video.appendChild(i),this._sourceCount++,!0},VideoLoader.prototype.set=function(e){var t=this;this._reset(),e instanceof HTMLVideoElement?this._video=e:\"string\"!=typeof e&&\"object\"!==(void 0===e?\"undefined\":r(e))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",e instanceof Array?e.forEach(function(e){return t._appendSourceElement(e)}):this._appendSourceElement(e),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var e=this;return new i(function(t,n){e._video?e._video.readyState>=o.HAVE_CURRENT_DATA?t(e._video):e._once(\"loadeddata\",function(){return t(e._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var e=this;this._handlers.forEach(function(t){e._video.removeEventListener(t.type,t.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(e,t){var n=this._video,r=function fn(r){n.removeEventListener(e,fn),t(r)};n.addEventListener(e,r,!0),this._handlers.push({type:e,fn:r})},VideoLoader}();t[\"default\"]=a},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0,t.WebGLUtils=t.PanoImageRenderer=undefined;var r=n(20),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o);t.PanoImageRenderer=i[\"default\"],t.WebGLUtils=a[\"default\"]},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(13),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(e){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,e.apply(this,arguments))}return _inherits(CubeRenderer,e),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var e=[],t=CubeRenderer.getVertexPositionData(),n=0;ni)return void console.warn(\"Image width(\"+r+\") exceeds device limit(\"+i+\"))\");e.activeTexture(e.TEXTURE0),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,t),this.texImage2D(e,n)}},SphereRenderer.texImage2D=function(e,t){e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t)},SphereRenderer._initData=function(){var e=[],t=[],n=[],r=void 0,i=void 0;for(r=0;r<=60;r++){var o=(r/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(i=0;i<=60;i++){var u=2*(i/60-.5)*Math.PI,c=Math.sin(u),l=Math.cos(u),h=l*s,f=a,d=c*s,p=i/60,_=r/60;if(e.push(p,_),t.push(2*h,2*f,2*d),60!==i&&60!==r){var m=61*r+i,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=t,SphereRenderer._TEXTURE_COORD_DATA=e,SphereRenderer._INDEX_DATA=n},SphereRenderer}(i[\"default\"]);t[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(e,t,n){\"use strict\";var r=n(7),i={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};e.exports={GYRO_MODE:r.GYRO_MODE,EVENTS:o,ERROR_TYPE:i}},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t=2&&(s.push(t[0]),a[t[0]]=t[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(e){return e.yawRange&&(e.yawRange=this._getValidYawRange(e.yawRange,e.fov,e.aspectRatio)),e.pitchRange&&(e.pitchRange=this._getValidPitchRange(e.pitchRange,e.fov)),e},YawPitchControl.prototype._getOptions=function(e){var t=void 0;return\"string\"==typeof e?t=this.options[e]:0===arguments.length&&(t=this.options),t},YawPitchControl.prototype._setOptions=function(e){for(var t in e)this.options[t]=e[t]},YawPitchControl.prototype._applyOptions=function(e,t){if(e.some(function(e){return\"showPolePoint\"===e||\"fov\"===e||\"aspectRatio\"===e||\"yawRange\"===e||\"pitchRange\"===e})&&this._updateControlScale(),e.some(function(e){return\"fovRange\"===e})){var n=this.options.fovRange,r=this.axes.get().fov,i=this.axes.get().fov;d.vec2.copy(this.axes.axis.fov.range,n),in[1]&&(i=n[1]),r!==i&&(this.axes.setTo({fov:i},0),this._updateControlScale())}if(e.some(function(e){return\"useGyro\"===e})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===p.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===p.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(e.some(function(e){return\"useKeyboard\"===e})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(e.some(function(e){return\"useZoom\"===e})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(e,t,n){var r=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),i=t||this.axes.get().fov,o=i*r;return e[1]-e[0]>=o?e:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(e,t){var n=t||this.axes.get().fov;return e[1]-e[0]>=n?e:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(e){var t=this.options,n=this.axes.get().fov,r=YawPitchControl._updatePitchRange(t.pitchRange,n,t.showPolePoint),i=YawPitchControl._updateYawRange(t.yawRange,n,t.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return d.vec2.copy(this.axes.axis.yaw.range,i),d.vec2.copy(this.axes.axis.pitch.range,r),this.axes.axis.yaw.circular=i[1]-i[0]<360?[!1,!1]:[!0,!0],ai[1]&&(a=i[1]),sr[1]&&(s=r[1]),e&&e.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(e,t,n){var r=e[1]-e[0],i=t/2,o=r<180;return n&&!o?e.map(function(e){return+e.toFixed(5)}):[e[0]+i,e[1]-i].map(function(e){return+e.toFixed(5)})},YawPitchControl._updateYawRange=function(e,t,n){var r=e[1]-e[0];if(r>=360)return e.map(function(e){return+e.toFixed(5)});var i=1,o=YawPitchControl.adjustAspectRatio(n),a=t/2*o;return r>290?i=.794:r>125&&(i=.98),[e[0]*i+a,e[1]*i-a].map(function(e){return+e.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var e=this.axes.get(),t=this.options,n={targetElement:t.element};n.yaw=e.yaw,n.pitch=e.pitch,n.fov=e.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(e){for(var t=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],r=-1,i=0;i=e){r=i;break}if(-1===r)return t[0]>e?n[0]:n[n[0].length-1];var o=t[r],a=t[r+1],s=n[r],u=n[r+1];return YawPitchControl.lerp(s,u,(e-o)/(a-o))},YawPitchControl.lerp=function(e,t,n){return e+n*(t-e)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(e){return this._enabled?(e||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var e=this.options;return this.axes.setTo({yaw:e.yaw,pitch:e.pitch,fov:e.fov},0),this},YawPitchControl.prototype.lookAt=function(e,t){var n=e.yaw,r=e.pitch,i=e.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=r===undefined?0:r-o.pitch,u=i===undefined?0:i-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},t)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);g.VERSION=\"3.0.0-rc\",t[\"default\"]=g},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0;var r=n(4),i=_interopRequireDefault(r),o=n(5),a=_interopRequireDefault(o),s=n(38),u=_interopRequireDefault(s);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var e=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,t=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,e);this.gyroIntegralQ.multiply(t),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(t);var n=new i[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var r=new i[\"default\"].Quaternion;r.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),r.inverse(),a[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",i[\"default\"].radToDeg*a[\"default\"].getQuaternionAngle(r),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new i[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(r),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},t[\"default\"]=u[\"default\"]},function(e,t,n){\"use strict\";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o=n(1),a=n(6),s=function(e){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var t=_possibleConstructorReturn(this,e.call(this));return t._onDeviceMotion=t._onDeviceMotion.bind(t),t._onDeviceOrientation=t._onDeviceOrientation.bind(t),t.isAndroid=-1!==a.window.navigator.userAgent.indexOf(\"Android\"),t.stillGyroVec=o.vec3.create(),t.rawGyroVec=o.vec3.create(),t.adjustedGyroVec=o.vec3.create(),t._timer=null,t.lastDevicemotionTimestamp=0,t._isEnabled=!1,t.enable(),t}return _inherits(DeviceMotion,e),DeviceMotion.prototype._onDeviceOrientation=function(){var e=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-e.lastDevicemotionTimestamp<200&&o.vec3.copy(e.stillGyroVec,e.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(e){0!==e.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,e.rotationRate.alpha||0,e.rotationRate.beta||0,e.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),e.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:e}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(i[\"default\"]);t[\"default\"]=s},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var r=n(0),i=_interopRequireDefault(r),o=n(39),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),l=_interopRequireDefault(c),h=n(6),f=n(1),d=n(28),p=_interopRequireDefault(d),_=n(27),m=_interopRequireDefault(_),g=.98,v=.04,y=function(e){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var t=_possibleConstructorReturn(this,e.call(this));return t.deviceMotion=new p[\"default\"],t.accelerometer=new u[\"default\"].Vector3,t.gyroscope=new u[\"default\"].Vector3,t._onDeviceMotionChange=t._onDeviceMotionChange.bind(t),t._onScreenOrientationChange=t._onScreenOrientationChange.bind(t),t.filter=new m[\"default\"](g),t.posePredictor=new a[\"default\"](v),t.filterToWorldQ=new u[\"default\"].Quaternion,t.isFirefoxAndroid=l[\"default\"].isFirefoxAndroid(),t.isIOS=l[\"default\"].isIOS(),t._isEnabled=!1,t.isIOS?t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):t.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),t.inverseWorldToScreenQ=new u[\"default\"].Quaternion,t.worldToScreenQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ=new u[\"default\"].Quaternion,t.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-h.window.orientation*Math.PI/180),t._setScreenTransform(),l[\"default\"].isLandscapeMode()&&t.filterToWorldQ.multiply(t.inverseWorldToScreenQ),t.resetQ=new u[\"default\"].Quaternion,t.deviceMotion.on(\"devicemotion\",t._onDeviceMotionChange),t.enable(),t}return _inherits(FusionPoseSensor,e),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,h.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,h.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var e=this.getOrientation();if(e)return this._prevOrientation?void(f.quat.equals(this._prevOrientation,e)||this.trigger(\"change\",{quaternion:e})):void(this._prevOrientation=e)},FusionPoseSensor.prototype.getOrientation=function(){var e=this.filter.getOrientation();if(!e)return null;var t=this._convertFusionToPredicted(e);return t=f.quat.fromValues(t.x,t.y,t.z,t.w),f.quat.normalize(t,t)},FusionPoseSensor.prototype._convertFusionToPredicted=function(e){this.predictedQ=this.posePredictor.getPrediction(e,this.gyroscope,this.previousTimestampS);var t=new u[\"default\"].Quaternion;return t.copy(this.filterToWorldQ),t.multiply(this.resetQ),t.multiply(this.predictedQ),t.multiply(this.worldToScreenQ),t},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),l[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(e){var t=e.inputEvent,n=t,r=n.accelerationIncludingGravity,i=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-r.x,-r.y,-r.z),this.gyroscope.set(i.alpha,i.beta,i.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(e){this._setScreenTransform(h.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),h.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(i[\"default\"]);t[\"default\"]=y},function(e,t,n){\"use strict\";function _interopRequireDefault(e){return e&&e.__esModule?e:{\"default\":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function getDeltaYaw(e,t){var n=c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(t))+n}function getDeltaPitch(e,t){return c.util.getRotationDelta(e,t,c.ROTATE_CONSTANT.PITCH_DELTA)}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t0&&(a=1/Math.sqrt(a),e[0]=n*a,e[1]=r*a,e[2]=i*a,e[3]=o*a),e},o.equals=function(e,t){var n=e[0],r=e[1],o=e[2],a=e[3],s=t[0],u=t[1],c=t[2],l=t[3];return Math.abs(n-s)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(r-u)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(r),Math.abs(u))&&Math.abs(o-c)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-l)<=i[\"default\"].EPSILON*Math.max(1,Math.abs(a),Math.abs(l))},o.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(2);return e[0]=0,e[1]=0,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.exports=o},function(e,t,n){\"use strict\";var r=n(2),i=function(e){return e&&e.__esModule?e:{\"default\":e}}(r),o={};o.create=function(){var e=new i[\"default\"].ARRAY_TYPE(3);return e[0]=0,e[1]=0,e[2]=0,e},o.fromValues=function(e,t,n){var r=new i[\"default\"].ARRAY_TYPE(3);return r[0]=e,r[1]=t,r[2]=n,r},o.set=function(e,t,n,r){return e[0]=t,e[1]=n,e[2]=r,e},o.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},o.scale=function(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e},o.subtract=function(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e},o.length=function(e){var t=e[0],n=e[1],r=e[2];return Math.sqrt(t*t+n*n+r*r)},o.normalize=function(e,t){var n=t[0],r=t[1],i=t[2],o=n*n+r*r+i*i;return o>0&&(o=1/Math.sqrt(o),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o),e},o.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]},o.cross=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2];return e[0]=i*u-o*s,e[1]=o*a-r*u,e[2]=r*s-i*a,e},o.transformQuat=function(e,t,n){var r=t[0],i=t[1],o=t[2],a=n[0],s=n[1],u=n[2],c=n[3],l=c*r+s*o-u*i,h=c*i+u*r-a*o,f=c*o+a*i-s*r,d=-a*r-s*i-u*o;return e[0]=l*c+d*-a+h*-u-f*-s,e[1]=h*c+d*-s+f*-a-l*-u,e[2]=f*c+d*-u+l*-s-h*-a,e},e.exports=o},function(e,t){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(e){if(n===setTimeout)return setTimeout(e,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}function runClearTimeout(e){if(r===clearTimeout)return clearTimeout(e);if((r===defaultClearTimeout||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{return r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var e=runTimeout(cleanUpNextTick);s=!0;for(var t=a.length;t;){for(o=a,a=[];++u1)for(var n=1;n발생할 커스텀 이벤트의 이름
\n * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터\n * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고\n * @example\n class Some extends eg.Component {\n some(){\n \tif(this.trigger(\"beforeHi\")){ // When event call to stop return false.\n \tthis.trigger(\"hi\");// fire hi event.\n \t}\n }\n }\n const some = new Some();\n some.on(\"beforeHi\", (e) => {\n if(condition){\n \te.stop(); // When event call to stop, `hi` event not call.\n }\n });\n some.on(\"hi\", (e) => {\n // `currentTarget` is component instance.\n console.log(some === e.currentTarget); // true\n });\n // If you want to more know event design. You can see article.\n // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F\n */\n\n\n\tComponent.prototype.trigger = function trigger(eventName) {\n\t\tvar customEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar handlerList = this._eventHandler[eventName] || [];\n\t\tvar hasHandlerList = handlerList.length > 0;\n\n\t\tif (!hasHandlerList) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If detach method call in handler in first time then handeler list calls.\n\t\thandlerList = handlerList.concat();\n\n\t\tcustomEvent.eventType = eventName;\n\n\t\tvar isCanceled = false;\n\t\tvar arg = [customEvent];\n\t\tvar i = 0;\n\n\t\tcustomEvent.stop = function () {\n\t\t\tisCanceled = true;\n\t\t};\n\t\tcustomEvent.currentTarget = this;\n\n\t\tfor (var _len = arguments.length, restParam = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t\t\trestParam[_key - 2] = arguments[_key];\n\t\t}\n\n\t\tif (restParam.length >= 1) {\n\t\t\targ = arg.concat(restParam);\n\t\t}\n\n\t\tfor (i = 0; handlerList[i]; i++) {\n\t\t\thandlerList[i].apply(this, arg);\n\t\t}\n\n\t\treturn !isCanceled;\n\t};\n\t/**\n * Executed event just one time.\n * @ko 이벤트가 한번만 실행된다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n alert(\"hi\");\n }\n thing() {\n this.once(\"hi\", this.hi);\n }\n }\n var some = new Some();\n some.thing();\n some.trigger(\"hi\");\n // fire alert(\"hi\");\n some.trigger(\"hi\");\n // Nothing happens\n */\n\n\n\tComponent.prototype.once = function once(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar i = void 0;\n\n\t\t\tfor (i in eventHash) {\n\t\t\t\tthis.once(i, eventHash[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar self = this;\n\n\t\t\tthis.on(eventName, function listener() {\n\t\t\t\tfor (var _len2 = arguments.length, arg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\t\targ[_key2] = arguments[_key2];\n\t\t\t\t}\n\n\t\t\t\thandlerToAttach.apply(self, arg);\n\t\t\t\tself.off(eventName, listener);\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n * Checks whether an event has been attached to a component.\n * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다.\n * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름\n * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부\n * @example\n class Some extends eg.Component {\n some() {\n this.hasOn(\"hi\");// check hi event.\n }\n }\n */\n\n\n\tComponent.prototype.hasOn = function hasOn(eventName) {\n\t\treturn !!this._eventHandler[eventName];\n\t};\n\n\t/**\n * Attaches an event to a component.\n * @ko 컴포넌트에 이벤트를 등록한다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.on(\"hi\",this.hi); //attach event\n }\n }\n */\n\n\n\tComponent.prototype.on = function on(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar name = void 0;\n\n\t\t\tfor (name in eventHash) {\n\t\t\t\tthis.on(name, eventHash[name]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\t\tif (typeof handlerList === \"undefined\") {\n\t\t\t\tthis._eventHandler[eventName] = [];\n\t\t\t\thandlerList = this._eventHandler[eventName];\n\t\t\t}\n\n\t\t\thandlerList.push(handlerToAttach);\n\t\t}\n\n\t\treturn this;\n\t};\n\t/**\n * Detaches an event from the component.\n * @ko 컴포넌트에 등록된 이벤트를 해제한다\n * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름\n * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.off(\"hi\",this.hi); //detach event\n }\n }\n */\n\n\n\tComponent.prototype.off = function off(eventName, handlerToDetach) {\n\t\t// All event detach.\n\t\tif (typeof eventName === \"undefined\") {\n\t\t\tthis._eventHandler = {};\n\t\t\treturn this;\n\t\t}\n\n\t\t// All handler of specific event detach.\n\t\tif (typeof handlerToDetach === \"undefined\") {\n\t\t\tif (typeof eventName === \"string\") {\n\t\t\t\tthis._eventHandler[eventName] = undefined;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar eventHash = eventName;\n\t\t\t\tvar name = void 0;\n\n\t\t\t\tfor (name in eventHash) {\n\t\t\t\t\tthis.off(name, eventHash[name]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// The handler of specific event detach.\n\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\tif (handlerList) {\n\t\t\tvar k = void 0;\n\t\t\tvar handlerFunction = void 0;\n\n\t\t\tfor (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) {\n\t\t\t\tif (handlerFunction === handlerToDetach) {\n\t\t\t\t\thandlerList = handlerList.splice(k, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\treturn Component;\n}();\n\nexports[\"default\"] = Component;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=component.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/component/dist/component.js\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/axes project is licensed under the MIT license\r\n * \r\n * @egjs/axes JavaScript library\r\n * https://github.com/naver/egjs-axes\r\n * \r\n * @version 2.3.3\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammerjs\", \"@egjs/component\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Axes\"] = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Axes\"] = factory(root[\"Hammer\"], root[\"eg\"][\"Component\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nfunction toArray(nodes) {\r\n // const el = Array.prototype.slice.call(nodes);\r\n // for IE8\r\n var el = [];\r\n for (var i = 0, len = nodes.length; i < len; i++) {\r\n el.push(nodes[i]);\r\n }\r\n return el;\r\n}\r\nexports.toArray = toArray;\r\nfunction $(param, multi) {\r\n if (multi === void 0) { multi = false; }\r\n var el;\r\n if (typeof param === \"string\") {\r\n // check if string is HTML tag format\r\n var match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\r\n // creating element\r\n if (match) {\r\n var dummy = document.createElement(\"div\");\r\n dummy.innerHTML = param;\r\n el = toArray(dummy.childNodes);\r\n }\r\n else {\r\n el = toArray(document.querySelectorAll(param));\r\n }\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n else if (param === window) {\r\n el = param;\r\n }\r\n else if (param.nodeName &&\r\n (param.nodeType === 1 || param.nodeType === 9)) {\r\n el = param;\r\n }\r\n else if ((\"jQuery\" in window && param instanceof jQuery) ||\r\n param.constructor.prototype.jquery) {\r\n el = multi ? param.toArray() : param.get(0);\r\n }\r\n else if (Array.isArray(param)) {\r\n el = param.map(function (v) { return $(v); });\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n return el;\r\n}\r\nexports.$ = $;\r\nvar raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame;\r\nvar caf = window.cancelAnimationFrame || window.webkitCancelAnimationFrame;\r\nif (raf && !caf) {\r\n var keyInfo_1 = {};\r\n var oldraf_1 = raf;\r\n raf = function (callback) {\r\n function wrapCallback(timestamp) {\r\n if (keyInfo_1[key]) {\r\n callback(timestamp);\r\n }\r\n }\r\n var key = oldraf_1(wrapCallback);\r\n keyInfo_1[key] = true;\r\n return key;\r\n };\r\n caf = function (key) {\r\n delete keyInfo_1[key];\r\n };\r\n}\r\nelse if (!(raf && caf)) {\r\n raf = function (callback) {\r\n return window.setTimeout(function () {\r\n callback(window.performance && window.performance.now && window.performance.now() || new Date().getTime());\r\n }, 16);\r\n };\r\n caf = window.clearTimeout;\r\n}\r\n/**\r\n * A polyfill for the window.requestAnimationFrame() method.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame\r\n * @private\r\n */\r\nfunction requestAnimationFrame(fp) {\r\n return raf(fp);\r\n}\r\nexports.requestAnimationFrame = requestAnimationFrame;\r\n;\r\n/**\r\n* A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method.\r\n* @param {Number} key −\tThe ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값\r\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame\r\n* @private\r\n*/\r\nfunction cancelAnimationFrame(key) {\r\n caf(key);\r\n}\r\nexports.cancelAnimationFrame = cancelAnimationFrame;\r\n;\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nexports.SUPPORT_TOUCH = \"ontouchstart\" in window;\r\nexports.UNIQUEKEY = \"_EGJS_AXES_INPUTTYPE_\";\r\nfunction toAxis(source, offset) {\r\n return offset.reduce(function (acc, v, i) {\r\n if (source[i]) {\r\n acc[source[i]] = v;\r\n }\r\n return acc;\r\n }, {});\r\n}\r\nexports.toAxis = toAxis;\r\n;\r\nfunction createHammer(element, options) {\r\n try {\r\n // create Hammer\r\n return new Hammer.Manager(element, __assign({}, options));\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\nexports.createHammer = createHammer;\r\n;\r\nfunction convertInputType(inputType) {\r\n if (inputType === void 0) { inputType = []; }\r\n var hasTouch = false;\r\n var hasMouse = false;\r\n inputType.forEach(function (v) {\r\n switch (v) {\r\n case \"mouse\":\r\n hasMouse = true;\r\n break;\r\n case \"touch\": hasTouch = exports.SUPPORT_TOUCH;\r\n }\r\n });\r\n return (hasTouch && Hammer.TouchInput) ||\r\n (hasMouse && Hammer.MouseInput) || null;\r\n}\r\nexports.convertInputType = convertInputType;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar Coordinate = {\r\n getInsidePosition: function (destPos, range, circular, bounce) {\r\n var toDestPos = destPos;\r\n var targetRange = [\r\n circular[0] ? range[0] : (bounce ? range[0] - bounce[0] : range[0]),\r\n circular[1] ? range[1] : (bounce ? range[1] + bounce[1] : range[1])\r\n ];\r\n toDestPos = Math.max(targetRange[0], toDestPos);\r\n toDestPos = Math.min(targetRange[1], toDestPos);\r\n return +toDestPos.toFixed(5);\r\n },\r\n // determine outside\r\n isOutside: function (pos, range) {\r\n return pos < range[0] || pos > range[1];\r\n },\r\n getDuration: function (distance, deceleration) {\r\n var duration = Math.sqrt(distance / deceleration * 2);\r\n // when duration is under 100, then value is zero\r\n return duration < 100 ? 0 : duration;\r\n },\r\n isCircularable: function (destPos, range, circular) {\r\n return (circular[1] && destPos > range[1]) ||\r\n (circular[0] && destPos < range[0]);\r\n },\r\n getCirculatedPos: function (pos, range, circular) {\r\n var toPos = pos;\r\n var min = range[0];\r\n var max = range[1];\r\n var length = max - min;\r\n if (circular[1] && pos > max) {\r\n toPos = (toPos - max) % length + min;\r\n }\r\n if (circular[0] && pos < min) {\r\n toPos = (toPos - min) % length + max;\r\n }\r\n return +toPos.toFixed(5);\r\n }\r\n};\r\nexports[\"default\"] = Coordinate;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\n;\r\nvar AxisManager = /** @class */ (function () {\r\n function AxisManager(axis, options) {\r\n var _this = this;\r\n this.axis = axis;\r\n this.options = options;\r\n this._complementOptions();\r\n this._pos = Object.keys(this.axis).reduce(function (acc, v) {\r\n acc[v] = _this.axis[v].range[0];\r\n return acc;\r\n }, {});\r\n }\r\n AxisManager.equal = function (target, base) {\r\n for (var k in target) {\r\n if (target[k] !== base[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * set up 'css' expression\r\n * @private\r\n */\r\n AxisManager.prototype._complementOptions = function () {\r\n var _this = this;\r\n Object.keys(this.axis).forEach(function (axis) {\r\n _this.axis[axis] = __assign({\r\n range: [0, 100],\r\n bounce: [0, 0],\r\n circular: [false, false]\r\n }, _this.axis[axis]);\r\n [\"bounce\", \"circular\"].forEach(function (v) {\r\n var axisOption = _this.axis;\r\n var key = axisOption[axis][v];\r\n if (/string|number|boolean/.test(typeof key)) {\r\n axisOption[axis][v] = [key, key];\r\n }\r\n });\r\n });\r\n };\r\n AxisManager.prototype.getDelta = function (depaPos, destPos) {\r\n var fullDepaPos = this.get(depaPos);\r\n return this.map(this.get(destPos), function (v, k) { return v - fullDepaPos[k]; });\r\n };\r\n AxisManager.prototype.get = function (axes) {\r\n var _this = this;\r\n if (axes && Array.isArray(axes)) {\r\n return axes.reduce(function (acc, v) {\r\n if (v && (v in _this._pos)) {\r\n acc[v] = _this._pos[v];\r\n }\r\n return acc;\r\n }, {});\r\n }\r\n else {\r\n return __assign({}, this._pos, (axes || {}));\r\n }\r\n };\r\n AxisManager.prototype.moveTo = function (pos) {\r\n var _this = this;\r\n var delta = this.map(this._pos, function (v, key) {\r\n return pos[key] ? pos[key] - _this._pos[key] : 0;\r\n });\r\n this.set(pos);\r\n return {\r\n pos: __assign({}, this._pos),\r\n delta: delta\r\n };\r\n };\r\n AxisManager.prototype.set = function (pos) {\r\n for (var k in pos) {\r\n if (k && (k in this._pos)) {\r\n this._pos[k] = pos[k];\r\n }\r\n }\r\n };\r\n AxisManager.prototype.every = function (pos, callback) {\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n if (!callback(pos[k], k, axisOptions[k])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n AxisManager.prototype.filter = function (pos, callback) {\r\n var filtered = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n callback(pos[k], k, axisOptions[k]) && (filtered[k] = pos[k]);\r\n }\r\n }\r\n return filtered;\r\n };\r\n AxisManager.prototype.map = function (pos, callback) {\r\n var tranformed = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n tranformed[k] = callback(pos[k], k, axisOptions[k]);\r\n }\r\n }\r\n return tranformed;\r\n };\r\n AxisManager.prototype.isOutside = function (axes) {\r\n return !this.every(axes ? this.get(axes) : this._pos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); });\r\n };\r\n return AxisManager;\r\n}());\r\nexports.AxisManager = AxisManager;\r\n;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"DIRECTION_NONE\"] = 1] = \"DIRECTION_NONE\";\r\n DIRECTION[DIRECTION[\"DIRECTION_LEFT\"] = 2] = \"DIRECTION_LEFT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_RIGHT\"] = 4] = \"DIRECTION_RIGHT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_HORIZONTAL\"] = 6] = \"DIRECTION_HORIZONTAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_UP\"] = 8] = \"DIRECTION_UP\";\r\n DIRECTION[DIRECTION[\"DIRECTION_DOWN\"] = 16] = \"DIRECTION_DOWN\";\r\n DIRECTION[DIRECTION[\"DIRECTION_VERTICAL\"] = 24] = \"DIRECTION_VERTICAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_ALL\"] = 30] = \"DIRECTION_ALL\";\r\n})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));\r\nexports.TRANSFORM = (function () {\r\n var bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\r\n var target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\r\n for (var i = 0, len = target.length; i < len; i++) {\r\n if (target[i] in bodyStyle) {\r\n return target[i];\r\n }\r\n }\r\n return \"\";\r\n})();\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar Axes_1 = __webpack_require__(7);\r\nvar PanInput_1 = __webpack_require__(13);\r\nvar PinchInput_1 = __webpack_require__(14);\r\nvar WheelInput_1 = __webpack_require__(15);\r\nvar MoveKeyInput_1 = __webpack_require__(16);\r\nAxes_1[\"default\"].PanInput = PanInput_1.PanInput;\r\nAxes_1[\"default\"].PinchInput = PinchInput_1.PinchInput;\r\nAxes_1[\"default\"].WheelInput = WheelInput_1.WheelInput;\r\nAxes_1[\"default\"].MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\r\nmodule.exports = Axes_1[\"default\"];\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Component = __webpack_require__(8);\r\nvar AnimationManager_1 = __webpack_require__(9);\r\nvar EventManager_1 = __webpack_require__(10);\r\nvar InterruptManager_1 = __webpack_require__(11);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar InputObserver_1 = __webpack_require__(12);\r\nvar const_1 = __webpack_require__(5);\r\n/**\r\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\r\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @property {Number[]} [range] The coordinate of range 좌표 범위\r\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\r\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\r\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\r\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\r\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\r\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\r\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\r\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\r\n**/\r\n/**\r\n * @typedef {Object} AxesOption The option object of the eg.Axes module\r\n * @ko eg.Axes 모듈의 옵션 객체\r\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\r\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\r\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\r\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\r\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
\r\n**/\r\n/**\r\n * @class eg.Axes\r\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\r\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\r\n * @extends eg.Component\r\n *\r\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\r\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\r\n *\r\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\r\n * @example\r\n *\r\n * // 1. Initialize eg.Axes\r\n * const axes = new eg.Axes({\r\n *\tsomething1: {\r\n *\t\trange: [0, 150],\r\n *\t\tbounce: 50\r\n *\t},\r\n *\tsomething2: {\r\n *\t\trange: [0, 200],\r\n *\t\tbounce: 100\r\n *\t},\r\n *\tsomethingN: {\r\n *\t\trange: [1, 10],\r\n *\t}\r\n * }, {\r\n * deceleration : 0.0024\r\n * });\r\n *\r\n * // 2. attach event handler\r\n * axes.on({\r\n *\t\"hold\" : function(evt) {\r\n *\t},\r\n *\t\"release\" : function(evt) {\r\n *\t},\r\n *\t\"animationStart\" : function(evt) {\r\n *\t},\r\n *\t\"animationEnd\" : function(evt) {\r\n *\t},\r\n *\t\"change\" : function(evt) {\r\n *\t}\r\n * });\r\n *\r\n * // 3. Initialize inputTypes\r\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\r\n *\tscale: [0.5, 1]\r\n * });\r\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\r\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\r\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\r\n *\tscale: 1.5\r\n * });\r\n *\r\n * // 4. Connect eg.Axes and InputTypes\r\n * // [PanInput] When the mouse or touchscreen is down and moved.\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\r\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\r\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\r\n *\r\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something2\", pinchInputArea);\r\n */\r\nvar Axes = /** @class */ (function (_super) {\r\n __extends(Axes, _super);\r\n function Axes(axis, options, startPos) {\r\n if (axis === void 0) { axis = {}; }\r\n var _this = _super.call(this) || this;\r\n _this.axis = axis;\r\n _this._inputs = [];\r\n _this.options = __assign({\r\n easing: function easeOutCubic(x) {\r\n return 1 - Math.pow(1 - x, 3);\r\n },\r\n interruptable: true,\r\n maximumDuration: Infinity,\r\n minimumDuration: 0,\r\n deceleration: 0.0006\r\n }, options);\r\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\r\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\r\n _this.em = new EventManager_1.EventManager(_this);\r\n _this.am = new AnimationManager_1.AnimationManager(_this);\r\n _this.io = new InputObserver_1.InputObserver(_this);\r\n _this.em.setAnimationManager(_this.am);\r\n startPos && _this.em.triggerChange(startPos);\r\n return _this;\r\n }\r\n /**\r\n * Connect the axis of eg.Axes to the inputType.\r\n * @ko eg.Axes의 축과 inputType을 연결한다\r\n * @method eg.Axes#connect\r\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\r\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\r\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\r\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\r\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\r\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\r\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\r\n */\r\n Axes.prototype.connect = function (axes, inputType) {\r\n var mapped;\r\n if (typeof axes === \"string\") {\r\n mapped = axes.split(\" \");\r\n }\r\n else {\r\n mapped = axes.concat();\r\n }\r\n // check same instance\r\n if (~this._inputs.indexOf(inputType)) {\r\n this.disconnect(inputType);\r\n }\r\n // check same element in hammer type for share\r\n if (\"hammer\" in inputType) {\r\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\r\n if (targets.length) {\r\n inputType.hammer = targets[0].hammer;\r\n }\r\n }\r\n inputType.mapAxes(mapped);\r\n inputType.connect(this.io);\r\n this._inputs.push(inputType);\r\n return this;\r\n };\r\n /**\r\n * Disconnect the axis of eg.Axes from the inputType.\r\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\r\n * @method eg.Axes#disconnect\r\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * const input1 = new eg.Axes.PanInput(\"#area1\");\r\n * const input2 = new eg.Axes.PanInput(\"#area2\");\r\n * const input3 = new eg.Axes.PanInput(\"#area3\");\r\n *\r\n * axes.connect(\"x\", input1);\r\n * .connect(\"x xOther\", input2)\r\n * .connect([\"xOther\", \"x\"], input3);\r\n *\r\n * axes.disconnect(input1); // disconnects input1\r\n * axes.disconnect(); // disconnects all of them\r\n */\r\n Axes.prototype.disconnect = function (inputType) {\r\n if (inputType) {\r\n var index = this._inputs.indexOf(inputType);\r\n if (index >= 0) {\r\n this._inputs[index].disconnect();\r\n this._inputs.splice(index, 1);\r\n }\r\n }\r\n else {\r\n this._inputs.forEach(function (v) { return v.disconnect(); });\r\n this._inputs = [];\r\n }\r\n return this;\r\n };\r\n /**\r\n * Returns the current position of the coordinates.\r\n * @ko 좌표의 현재 위치를 반환한다\r\n * @method eg.Axes#get\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Object.} Axis coordinate information 축 좌표 정보\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\r\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\r\n */\r\n Axes.prototype.get = function (axes) {\r\n return this.axm.get(axes);\r\n };\r\n /**\r\n * Moves an axis to specific coordinates.\r\n * @ko 좌표를 이동한다.\r\n * @method eg.Axes#setTo\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setTo({\"x\": 30, \"zoom\": 60});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\r\n */\r\n Axes.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setTo(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Moves an axis from the current coordinates to specific coordinates.\r\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\r\n * @method eg.Axes#setBy\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setBy({\"x\": 30, \"zoom\": 10});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\r\n */\r\n Axes.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setBy(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Returns whether there is a coordinate in the bounce area of ​​the target axis.\r\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\r\n * @method eg.Axes#isBounceArea\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.isBounceArea([\"x\"]);\r\n * axes.isBounceArea([\"x\", \"zoom\"]);\r\n * axes.isBounceArea();\r\n */\r\n Axes.prototype.isBounceArea = function (axes) {\r\n return this.axm.isOutside(axes);\r\n };\r\n /**\r\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\r\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\r\n * @method eg.Axes#destroy\r\n */\r\n Axes.prototype.destroy = function () {\r\n this.disconnect();\r\n this.em.destroy();\r\n };\r\n Axes.VERSION = \"3.0.0-rc\";\r\n /**\r\n * @name eg.Axes.TRANSFORM\r\n * @desc Returns the transform attribute with CSS vendor prefixes.\r\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\r\n *\r\n * @constant\r\n * @type {String}\r\n * @example\r\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\r\n */\r\n Axes.TRANSFORM = const_1.TRANSFORM;\r\n /**\r\n * @name eg.Axes.DIRECTION_NONE\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\r\n /**\r\n * @name eg.Axes.DIRECTION_LEFT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\r\n /**\r\n * @name eg.Axes.DIRECTION_RIGHT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\r\n /**\r\n * @name eg.Axes.DIRECTION_UP\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\r\n /**\r\n * @name eg.Axes.DIRECTION_DOWN\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\r\n /**\r\n * @name eg.Axes.DIRECTION_HORIZONTAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_VERTICAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_ALL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\r\n return Axes;\r\n}(Component));\r\nexports[\"default\"] = Axes;\r\n;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar utils_1 = __webpack_require__(0);\r\nvar AnimationManager = /** @class */ (function () {\r\n function AnimationManager(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.animationEnd = this.animationEnd.bind(this);\r\n }\r\n AnimationManager.getDuration = function (duration, min, max) {\r\n return Math.max(Math.min(duration, max), min);\r\n };\r\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\r\n var _this = this;\r\n var duration;\r\n if (typeof wishDuration !== \"undefined\") {\r\n duration = wishDuration;\r\n }\r\n else {\r\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\r\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\r\n }\r\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\r\n };\r\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\r\n var depaPos = this.axm.get();\r\n var destPos = pos;\r\n var inputEvent = option && option.event || null;\r\n return {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: inputEvent,\r\n input: option && option.input || null,\r\n isTrusted: !!inputEvent,\r\n done: this.animationEnd\r\n };\r\n };\r\n AnimationManager.prototype.grab = function (axes, option) {\r\n if (this._animateParam && axes.length) {\r\n var orgPos_1 = this.axm.get(axes);\r\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\r\n this.em.triggerChange(pos, option, !!option);\r\n }\r\n this._animateParam = null;\r\n this._raf && utils_1.cancelAnimationFrame(this._raf);\r\n this._raf = null;\r\n this.em.triggerAnimationEnd(!!(option && option.event));\r\n }\r\n };\r\n AnimationManager.prototype.getEventInfo = function () {\r\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\r\n return {\r\n input: this._animateParam.input,\r\n event: this._animateParam.inputEvent\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n AnimationManager.prototype.restore = function (option) {\r\n var pos = this.axm.get();\r\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\r\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\r\n };\r\n AnimationManager.prototype.animationEnd = function () {\r\n var beforeParam = this.getEventInfo();\r\n this._animateParam = null;\r\n // for Circular\r\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\r\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\r\n this.itm.setInterrupt(false);\r\n this.em.triggerAnimationEnd(!!beforeParam);\r\n if (this.axm.isOutside()) {\r\n this.restore(beforeParam);\r\n }\r\n else {\r\n this.em.triggerFinish(!!beforeParam);\r\n }\r\n };\r\n AnimationManager.prototype.animateLoop = function (param, complete) {\r\n this._animateParam = __assign({}, param);\r\n this._animateParam.startTime = new Date().getTime();\r\n if (param.duration) {\r\n var info_1 = this._animateParam;\r\n var self_1 = this;\r\n (function loop() {\r\n self_1._raf = null;\r\n if (self_1.frame(info_1) >= 1) {\r\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\r\n self_1.em.triggerChange(param.destPos);\r\n }\r\n complete();\r\n return;\r\n } // animationEnd\r\n self_1._raf = utils_1.requestAnimationFrame(loop);\r\n })();\r\n }\r\n else {\r\n this.em.triggerChange(param.destPos);\r\n complete();\r\n }\r\n };\r\n AnimationManager.prototype.getUserControll = function (param) {\r\n var userWish = param.setTo();\r\n userWish.destPos = this.axm.get(userWish.destPos);\r\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\r\n return userWish;\r\n };\r\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\r\n var _this = this;\r\n var param = this.createAnimationParam(destPos, duration, option);\r\n var depaPos = __assign({}, param.depaPos);\r\n var retTrigger = this.em.triggerAnimationStart(param);\r\n // to control\r\n var userWish = this.getUserControll(param);\r\n // You can't stop the 'animationStart' event when 'circular' is true.\r\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\r\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\r\n }\r\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\r\n var inputEvent = option && option.event || null;\r\n this.animateLoop({\r\n depaPos: depaPos,\r\n destPos: userWish.destPos,\r\n duration: userWish.duration,\r\n delta: this.axm.getDelta(depaPos, userWish.destPos),\r\n isTrusted: !!inputEvent,\r\n inputEvent: inputEvent,\r\n input: option && option.input || null\r\n }, function () { return _this.animationEnd(); });\r\n }\r\n };\r\n // animation frame (0~1)\r\n AnimationManager.prototype.frame = function (param) {\r\n var curTime = new Date().getTime() - param.startTime;\r\n var easingPer = this.easing(curTime / param.duration);\r\n var toPos = param.depaPos;\r\n toPos = this.axm.map(toPos, function (v, k, opt) {\r\n v += param.delta[k] * easingPer;\r\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n });\r\n this.em.triggerChange(toPos);\r\n return easingPer;\r\n };\r\n AnimationManager.prototype.easing = function (p) {\r\n return p > 1 ? 1 : this.options.easing(p);\r\n };\r\n AnimationManager.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n var axes = Object.keys(pos);\r\n this.grab(axes);\r\n var orgPos = this.axm.get(axes);\r\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\r\n return this;\r\n }\r\n this.itm.setInterrupt(true);\r\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\r\n if (!Object.keys(movedPos).length) {\r\n return this;\r\n }\r\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\r\n }\r\n });\r\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\r\n return this;\r\n }\r\n if (duration > 0) {\r\n this.animateTo(movedPos, duration);\r\n }\r\n else {\r\n this.em.triggerChange(movedPos);\r\n this.itm.setInterrupt(false);\r\n }\r\n return this;\r\n };\r\n AnimationManager.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\r\n };\r\n return AnimationManager;\r\n}());\r\nexports.AnimationManager = AnimationManager;\r\n;\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(axes) {\r\n this.axes = axes;\r\n }\r\n /**\r\n * This event is fired when a user holds an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\r\n * @name eg.Axes#hold\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos coordinate 좌표 정보\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"hold\", function(event) {\r\n * // event.pos\r\n * // event.input\r\n * // event.inputEvent\r\n * // isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerHold = function (pos, option) {\r\n this.axes.trigger(\"hold\", {\r\n pos: pos,\r\n input: option.input || null,\r\n inputEvent: option.event || null,\r\n isTrusted: true\r\n });\r\n };\r\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\r\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\r\n * @name set\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\r\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\r\n * @name setTo\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationStart\", function(event) {\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n /**\r\n * This event is fired when a user release an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\r\n * @name eg.Axes#release\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'release' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerRelease = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n this.axes.trigger(\"release\", param);\r\n };\r\n /**\r\n * This event is fired when coordinate changes.\r\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\r\n * @name eg.Axes#change\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos The coordinate 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * // event.pos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.holding\r\n * // event.set\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the coordinates to move after the 'change' event.\r\n * // it works when the holding value of the change event is true.\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n EventManager.prototype.triggerChange = function (pos, option, holding) {\r\n if (option === void 0) { option = null; }\r\n if (holding === void 0) { holding = false; }\r\n var eventInfo = this.am.getEventInfo();\r\n var moveTo = this.am.axm.moveTo(pos);\r\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\r\n var param = {\r\n pos: moveTo.pos,\r\n delta: moveTo.delta,\r\n holding: holding,\r\n inputEvent: inputEvent,\r\n isTrusted: !!inputEvent,\r\n input: option && option.input || eventInfo && eventInfo.input || null,\r\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\r\n };\r\n this.axes.trigger(\"change\", param);\r\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\r\n };\r\n /**\r\n * This event is fired when animation starts.\r\n * @ko 에니메이션이 시작할 때 발생한다.\r\n * @name eg.Axes#animationStart\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationStart = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n return this.axes.trigger(\"animationStart\", param);\r\n };\r\n /**\r\n * This event is fired when animation ends.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#animationEnd\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationEnd\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"animationEnd\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n /**\r\n * This event is fired when all actions have been completed.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#finish\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"finish\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerFinish = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"finish\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n EventManager.prototype.createUserControll = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n // to controll\r\n var userControl = {\r\n destPos: __assign({}, pos),\r\n duration: duration\r\n };\r\n return function (toPos, userDuration) {\r\n toPos && (userControl.destPos = __assign({}, toPos));\r\n (userDuration !== undefined) && (userControl.duration = userDuration);\r\n return userControl;\r\n };\r\n };\r\n EventManager.prototype.setAnimationManager = function (am) {\r\n this.am = am;\r\n };\r\n EventManager.prototype.destroy = function () {\r\n this.axes.off();\r\n };\r\n return EventManager;\r\n}());\r\nexports.EventManager = EventManager;\r\n;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar InterruptManager = /** @class */ (function () {\r\n function InterruptManager(options) {\r\n this.options = options;\r\n this._prevented = false; // check whether the animation event was prevented\r\n }\r\n InterruptManager.prototype.isInterrupting = function () {\r\n // when interruptable is 'true', return value is always 'true'.\r\n return this.options.interruptable || this._prevented;\r\n };\r\n InterruptManager.prototype.isInterrupted = function () {\r\n return !this.options.interruptable && this._prevented;\r\n };\r\n InterruptManager.prototype.setInterrupt = function (prevented) {\r\n !this.options.interruptable && (this._prevented = prevented);\r\n };\r\n return InterruptManager;\r\n}());\r\nexports.InterruptManager = InterruptManager;\r\n;\r\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar InputObserver = /** @class */ (function () {\r\n function InputObserver(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\r\n this.isOutside = false;\r\n this.moveDistance = null;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.am = am;\r\n }\r\n // when move pointer is held in outside\r\n InputObserver.prototype.atOutside = function (pos) {\r\n var _this = this;\r\n if (this.isOutside) {\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var tn = opt.range[0] - opt.bounce[0];\r\n var tx = opt.range[1] + opt.bounce[1];\r\n return v > tx ? tx : (v < tn ? tn : v);\r\n });\r\n }\r\n else {\r\n // when start pointer is held in inside\r\n // get a initialization slope value to prevent smooth animation.\r\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var min = opt.range[0];\r\n var max = opt.range[1];\r\n var out = opt.bounce;\r\n if (v < min) {\r\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\r\n }\r\n else if (v > max) {\r\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\r\n }\r\n return v;\r\n });\r\n }\r\n };\r\n InputObserver.prototype.get = function (input) {\r\n return this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.hold = function (input, event) {\r\n if (this.itm.isInterrupted() || !input.axes.length) {\r\n return;\r\n }\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n this.itm.setInterrupt(true);\r\n this.am.grab(input.axes, changeOption);\r\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\r\n this.isOutside = this.axm.isOutside(input.axes);\r\n this.moveDistance = this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.change = function (input, event, offset) {\r\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\r\n return;\r\n }\r\n var depaPos = this.axm.get(input.axes);\r\n var destPos;\r\n // for outside logic\r\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\r\n this.moveDistance && (this.moveDistance = destPos);\r\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n // from outside to inside\r\n if (this.isOutside &&\r\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\r\n this.isOutside = false;\r\n }\r\n destPos = this.atOutside(destPos);\r\n this.em.triggerChange(destPos, {\r\n input: input,\r\n event: event\r\n }, true);\r\n };\r\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\r\n if (!this.itm.isInterrupting()) {\r\n return;\r\n }\r\n if (!this.moveDistance) {\r\n return;\r\n }\r\n var pos = this.axm.get(input.axes);\r\n var depaPos = this.axm.get();\r\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return pos[k] + v;\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\r\n }\r\n }));\r\n var duration = this.am.getDuration(destPos, pos, inputDuration);\r\n if (duration === 0) {\r\n destPos = __assign({}, depaPos);\r\n }\r\n // prepare params\r\n var param = {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: duration,\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: event,\r\n input: input,\r\n isTrusted: true\r\n };\r\n this.em.triggerRelease(param);\r\n this.moveDistance = null;\r\n // to contol\r\n var userWish = this.am.getUserControll(param);\r\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n if (isEqual || userWish.duration === 0) {\r\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\r\n this.itm.setInterrupt(false);\r\n if (this.axm.isOutside()) {\r\n this.am.restore(changeOption);\r\n }\r\n else {\r\n this.em.triggerFinish(true);\r\n }\r\n }\r\n else {\r\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\r\n }\r\n };\r\n return InputObserver;\r\n}());\r\nexports.InputObserver = InputObserver;\r\n;\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar const_1 = __webpack_require__(5);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\r\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\r\n * @property {String[]} [inputType=[\"touch\",\"mouse\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
\r\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\r\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\r\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\r\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PanInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\r\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\r\n *\r\n * @example\r\n * const pan = new eg.Axes.PanInput(\"#area\", {\r\n * \t\tinputType: [\"touch\"],\r\n * \t\tscale: [1, 1.3],\r\n * });\r\n *\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\r\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\r\n */\r\nvar PanInput = /** @class */ (function () {\r\n function PanInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n inputType: [\"touch\", \"mouse\"],\r\n scale: [1, 1],\r\n thresholdAngle: 45,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onHammerInput = this.onHammerInput.bind(this);\r\n this.onPanmove = this.onPanmove.bind(this);\r\n this.onPanend = this.onPanend.bind(this);\r\n }\r\n // get user's direction\r\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\r\n if (thresholdAngle < 0 || thresholdAngle > 90) {\r\n return const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n var toAngle = Math.abs(angle);\r\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\r\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n };\r\n PanInput.getNextOffset = function (speeds, deceleration) {\r\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\r\n var duration = Math.abs(normalSpeed / -deceleration);\r\n return [\r\n speeds[0] / 2 * duration,\r\n speeds[1] / 2 * duration\r\n ];\r\n };\r\n PanInput.useDirection = function (checkType, direction, userDirection) {\r\n if (userDirection) {\r\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\r\n ((direction & checkType) && (userDirection & checkType)));\r\n }\r\n else {\r\n return !!(direction & checkType);\r\n }\r\n };\r\n PanInput.prototype.mapAxes = function (axes) {\r\n var useHorizontal = !!axes[0];\r\n var useVertical = !!axes[1];\r\n if (useHorizontal && useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\r\n }\r\n else if (useHorizontal) {\r\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n }\r\n else if (useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n }\r\n else {\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n this.axes = axes;\r\n };\r\n PanInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n direction: this._direction,\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PanRecognizer.\r\n this.hammer.add(new Hammer.Pan(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer && this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n var inputClass = InputType_1.convertInputType(this.options.inputType);\r\n if (!inputClass) {\r\n throw new Error(\"Wrong inputType parameter!\");\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pan, hammerOption],\r\n ],\r\n inputClass: inputClass\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PanInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PanInput#destroy\r\n */\r\n PanInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PanInput#enable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PanInput#disable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PanInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PanInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\r\n };\r\n PanInput.prototype.onHammerInput = function (event) {\r\n if (this.isEnable()) {\r\n if (event.isFirst) {\r\n this.observer.hold(this, event);\r\n }\r\n else if (event.isFinal) {\r\n this.onPanend(event);\r\n }\r\n }\r\n };\r\n PanInput.prototype.onPanmove = function (event) {\r\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\r\n // not support offset properties in Hammerjs - start\r\n var prevInput = this.hammer.session.prevInput;\r\n /* eslint-disable no-param-reassign */\r\n if (prevInput) {\r\n event.offsetX = event.deltaX - prevInput.deltaX;\r\n event.offsetY = event.deltaY - prevInput.deltaY;\r\n }\r\n else {\r\n event.offsetX = 0;\r\n event.offsetY = 0;\r\n }\r\n var offset = this.getOffset([event.offsetX, event.offsetY], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\r\n ]);\r\n var prevent = offset.some(function (v) { return v !== 0; });\r\n if (prevent) {\r\n event.srcEvent.preventDefault();\r\n event.srcEvent.stopPropagation();\r\n }\r\n event.preventSystemEvent = prevent;\r\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.onPanend = function (event) {\r\n var offset = this.getOffset([\r\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\r\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\r\n ], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\r\n ]);\r\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"hammer.input\", this.onHammerInput)\r\n .on(\"panstart panmove\", this.onPanmove);\r\n };\r\n PanInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"hammer.input\", this.onHammerInput)\r\n .off(\"panstart panmove\", this.onPanmove);\r\n this.observer = null;\r\n };\r\n PanInput.prototype.getOffset = function (properties, useDirection) {\r\n var offset = [0, 0];\r\n var scale = this.options.scale;\r\n if (useDirection[0]) {\r\n offset[0] = (properties[0] * scale[0]);\r\n }\r\n if (useDirection[1]) {\r\n offset[1] = (properties[1] * scale[1]);\r\n }\r\n return offset;\r\n };\r\n return PanInput;\r\n}());\r\nexports.PanInput = PanInput;\r\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\r\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PinchInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\r\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n * @example\r\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something\", pinch);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\r\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\r\n */\r\nvar PinchInput = /** @class */ (function () {\r\n function PinchInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n this._base = null;\r\n this._prev = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onPinchStart = this.onPinchStart.bind(this);\r\n this.onPinchMove = this.onPinchMove.bind(this);\r\n this.onPinchEnd = this.onPinchEnd.bind(this);\r\n }\r\n PinchInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n PinchInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PinchRecognizer.\r\n this.hammer.add(new Hammer.Pinch(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pinch, hammerOption],\r\n ],\r\n inputClass: Hammer.TouchInput\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PinchInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PinchInput#destroy\r\n */\r\n PinchInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n PinchInput.prototype.onPinchStart = function (event) {\r\n this._base = this.observer.get(this)[this.axes[0]];\r\n var offset = this.getOffset(event.scale);\r\n this.observer.hold(this, event);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchMove = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchEnd = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\r\n this._base = null;\r\n this._prev = null;\r\n };\r\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\r\n if (prev === void 0) { prev = 1; }\r\n return this._base * (pinchScale - prev) * this.options.scale;\r\n };\r\n PinchInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"pinchstart\", this.onPinchStart)\r\n .on(\"pinchmove\", this.onPinchMove)\r\n .on(\"pinchend\", this.onPinchEnd);\r\n };\r\n PinchInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"pinchstart\", this.onPinchStart)\r\n .off(\"pinchmove\", this.onPinchMove)\r\n .off(\"pinchend\", this.onPinchEnd);\r\n this.observer = null;\r\n this._prev = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PinchInput#enable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PinchInput#disable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PinchInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PinchInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\r\n };\r\n return PinchInput;\r\n}());\r\nexports.PinchInput = PinchInput;\r\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\r\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.WheelInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\r\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when the mousewheel is moved.\r\n * axes.connect(\"something\", wheel);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\r\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\r\n */\r\nvar WheelInput = /** @class */ (function () {\r\n function WheelInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this._timer = null;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1\r\n }, options);\r\n this.onWheel = this.onWheel.bind(this);\r\n }\r\n WheelInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n WheelInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n WheelInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.WheelInput#destroy\r\n */\r\n WheelInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n WheelInput.prototype.onWheel = function (event) {\r\n var _this = this;\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n if (!this._isHolded) {\r\n this.observer.hold(this, event);\r\n this._isHolded = true;\r\n }\r\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale;\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(function () {\r\n if (_this._isHolded) {\r\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\r\n _this._isHolded = false;\r\n }\r\n }, 50);\r\n };\r\n WheelInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = true;\r\n };\r\n WheelInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.WheelInput#enable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.WheelInput#disable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.WheelInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n WheelInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return WheelInput;\r\n}());\r\nexports.WheelInput = WheelInput;\r\n;\r\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\nexports.KEYMAP = {\r\n LEFT_ARROW: 37,\r\n A: 65,\r\n UP_ARROW: 38,\r\n W: 87,\r\n RIGHT_ARROW: 39,\r\n D: 68,\r\n DOWN_ARROW: 40,\r\n S: 83\r\n};\r\n/**\r\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\r\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\r\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.MoveKeyInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\r\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\r\n * \t\tscale: [1, 1]\r\n * });\r\n *\r\n * // Connect 'x', 'y' axes when the moveKey is pressed.\r\n * axes.connect([\"x\", \"y\"], moveKey);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\r\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n */\r\nvar MoveKeyInput = /** @class */ (function () {\r\n function MoveKeyInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: [1, 1]\r\n }, options);\r\n this.onKeydown = this.onKeydown.bind(this);\r\n }\r\n MoveKeyInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n MoveKeyInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n // add tabindex=\"0\" to the container for making it focusable\r\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\r\n this.element.setAttribute(\"tabindex\", \"0\");\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n MoveKeyInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.MoveKeyInput#destroy\r\n */\r\n MoveKeyInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n MoveKeyInput.prototype.onKeydown = function (event) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n var isMoveKey = true;\r\n var offsets;\r\n var e = event;\r\n switch (e.keyCode) {\r\n case exports.KEYMAP.LEFT_ARROW:\r\n case exports.KEYMAP.A:\r\n offsets = [-this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.RIGHT_ARROW:\r\n case exports.KEYMAP.D:\r\n offsets = [this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.UP_ARROW:\r\n case exports.KEYMAP.W:\r\n offsets = [0, this.options.scale[1]];\r\n break;\r\n case exports.KEYMAP.DOWN_ARROW:\r\n case exports.KEYMAP.S:\r\n offsets = [0, -this.options.scale[1]];\r\n break;\r\n default:\r\n isMoveKey = false;\r\n }\r\n if (isMoveKey) {\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\r\n // Suppress \"double action\" if event handled\r\n e.preventDefault();\r\n }\r\n };\r\n MoveKeyInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = true;\r\n };\r\n MoveKeyInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.MoveKeyInput#enable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.MoveKeyInput#disable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.MoveKeyInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n MoveKeyInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return MoveKeyInput;\r\n}());\r\nexports.MoveKeyInput = MoveKeyInput;\r\n;\r\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=axes.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/axes/dist/axes.js\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 14\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 17\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 18\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 19\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\tres(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\t_this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 35\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 36\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 37\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 39\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 40\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 41\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 42\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.VERSION = exports.SpriteImage = exports.SpinViewer = exports.PanoViewer = exports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar VERSION = \"3.0.0-rc\";\n\nexports.YawPitchControl = _YawPitchControl.YawPitchControl;\nexports.PanoViewer = _PanoViewer.PanoViewer;\nexports.SpinViewer = _SpinViewer.SpinViewer;\nexports.SpriteImage = _SpinViewer.SpriteImage;\nexports.VERSION = VERSION;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/index.js\n// module id = 43\n// module chunks = 0 1"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACr2EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACllFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"view360.pkgd.js","sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 300fcddb410135c43d6f","webpack:///./~/@egjs/component/dist/component.js","webpack:///./src/utils/math-util.js","webpack:///./src/utils/mathUtil/common.js","webpack:///./~/es6-promise/dist/es6-promise.js","webpack:///./~/webvr-polyfill/src/math-util.js","webpack:///./~/webvr-polyfill/src/util.js","webpack:///./src/YawPitchControl/browser.js","webpack:///./src/YawPitchControl/consts.js","webpack:///./~/@egjs/axes/dist/axes.js","webpack:///./src/SpinViewer/SpriteImage.js","webpack:///./src/PanoImageRenderer/WebGLUtils.js","webpack:///./src/PanoImageRenderer/renderer/Renderer.js","webpack:///./src/YawPitchControl/utils.js","webpack:///./~/@egjs/agent/dist/agent.js","webpack:///./~/hammerjs/hammer.js","webpack:///./src/YawPitchControl/index.js","webpack:///./src/PanoViewer/PanoViewer.js","webpack:///./src/PanoViewer/index.js","webpack:///./src/SpinViewer/SpinViewer.js","webpack:///./src/SpinViewer/index.js","webpack:///./src/PanoImageRenderer/ImageLoader.js","webpack:///./src/PanoImageRenderer/PanoImageRenderer.js","webpack:///./src/PanoImageRenderer/VideoLoader.js","webpack:///./src/PanoImageRenderer/index.js","webpack:///./src/PanoImageRenderer/renderer/CubeRenderer.js","webpack:///./src/PanoImageRenderer/renderer/SphereRenderer.js","webpack:///./src/PanoViewer/consts.js","webpack:///./src/YawPitchControl/YawPitchControl.js","webpack:///./src/YawPitchControl/input/ComplementaryFilter.js","webpack:///./src/YawPitchControl/input/DeviceMotion.js","webpack:///./src/YawPitchControl/input/FusionPoseSensor.js","webpack:///./src/YawPitchControl/input/TiltMotionInput.js","webpack:///./src/YawPitchControl/input/WheelInput.js","webpack:///./src/utils/mathUtil/mat4.js","webpack:///./src/utils/mathUtil/quat.js","webpack:///./src/utils/mathUtil/vec2.js","webpack:///./src/utils/mathUtil/vec3.js","webpack:///./~/process/browser.js","webpack:///(webpack)/buildin/global.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js","webpack:///./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js","webpack:///vertx (ignored)","webpack:///./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"view360\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"view360\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"view360\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 43);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 300fcddb410135c43d6f","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/component project is licensed under the MIT license\r\n * \r\n * @egjs/component JavaScript library\r\n * http://naver.github.io/egjs/component\r\n * \r\n * @version 2.1.0\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Component\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Component\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _Component = __webpack_require__(1);\n\nvar _Component2 = _interopRequireDefault(_Component);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_Component2[\"default\"].VERSION = \"2.1.0\";\nmodule.exports = _Component2[\"default\"];\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * A class used to manage events and options in a component\n * @ko 컴포넌트의 이벤트와 옵션을 관리할 수 있게 하는 클래스\n * @alias eg.Component\n */\nvar Component = function () {\n\t/**\n * @support {\"ie\": \"7+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.1+ (except 3.x)\"}\n */\n\tfunction Component() {\n\t\t_classCallCheck(this, Component);\n\n\t\tthis._eventHandler = {};\n\t\tthis.options = {};\n\t}\n\t/**\n * Triggers a custom event.\n * @ko 커스텀 이벤트를 발생시킨다\n * @param {String} eventName The name of the custom event to be triggered 발생할 커스텀 이벤트의 이름\n * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터\n * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고\n * @example\n class Some extends eg.Component {\n some(){\n \tif(this.trigger(\"beforeHi\")){ // When event call to stop return false.\n \tthis.trigger(\"hi\");// fire hi event.\n \t}\n }\n }\n const some = new Some();\n some.on(\"beforeHi\", (e) => {\n if(condition){\n \te.stop(); // When event call to stop, `hi` event not call.\n }\n });\n some.on(\"hi\", (e) => {\n // `currentTarget` is component instance.\n console.log(some === e.currentTarget); // true\n });\n // If you want to more know event design. You can see article.\n // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F\n */\n\n\n\tComponent.prototype.trigger = function trigger(eventName) {\n\t\tvar customEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar handlerList = this._eventHandler[eventName] || [];\n\t\tvar hasHandlerList = handlerList.length > 0;\n\n\t\tif (!hasHandlerList) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If detach method call in handler in first time then handeler list calls.\n\t\thandlerList = handlerList.concat();\n\n\t\tcustomEvent.eventType = eventName;\n\n\t\tvar isCanceled = false;\n\t\tvar arg = [customEvent];\n\t\tvar i = 0;\n\n\t\tcustomEvent.stop = function () {\n\t\t\tisCanceled = true;\n\t\t};\n\t\tcustomEvent.currentTarget = this;\n\n\t\tfor (var _len = arguments.length, restParam = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t\t\trestParam[_key - 2] = arguments[_key];\n\t\t}\n\n\t\tif (restParam.length >= 1) {\n\t\t\targ = arg.concat(restParam);\n\t\t}\n\n\t\tfor (i = 0; handlerList[i]; i++) {\n\t\t\thandlerList[i].apply(this, arg);\n\t\t}\n\n\t\treturn !isCanceled;\n\t};\n\t/**\n * Executed event just one time.\n * @ko 이벤트가 한번만 실행된다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n alert(\"hi\");\n }\n thing() {\n this.once(\"hi\", this.hi);\n }\n }\n var some = new Some();\n some.thing();\n some.trigger(\"hi\");\n // fire alert(\"hi\");\n some.trigger(\"hi\");\n // Nothing happens\n */\n\n\n\tComponent.prototype.once = function once(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar i = void 0;\n\n\t\t\tfor (i in eventHash) {\n\t\t\t\tthis.once(i, eventHash[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar self = this;\n\n\t\t\tthis.on(eventName, function listener() {\n\t\t\t\tfor (var _len2 = arguments.length, arg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\t\targ[_key2] = arguments[_key2];\n\t\t\t\t}\n\n\t\t\t\thandlerToAttach.apply(self, arg);\n\t\t\t\tself.off(eventName, listener);\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n * Checks whether an event has been attached to a component.\n * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다.\n * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름\n * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부\n * @example\n class Some extends eg.Component {\n some() {\n this.hasOn(\"hi\");// check hi event.\n }\n }\n */\n\n\n\tComponent.prototype.hasOn = function hasOn(eventName) {\n\t\treturn !!this._eventHandler[eventName];\n\t};\n\n\t/**\n * Attaches an event to a component.\n * @ko 컴포넌트에 이벤트를 등록한다.\n * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름\n * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.on(\"hi\",this.hi); //attach event\n }\n }\n */\n\n\n\tComponent.prototype.on = function on(eventName, handlerToAttach) {\n\t\tif ((typeof eventName === \"undefined\" ? \"undefined\" : _typeof(eventName)) === \"object\" && typeof handlerToAttach === \"undefined\") {\n\t\t\tvar eventHash = eventName;\n\t\t\tvar name = void 0;\n\n\t\t\tfor (name in eventHash) {\n\t\t\t\tthis.on(name, eventHash[name]);\n\t\t\t}\n\t\t\treturn this;\n\t\t} else if (typeof eventName === \"string\" && typeof handlerToAttach === \"function\") {\n\t\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\t\tif (typeof handlerList === \"undefined\") {\n\t\t\t\tthis._eventHandler[eventName] = [];\n\t\t\t\thandlerList = this._eventHandler[eventName];\n\t\t\t}\n\n\t\t\thandlerList.push(handlerToAttach);\n\t\t}\n\n\t\treturn this;\n\t};\n\t/**\n * Detaches an event from the component.\n * @ko 컴포넌트에 등록된 이벤트를 해제한다\n * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름\n * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수\n * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스\n * @example\n class Some extends eg.Component {\n hi() {\n console.log(\"hi\");\n }\n some() {\n this.off(\"hi\",this.hi); //detach event\n }\n }\n */\n\n\n\tComponent.prototype.off = function off(eventName, handlerToDetach) {\n\t\t// All event detach.\n\t\tif (typeof eventName === \"undefined\") {\n\t\t\tthis._eventHandler = {};\n\t\t\treturn this;\n\t\t}\n\n\t\t// All handler of specific event detach.\n\t\tif (typeof handlerToDetach === \"undefined\") {\n\t\t\tif (typeof eventName === \"string\") {\n\t\t\t\tthis._eventHandler[eventName] = undefined;\n\t\t\t\treturn this;\n\t\t\t} else {\n\t\t\t\tvar eventHash = eventName;\n\t\t\t\tvar name = void 0;\n\n\t\t\t\tfor (name in eventHash) {\n\t\t\t\t\tthis.off(name, eventHash[name]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// The handler of specific event detach.\n\t\tvar handlerList = this._eventHandler[eventName];\n\n\t\tif (handlerList) {\n\t\t\tvar k = void 0;\n\t\t\tvar handlerFunction = void 0;\n\n\t\t\tfor (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) {\n\t\t\t\tif (handlerFunction === handlerToDetach) {\n\t\t\t\t\thandlerList = handlerList.splice(k, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\treturn Component;\n}();\n\nexports[\"default\"] = Component;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=component.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/component/dist/component.js\n// module id = 0\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.ROTATE_CONSTANT = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.glMatrix = exports.util = undefined;\n\nvar _common = require(\"./mathUtil/common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nvar _vec = require(\"./mathUtil/vec3.js\");\n\nvar _vec2 = _interopRequireDefault(_vec);\n\nvar _vec3 = require(\"./mathUtil/vec2.js\");\n\nvar _vec4 = _interopRequireDefault(_vec3);\n\nvar _quat = require(\"./mathUtil/quat.js\");\n\nvar _quat2 = _interopRequireDefault(_quat);\n\nvar _mat = require(\"./mathUtil/mat4.js\");\n\nvar _mat2 = _interopRequireDefault(_mat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction quatToVec3(quaternion) {\n\tvar baseV = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(baseV, baseV, quaternion);\n\treturn baseV;\n} /**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix.js\n * Math Util\n * modified by egjs\n */\n/**\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.\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:\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\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// Some minimal math functionality borrowed from gl-Matrix and stripped down\n// for the purposes of this library.\n\nvar util = {};\n\nutil.isPowerOfTwo = function (n) {\n\tif (typeof n !== \"number\") {\n\t\treturn \"Not a number\";\n\t}\n\treturn n && (n & n - 1) === 0;\n};\n\nutil.extractYawFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn 1 * Math.atan2(baseV[0], baseV[2]);\n};\n\nutil.extractPitchFromQuat = function (quaternion) {\n\tvar baseV = quatToVec3(quaternion);\n\n\treturn -1 * Math.atan2(baseV[1], Math.sqrt(Math.pow(baseV[0], 2) + Math.pow(baseV[2], 2)));\n};\n\nutil.getQuaternionWithYawPitch = function (yaw, pitch) {\n\tvar q = _quat2[\"default\"].create();\n\n\t_quat2[\"default\"].rotateY(q, q, _common2[\"default\"].toRadian(yaw));\n\t_quat2[\"default\"].rotateX(q, q, _common2[\"default\"].toRadian(pitch));\n\treturn q;\n};\n\nutil.quatToYawPitch = function (quaternion) {\n\treturn {\n\t\tyaw: _common2[\"default\"].toDegree(util.extractYawFromQuat(quaternion)),\n\t\tpitch: _common2[\"default\"].toDegree(util.extractPitchFromQuat(quaternion))\n\t};\n};\n\nutil.yawPitchToPoint = function (yaw, pitch) {\n\t// rad, rad\n\treturn [Math.tan(yaw) / Math.cos(pitch), Math.tan(pitch)];\n};\n\n// implement reference\n// the general equation of a plane : http://www.gisdeveloper.co.kr/entry/평면의-공식\n// calculating angle between two vectors : http://darkpgmr.tistory.com/121\nvar ROTATE_CONSTANT = {\n\tPITCH_DELTA: 1,\n\tYAW_DELTA_BY_ROLL: 2,\n\tYAW_DELTA_BY_YAW: 3\n};\n\nROTATE_CONSTANT[ROTATE_CONSTANT.PITCH_DELTA] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [0, 0, 1]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_ROLL] = {\n\ttargetAxis: [0, 1, 0],\n\tmeshPoint: [1, 0, 0]\n};\nROTATE_CONSTANT[ROTATE_CONSTANT.YAW_DELTA_BY_YAW] = {\n\ttargetAxis: [1, 0, 0],\n\tmeshPoint: [0, 0, 1]\n};\n\nfunction getRotationDelta(prevQ, curQ, rotateKind) {\n\tvar targetAxis = _vec2[\"default\"].fromValues(ROTATE_CONSTANT[rotateKind].targetAxis[0], ROTATE_CONSTANT[rotateKind].targetAxis[1], ROTATE_CONSTANT[rotateKind].targetAxis[2]);\n\tvar meshPoint = ROTATE_CONSTANT[rotateKind].meshPoint;\n\n\tvar prevQuaternion = _quat2[\"default\"].clone(prevQ);\n\tvar curQuaternion = _quat2[\"default\"].clone(curQ);\n\n\t_quat2[\"default\"].normalize(prevQuaternion, prevQuaternion);\n\t_quat2[\"default\"].normalize(curQuaternion, curQuaternion);\n\n\tvar prevPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\tvar curPoint = _vec2[\"default\"].fromValues(0, 0, 1);\n\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\t_vec2[\"default\"].transformQuat(targetAxis, targetAxis, curQuaternion);\n\n\tvar rotateDistance = _vec2[\"default\"].dot(targetAxis, _vec2[\"default\"].cross(_vec2[\"default\"].create(), prevPoint, curPoint));\n\tvar rotateDirection = rotateDistance > 0 ? 1 : -1;\n\n\t// when counter clock wise, use vec3.fromValues(0,1,0)\n\t// when clock wise, use vec3.fromValues(0,-1,0)\n\t// const meshPoint1 = vec3.fromValues(0, 0, 0);\n\tvar meshPoint2 = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\n\tvar meshPoint3 = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(0, rotateDirection, 0);\n\t} else {\n\t\tmeshPoint3 = _vec2[\"default\"].fromValues(rotateDirection, 0, 0);\n\t}\n\n\t_vec2[\"default\"].transformQuat(meshPoint2, meshPoint2, curQuaternion);\n\t_vec2[\"default\"].transformQuat(meshPoint3, meshPoint3, curQuaternion);\n\n\tvar vecU = meshPoint2;\n\tvar vecV = meshPoint3;\n\tvar vecN = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].cross(vecN, vecU, vecV);\n\t_vec2[\"default\"].normalize(vecN, vecN);\n\n\tvar coefficientA = vecN[0];\n\tvar coefficientB = vecN[1];\n\tvar coefficientC = vecN[2];\n\t//\tconst coefficientD = -1 * vec3.dot(vecN, meshPoint1);\n\n\t// a point on the plane\n\tcurPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(curPoint, curPoint, curQuaternion);\n\n\t// a point should project on the plane\n\tprevPoint = _vec2[\"default\"].fromValues(meshPoint[0], meshPoint[1], meshPoint[2]);\n\t_vec2[\"default\"].transformQuat(prevPoint, prevPoint, prevQuaternion);\n\n\t// distance between prevPoint and the plane\n\tvar distance = Math.abs(prevPoint[0] * coefficientA + prevPoint[1] * coefficientB + prevPoint[2] * coefficientC);\n\n\tvar projectedPrevPoint = _vec2[\"default\"].create();\n\n\t_vec2[\"default\"].subtract(projectedPrevPoint, prevPoint, _vec2[\"default\"].scale(_vec2[\"default\"].create(), vecN, distance));\n\n\tvar trigonometricRatio = (projectedPrevPoint[0] * curPoint[0] + projectedPrevPoint[1] * curPoint[1] + projectedPrevPoint[2] * curPoint[2]) / (_vec2[\"default\"].length(projectedPrevPoint) * _vec2[\"default\"].length(curPoint));\n\n\t// defensive block\n\tif (trigonometricRatio > 1) {\n\t\ttrigonometricRatio = 1;\n\t}\n\n\tvar theta = Math.acos(trigonometricRatio);\n\n\tvar crossVec = _vec2[\"default\"].cross(_vec2[\"default\"].create(), curPoint, projectedPrevPoint);\n\n\tdistance = coefficientA * crossVec[0] + coefficientB * crossVec[1] + coefficientC * crossVec[2];\n\n\tvar thetaDirection = void 0;\n\n\tif (rotateKind !== ROTATE_CONSTANT.YAW_DELTA_BY_YAW) {\n\t\tthetaDirection = distance > 0 ? 1 : -1;\n\t} else {\n\t\tthetaDirection = distance < 0 ? 1 : -1;\n\t}\n\n\tvar deltaRadian = theta * thetaDirection * rotateDirection;\n\n\treturn _common2[\"default\"].toDegree(deltaRadian);\n}\n\nutil.getRotationDelta = getRotationDelta;\n\nexports.util = util;\nexports.glMatrix = _common2[\"default\"];\nexports.mat4 = _mat2[\"default\"];\nexports.quat = _quat2[\"default\"];\nexports.vec2 = _vec4[\"default\"];\nexports.vec3 = _vec2[\"default\"];\nexports.ROTATE_CONSTANT = ROTATE_CONSTANT;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/math-util.js\n// module id = 1\n// module chunks = 0 1 2 3","'use strict';\n\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/common.js\n * Common utilities\n * modified by egjs\n */\nvar glMatrix = {};\n\nglMatrix.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\n\nvar degree = Math.PI / 180;\n\nglMatrix.toRadian = function (a) {\n return a * degree;\n};\n\nglMatrix.toDegree = function (a) {\n return a / degree;\n};\n\n// glMatrix.EPSILON = 0.000001;\nglMatrix.EPSILON = 0.0001;\n\nmodule.exports = glMatrix;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/common.js\n// module id = 2\n// module chunks = 0 1 2 3","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.2+97478eb6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = void 0,\n failed = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/es6-promise/dist/es6-promise.js\n// module id = 3\n// module chunks = 0 1 2 3","/*\n * Copyright 2016 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n this.x = x || 0;\n this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n constructor: MathUtil.Vector2,\n\n set: function ( x, y ) {\n this.x = x;\n this.y = y;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n },\n\n subVectors: function ( a, b ) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n constructor: MathUtil.Vector3,\n\n set: function ( x, y, z ) {\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n },\n\n copy: function ( v ) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n\n return this;\n },\n\n length: function () {\n return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n },\n\n normalize: function () {\n var scalar = this.length();\n\n if ( scalar !== 0 ) {\n var invScalar = 1 / scalar;\n\n this.multiplyScalar(invScalar);\n } else {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n }\n\n return this;\n },\n\n multiplyScalar: function ( scalar ) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n },\n\n applyQuaternion: function ( q ) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = - qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n return this;\n },\n\n dot: function ( v ) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n crossVectors: function ( a, b ) {\n var ax = a.x, ay = a.y, az = a.z;\n var bx = b.x, by = b.y, bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n constructor: MathUtil.Quaternion,\n\n set: function ( x, y, z, w ) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n\n return this;\n },\n\n copy: function ( quaternion ) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n\n return this;\n },\n\n setFromEulerXYZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n },\n\n setFromEulerYXZ: function( x, y, z ) {\n var c1 = Math.cos( x / 2 );\n var c2 = Math.cos( y / 2 );\n var c3 = Math.cos( z / 2 );\n var s1 = Math.sin( x / 2 );\n var s2 = Math.sin( y / 2 );\n var s3 = Math.sin( z / 2 );\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 - s1 * s2 * c3;\n this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n return this;\n },\n\n setFromAxisAngle: function ( axis, angle ) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n\n var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos( halfAngle );\n\n return this;\n },\n\n multiply: function ( q ) {\n return this.multiplyQuaternions( this, q );\n },\n\n multiplyQuaternions: function ( a, b ) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n },\n\n inverse: function () {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n\n this.normalize();\n\n return this;\n },\n\n normalize: function () {\n var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n if ( l === 0 ) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n },\n\n slerp: function ( qb, t ) {\n if ( t === 0 ) return this;\n if ( t === 1 ) return this.copy( qb );\n\n var x = this.x, y = this.y, z = this.z, w = this.w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n if ( cosHalfTheta < 0 ) {\n this.w = - qb.w;\n this.x = - qb.x;\n this.y = - qb.y;\n this.z = - qb.z;\n\n cosHalfTheta = - cosHalfTheta;\n } else {\n this.copy( qb );\n }\n\n if ( cosHalfTheta >= 1.0 ) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n\n return this;\n }\n\n var halfTheta = Math.acos( cosHalfTheta );\n var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n this.w = 0.5 * ( w + this.w );\n this.x = 0.5 * ( x + this.x );\n this.y = 0.5 * ( y + this.y );\n this.z = 0.5 * ( z + this.z );\n\n return this;\n }\n\n var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n this.w = ( w * ratioA + this.w * ratioB );\n this.x = ( x * ratioA + this.x * ratioB );\n this.y = ( y * ratioA + this.y * ratioB );\n this.z = ( z * ratioA + this.z * ratioB );\n\n return this;\n },\n\n setFromUnitVectors: function () {\n // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n // assumes direction vectors vFrom and vTo are normalized\n\n var v1, r;\n var EPS = 0.000001;\n\n return function ( vFrom, vTo ) {\n if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n r = vFrom.dot( vTo ) + 1;\n\n if ( r < EPS ) {\n r = 0;\n\n if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n v1.set( - vFrom.y, vFrom.x, 0 );\n } else {\n v1.set( 0, - vFrom.z, vFrom.y );\n }\n } else {\n v1.crossVectors( vFrom, vTo );\n }\n\n this.x = v1.x;\n this.y = v1.y;\n this.z = v1.z;\n this.w = r;\n\n this.normalize();\n\n return this;\n }\n }(),\n};\n\nmodule.exports = MathUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/math-util.js\n// module id = 4\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.001;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array} promises\n */\nUtil.race = function(promises) {\n if (Promise.race) {\n return Promise.race(promises);\n }\n\n return new Promise(function (resolve, reject) {\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(resolve, reject);\n }\n });\n};\n\nUtil.isIOS = (function() {\n var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n return function() {\n return isIOS;\n };\n})();\n\nUtil.isWebViewAndroid = (function() {\n var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1 &&\n navigator.userAgent.indexOf('Chrome') !== -1;\n return function() {\n return isWebViewAndroid;\n };\n})();\n\nUtil.isSafari = (function() {\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n return function() {\n return isSafari;\n };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n navigator.userAgent.indexOf('Android') !== -1;\n return function() {\n return isFirefoxAndroid;\n };\n})();\n\nUtil.isR7 = (function() {\n var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n return function() {\n return isR7;\n };\n})();\n\nUtil.isLandscapeMode = function() {\n var rtn = (window.orientation == 90 || window.orientation == -90);\n return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n if (isNaN(timestampDeltaS)) {\n return false;\n }\n if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n return false;\n }\n if (timestampDeltaS > Util.MAX_TIMESTEP) {\n return false;\n }\n return true;\n};\n\nUtil.getScreenWidth = function() {\n return Math.max(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n return Math.min(window.screen.width, window.screen.height) *\n window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n if (Util.isWebViewAndroid()) {\n return false;\n }\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.exitFullscreen = function() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else {\n return false;\n }\n\n return true;\n};\n\nUtil.getFullscreenElement = function() {\n return document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n // No error checking for brevity.\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n for (var attribName in attribLocationMap)\n gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n gl.linkProgram(program);\n\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n var uniforms = {};\n var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n var uniformName = '';\n for (var i = 0; i < uniformCount; i++) {\n var uniformInfo = gl.getActiveUniform(program, i);\n uniformName = uniformInfo.name.replace('[0]', '');\n uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n }\n return uniforms;\n};\n\nUtil.orthoMatrix = 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\nUtil.copyArray = function (source, dest) {\n for (var i = 0, n = source.length; i < n; i++) {\n dest[i] = source[i];\n }\n};\n\nUtil.isMobile = function() {\n var check = false;\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n return check;\n};\n\nUtil.extend = function(dest, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n //\n // \"To the last I grapple with thee;\n // from hell's heart I stab at thee;\n // for hate's sake I spit my last breath at thee.\"\n // -- Moby Dick, by Herman Melville\n if (Util.isIOS()) {\n var width = canvas.style.width;\n var height = canvas.style.height;\n canvas.style.width = (parseInt(width) + 1) + 'px';\n canvas.style.height = (parseInt(height)) + 'px';\n setTimeout(function() {\n canvas.style.width = width;\n canvas.style.height = height;\n }, 100);\n }\n\n // Debug only.\n window.Util = Util;\n window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n results = regex.exec(location.search);\n return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n var piOver180 = Math.PI / 180.0;\n var rad45 = Math.PI * 0.25;\n\n // Borrowed from glMatrix.\n function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\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 function mat4_fromRotationTranslation(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 function mat4_translate(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 function mat4_invert(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 var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n var defaultPosition = new Float32Array([0, 0, 0]);\n\n function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n var orientation = pose.orientation || defaultOrientation;\n var position = pose.position || defaultPosition;\n\n mat4_fromRotationTranslation(view, orientation, position);\n if (parameters)\n mat4_translate(view, view, parameters.offset);\n mat4_invert(view, view);\n }\n\n return function(frameData, pose, vrDisplay) {\n if (!frameData || !pose)\n return false;\n\n frameData.pose = pose;\n frameData.timestamp = pose.timestamp;\n\n updateEyeMatrices(\n frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n updateEyeMatrices(\n frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n return true;\n };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n var isFramed = (window.self !== window.top);\n var refDomain = Util.getDomainFromUrl(document.referrer);\n var thisDomain = Util.getDomainFromUrl(window.location.href);\n\n return isFramed && (refDomain !== thisDomain);\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n var domain;\n // Find & remove protocol (http, ftp, etc.) and get domain.\n if (url.indexOf(\"://\") > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n domain = domain.split(':')[0];\n\n return domain;\n}\n\nmodule.exports = Util;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/util.js\n// module id = 5\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n/* eslint-disable no-new-func */\n/* eslint-disable no-nested-ternary */\nvar win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\n/* eslint-enable no-nested-ternary */\n/* eslint-enable no-new-func */\n\nwin.Float32Array = typeof win.Float32Array !== \"undefined\" ? win.Float32Array : win.Array;\n\nexports.window = win;\nvar document = exports.document = win.document;\nvar Float32Array = exports.Float32Array = win.Float32Array;\nvar getComputedStyle = exports.getComputedStyle = win.getComputedStyle;\nvar SUPPORT_TOUCH = exports.SUPPORT_TOUCH = \"ontouchstart\" in win;\nvar SUPPORT_DEVICEMOTION = exports.SUPPORT_DEVICEMOTION = \"ondevicemotion\" in win;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/browser.js\n// module id = 6\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar CONTROL_MODE_VR = 1;\nvar CONTROL_MODE_YAWPITCH = 2;\n\nvar TOUCH_DIRECTION_NONE = 1;\nvar TOUCH_DIRECTION_YAW = 2;\nvar TOUCH_DIRECTION_PITCH = 4;\nvar TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_YAW | TOUCH_DIRECTION_PITCH;\n\n/* Const for MovableCoord */\nvar MC_DECELERATION = 0.0014;\nvar MC_MAXIMUM_DURATION = 1000;\nvar MC_BIND_SCALE = [0.20, 0.20];\n\nvar MIN_FIELD_OF_VIEW = 20;\nvar MAX_FIELD_OF_VIEW = 110;\nvar PAN_SCALE = 320;\n\n// const DELTA_THRESHOLD = 0.015;\n// const DELTA_THRESHOLD = 0.09; // Note4\n// const DELTA_THRESHOLD = 0.0825;\n// const DELTA_THRESHOLD = 0.075;\n// const DELTA_THRESHOLD = 0.06;\n// const DELTA_THRESHOLD = 0.045;\nvar DELTA_THRESHOLD = 0.0375; // Note2\n\nvar YAW_RANGE_HALF = 180;\nvar PITCH_RANGE_HALF = 90;\nvar PINCH_EVENTS = \"pinchstart pinchmove pinchend\";\n\nvar KEYMAP = {\n\tLEFT_ARROW: 37,\n\tA: 65,\n\tUP_ARROW: 38,\n\tW: 87,\n\tRIGHT_ARROW: 39,\n\tD: 68,\n\tDOWN_ARROW: 40,\n\tS: 83\n};\n\nvar GYRO_MODE = {\n\tNONE: \"none\",\n\tYAWPITCH: \"yawPitch\"\n};\n\nexports.GYRO_MODE = GYRO_MODE;\nexports.CONTROL_MODE_VR = CONTROL_MODE_VR;\nexports.CONTROL_MODE_YAWPITCH = CONTROL_MODE_YAWPITCH;\nexports.TOUCH_DIRECTION_NONE = TOUCH_DIRECTION_NONE;\nexports.TOUCH_DIRECTION_YAW = TOUCH_DIRECTION_YAW;\nexports.TOUCH_DIRECTION_PITCH = TOUCH_DIRECTION_PITCH;\nexports.TOUCH_DIRECTION_ALL = TOUCH_DIRECTION_ALL;\nexports.MC_DECELERATION = MC_DECELERATION;\nexports.MC_MAXIMUM_DURATION = MC_MAXIMUM_DURATION;\nexports.MC_BIND_SCALE = MC_BIND_SCALE;\nexports.MIN_FIELD_OF_VIEW = MIN_FIELD_OF_VIEW;\nexports.MAX_FIELD_OF_VIEW = MAX_FIELD_OF_VIEW;\nexports.PAN_SCALE = PAN_SCALE;\nexports.DELTA_THRESHOLD = DELTA_THRESHOLD;\nexports.YAW_RANGE_HALF = YAW_RANGE_HALF;\nexports.PITCH_RANGE_HALF = PITCH_RANGE_HALF;\nexports.PINCH_EVENTS = PINCH_EVENTS;\nexports.KEYMAP = KEYMAP;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/consts.js\n// module id = 7\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/axes project is licensed under the MIT license\r\n * \r\n * @egjs/axes JavaScript library\r\n * https://github.com/naver/egjs-axes\r\n * \r\n * @version 2.3.3\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"hammerjs\", \"@egjs/component\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Axes\"] = factory(require(\"hammerjs\"), require(\"@egjs/component\"));\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"Axes\"] = factory(root[\"Hammer\"], root[\"eg\"][\"Component\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nfunction toArray(nodes) {\r\n // const el = Array.prototype.slice.call(nodes);\r\n // for IE8\r\n var el = [];\r\n for (var i = 0, len = nodes.length; i < len; i++) {\r\n el.push(nodes[i]);\r\n }\r\n return el;\r\n}\r\nexports.toArray = toArray;\r\nfunction $(param, multi) {\r\n if (multi === void 0) { multi = false; }\r\n var el;\r\n if (typeof param === \"string\") {\r\n // check if string is HTML tag format\r\n var match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\r\n // creating element\r\n if (match) {\r\n var dummy = document.createElement(\"div\");\r\n dummy.innerHTML = param;\r\n el = toArray(dummy.childNodes);\r\n }\r\n else {\r\n el = toArray(document.querySelectorAll(param));\r\n }\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n else if (param === window) {\r\n el = param;\r\n }\r\n else if (param.nodeName &&\r\n (param.nodeType === 1 || param.nodeType === 9)) {\r\n el = param;\r\n }\r\n else if ((\"jQuery\" in window && param instanceof jQuery) ||\r\n param.constructor.prototype.jquery) {\r\n el = multi ? param.toArray() : param.get(0);\r\n }\r\n else if (Array.isArray(param)) {\r\n el = param.map(function (v) { return $(v); });\r\n if (!multi) {\r\n el = el.length >= 1 ? el[0] : undefined;\r\n }\r\n }\r\n return el;\r\n}\r\nexports.$ = $;\r\nvar raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame;\r\nvar caf = window.cancelAnimationFrame || window.webkitCancelAnimationFrame;\r\nif (raf && !caf) {\r\n var keyInfo_1 = {};\r\n var oldraf_1 = raf;\r\n raf = function (callback) {\r\n function wrapCallback(timestamp) {\r\n if (keyInfo_1[key]) {\r\n callback(timestamp);\r\n }\r\n }\r\n var key = oldraf_1(wrapCallback);\r\n keyInfo_1[key] = true;\r\n return key;\r\n };\r\n caf = function (key) {\r\n delete keyInfo_1[key];\r\n };\r\n}\r\nelse if (!(raf && caf)) {\r\n raf = function (callback) {\r\n return window.setTimeout(function () {\r\n callback(window.performance && window.performance.now && window.performance.now() || new Date().getTime());\r\n }, 16);\r\n };\r\n caf = window.clearTimeout;\r\n}\r\n/**\r\n * A polyfill for the window.requestAnimationFrame() method.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame\r\n * @private\r\n */\r\nfunction requestAnimationFrame(fp) {\r\n return raf(fp);\r\n}\r\nexports.requestAnimationFrame = requestAnimationFrame;\r\n;\r\n/**\r\n* A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method.\r\n* @param {Number} key −\tThe ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값\r\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame\r\n* @private\r\n*/\r\nfunction cancelAnimationFrame(key) {\r\n caf(key);\r\n}\r\nexports.cancelAnimationFrame = cancelAnimationFrame;\r\n;\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nexports.SUPPORT_TOUCH = \"ontouchstart\" in window;\r\nexports.UNIQUEKEY = \"_EGJS_AXES_INPUTTYPE_\";\r\nfunction toAxis(source, offset) {\r\n return offset.reduce(function (acc, v, i) {\r\n if (source[i]) {\r\n acc[source[i]] = v;\r\n }\r\n return acc;\r\n }, {});\r\n}\r\nexports.toAxis = toAxis;\r\n;\r\nfunction createHammer(element, options) {\r\n try {\r\n // create Hammer\r\n return new Hammer.Manager(element, __assign({}, options));\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\nexports.createHammer = createHammer;\r\n;\r\nfunction convertInputType(inputType) {\r\n if (inputType === void 0) { inputType = []; }\r\n var hasTouch = false;\r\n var hasMouse = false;\r\n inputType.forEach(function (v) {\r\n switch (v) {\r\n case \"mouse\":\r\n hasMouse = true;\r\n break;\r\n case \"touch\": hasTouch = exports.SUPPORT_TOUCH;\r\n }\r\n });\r\n return (hasTouch && Hammer.TouchInput) ||\r\n (hasMouse && Hammer.MouseInput) || null;\r\n}\r\nexports.convertInputType = convertInputType;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar Coordinate = {\r\n getInsidePosition: function (destPos, range, circular, bounce) {\r\n var toDestPos = destPos;\r\n var targetRange = [\r\n circular[0] ? range[0] : (bounce ? range[0] - bounce[0] : range[0]),\r\n circular[1] ? range[1] : (bounce ? range[1] + bounce[1] : range[1])\r\n ];\r\n toDestPos = Math.max(targetRange[0], toDestPos);\r\n toDestPos = Math.min(targetRange[1], toDestPos);\r\n return +toDestPos.toFixed(5);\r\n },\r\n // determine outside\r\n isOutside: function (pos, range) {\r\n return pos < range[0] || pos > range[1];\r\n },\r\n getDuration: function (distance, deceleration) {\r\n var duration = Math.sqrt(distance / deceleration * 2);\r\n // when duration is under 100, then value is zero\r\n return duration < 100 ? 0 : duration;\r\n },\r\n isCircularable: function (destPos, range, circular) {\r\n return (circular[1] && destPos > range[1]) ||\r\n (circular[0] && destPos < range[0]);\r\n },\r\n getCirculatedPos: function (pos, range, circular) {\r\n var toPos = pos;\r\n var min = range[0];\r\n var max = range[1];\r\n var length = max - min;\r\n if (circular[1] && pos > max) {\r\n toPos = (toPos - max) % length + min;\r\n }\r\n if (circular[0] && pos < min) {\r\n toPos = (toPos - min) % length + max;\r\n }\r\n return +toPos.toFixed(5);\r\n }\r\n};\r\nexports[\"default\"] = Coordinate;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\n;\r\nvar AxisManager = /** @class */ (function () {\r\n function AxisManager(axis, options) {\r\n var _this = this;\r\n this.axis = axis;\r\n this.options = options;\r\n this._complementOptions();\r\n this._pos = Object.keys(this.axis).reduce(function (acc, v) {\r\n acc[v] = _this.axis[v].range[0];\r\n return acc;\r\n }, {});\r\n }\r\n AxisManager.equal = function (target, base) {\r\n for (var k in target) {\r\n if (target[k] !== base[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * set up 'css' expression\r\n * @private\r\n */\r\n AxisManager.prototype._complementOptions = function () {\r\n var _this = this;\r\n Object.keys(this.axis).forEach(function (axis) {\r\n _this.axis[axis] = __assign({\r\n range: [0, 100],\r\n bounce: [0, 0],\r\n circular: [false, false]\r\n }, _this.axis[axis]);\r\n [\"bounce\", \"circular\"].forEach(function (v) {\r\n var axisOption = _this.axis;\r\n var key = axisOption[axis][v];\r\n if (/string|number|boolean/.test(typeof key)) {\r\n axisOption[axis][v] = [key, key];\r\n }\r\n });\r\n });\r\n };\r\n AxisManager.prototype.getDelta = function (depaPos, destPos) {\r\n var fullDepaPos = this.get(depaPos);\r\n return this.map(this.get(destPos), function (v, k) { return v - fullDepaPos[k]; });\r\n };\r\n AxisManager.prototype.get = function (axes) {\r\n var _this = this;\r\n if (axes && Array.isArray(axes)) {\r\n return axes.reduce(function (acc, v) {\r\n if (v && (v in _this._pos)) {\r\n acc[v] = _this._pos[v];\r\n }\r\n return acc;\r\n }, {});\r\n }\r\n else {\r\n return __assign({}, this._pos, (axes || {}));\r\n }\r\n };\r\n AxisManager.prototype.moveTo = function (pos) {\r\n var _this = this;\r\n var delta = this.map(this._pos, function (v, key) {\r\n return pos[key] ? pos[key] - _this._pos[key] : 0;\r\n });\r\n this.set(pos);\r\n return {\r\n pos: __assign({}, this._pos),\r\n delta: delta\r\n };\r\n };\r\n AxisManager.prototype.set = function (pos) {\r\n for (var k in pos) {\r\n if (k && (k in this._pos)) {\r\n this._pos[k] = pos[k];\r\n }\r\n }\r\n };\r\n AxisManager.prototype.every = function (pos, callback) {\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n if (!callback(pos[k], k, axisOptions[k])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n AxisManager.prototype.filter = function (pos, callback) {\r\n var filtered = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n callback(pos[k], k, axisOptions[k]) && (filtered[k] = pos[k]);\r\n }\r\n }\r\n return filtered;\r\n };\r\n AxisManager.prototype.map = function (pos, callback) {\r\n var tranformed = {};\r\n var axisOptions = this.axis;\r\n for (var k in pos) {\r\n if (k) {\r\n tranformed[k] = callback(pos[k], k, axisOptions[k]);\r\n }\r\n }\r\n return tranformed;\r\n };\r\n AxisManager.prototype.isOutside = function (axes) {\r\n return !this.every(axes ? this.get(axes) : this._pos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); });\r\n };\r\n return AxisManager;\r\n}());\r\nexports.AxisManager = AxisManager;\r\n;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"DIRECTION_NONE\"] = 1] = \"DIRECTION_NONE\";\r\n DIRECTION[DIRECTION[\"DIRECTION_LEFT\"] = 2] = \"DIRECTION_LEFT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_RIGHT\"] = 4] = \"DIRECTION_RIGHT\";\r\n DIRECTION[DIRECTION[\"DIRECTION_HORIZONTAL\"] = 6] = \"DIRECTION_HORIZONTAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_UP\"] = 8] = \"DIRECTION_UP\";\r\n DIRECTION[DIRECTION[\"DIRECTION_DOWN\"] = 16] = \"DIRECTION_DOWN\";\r\n DIRECTION[DIRECTION[\"DIRECTION_VERTICAL\"] = 24] = \"DIRECTION_VERTICAL\";\r\n DIRECTION[DIRECTION[\"DIRECTION_ALL\"] = 30] = \"DIRECTION_ALL\";\r\n})(DIRECTION = exports.DIRECTION || (exports.DIRECTION = {}));\r\nexports.TRANSFORM = (function () {\r\n var bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\r\n var target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\r\n for (var i = 0, len = target.length; i < len; i++) {\r\n if (target[i] in bodyStyle) {\r\n return target[i];\r\n }\r\n }\r\n return \"\";\r\n})();\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar Axes_1 = __webpack_require__(7);\r\nvar PanInput_1 = __webpack_require__(13);\r\nvar PinchInput_1 = __webpack_require__(14);\r\nvar WheelInput_1 = __webpack_require__(15);\r\nvar MoveKeyInput_1 = __webpack_require__(16);\r\nAxes_1[\"default\"].PanInput = PanInput_1.PanInput;\r\nAxes_1[\"default\"].PinchInput = PinchInput_1.PinchInput;\r\nAxes_1[\"default\"].WheelInput = WheelInput_1.WheelInput;\r\nAxes_1[\"default\"].MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\r\nmodule.exports = Axes_1[\"default\"];\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Component = __webpack_require__(8);\r\nvar AnimationManager_1 = __webpack_require__(9);\r\nvar EventManager_1 = __webpack_require__(10);\r\nvar InterruptManager_1 = __webpack_require__(11);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar InputObserver_1 = __webpack_require__(12);\r\nvar const_1 = __webpack_require__(5);\r\n/**\r\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\r\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @property {Number[]} [range] The coordinate of range 좌표 범위\r\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\r\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\r\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\r\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\r\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\r\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\r\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\r\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\r\n**/\r\n/**\r\n * @typedef {Object} AxesOption The option object of the eg.Axes module\r\n * @ko eg.Axes 모듈의 옵션 객체\r\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\r\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\r\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\r\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\r\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
\r\n**/\r\n/**\r\n * @class eg.Axes\r\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\r\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\r\n * @extends eg.Component\r\n *\r\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\r\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\r\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\r\n *\r\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\r\n * @example\r\n *\r\n * // 1. Initialize eg.Axes\r\n * const axes = new eg.Axes({\r\n *\tsomething1: {\r\n *\t\trange: [0, 150],\r\n *\t\tbounce: 50\r\n *\t},\r\n *\tsomething2: {\r\n *\t\trange: [0, 200],\r\n *\t\tbounce: 100\r\n *\t},\r\n *\tsomethingN: {\r\n *\t\trange: [1, 10],\r\n *\t}\r\n * }, {\r\n * deceleration : 0.0024\r\n * });\r\n *\r\n * // 2. attach event handler\r\n * axes.on({\r\n *\t\"hold\" : function(evt) {\r\n *\t},\r\n *\t\"release\" : function(evt) {\r\n *\t},\r\n *\t\"animationStart\" : function(evt) {\r\n *\t},\r\n *\t\"animationEnd\" : function(evt) {\r\n *\t},\r\n *\t\"change\" : function(evt) {\r\n *\t}\r\n * });\r\n *\r\n * // 3. Initialize inputTypes\r\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\r\n *\tscale: [0.5, 1]\r\n * });\r\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\r\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\r\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\r\n *\tscale: 1.5\r\n * });\r\n *\r\n * // 4. Connect eg.Axes and InputTypes\r\n * // [PanInput] When the mouse or touchscreen is down and moved.\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\r\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\r\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\r\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\r\n *\r\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something2\", pinchInputArea);\r\n */\r\nvar Axes = /** @class */ (function (_super) {\r\n __extends(Axes, _super);\r\n function Axes(axis, options, startPos) {\r\n if (axis === void 0) { axis = {}; }\r\n var _this = _super.call(this) || this;\r\n _this.axis = axis;\r\n _this._inputs = [];\r\n _this.options = __assign({\r\n easing: function easeOutCubic(x) {\r\n return 1 - Math.pow(1 - x, 3);\r\n },\r\n interruptable: true,\r\n maximumDuration: Infinity,\r\n minimumDuration: 0,\r\n deceleration: 0.0006\r\n }, options);\r\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\r\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\r\n _this.em = new EventManager_1.EventManager(_this);\r\n _this.am = new AnimationManager_1.AnimationManager(_this);\r\n _this.io = new InputObserver_1.InputObserver(_this);\r\n _this.em.setAnimationManager(_this.am);\r\n startPos && _this.em.triggerChange(startPos);\r\n return _this;\r\n }\r\n /**\r\n * Connect the axis of eg.Axes to the inputType.\r\n * @ko eg.Axes의 축과 inputType을 연결한다\r\n * @method eg.Axes#connect\r\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\r\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\r\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\r\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\r\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\r\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\r\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\r\n */\r\n Axes.prototype.connect = function (axes, inputType) {\r\n var mapped;\r\n if (typeof axes === \"string\") {\r\n mapped = axes.split(\" \");\r\n }\r\n else {\r\n mapped = axes.concat();\r\n }\r\n // check same instance\r\n if (~this._inputs.indexOf(inputType)) {\r\n this.disconnect(inputType);\r\n }\r\n // check same element in hammer type for share\r\n if (\"hammer\" in inputType) {\r\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\r\n if (targets.length) {\r\n inputType.hammer = targets[0].hammer;\r\n }\r\n }\r\n inputType.mapAxes(mapped);\r\n inputType.connect(this.io);\r\n this._inputs.push(inputType);\r\n return this;\r\n };\r\n /**\r\n * Disconnect the axis of eg.Axes from the inputType.\r\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\r\n * @method eg.Axes#disconnect\r\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * }\r\n * });\r\n *\r\n * const input1 = new eg.Axes.PanInput(\"#area1\");\r\n * const input2 = new eg.Axes.PanInput(\"#area2\");\r\n * const input3 = new eg.Axes.PanInput(\"#area3\");\r\n *\r\n * axes.connect(\"x\", input1);\r\n * .connect(\"x xOther\", input2)\r\n * .connect([\"xOther\", \"x\"], input3);\r\n *\r\n * axes.disconnect(input1); // disconnects input1\r\n * axes.disconnect(); // disconnects all of them\r\n */\r\n Axes.prototype.disconnect = function (inputType) {\r\n if (inputType) {\r\n var index = this._inputs.indexOf(inputType);\r\n if (index >= 0) {\r\n this._inputs[index].disconnect();\r\n this._inputs.splice(index, 1);\r\n }\r\n }\r\n else {\r\n this._inputs.forEach(function (v) { return v.disconnect(); });\r\n this._inputs = [];\r\n }\r\n return this;\r\n };\r\n /**\r\n * Returns the current position of the coordinates.\r\n * @ko 좌표의 현재 위치를 반환한다\r\n * @method eg.Axes#get\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Object.} Axis coordinate information 축 좌표 정보\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\r\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\r\n */\r\n Axes.prototype.get = function (axes) {\r\n return this.axm.get(axes);\r\n };\r\n /**\r\n * Moves an axis to specific coordinates.\r\n * @ko 좌표를 이동한다.\r\n * @method eg.Axes#setTo\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setTo({\"x\": 30, \"zoom\": 60});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\r\n */\r\n Axes.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setTo(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Moves an axis from the current coordinates to specific coordinates.\r\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\r\n * @method eg.Axes#setBy\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.setBy({\"x\": 30, \"zoom\": 10});\r\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\r\n *\r\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\r\n *\r\n * // after 1000 ms\r\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\r\n */\r\n Axes.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n this.am.setBy(pos, duration);\r\n return this;\r\n };\r\n /**\r\n * Returns whether there is a coordinate in the bounce area of ​​the target axis.\r\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\r\n * @method eg.Axes#isBounceArea\r\n * @param {Object} [axes] The names of the axis 축 이름들\r\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"xOther\": {\r\n * range: [-100, 100]\r\n * },\r\n * \t \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * });\r\n *\r\n * axes.isBounceArea([\"x\"]);\r\n * axes.isBounceArea([\"x\", \"zoom\"]);\r\n * axes.isBounceArea();\r\n */\r\n Axes.prototype.isBounceArea = function (axes) {\r\n return this.axm.isOutside(axes);\r\n };\r\n /**\r\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\r\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\r\n * @method eg.Axes#destroy\r\n */\r\n Axes.prototype.destroy = function () {\r\n this.disconnect();\r\n this.em.destroy();\r\n };\r\n Axes.VERSION = \"3.0.0-rc\";\r\n /**\r\n * @name eg.Axes.TRANSFORM\r\n * @desc Returns the transform attribute with CSS vendor prefixes.\r\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\r\n *\r\n * @constant\r\n * @type {String}\r\n * @example\r\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\r\n */\r\n Axes.TRANSFORM = const_1.TRANSFORM;\r\n /**\r\n * @name eg.Axes.DIRECTION_NONE\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\r\n /**\r\n * @name eg.Axes.DIRECTION_LEFT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\r\n /**\r\n * @name eg.Axes.DIRECTION_RIGHT\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\r\n /**\r\n * @name eg.Axes.DIRECTION_UP\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\r\n /**\r\n * @name eg.Axes.DIRECTION_DOWN\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\r\n /**\r\n * @name eg.Axes.DIRECTION_HORIZONTAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_VERTICAL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n /**\r\n * @name eg.Axes.DIRECTION_ALL\r\n * @constant\r\n * @type {Number}\r\n */\r\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\r\n return Axes;\r\n}(Component));\r\nexports[\"default\"] = Axes;\r\n;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar utils_1 = __webpack_require__(0);\r\nvar AnimationManager = /** @class */ (function () {\r\n function AnimationManager(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.animationEnd = this.animationEnd.bind(this);\r\n }\r\n AnimationManager.getDuration = function (duration, min, max) {\r\n return Math.max(Math.min(duration, max), min);\r\n };\r\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\r\n var _this = this;\r\n var duration;\r\n if (typeof wishDuration !== \"undefined\") {\r\n duration = wishDuration;\r\n }\r\n else {\r\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\r\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\r\n }\r\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\r\n };\r\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\r\n var depaPos = this.axm.get();\r\n var destPos = pos;\r\n var inputEvent = option && option.event || null;\r\n return {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: inputEvent,\r\n input: option && option.input || null,\r\n isTrusted: !!inputEvent,\r\n done: this.animationEnd\r\n };\r\n };\r\n AnimationManager.prototype.grab = function (axes, option) {\r\n if (this._animateParam && axes.length) {\r\n var orgPos_1 = this.axm.get(axes);\r\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\r\n this.em.triggerChange(pos, option, !!option);\r\n }\r\n this._animateParam = null;\r\n this._raf && utils_1.cancelAnimationFrame(this._raf);\r\n this._raf = null;\r\n this.em.triggerAnimationEnd(!!(option && option.event));\r\n }\r\n };\r\n AnimationManager.prototype.getEventInfo = function () {\r\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\r\n return {\r\n input: this._animateParam.input,\r\n event: this._animateParam.inputEvent\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n AnimationManager.prototype.restore = function (option) {\r\n var pos = this.axm.get();\r\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\r\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\r\n };\r\n AnimationManager.prototype.animationEnd = function () {\r\n var beforeParam = this.getEventInfo();\r\n this._animateParam = null;\r\n // for Circular\r\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\r\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\r\n this.itm.setInterrupt(false);\r\n this.em.triggerAnimationEnd(!!beforeParam);\r\n if (this.axm.isOutside()) {\r\n this.restore(beforeParam);\r\n }\r\n else {\r\n this.em.triggerFinish(!!beforeParam);\r\n }\r\n };\r\n AnimationManager.prototype.animateLoop = function (param, complete) {\r\n this._animateParam = __assign({}, param);\r\n this._animateParam.startTime = new Date().getTime();\r\n if (param.duration) {\r\n var info_1 = this._animateParam;\r\n var self_1 = this;\r\n (function loop() {\r\n self_1._raf = null;\r\n if (self_1.frame(info_1) >= 1) {\r\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\r\n self_1.em.triggerChange(param.destPos);\r\n }\r\n complete();\r\n return;\r\n } // animationEnd\r\n self_1._raf = utils_1.requestAnimationFrame(loop);\r\n })();\r\n }\r\n else {\r\n this.em.triggerChange(param.destPos);\r\n complete();\r\n }\r\n };\r\n AnimationManager.prototype.getUserControll = function (param) {\r\n var userWish = param.setTo();\r\n userWish.destPos = this.axm.get(userWish.destPos);\r\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\r\n return userWish;\r\n };\r\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\r\n var _this = this;\r\n var param = this.createAnimationParam(destPos, duration, option);\r\n var depaPos = __assign({}, param.depaPos);\r\n var retTrigger = this.em.triggerAnimationStart(param);\r\n // to control\r\n var userWish = this.getUserControll(param);\r\n // You can't stop the 'animationStart' event when 'circular' is true.\r\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\r\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\r\n }\r\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\r\n var inputEvent = option && option.event || null;\r\n this.animateLoop({\r\n depaPos: depaPos,\r\n destPos: userWish.destPos,\r\n duration: userWish.duration,\r\n delta: this.axm.getDelta(depaPos, userWish.destPos),\r\n isTrusted: !!inputEvent,\r\n inputEvent: inputEvent,\r\n input: option && option.input || null\r\n }, function () { return _this.animationEnd(); });\r\n }\r\n };\r\n // animation frame (0~1)\r\n AnimationManager.prototype.frame = function (param) {\r\n var curTime = new Date().getTime() - param.startTime;\r\n var easingPer = this.easing(curTime / param.duration);\r\n var toPos = param.depaPos;\r\n toPos = this.axm.map(toPos, function (v, k, opt) {\r\n v += param.delta[k] * easingPer;\r\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n });\r\n this.em.triggerChange(toPos);\r\n return easingPer;\r\n };\r\n AnimationManager.prototype.easing = function (p) {\r\n return p > 1 ? 1 : this.options.easing(p);\r\n };\r\n AnimationManager.prototype.setTo = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n var axes = Object.keys(pos);\r\n this.grab(axes);\r\n var orgPos = this.axm.get(axes);\r\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\r\n return this;\r\n }\r\n this.itm.setInterrupt(true);\r\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\r\n if (!Object.keys(movedPos).length) {\r\n return this;\r\n }\r\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\r\n }\r\n });\r\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\r\n return this;\r\n }\r\n if (duration > 0) {\r\n this.animateTo(movedPos, duration);\r\n }\r\n else {\r\n this.em.triggerChange(movedPos);\r\n this.itm.setInterrupt(false);\r\n }\r\n return this;\r\n };\r\n AnimationManager.prototype.setBy = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\r\n };\r\n return AnimationManager;\r\n}());\r\nexports.AnimationManager = AnimationManager;\r\n;\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(axes) {\r\n this.axes = axes;\r\n }\r\n /**\r\n * This event is fired when a user holds an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\r\n * @name eg.Axes#hold\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos coordinate 좌표 정보\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"hold\", function(event) {\r\n * // event.pos\r\n * // event.input\r\n * // event.inputEvent\r\n * // isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerHold = function (pos, option) {\r\n this.axes.trigger(\"hold\", {\r\n pos: pos,\r\n input: option.input || null,\r\n inputEvent: option.event || null,\r\n isTrusted: true\r\n });\r\n };\r\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\r\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\r\n * @name set\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\r\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\r\n * @name setTo\r\n * @function\r\n * @param {Object.} pos The coordinate to move to 이동할 좌표\r\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationStart\", function(event) {\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n /**\r\n * This event is fired when a user release an element on the screen of the device.\r\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\r\n * @name eg.Axes#release\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'release' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerRelease = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n this.axes.trigger(\"release\", param);\r\n };\r\n /**\r\n * This event is fired when coordinate changes.\r\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\r\n * @name eg.Axes#change\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} pos The coordinate 좌표\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"change\", function(event) {\r\n * // event.pos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.holding\r\n * // event.set\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the coordinates to move after the 'change' event.\r\n * // it works when the holding value of the change event is true.\r\n * event.holding && event.set({x: 10});\r\n * });\r\n */\r\n EventManager.prototype.triggerChange = function (pos, option, holding) {\r\n if (option === void 0) { option = null; }\r\n if (holding === void 0) { holding = false; }\r\n var eventInfo = this.am.getEventInfo();\r\n var moveTo = this.am.axm.moveTo(pos);\r\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\r\n var param = {\r\n pos: moveTo.pos,\r\n delta: moveTo.delta,\r\n holding: holding,\r\n inputEvent: inputEvent,\r\n isTrusted: !!inputEvent,\r\n input: option && option.input || eventInfo && eventInfo.input || null,\r\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\r\n };\r\n this.axes.trigger(\"change\", param);\r\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\r\n };\r\n /**\r\n * This event is fired when animation starts.\r\n * @ko 에니메이션이 시작할 때 발생한다.\r\n * @name eg.Axes#animationStart\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \r\n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\r\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\r\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\r\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\r\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\r\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"release\", function(event) {\r\n * // event.depaPos\r\n * // event.destPos\r\n * // event.delta\r\n * // event.input\r\n * // event.inputEvent\r\n * // event.setTo\r\n * // event.isTrusted\r\n *\r\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\r\n * event.setTo({x: 10}, 2000);\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationStart = function (param) {\r\n param.setTo = this.createUserControll(param.destPos, param.duration);\r\n return this.axes.trigger(\"animationStart\", param);\r\n };\r\n /**\r\n * This event is fired when animation ends.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#animationEnd\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"animationEnd\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"animationEnd\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n /**\r\n * This event is fired when all actions have been completed.\r\n * @ko 에니메이션이 끝났을 때 발생한다.\r\n * @name eg.Axes#finish\r\n * @event\r\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\r\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\r\n *\r\n * @example\r\n * const axes = new eg.Axes({\r\n * \"x\": {\r\n * range: [0, 100]\r\n * },\r\n * \"zoom\": {\r\n * range: [50, 30]\r\n * }\r\n * }).on(\"finish\", function(event) {\r\n * // event.isTrusted\r\n * });\r\n */\r\n EventManager.prototype.triggerFinish = function (isTrusted) {\r\n if (isTrusted === void 0) { isTrusted = false; }\r\n this.axes.trigger(\"finish\", {\r\n isTrusted: isTrusted\r\n });\r\n };\r\n EventManager.prototype.createUserControll = function (pos, duration) {\r\n if (duration === void 0) { duration = 0; }\r\n // to controll\r\n var userControl = {\r\n destPos: __assign({}, pos),\r\n duration: duration\r\n };\r\n return function (toPos, userDuration) {\r\n toPos && (userControl.destPos = __assign({}, toPos));\r\n (userDuration !== undefined) && (userControl.duration = userDuration);\r\n return userControl;\r\n };\r\n };\r\n EventManager.prototype.setAnimationManager = function (am) {\r\n this.am = am;\r\n };\r\n EventManager.prototype.destroy = function () {\r\n this.axes.off();\r\n };\r\n return EventManager;\r\n}());\r\nexports.EventManager = EventManager;\r\n;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nexports.__esModule = true;\r\nvar InterruptManager = /** @class */ (function () {\r\n function InterruptManager(options) {\r\n this.options = options;\r\n this._prevented = false; // check whether the animation event was prevented\r\n }\r\n InterruptManager.prototype.isInterrupting = function () {\r\n // when interruptable is 'true', return value is always 'true'.\r\n return this.options.interruptable || this._prevented;\r\n };\r\n InterruptManager.prototype.isInterrupted = function () {\r\n return !this.options.interruptable && this._prevented;\r\n };\r\n InterruptManager.prototype.setInterrupt = function (prevented) {\r\n !this.options.interruptable && (this._prevented = prevented);\r\n };\r\n return InterruptManager;\r\n}());\r\nexports.InterruptManager = InterruptManager;\r\n;\r\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar AxisManager_1 = __webpack_require__(3);\r\nvar Coordinate_1 = __webpack_require__(2);\r\nvar InputObserver = /** @class */ (function () {\r\n function InputObserver(_a) {\r\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\r\n this.isOutside = false;\r\n this.moveDistance = null;\r\n this.options = options;\r\n this.itm = itm;\r\n this.em = em;\r\n this.axm = axm;\r\n this.am = am;\r\n }\r\n // when move pointer is held in outside\r\n InputObserver.prototype.atOutside = function (pos) {\r\n var _this = this;\r\n if (this.isOutside) {\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var tn = opt.range[0] - opt.bounce[0];\r\n var tx = opt.range[1] + opt.bounce[1];\r\n return v > tx ? tx : (v < tn ? tn : v);\r\n });\r\n }\r\n else {\r\n // when start pointer is held in inside\r\n // get a initialization slope value to prevent smooth animation.\r\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\r\n return this.axm.map(pos, function (v, k, opt) {\r\n var min = opt.range[0];\r\n var max = opt.range[1];\r\n var out = opt.bounce;\r\n if (v < min) {\r\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\r\n }\r\n else if (v > max) {\r\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\r\n }\r\n return v;\r\n });\r\n }\r\n };\r\n InputObserver.prototype.get = function (input) {\r\n return this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.hold = function (input, event) {\r\n if (this.itm.isInterrupted() || !input.axes.length) {\r\n return;\r\n }\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n this.itm.setInterrupt(true);\r\n this.am.grab(input.axes, changeOption);\r\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\r\n this.isOutside = this.axm.isOutside(input.axes);\r\n this.moveDistance = this.axm.get(input.axes);\r\n };\r\n InputObserver.prototype.change = function (input, event, offset) {\r\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\r\n return;\r\n }\r\n var depaPos = this.axm.get(input.axes);\r\n var destPos;\r\n // for outside logic\r\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\r\n this.moveDistance && (this.moveDistance = destPos);\r\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\r\n // from outside to inside\r\n if (this.isOutside &&\r\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\r\n this.isOutside = false;\r\n }\r\n destPos = this.atOutside(destPos);\r\n this.em.triggerChange(destPos, {\r\n input: input,\r\n event: event\r\n }, true);\r\n };\r\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\r\n if (!this.itm.isInterrupting()) {\r\n return;\r\n }\r\n if (!this.moveDistance) {\r\n return;\r\n }\r\n var pos = this.axm.get(input.axes);\r\n var depaPos = this.axm.get();\r\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\r\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\r\n return pos[k] + v;\r\n }\r\n else {\r\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\r\n }\r\n }));\r\n var duration = this.am.getDuration(destPos, pos, inputDuration);\r\n if (duration === 0) {\r\n destPos = __assign({}, depaPos);\r\n }\r\n // prepare params\r\n var param = {\r\n depaPos: depaPos,\r\n destPos: destPos,\r\n duration: duration,\r\n delta: this.axm.getDelta(depaPos, destPos),\r\n inputEvent: event,\r\n input: input,\r\n isTrusted: true\r\n };\r\n this.em.triggerRelease(param);\r\n this.moveDistance = null;\r\n // to contol\r\n var userWish = this.am.getUserControll(param);\r\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\r\n var changeOption = {\r\n input: input,\r\n event: event\r\n };\r\n if (isEqual || userWish.duration === 0) {\r\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\r\n this.itm.setInterrupt(false);\r\n if (this.axm.isOutside()) {\r\n this.am.restore(changeOption);\r\n }\r\n else {\r\n this.em.triggerFinish(true);\r\n }\r\n }\r\n else {\r\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\r\n }\r\n };\r\n return InputObserver;\r\n}());\r\nexports.InputObserver = InputObserver;\r\n;\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar const_1 = __webpack_require__(5);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\r\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\r\n * @property {String[]} [inputType=[\"touch\",\"mouse\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
\r\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\r\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\r\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\r\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PanInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\r\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\r\n *\r\n * @example\r\n * const pan = new eg.Axes.PanInput(\"#area\", {\r\n * \t\tinputType: [\"touch\"],\r\n * \t\tscale: [1, 1.3],\r\n * });\r\n *\r\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\r\n *\r\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\r\n *\r\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\r\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\r\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\r\n */\r\nvar PanInput = /** @class */ (function () {\r\n function PanInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n inputType: [\"touch\", \"mouse\"],\r\n scale: [1, 1],\r\n thresholdAngle: 45,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onHammerInput = this.onHammerInput.bind(this);\r\n this.onPanmove = this.onPanmove.bind(this);\r\n this.onPanend = this.onPanend.bind(this);\r\n }\r\n // get user's direction\r\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\r\n if (thresholdAngle < 0 || thresholdAngle > 90) {\r\n return const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n var toAngle = Math.abs(angle);\r\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\r\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n };\r\n PanInput.getNextOffset = function (speeds, deceleration) {\r\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\r\n var duration = Math.abs(normalSpeed / -deceleration);\r\n return [\r\n speeds[0] / 2 * duration,\r\n speeds[1] / 2 * duration\r\n ];\r\n };\r\n PanInput.useDirection = function (checkType, direction, userDirection) {\r\n if (userDirection) {\r\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\r\n ((direction & checkType) && (userDirection & checkType)));\r\n }\r\n else {\r\n return !!(direction & checkType);\r\n }\r\n };\r\n PanInput.prototype.mapAxes = function (axes) {\r\n var useHorizontal = !!axes[0];\r\n var useVertical = !!axes[1];\r\n if (useHorizontal && useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\r\n }\r\n else if (useHorizontal) {\r\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\r\n }\r\n else if (useVertical) {\r\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\r\n }\r\n else {\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n }\r\n this.axes = axes;\r\n };\r\n PanInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n direction: this._direction,\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PanRecognizer.\r\n this.hammer.add(new Hammer.Pan(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer && this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n var inputClass = InputType_1.convertInputType(this.options.inputType);\r\n if (!inputClass) {\r\n throw new Error(\"Wrong inputType parameter!\");\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pan, hammerOption],\r\n ],\r\n inputClass: inputClass\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PanInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PanInput#destroy\r\n */\r\n PanInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PanInput#enable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PanInput#disable\r\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PanInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PanInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PanInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\r\n };\r\n PanInput.prototype.onHammerInput = function (event) {\r\n if (this.isEnable()) {\r\n if (event.isFirst) {\r\n this.observer.hold(this, event);\r\n }\r\n else if (event.isFinal) {\r\n this.onPanend(event);\r\n }\r\n }\r\n };\r\n PanInput.prototype.onPanmove = function (event) {\r\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\r\n // not support offset properties in Hammerjs - start\r\n var prevInput = this.hammer.session.prevInput;\r\n /* eslint-disable no-param-reassign */\r\n if (prevInput) {\r\n event.offsetX = event.deltaX - prevInput.deltaX;\r\n event.offsetY = event.deltaY - prevInput.deltaY;\r\n }\r\n else {\r\n event.offsetX = 0;\r\n event.offsetY = 0;\r\n }\r\n var offset = this.getOffset([event.offsetX, event.offsetY], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\r\n ]);\r\n var prevent = offset.some(function (v) { return v !== 0; });\r\n if (prevent) {\r\n event.srcEvent.preventDefault();\r\n event.srcEvent.stopPropagation();\r\n }\r\n event.preventSystemEvent = prevent;\r\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.onPanend = function (event) {\r\n var offset = this.getOffset([\r\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\r\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\r\n ], [\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\r\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\r\n ]);\r\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\r\n };\r\n PanInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"hammer.input\", this.onHammerInput)\r\n .on(\"panstart panmove\", this.onPanmove);\r\n };\r\n PanInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"hammer.input\", this.onHammerInput)\r\n .off(\"panstart panmove\", this.onPanmove);\r\n this.observer = null;\r\n };\r\n PanInput.prototype.getOffset = function (properties, useDirection) {\r\n var offset = [0, 0];\r\n var scale = this.options.scale;\r\n if (useDirection[0]) {\r\n offset[0] = (properties[0] * scale[0]);\r\n }\r\n if (useDirection[1]) {\r\n offset[1] = (properties[1] * scale[1]);\r\n }\r\n return offset;\r\n };\r\n return PanInput;\r\n}());\r\nexports.PanInput = PanInput;\r\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar Hammer = __webpack_require__(4);\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\r\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\r\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\r\n**/\r\n/**\r\n * @class eg.Axes.PinchInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\r\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n * @example\r\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\r\n * axes.connect(\"something\", pinch);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\r\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\r\n */\r\nvar PinchInput = /** @class */ (function () {\r\n function PinchInput(el, options) {\r\n this.axes = [];\r\n this.hammer = null;\r\n this.element = null;\r\n this._base = null;\r\n this._prev = null;\r\n /**\r\n * Hammer helps you add support for touch gestures to your page\r\n *\r\n * @external Hammer\r\n * @see {@link http://hammerjs.github.io|Hammer.JS}\r\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\r\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\r\n */\r\n if (typeof Hammer === \"undefined\") {\r\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\r\n }\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1,\r\n threshold: 0,\r\n hammerManagerOptions: {\r\n // css properties were removed due to usablility issue\r\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\r\n cssProps: {\r\n userSelect: \"none\",\r\n touchSelect: \"none\",\r\n touchCallout: \"none\",\r\n userDrag: \"none\"\r\n }\r\n }\r\n }, options);\r\n this.onPinchStart = this.onPinchStart.bind(this);\r\n this.onPinchMove = this.onPinchMove.bind(this);\r\n this.onPinchEnd = this.onPinchEnd.bind(this);\r\n }\r\n PinchInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n PinchInput.prototype.connect = function (observer) {\r\n var hammerOption = {\r\n threshold: this.options.threshold\r\n };\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n // hammer remove previous PinchRecognizer.\r\n this.hammer.add(new Hammer.Pinch(hammerOption));\r\n }\r\n else {\r\n var keyValue = this.element[InputType_1.UNIQUEKEY];\r\n if (keyValue) {\r\n this.hammer.destroy();\r\n }\r\n else {\r\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\r\n }\r\n this.hammer = InputType_1.createHammer(this.element, __assign({\r\n recognizers: [\r\n [Hammer.Pinch, hammerOption],\r\n ],\r\n inputClass: Hammer.TouchInput\r\n }, this.options.hammerManagerOptions));\r\n this.element[InputType_1.UNIQUEKEY] = keyValue;\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n PinchInput.prototype.disconnect = function () {\r\n if (this.hammer) {\r\n this.dettachEvent();\r\n }\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.PinchInput#destroy\r\n */\r\n PinchInput.prototype.destroy = function () {\r\n this.disconnect();\r\n if (this.hammer) {\r\n this.hammer.destroy();\r\n }\r\n delete this.element[InputType_1.UNIQUEKEY];\r\n this.element = null;\r\n this.hammer = null;\r\n };\r\n PinchInput.prototype.onPinchStart = function (event) {\r\n this._base = this.observer.get(this)[this.axes[0]];\r\n var offset = this.getOffset(event.scale);\r\n this.observer.hold(this, event);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchMove = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this._prev = event.scale;\r\n };\r\n PinchInput.prototype.onPinchEnd = function (event) {\r\n var offset = this.getOffset(event.scale, this._prev);\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\r\n this._base = null;\r\n this._prev = null;\r\n };\r\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\r\n if (prev === void 0) { prev = 1; }\r\n return this._base * (pinchScale - prev) * this.options.scale;\r\n };\r\n PinchInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.hammer.on(\"pinchstart\", this.onPinchStart)\r\n .on(\"pinchmove\", this.onPinchMove)\r\n .on(\"pinchend\", this.onPinchEnd);\r\n };\r\n PinchInput.prototype.dettachEvent = function () {\r\n this.hammer.off(\"pinchstart\", this.onPinchStart)\r\n .off(\"pinchmove\", this.onPinchMove)\r\n .off(\"pinchend\", this.onPinchEnd);\r\n this.observer = null;\r\n this._prev = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.PinchInput#enable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.enable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.PinchInput#disable\r\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n PinchInput.prototype.disable = function () {\r\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.PinchInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n PinchInput.prototype.isEnable = function () {\r\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\r\n };\r\n return PinchInput;\r\n}());\r\nexports.PinchInput = PinchInput;\r\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\n/**\r\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\r\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\r\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.WheelInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\r\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\r\n * \t\tscale: 1\r\n * });\r\n *\r\n * // Connect 'something' axis when the mousewheel is moved.\r\n * axes.connect(\"something\", wheel);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\r\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\r\n */\r\nvar WheelInput = /** @class */ (function () {\r\n function WheelInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this._timer = null;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: 1\r\n }, options);\r\n this.onWheel = this.onWheel.bind(this);\r\n }\r\n WheelInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n WheelInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n WheelInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.WheelInput#destroy\r\n */\r\n WheelInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n WheelInput.prototype.onWheel = function (event) {\r\n var _this = this;\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n if (event.deltaY === 0) {\r\n return;\r\n }\r\n if (!this._isHolded) {\r\n this.observer.hold(this, event);\r\n this._isHolded = true;\r\n }\r\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale;\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(function () {\r\n if (_this._isHolded) {\r\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\r\n _this._isHolded = false;\r\n }\r\n }, 50);\r\n };\r\n WheelInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = true;\r\n };\r\n WheelInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"wheel\", this.onWheel);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.WheelInput#enable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.WheelInput#disable\r\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n WheelInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.WheelInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n WheelInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return WheelInput;\r\n}());\r\nexports.WheelInput = WheelInput;\r\n;\r\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nexports.__esModule = true;\r\nvar utils_1 = __webpack_require__(0);\r\nvar InputType_1 = __webpack_require__(1);\r\nexports.KEYMAP = {\r\n LEFT_ARROW: 37,\r\n A: 65,\r\n UP_ARROW: 38,\r\n W: 87,\r\n RIGHT_ARROW: 39,\r\n D: 68,\r\n DOWN_ARROW: 40,\r\n S: 83\r\n};\r\n/**\r\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\r\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\r\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\r\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\r\n**/\r\n/**\r\n * @class eg.Axes.MoveKeyInput\r\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\r\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\r\n *\r\n * @example\r\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\r\n * \t\tscale: [1, 1]\r\n * });\r\n *\r\n * // Connect 'x', 'y' axes when the moveKey is pressed.\r\n * axes.connect([\"x\", \"y\"], moveKey);\r\n *\r\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\r\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\r\n */\r\nvar MoveKeyInput = /** @class */ (function () {\r\n function MoveKeyInput(el, options) {\r\n this.axes = [];\r\n this.element = null;\r\n this._isEnabled = false;\r\n this._isHolded = false;\r\n this.element = utils_1.$(el);\r\n this.options = __assign({\r\n scale: [1, 1]\r\n }, options);\r\n this.onKeydown = this.onKeydown.bind(this);\r\n }\r\n MoveKeyInput.prototype.mapAxes = function (axes) {\r\n this.axes = axes;\r\n };\r\n MoveKeyInput.prototype.connect = function (observer) {\r\n this.dettachEvent();\r\n // add tabindex=\"0\" to the container for making it focusable\r\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\r\n this.element.setAttribute(\"tabindex\", \"0\");\r\n }\r\n this.attachEvent(observer);\r\n return this;\r\n };\r\n MoveKeyInput.prototype.disconnect = function () {\r\n this.dettachEvent();\r\n return this;\r\n };\r\n /**\r\n * Destroys elements, properties, and events used in a module.\r\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\r\n * @method eg.Axes.MoveKeyInput#destroy\r\n */\r\n MoveKeyInput.prototype.destroy = function () {\r\n this.disconnect();\r\n this.element = null;\r\n };\r\n MoveKeyInput.prototype.onKeydown = function (event) {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n var isMoveKey = true;\r\n var offsets;\r\n var e = event;\r\n switch (e.keyCode) {\r\n case exports.KEYMAP.LEFT_ARROW:\r\n case exports.KEYMAP.A:\r\n offsets = [-this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.RIGHT_ARROW:\r\n case exports.KEYMAP.D:\r\n offsets = [this.options.scale[0], 0];\r\n break;\r\n case exports.KEYMAP.UP_ARROW:\r\n case exports.KEYMAP.W:\r\n offsets = [0, this.options.scale[1]];\r\n break;\r\n case exports.KEYMAP.DOWN_ARROW:\r\n case exports.KEYMAP.S:\r\n offsets = [0, -this.options.scale[1]];\r\n break;\r\n default:\r\n isMoveKey = false;\r\n }\r\n if (isMoveKey) {\r\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\r\n // Suppress \"double action\" if event handled\r\n e.preventDefault();\r\n }\r\n };\r\n MoveKeyInput.prototype.attachEvent = function (observer) {\r\n this.observer = observer;\r\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = true;\r\n };\r\n MoveKeyInput.prototype.dettachEvent = function () {\r\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\r\n this._isEnabled = false;\r\n this.observer = null;\r\n };\r\n /**\r\n * Enables input devices\r\n * @ko 입력 장치를 사용할 수 있게 한다\r\n * @method eg.Axes.MoveKeyInput#enable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.enable = function () {\r\n this._isEnabled = true;\r\n return this;\r\n };\r\n /**\r\n * Disables input devices\r\n * @ko 입력 장치를 사용할 수 없게 한다.\r\n * @method eg.Axes.MoveKeyInput#disable\r\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\r\n */\r\n MoveKeyInput.prototype.disable = function () {\r\n this._isEnabled = false;\r\n return this;\r\n };\r\n /**\r\n * Returns whether to use an input device\r\n * @ko 입력 장치를 사용 여부를 반환한다.\r\n * @method eg.Axes.MoveKeyInput#isEnable\r\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\r\n */\r\n MoveKeyInput.prototype.isEnable = function () {\r\n return this._isEnabled;\r\n };\r\n return MoveKeyInput;\r\n}());\r\nexports.MoveKeyInput = MoveKeyInput;\r\n;\r\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=axes.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/axes/dist/axes.js\n// module id = 8\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\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 eg.view360.SpriteImage\n * @classdesc A module that displays a single or continuous image of any one of the \"sprite images\". SpinViewer internally uses SpriteImage to show each frame of the sprite image.\n * @ko 스프라이트 이미지 중 임의의 한 프레임을 단발성 혹은 연속적으로 보여주는 컴포넌트입니다. SpinViewer 는 내부적으로 SpriteImage 를 사용하여 스프라이트 이미지의 각 프레임을 보여줍니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.frameIndex=0] frameIndex specifies the index of the frame to be displayed in the \"Sprite image\". The frameIndex order is zero-based and indexed in Z form (left-to-right, top-to-bottom, and newline again from left to right).
- colRow is equivalent to frameIndex. However, if colRow is specified at the same time, colRow takes precedence.스프라이트 이미지 중에서 보여질 프레임의 인덱스를 지정합니다. frameIndex 순서는 0부터 시작하며 Z 형태(왼쪽에서 오른쪽, 위에서 아래, 개행 시 다시 왼쪽 부터)로 인덱싱합니다.
- colRow 는 frameIndex 와 동일한 기능을 합니다. 단, colRow 가 동시에 지정된 경우 colRow 가 우선합니다.
\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpriteImage\n *\n * var el = document.getElementById(\"image-div\");\n * var sprites = new eg.view360.SpriteImage(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24\n * });\n */\nvar SpriteImage = function (_Component) {\n\t_inherits(SpriteImage, _Component);\n\n\tfunction SpriteImage(element, options) {\n\t\t_classCallCheck(this, SpriteImage);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = options || {};\n\n\t\t_this._el = element;\n\t\t_this._rowCount = opt.rowCount || 1;\n\t\t_this._colCount = opt.colCount || 1;\n\t\t_this._totalCount = _this._rowCount * _this._colCount; // total frames\n\t\t_this._width = opt.width || \"auto\";\n\t\t_this._height = opt.height || \"auto\";\n\t\t_this._autoHeight = opt.autoHeight != null ? opt.autoHeight : \"true\"; // If autoHeight is specified, _height will be overwritten.\n\t\t_this._colRow = [0, 0];\n\n\t\tif (opt.colRow) {\n\t\t\t_this._colRow = opt.colRow;\n\t\t} else if (opt.frameIndex) {\n\t\t\t_this.setFrameIndex(opt.frameIndex);\n\t\t}\n\n\t\t_this._el.style.width = SpriteImage._getSizeString(_this._width);\n\t\t_this._el.style.height = SpriteImage._getSizeString(_this._height);\n\n\t\tif (!opt.imageUrl) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: opt.imageUrl\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _possibleConstructorReturn(_this);\n\t\t}\n\n\t\t_this._image = new Image();\n\t\t/**\n * Event\n */\n\t\t_this._image.onload = function () {\n\t\t\t_this._bg = SpriteImage._createBgDiv(_this._image, _this._rowCount, _this._colCount, _this._autoHeight);\n\t\t\t_this._el.appendChild(_this._bg);\n\t\t\t_this.setColRow(_this._colRow[0], _this._colRow[1]);\n\n\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpriteImage#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * sprites.on({\n *\t\"load\" : function(evt) {\n *\t\tconsole.log(\"load event fired - e.target\", e.target, \"e.bgElement\", e.bgElement);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"load\", {\n\t\t\t\ttarget: _this._el,\n\t\t\t\tbgElement: _this._bg\n\t\t\t});\n\n\t\t\tif (_this._autoPlayReservedInfo) {\n\t\t\t\t_this.play(_this._autoPlayReservedInfo);\n\t\t\t\t_this._autoPlayReservedInfo = null;\n\t\t\t}\n\t\t};\n\n\t\t_this._image.onerror = function (e) {\n\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpriteImage#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * sprites.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\timageUrl: opt.imageUrl\n\t\t\t});\n\t\t};\n\n\t\t_this._image.src = opt.imageUrl;\n\t\treturn _this;\n\t}\n\n\tSpriteImage._createBgDiv = function _createBgDiv(img, rowCount, colCount, autoHeight) {\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.style.backgroundImage = \"url(\" + img.src + \")\";\n\t\tel.style.backgroundSize = colCount * 100 + \"% \" + rowCount * 100 + \"%\";\n\n\t\tvar unitWidth = img.width / colCount;\n\t\tvar unitHeight = img.height / rowCount;\n\n\t\tif (autoHeight) {\n\t\t\tvar r = unitHeight / unitWidth;\n\n\t\t\tel.style.paddingBottom = r * 100 + \"%\";\n\t\t} else {\n\t\t\tel.style.height = \"100%\";\n\t\t}\n\n\t\treturn el;\n\t};\n\n\t/**\n * Specifies the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 frameIndex 값을 지정\n * @method eg.view360.SpriteImage#setFrameIndex\n * @param {Number} frameIndex frame index of a frame프레임의 인덱스\n *\n * @example\n *\n * sprites.setFrameIndex(0, 1);// col = 0, row = 1\n */\n\n\n\tSpriteImage.prototype.setFrameIndex = function setFrameIndex(index) {\n\t\tvar colRow = this.toColRow(index);\n\n\t\tthis.setColRow(colRow[0], colRow[1]);\n\t};\n\n\t/**\n * Returns the frameIndex of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 index 값을 반환\n * @method eg.view360.SpriteImage#getFrameIndex\n * @return {Number} frame index frame 인덱스\n *\n * @example\n *\n * var frameIndex = sprites.getFrameIndex(); // eg. frameIndex = 1\n *\n */\n\n\n\tSpriteImage.prototype.getFrameIndex = function getFrameIndex() {\n\t\treturn this._colRow[1] * this._colCount + this._colRow[0];\n\t};\n\n\t/**\n * Specifies the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여질 프레임의 col, row 값을 지정\n * @method eg.view360.SpriteImage#setColRow\n * @param {Number} col Column number of a frame프레임의 행값\n * @param {Number} row Row number of a frame프레임의 열값\n *\n * @example\n *\n * sprites.setlColRow(1, 2); // col = 1, row = 2\n */\n\n\n\tSpriteImage.prototype.setColRow = function setColRow(col, row) {\n\t\tif (row > this._rowCount - 1 || col > this._colCount - 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bg) {\n\t\t\tthis._bg.style.backgroundPosition = -col * 100 + \"% \" + -row * 100 + \"%\";\n\t\t}\n\n\t\tthis._colRow = [col, row];\n\t};\n\n\t/**\n * Returns the col and row values of the frame to be shown in the sprite image.\n * @ko 스프라이트 이미지 중 보여지는 프레임의 col, row 값을환반환\n * @method eg.view360.SpriteImage#gelColRow\n * @return {Number[]} Array containing col, rowcol, row 정보를 담는 배열\n *\n * @example\n *\n * var colRow = sprites.getlColRow();\n * // colRow = [1, 2] - index of col is 1, index of row is 2\n *\n */\n\n\n\tSpriteImage.prototype.getColRow = function getColRow() {\n\t\treturn this._colRow;\n\t};\n\n\tSpriteImage._getSizeString = function _getSizeString(size) {\n\t\tif (typeof size === \"number\") {\n\t\t\treturn size + \"px\";\n\t\t}\n\n\t\treturn size;\n\t};\n\n\t/**\n * Stop playing\n * @ko play 되고 있던 프레임 재생을 중지합니다.\n * @method eg.view360.SpriteImage#stop\n *\n * @example\n *\n * viewer.stop();\n *\n */\n\n\n\tSpriteImage.prototype.stop = function stop() {\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\t};\n\n\t/**\n * Switches frames sequentially in the 'interval' starting from the currently displayed frame and plays all frames by 'playCount'.\n * @ko 현재 보여지고 있는 프레임을 시작으로 'interval' 간격으로 순차적으로 프레임을 전환하며 모든 프레임을 'playCount' 만큼 재생한다.\n * @method eg.view360.SpriteImage#play\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.interval=1000 / totalFrameCount] Interframe Interval - in milliseconds프레임간 간격 - 밀리세컨드 단위\n * @param {Number} [param.playCount=0] PlayCount = 1 in which all frames are reproduced once, and playCount = n in which all frames are repeated n times. playCount = 0 in which all frames are repeated infinitely모든 프레임을 1회씩 재생한 것이 playCount = 1, 모든 프레임을 n 회 재상한 것이 playCount = n 이 된다. 0 dms 무한반복\n *\n * @example\n *\n * viewer.play({angle: 16, playCount: 1});\n *\n */\n\n\n\tSpriteImage.prototype.play = function play() {\n\t\tvar _this2 = this;\n\n\t\tvar _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { interval: 1000 / this._totalCount, playCount: 0 },\n\t\t interval = _ref.interval,\n\t\t playCount = _ref.playCount;\n\n\t\tif (!this._bg) {\n\t\t\tthis._autoPlayReservedInfo = { interval: interval, playCount: playCount };\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._autoPlayTimer) {\n\t\t\tclearInterval(this._autoPlayTimer);\n\t\t\tthis._autoPlayTimer = null;\n\t\t}\n\n\t\tvar frameIndex = this.getFrameIndex();\n\t\tvar count = 0;\n\t\tvar frameCount = 0; // for checking 1 cycle\n\n\t\tthis._autoPlayTimer = setInterval(function () {\n\t\t\tframeIndex %= _this2._totalCount;\n\t\t\tvar colRow = _this2.toColRow(frameIndex);\n\n\t\t\t_this2.setColRow(colRow[0], colRow[1]);\n\t\t\tframeIndex++;\n\n\t\t\t// Done 1 Cycle?\n\t\t\tif (++frameCount === _this2._totalCount) {\n\t\t\t\tframeCount = 0;\n\t\t\t\tcount++;\n\t\t\t}\n\n\t\t\tif (playCount > 0 && count === playCount) {\n\t\t\t\tclearInterval(_this2._autoPlayTimer);\n\t\t\t}\n\t\t}, interval);\n\t};\n\n\tSpriteImage.prototype.toColRow = function toColRow(frameIndex) {\n\t\tvar colCount = this._colCount;\n\t\tvar rowCount = this._rowCount;\n\n\t\tif (frameIndex < 0) {\n\t\t\treturn [0, 0];\n\t\t} else if (frameIndex >= this._totalCount) {\n\t\t\treturn [colCount - 1, rowCount - 1];\n\t\t}\n\n\t\tvar col = frameIndex % colCount;\n\t\tvar row = Math.floor(frameIndex / colCount);\n\n\t\t// console.log(frameIndex, col, row);\n\t\treturn [col, row];\n\t};\n\n\treturn SpriteImage;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpriteImage;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpriteImage.js\n// module id = 9\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\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\nvar WEBGL_ERROR_CODE = {\n\t\"0\": \"NO_ERROR\",\n\t\"1280\": \"INVALID_ENUM\",\n\t\"1281\": \"INVALID_VALUE\",\n\t\"1282\": \"INVALID_OPERATION\",\n\t\"1285\": \"OUT_OF_MEMORY\",\n\t\"1286\": \"INVALID_FRAMEBUFFER_OPERATION\",\n\t\"37442\": \"CONTEXT_LOST_WEBGL\"\n};\n\nvar webglAvailability = null;\n\nvar WebGLUtils = function () {\n\tfunction WebGLUtils() {\n\t\t_classCallCheck(this, WebGLUtils);\n\t}\n\n\tWebGLUtils.createShader = function createShader(gl, type, source) {\n\t\tvar shader = gl.createShader(type);\n\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\t\tif (success) {\n\t\t\treturn shader;\n\t\t}\n\n\t\tgl.deleteShader(shader);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.createProgram = function createProgram(gl, vertexShader, fragmentShader) {\n\t\tvar program = gl.createProgram();\n\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tvar success = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n\t\tif (success) {\n\t\t\treturn program;\n\t\t}\n\n\t\tgl.deleteProgram(program);\n\t\treturn null;\n\t};\n\n\tWebGLUtils.initBuffer = function initBuffer(gl, target /* bind point */, data, itemSize, attr) {\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(target, buffer);\n\t\tgl.bufferData(target, data, gl.STATIC_DRAW);\n\n\t\tif (buffer) {\n\t\t\tbuffer.itemSize = itemSize;\n\t\t\tbuffer.numItems = data.length / itemSize;\n\t\t}\n\n\t\tif (attr !== undefined) {\n\t\t\tgl.enableVertexAttribArray(attr);\n\t\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\n\t\treturn buffer;\n\t};\n\n\tWebGLUtils.bindBufferToAttribute = function bindBufferToAttribute(gl, buffer, attr) {\n\t\tif (buffer === null || attr === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t\tgl.vertexAttribPointer(attr, buffer.itemSize, gl.FLOAT, false, 0, 0);\n\t};\n\n\tWebGLUtils.getWebglContext = function getWebglContext(canvas) {\n\t\tvar webglIdentifiers = [\"webgl\", \"experimental-webgl\", \"webkit-3d\", \"moz-webgl\"];\n\t\tvar context = null;\n\n\t\tfunction onWebglcontextcreationerror(e) {\n\t\t\treturn e.statusMessage;\n\t\t}\n\n\t\tcanvas.addEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\tfor (var i = 0; i < webglIdentifiers.length; i++) {\n\t\t\ttry {\n\t\t\t\t// preserveDrawingBuffer: if true, the Galaxy s6 Naver app will experience tremor\n\t\t\t\tcontext = canvas.getContext(webglIdentifiers[i], { preserveDrawingBuffer: false });\n\t\t\t} catch (t) {}\n\t\t\tif (context) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tcanvas.removeEventListener(\"webglcontextcreationerror\", onWebglcontextcreationerror);\n\n\t\treturn context;\n\t};\n\n\tWebGLUtils.createTexture = function createTexture(gl, textureTarget) {\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.bindTexture(textureTarget, null);\n\n\t\treturn texture;\n\t};\n\n\t/**\n * Returns the webgl availability of the current browser.\n * @method WebGLUtils#isWebGLAvailable\n * @retuen {Boolean} isWebGLAvailable\n */\n\n\n\tWebGLUtils.isWebGLAvailable = function isWebGLAvailable() {\n\t\tif (webglAvailability === null) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\tvar webglContext = WebGLUtils.getWebglContext(canvas);\n\n\t\t\twebglAvailability = !!webglContext;\n\n\t\t\t// webglContext Resource forced collection\n\t\t\tif (webglContext) {\n\t\t\t\tvar loseContextExtension = webglContext.getExtension(\"WEBGL_lose_context\");\n\n\t\t\t\tloseContextExtension && loseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t\treturn webglAvailability;\n\t};\n\n\t/**\n * Returns whether webgl is stable in the current browser.\n * @method WebGLUtils#isStableWebGL\n * @retuen {Boolean} isStableWebGL\n */\n\n\n\tWebGLUtils.isStableWebGL = function isStableWebGL() {\n\t\tvar isStableWebgl = true;\n\t\tvar agentInfo = (0, _agent2[\"default\"])();\n\n\t\tif (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) <= 4.3) {\n\t\t\tisStableWebgl = false;\n\t\t} else if (agentInfo.os.name === \"android\" && parseFloat(agentInfo.os.version) === 4.4) {\n\t\t\tif (agentInfo.browser.name !== \"chrome\") {\n\t\t\t\tisStableWebgl = false;\n\t\t\t}\n\t\t} else if (agentInfo.os.name === \"ios\" && parseInt(agentInfo.os.version, 10) <= 7) {\n\t\t\tisStableWebgl = false;\n\t\t}\n\n\t\treturn isStableWebgl;\n\t};\n\n\tWebGLUtils.getErrorNameFromWebGLErrorCode = function getErrorNameFromWebGLErrorCode(code) {\n\t\tif (!(code in WEBGL_ERROR_CODE)) {\n\t\t\treturn \"UNKNOWN_ERROR\";\n\t\t}\n\n\t\treturn WEBGL_ERROR_CODE[code];\n\t};\n\n\treturn WebGLUtils;\n}();\n\nexports[\"default\"] = WebGLUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/WebGLUtils.js\n// module id = 10\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function Renderer() {\n\t_classCallCheck(this, Renderer);\n};\n\nexports[\"default\"] = Renderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/Renderer.js\n// module id = 11\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nvar util = {};\n\nfunction toAxis(source, offset) {\n\treturn offset.reduce(function (acc, v, i) {\n\t\tif (source[i]) {\n\t\t\tacc[source[i]] = v;\n\t\t}\n\t\treturn acc;\n\t}, {});\n}\n\nutil.toAxis = toAxis;\n\nexports[\"default\"] = util;\nexports.toAxis = toAxis;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/utils.js\n// module id = 12\n// module chunks = 0 1 2 3","/*!\n * Copyright (c) 2017 NAVER Corp.\r\n * @egjs/agent project is licensed under the MIT license\r\n * \r\n * @egjs/agent JavaScript library\r\n * \r\n * \r\n * @version 2.1.2\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"agent\"] = factory();\n\telse\n\t\troot[\"eg\"] = root[\"eg\"] || {}, root[\"eg\"][\"agent\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _agent = __webpack_require__(1);\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = _agent2[\"default\"]; /**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(2);\n\nvar _Parser = __webpack_require__(3);\n\nvar _Parser2 = _interopRequireDefault(_Parser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @namespace eg\n */\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg#agent\n * @param {String} [userAgent=navigator.userAgent] user agent string to parse 파싱할 유저에이전트 문자열\n * @return {Object} agentInfo\n * @return {Object} agentInfo.os os Operating system information 운영체제 정보\n * @return {String} agentInfo.os.name Operating system name (android, ios, window, mac, unknown) 운영체제 이름 (android, ios, window, mac, unknown)\n * @return {String} agentInfo.os.version Operating system version 운영체제 버전\n * @return {String} agentInfo.browser Browser information 브라우저 정보\n * @return {String} agentInfo.browser.name Browser name (safari, chrome, sbrowser, ie, firefox, unknown) 브라우저 이름 (safari, chrome, sbrowser, ie, firefox, unknown)\n * @return {String} agentInfo.browser.version Browser version 브라우저 버전 \n * @return {Boolean} agentInfo.browser.webview Indicates whether the browser is inapp웹뷰 브라우저 여부\n * @return {Boolean} agentInfo.isMobile Indicates whether the browser is for mobile모바일 브라우저 여부\n */\n/**\n * Copyright (c) NAVER Corp.\n * egjs-agent projects are licensed under the MIT license\n */\nfunction agent() {\n var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _browser.navigator.userAgent;\n\n _Parser2[\"default\"].setUa(ua);\n\n var agentInfo = {\n os: _Parser2[\"default\"].getOs(),\n browser: _Parser2[\"default\"].getBrowser(),\n isMobile: _Parser2[\"default\"].getIsMobile()\n };\n\n agentInfo.browser.name = agentInfo.browser.name.toLowerCase();\n agentInfo.os.name = agentInfo.os.name.toLowerCase();\n agentInfo.os.version = agentInfo.os.version.toLowerCase();\n\n if (agentInfo.os.name === \"ios\" && agentInfo.browser.webview) {\n agentInfo.browser.version = \"-1\";\n }\n\n return agentInfo;\n}\nagent.VERSION = \"2.1.2\";\nexports[\"default\"] = agent;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar win = typeof window !== \"undefined\" && window || {};\n\nvar RegExp = exports.RegExp = win.RegExp;\nvar navigator = exports.navigator = win.navigator;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _parseRules = __webpack_require__(4);\n\nvar _parseRules2 = _interopRequireDefault(_parseRules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar UA = void 0;\n\nfunction setUa(ua) {\n\tUA = ua;\n}\n\nfunction isMatched(base, target) {\n\treturn target && target.test ? !!target.test(base) : base.indexOf(target) > -1;\n}\n\nfunction getIdentityStringFromArray(rules, defaultStrings) {\n\tvar matchedRule = rules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t})[0];\n\n\treturn matchedRule && matchedRule.identity || defaultStrings.name;\n}\n\nfunction getRule(rules, targetIdentity) {\n\treturn rules.filter(function (rule) {\n\t\tvar criteria = rule.criteria;\n\t\tvar identityMatched = new RegExp(rule.identity, \"i\").test(targetIdentity);\n\n\t\tif (criteria ? identityMatched && isMatched(UA, criteria) : identityMatched) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t})[0];\n}\n\nfunction getBrowserName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].browser, _parseRules2[\"default\"].defaultString.browser);\n}\n\nfunction getBrowserRule(browserName) {\n\tvar rule = getRule(_parseRules2[\"default\"].browser, browserName);\n\n\tif (!rule) {\n\t\trule = {\n\t\t\tcriteria: browserName,\n\t\t\tversionSearch: browserName,\n\t\t\tidentity: browserName\n\t\t};\n\t}\n\n\treturn rule;\n}\n\nfunction extractBrowserVersion(versionToken, ua) {\n\tvar browserVersion = _parseRules2[\"default\"].defaultString.browser.version;\n\tvar versionRegexResult = new RegExp(\"(\" + versionToken + \")\", \"i\").exec(ua);\n\n\tif (!versionRegexResult) {\n\t\treturn browserVersion;\n\t}\n\n\tvar versionTokenIndex = versionRegexResult.index;\n\tvar verTkn = versionRegexResult[0];\n\n\tif (versionTokenIndex > -1) {\n\t\tvar versionIndex = versionTokenIndex + verTkn.length + 1;\n\n\t\tbrowserVersion = ua.substring(versionIndex).split(\" \")[0].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn browserVersion;\n}\n\nfunction getBrowserVersion(browserName) {\n\tif (!browserName) {\n\t\treturn undefined;\n\t}\n\n\t// console.log(browserRule);\n\t// const versionToken = browserRule ? browserRule.versionSearch : browserName;\n\tvar browserRule = getBrowserRule(browserName);\n\tvar versionToken = browserRule.versionSearch || browserName;\n\tvar browserVersion = extractBrowserVersion(versionToken, UA);\n\n\treturn browserVersion;\n}\n\nfunction isWebview() {\n\tvar webviewRules = _parseRules2[\"default\"].webview;\n\tvar browserVersion = void 0;\n\n\treturn webviewRules.filter(function (rule) {\n\t\treturn isMatched(UA, rule.criteria);\n\t}).some(function (rule) {\n\t\tbrowserVersion = extractBrowserVersion(rule.browserVersionSearch, UA);\n\t\tif (isMatched(UA, rule.webviewToken) || isMatched(browserVersion, rule.webviewBrowserVersion)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\nfunction getOSRule(osName) {\n\treturn getRule(_parseRules2[\"default\"].os, osName);\n}\n\nfunction getOsName() {\n\treturn getIdentityStringFromArray(_parseRules2[\"default\"].os, _parseRules2[\"default\"].defaultString.os);\n}\n\nfunction getOsVersion(osName) {\n\tvar osRule = getOSRule(osName) || {};\n\tvar defaultOSVersion = _parseRules2[\"default\"].defaultString.os.version;\n\tvar osVersion = void 0;\n\n\tif (!osName) {\n\t\treturn undefined;\n\t}\n\tif (osRule.versionAlias) {\n\t\treturn osRule.versionAlias;\n\t}\n\tvar osVersionToken = osRule.versionSearch || osName;\n\tvar osVersionRegex = new RegExp(\"(\" + osVersionToken + \")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\");\n\tvar osVersionRegexResult = osVersionRegex.exec(UA);\n\n\tif (osVersionRegexResult) {\n\t\tosVersion = osVersionRegex.exec(UA)[2].replace(/_/g, \".\").replace(/;|\\)/g, \"\");\n\t}\n\treturn osVersion || defaultOSVersion;\n}\n\nfunction getOs() {\n\tvar name = getOsName();\n\tvar version = getOsVersion(name);\n\n\treturn { name: name, version: version };\n}\n\nfunction getBrowser() {\n\tvar name = getBrowserName();\n\tvar version = getBrowserVersion(name);\n\n\treturn { name: name, version: version, webview: isWebview() };\n}\n\nfunction getIsMobile() {\n\treturn UA.indexOf(\"Mobi\") !== -1;\n}\n\nexports[\"default\"] = {\n\tgetOs: getOs,\n\tgetBrowser: getBrowser,\n\tgetIsMobile: getIsMobile,\n\tsetUa: setUa\n};\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nvar parseRules = {\n\tbrowser: [{\n\t\tcriteria: \"PhantomJS\",\n\t\tidentity: \"PhantomJS\"\n\t}, {\n\t\tcriteria: /Whale/,\n\t\tidentity: \"Whale\",\n\t\tversionSearch: \"Whale\"\n\t}, {\n\t\tcriteria: /Edge/,\n\t\tidentity: \"Edge\",\n\t\tversionSearch: \"Edge\"\n\t}, {\n\t\tcriteria: /MSIE|Trident|Windows Phone/,\n\t\tidentity: \"IE\",\n\t\tversionSearch: \"IEMobile|MSIE|rv\"\n\t}, {\n\t\tcriteria: /MiuiBrowser/,\n\t\tidentity: \"MIUI Browser\",\n\t\tversionSearch: \"MiuiBrowser\"\n\t}, {\n\t\tcriteria: /SamsungBrowser/,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"SamsungBrowser\"\n\t}, {\n\t\tcriteria: /SAMSUNG /,\n\t\tidentity: \"Samsung Internet\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /Chrome|CriOS/,\n\t\tidentity: \"Chrome\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android Browser\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Apple\",\n\t\tidentity: \"Safari\",\n\t\tversionSearch: \"Version\"\n\t}, {\n\t\tcriteria: \"Firefox\",\n\t\tidentity: \"Firefox\"\n\t}],\n\tos: [{\n\t\tcriteria: /Windows Phone/,\n\t\tidentity: \"Windows Phone\",\n\t\tversionSearch: \"Windows Phone\"\n\t}, {\n\t\tcriteria: \"Windows 2000\",\n\t\tidentity: \"Window\",\n\t\tversionAlias: \"5.0\"\n\t}, {\n\t\tcriteria: /Windows NT/,\n\t\tidentity: \"Window\",\n\t\tversionSearch: \"Windows NT\"\n\t}, {\n\t\tcriteria: /iPhone|iPad/,\n\t\tidentity: \"iOS\",\n\t\tversionSearch: \"iPhone OS|CPU OS\"\n\t}, {\n\t\tcriteria: \"Mac\",\n\t\tversionSearch: \"OS X\",\n\t\tidentity: \"MAC\"\n\t}, {\n\t\tcriteria: /Android/,\n\t\tidentity: \"Android\"\n\t}, {\n\t\tcriteria: /Tizen/,\n\t\tidentity: \"Tizen\"\n\t}, {\n\t\tcriteria: /Web0S/,\n\t\tidentity: \"WebOS\"\n\t}],\n\n\t// Webview check condition\n\t// ios: If has no version information\n\t// Android 5.0 && chrome 40+: Presence of \"; wv\" in userAgent\n\t// Under android 5.0: Presence of \"NAVER\" or \"Daum\" in userAgent\n\twebview: [{\n\t\tcriteria: /iPhone|iPad/,\n\t\tbrowserVersionSearch: \"Version\",\n\t\twebviewBrowserVersion: /-1/\n\t}, {\n\t\tcriteria: /iPhone|iPad|Android/,\n\t\twebviewToken: /NAVER|DAUM|; wv/\n\n\t}],\n\tdefaultString: {\n\t\tbrowser: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t},\n\t\tos: {\n\t\t\tversion: \"-1\",\n\t\t\tname: \"unknown\"\n\t\t}\n\t}\n};\n\nexports[\"default\"] = parseRules;\nmodule.exports = exports[\"default\"];\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@egjs/agent/dist/agent.js\n// module id = 13\n// module chunks = 0 1 2 3","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 14\n// module chunks = 0 1 2 3 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _YawPitchControl2 = _interopRequireDefault(_YawPitchControl);\n\nvar _consts = require(\"./consts\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Expose DeviceOrientationControls sub module for test purpose\n_YawPitchControl2[\"default\"].CONTROL_MODE_VR = _consts.CONTROL_MODE_VR;\n_YawPitchControl2[\"default\"].CONTROL_MODE_YAWPITCH = _consts.CONTROL_MODE_YAWPITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_ALL = _consts.TOUCH_DIRECTION_ALL;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_YAW = _consts.TOUCH_DIRECTION_YAW;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_PITCH = _consts.TOUCH_DIRECTION_PITCH;\n_YawPitchControl2[\"default\"].TOUCH_DIRECTION_NONE = _consts.TOUCH_DIRECTION_NONE;\n\n// module.exports = YawPitch;\nexports.YawPitchControl = _YawPitchControl2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/index.js\n// module id = 15\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _YawPitchControl = require(\"../YawPitchControl\");\n\nvar _PanoImageRenderer = require(\"../PanoImageRenderer\");\n\nvar _consts = require(\"./consts\");\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar PanoViewer = function (_Component) {\n\t_inherits(PanoViewer, _Component);\n\n\t/**\n * @classdesc 360 media viewer\n * @ko 360 미디어 뷰어\n * @class\n * @name eg.view360.PanoViewer\n * @extends eg.Component\n *\n * @param {HTMLElement} container The container element for the renderer. 렌더러의 컨테이너 엘리먼트\n * @param {Object} config\n *\n * @param {String|Image} config.image Input image url or image object입력 이미지 URL 혹은 이미지 객체(image 와 video 둘 중 하나만 설정한다.)\n * @param {String|HTMLVideoElement} config.video Input video url or tag입력 비디오 URL 혹은 video 태그(image 와 video 둘 중 하나만 설정한다.)\n * @param {String} [config.projectionType=equirectangular] The type of projection: equirectangular, vertival_cubestrip Projection 유형 : equirectangular, vertival_cubestrip\n * @param {Number} [config.width=width of container] the viewer's width. (in px) 뷰어의 너비 (px 단위)\n * @param {Number} [config.height=height of container] the viewer's height.(in px) 뷰어의 높이 (px 단위)\n *\n * @param {Number} [config.yaw=0] Initial Yaw of camera (in degree) 카메라의 초기 Yaw (degree 단위)\n * @param {Number} [config.pitch=0] Initial Pitch of camera (in degree) 카메라의 초기 Pitch (degree 단위)\n * @param {Number} [config.fov=65] Initial vertical field of view of camera (in degree) 카메라의 초기 수직 field of view (degree 단위)\n * @param {Boolean} [config.showPolePoint=false] If false, the pole is not displayed inside the viewport false 인 경우, 극점은 뷰포트 내부에 표시되지 않습니다\n * @param {Boolean} [config.useZoom=true] When true, enables zoom with the wheel and Pinch gesture true 일 때 휠 및 집기 제스춰로 확대 / 축소 할 수 있습니다.\n * @param {Boolean} [config.useKeyboard=true] When true, enables the keyboard move key control: awsd, arrow keys true 이면 키보드 이동 키 컨트롤을 활성화합니다: awsd, 화살표 키\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion. (\"none\", \"yawPitch\") 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\") \n * @param {Array} [config.yawRange=[-180, 180]] Range of controllable Yaw values 제어 가능한 Yaw 값의 범위\n * @param {Array} [config.pitchRange=[-90, 90]] Range of controllable Pitch values 제어 가능한 Pitch 값의 범위\n * @param {Array} [config.fovRange=[30, 110]] Range of controllable vertical field of view values 제어 가능한 수직 field of view 값의 범위\n * @param {Function} [config.checkSupport] A function that returns a boolean value that determines whether the component is working. 뷰어가 작동할 지 여부를 결정하는 부울 값을 반환하는 함수입니다.\n */\n\tfunction PanoViewer(container) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, PanoViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tif (options.checkSupport && !options.checkSupport()) {\n\t\t\tvar _ret;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_DEVICE,\n\t\t\t\t\tmessage: \"invalid device\"\n\t\t\t\t});\n\t\t\t}, 0);\n\n\t\t\treturn _ret = _this, _possibleConstructorReturn(_this, _ret);\n\t\t}\n\n\t\t// Raises the error event if webgl is not supported.\n\t\tif (!_PanoImageRenderer.WebGLUtils.isWebGLAvailable()) {\n\t\t\tvar _ret2;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.NO_WEBGL,\n\t\t\t\t\tmessage: \"no webgl support\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret2 = _this, _possibleConstructorReturn(_this, _ret2);\n\t\t}\n\n\t\tif (!!options.image && !!options.video) {\n\t\t\tvar _ret3;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\t_this.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\t\ttype: _consts.ERROR_TYPE.INVALID_RESOURCE,\n\t\t\t\t\tmessage: \"Specifying multi resouces(both image and video) is not valid.\"\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\treturn _ret3 = _this, _possibleConstructorReturn(_this, _ret3);\n\t\t}\n\n\t\t_this._container = container;\n\t\t_this._image = options.image || options.video;\n\t\t_this._isVideo = !!options.video;\n\t\t_this._projectionType = options.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\n\t\t// If the width and height are not provided, will use the size of the container.\n\t\t_this._width = options.width || parseInt(window.getComputedStyle(container).width, 10);\n\t\t_this._height = options.height || parseInt(window.getComputedStyle(container).height, 10);\n\n\t\t_this._yaw = options.yaw || 0;\n\t\t_this._pitch = options.pitch || 0;\n\t\t_this._fov = options.fov || 65;\n\n\t\t_this._useGyro = options.useGyro || _consts.GYRO_MODE.YAWPITCH;\n\n\t\t_this._aspectRatio = _this._width / _this._height;\n\t\tvar fovRange = options.fovRange || [30, 110];\n\n\t\tvar yawPitchConfig = _extends(options, {\n\t\t\telement: container,\n\t\t\tyaw: _this._yaw,\n\t\t\tpitch: _this._pitch,\n\t\t\tfov: _this._fov,\n\t\t\tuseGyro: _this._useGyro,\n\t\t\tfovRange: fovRange,\n\t\t\taspectRatio: _this._aspectRatio\n\t\t});\n\n\t\t_this._isReady = false;\n\n\t\t_this._initYawPitchControl(yawPitchConfig);\n\t\t_this._initRenderer(_this._yaw, _this._pitch, _this._fov, _this._projectionType);\n\t\treturn _this;\n\t}\n\n\t/**\n \t* Getting the video element that the viewer is currently playing. You can use this for playback.\n \t* @ko 뷰어가 현재 사용 중인 비디오 요소를 얻습니다. 이 요소를 이용해 비디오의 컨트롤을 할 수 있습니다.\n \t* @method eg.view360.PanoViewer#getVideo\n \t* @return {HTMLVideoElement} HTMLVideoElementHTMLVideoElement\n \t*/\n\n\n\tPanoViewer.prototype.getVideo = function getVideo() {\n\t\tif (!this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the video information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setVideo\n * @param {String|HTMLVideoElement} video Video URL or Video Tag비디오 URL 혹은 비디오 태그\n * @param {Object} param\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setVideo = function setVideo(video) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { projectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR };\n\n\t\tif (!video) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.setImage(video, { projectionType: param.projectionType, isVideo: true });\n\t\treturn this;\n\t};\n\n\t/**\n * Getting the image information that the viewer is currently using.\n * @ko 뷰어가 현재 사용하고있는 이미지 정보를 얻습니다.\n * @method eg.view360.PanoViewer#getImage\n * @return {Image} Image Object이미지 객체\n */\n\n\n\tPanoViewer.prototype.getImage = function getImage() {\n\t\tif (this._isVideo) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._photoSphereRenderer.getContent();\n\t};\n\n\t/**\n * Setting the image information to be used by the viewer.\n * @ko 뷰어가 사용할 이미지 정보를 설정 합니다.\n * @method eg.view360.PanoViewer#setImage\n * @param {String|Image} image ImageURL or Image Object이미지 URL 혹은 Image 객체\n * @param {Object} param Additional information이미지 추가 정보\n * @param {String} [param.projectionType=\"equirectangular\"] Projection Type프로젝션 타입\n *\n * @return {PanoViewer} PanoViewer instancePanoViewer 인스턴스\n */\n\n\n\tPanoViewer.prototype.setImage = function setImage(image) {\n\t\tvar param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\t\tprojectionType: _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR,\n\t\t\tisVideo: false\n\t\t};\n\n\t\tvar projectionType = param.projectionType || _PanoImageRenderer.PanoImageRenderer.ImageType.EQUIRECTANGULAR;\n\t\tvar isVideo = param.isVideo || false;\n\n\t\tif (this._image && isVideo !== this._isVideo) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Currently not supporting to change content type(Image <--> Video)\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!image) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._image = image;\n\t\tthis._isVideo = isVideo;\n\t\tthis._projectionType = projectionType;\n\n\t\tthis._deactivate();\n\t\tthis._initRenderer(this._yaw, this._pitch, this._fov, this._projectionType);\n\n\t\treturn this;\n\t};\n\n\tPanoViewer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tthis._photoSphereRenderer.keepUpdate(doUpdate);\n\t\treturn this;\n\t};\n\n\t/**\n * Get projection type (equirectangular/cube)\n * @ko 프로젝션 타입(Equirectangular 혹은 Cube)을 반환한다.\n *\n * @method eg.view360.PanoViewer#getProjectionType\n */\n\n\n\tPanoViewer.prototype.getProjectionType = function getProjectionType() {\n\t\treturn this._projectionType;\n\t};\n\n\tPanoViewer.prototype._initRenderer = function _initRenderer(yaw, pitch, fov, projectionType) {\n\t\tvar _this2 = this;\n\n\t\tthis._photoSphereRenderer = new _PanoImageRenderer.PanoImageRenderer(this._image, this._width, this._height, this._isVideo, {\n\t\t\tinitialYaw: yaw,\n\t\t\tinitialPitch: pitch,\n\t\t\tfieldOfView: fov,\n\t\t\timageType: projectionType\n\t\t});\n\n\t\tthis._bindRendererHandler();\n\n\t\tthis._photoSphereRenderer.bindTexture().then(function () {\n\t\t\treturn _this2._activate();\n\t\t})[\"catch\"](function () {\n\t\t\t_this2._triggerEvent(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.FAIL_BIND_TEXTURE,\n\t\t\t\tmessage: \"failed to bind texture\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._bindRendererHandler = function _bindRendererHandler() {\n\t\tvar _this3 = this;\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.IMAGE_LOADED, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.CONTENT_LOADED, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.ERROR, function (e) {\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, e);\n\t\t});\n\n\t\tthis._photoSphereRenderer.on(_PanoImageRenderer.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST, function (e) {\n\t\t\t_this3._deactivate();\n\t\t\t_this3.trigger(_consts.EVENTS.ERROR, {\n\t\t\t\ttype: _consts.ERROR_TYPE.RENDERING_CONTEXT_LOST,\n\t\t\t\tmessage: \"webgl rendering context lost\"\n\t\t\t});\n\t\t});\n\t};\n\n\tPanoViewer.prototype._initYawPitchControl = function _initYawPitchControl(yawPitchConfig) {\n\t\tvar _this4 = this;\n\n\t\tthis._yawPitchControl = new _YawPitchControl.YawPitchControl(yawPitchConfig);\n\n\t\tthis._yawPitchControl.on(_consts.EVENTS.ANIMATION_END, function (e) {\n\t\t\t_this4._triggerEvent(_consts.EVENTS.ANIMATION_END, e);\n\t\t});\n\n\t\tthis._yawPitchControl.on(\"change\", function (e) {\n\t\t\t_this4._yaw = e.yaw;\n\t\t\t_this4._pitch = e.pitch;\n\t\t\t_this4._fov = e.fov;\n\n\t\t\t_this4._triggerEvent(_consts.EVENTS.VIEW_CHANGE, e);\n\t\t});\n\t};\n\n\tPanoViewer.prototype._triggerEvent = function _triggerEvent(name, param) {\n\t\tvar evt = param || {};\n\n\t\t/**\n * Events that is fired when error occurs\n * @ko 에러 발생 시 발생하는 이벤트\n * @name eg.view360.PanoViewer#error\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.type Error type\n * \t\t10: INVALID_DEVICE: Unsupported device\n * \t\t11: NO_WEBGL: Webgl not support\n * \t\t12, FAIL_IMAGE_LOAD: Failed to load image\n * \t\t13: FAIL_BIND_TEXTURE: Failed to bind texture\n * \t\t14: INVALID_RESOURCE: Only one resource(image or video) should be specified\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost occurred\n * 에러 종류\n * \t\t10: INVALID_DEVICE: 미지원 기기\n * \t\t11: NO_WEBGL: WEBGL 미지원\n * \t\t12, FAIL_IMAGE_LOAD: 이미지 로드 실패\n * \t\t13: FAIL_BIND_TEXTURE: 텍스쳐 바인딩 실패\n * \t\t14: INVALID_RESOURCE: 리소스 지정 오류 (image 혹은 video 중 하나만 지정되어야 함)\n * \t\t15: RENDERING_CONTEXT_LOST: WebGL context lost 발생\n * \n * @param {String} param.message Error message 에러 메시지\n *\n * @example\n *\n * viwer.on({\n *\t\"error\" : function(evt) {\n *\t\t// evt.type === 13\n *\t\t// evt.messaeg === \"failed to bind texture\"\n * });\n */\n\n\t\t/**\n * Events that is fired when PanoViewer is ready to go.\n * @ko PanoViewer 가 준비된 상태에 발생하는 이벤트\n * @name eg.view360.PanoViewer#ready\n * @event\n *\n * @example\n *\n * viwer.on({\n *\t\"ready\" : function(evt) {\n *\t\t// PanoViewer is ready to show image and handle user interaction.\n * });\n */\n\n\t\t/**\n * Events that is fired when direction or fov is changed.\n * @ko PanoViewer 에서 바라보고 있는 방향이나 FOV(화각)가 변경되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#viewChange\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number} param.yaw yawyaw\n * @param {Number} param.pitch pitch pitch\n * @param {Number} param.fov Field of view (fov) 화각\n * @example\n *\n * viwer.on({\n *\t\"viewChange\" : function(evt) {\n *\t\t//evt.yaw, evt.pitch, evt.fov is available.\n * });\n */\n\n\t\t/**\n * Events that is fired when animation which is triggered by inertia is ended.\n * @ko 관성에 의한 애니메이션 동작이 완료되었을때 발생하는 이벤트\n * @name eg.view360.PanoViewer#animationEnd\n * @event\n * @example\n *\n * viwer.on({\n *\t\"animationEnd\" : function(evt) {\n *\t\t// animation is ended.\n * });\n */\n\n\t\t/**\n \t* Events that is fired when content(Video/Image) is loaded\n \t* @ko 컨텐츠(비디오 혹은 이미지)가 로드되었을때 발생되는 이벤트\n \t*\n \t* @name eg.view360.PanoViewer#contentLoaded\n \t* @event\n \t* @param {Object} event\n \t* @param {HTMLVideoElement|Image} event.content\n \t* @param {Boolean} event.isVideo\n \t* @param {String} event.projectionType\n \t*/\n\t\treturn this.trigger(name, evt);\n\t};\n\n\t/**\n * When set true, enables zoom with the wheel and Pinch gesture\n * @ko true 로 설정 시 휠 및 집기 동작으로 확대 / 축소 할 수 있습니다.\n * @method eg.view360.PanoViewer#setUseZoom\n * @param {Boolean} useZoom\n */\n\n\n\tPanoViewer.prototype.setUseZoom = function setUseZoom(useZoom) {\n\t\tif (typeof useZoom !== \"boolean\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._yawPitchControl.option(\"useZoom\", useZoom);\n\t};\n\n\t/**\n * When true, enables the keyboard move key control: awsd, arrow keys\n * @ko true이면 키보드 이동 키 컨트롤을 활성화합니다. (awsd, 화살표 키)\n * @method eg.view360.PanoViewer#setUseKeyboard\n * @param {Boolean} useKeyboard\n */\n\n\n\tPanoViewer.prototype.setUseKeyboard = function setUseKeyboard(useKeyboard) {\n\t\tthis._yawPitchControl.option(\"useKeyboard\", useKeyboard);\n\t};\n\n\t/**\n * Enables control through device motion. (\"none\", \"yawPitch\")\n * @ko 디바이스 움직임을 통한 컨트롤을 활성화 합니다. (\"none\", \"yawPitch\")\n * @method eg.view360.PanoViewer#setUseGyro\n * @param {String} useGyro\n */\n\n\n\tPanoViewer.prototype.setUseGyro = function setUseGyro(useGyro) {\n\t\tthis._yawPitchControl.option(\"useGyro\", useGyro);\n\t};\n\n\t/**\n * Setting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 설정\n * @method eg.view360.PanoViewer#setFovRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setFovRange = function setFovRange(range) {\n\t\tthis._yawPitchControl.option(\"fovRange\", range);\n\t};\n\n\t/**\n * Getting the range of controllable FOV values\n * @ko 제어 가능한 FOV 값의 범위 가져 오기\n * @method eg.view360.PanoViewer#getFovRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getFovRange = function getFovRange() {\n\t\treturn this._yawPitchControl.option(\"fovRange\");\n\t};\n\n\t/**\n * Update size of canvas element by it's container element's or specified size.\n * @ko 캔버스 엘리먼트의 크기를 컨테이너 엘리먼트의 크기나 지정된 크기로 업데이트합니다.\n * @method eg.view360.PanoViewer#updateViewportDimensions\n * @param {Object} [size]\n * @param {Number} [size.width=width of container]\n * @param {Number} [size.height=height of container]\n */\n\n\n\tPanoViewer.prototype.updateViewportDimensions = function updateViewportDimensions(size) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\t\tthis._width = size && size.width || parseInt(window.getComputedStyle(this._container).width, 10);\n\t\tthis._height = size && size.height || parseInt(window.getComputedStyle(this._container).height, 10);\n\t\tthis._aspectRatio = this._width / this._height;\n\t\tthis._photoSphereRenderer.updateViewportDimensions(this._width, this._height);\n\t\tthis._yawPitchControl.option(\"aspectRatio\", this._aspectRatio);\n\n\t\tthis.lookAt({}, 0);\n\t};\n\n\t/**\n * Get the vertical field of view\n * @ko 뷰어의 수직 field of view 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getFov\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getFov = function getFov() {\n\t\treturn this._fov;\n\t};\n\n\t/**\n * Get the horizontal field of view in degree\n */\n\n\n\tPanoViewer.prototype._getHFov = function _getHFov() {\n\t\treturn _mathUtil.glMatrix.toDegree(2 * Math.atan(this._aspectRatio * Math.tan(_mathUtil.glMatrix.toRadian(this._fov) / 2)));\n\t};\n\n\t/**\n * Get current yaw value\n * @ko 뷰어의 yaw 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getYaw\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getYaw = function getYaw() {\n\t\treturn this._yaw;\n\t};\n\n\t/**\n * Get current pitch value\n * @ko 뷰어의 pitch 값을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitch\n * @return {Number}\n */\n\n\n\tPanoViewer.prototype.getPitch = function getPitch() {\n\t\treturn this._pitch;\n\t};\n\n\t/**\n * Get the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getYawRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getYawRange = function getYawRange() {\n\t\treturn this._yawPitchControl.option(\"yawRange\");\n\t};\n\n\t/**\n * Get the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 가져옵니다.\n * @method eg.view360.PanoViewer#getPitchRange\n * @return {Array}\n */\n\n\n\tPanoViewer.prototype.getPitchRange = function getPitchRange() {\n\t\treturn this._yawPitchControl.option(\"pitchRange\");\n\t};\n\n\t/**\n * Set the range of controllable Yaw values\n * @ko 컨트롤 가능한 Yaw 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setYawRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setYawRange = function setYawRange(yawRange) {\n\t\treturn this._yawPitchControl.option(\"yawRange\", yawRange);\n\t};\n\n\t/**\n * Set the range of controllable Pitch values\n * @ko 컨트롤 가능한 Pitch 구간을 설정합니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Array} range\n */\n\n\n\tPanoViewer.prototype.setPitchRange = function setPitchRange(pitchRange) {\n\t\treturn this._yawPitchControl.option(\"pitchRange\", pitchRange);\n\t};\n\n\t/**\n * If false, the pole is not displayed inside the viewport\n * @ko false 인 경우, 폴은 뷰포트 내부에 표시되지 않습니다.\n * @method eg.view360.PanoViewer#setPitchRange\n * @param {Boolean} showPolePoint\n */\n\n\n\tPanoViewer.prototype.setShowPolePoint = function setShowPolePoint(showPolePoint) {\n\t\treturn this._yawPitchControl.option(\"showPolePoint\", showPolePoint);\n\t};\n\n\t/**\n * Set a new view by setting camera configuration. Any parameters not specified remain the same.\n * @ko 카메라 설정을 지정하여 화면을 갱신합니다. 지정되지 않은 매개 변수는 동일하게 유지됩니다.\n * @method eg.view360.PanoViewer#lookAt\n * @param {Object} orientation\n * @param {Number} orientation.yaw Target yaw in degree 목표 yaw (degree 단위)\n * @param {Number} orientation.pitch Target pitch in degree 목표 pitch (degree 단위)\n * @param {Number} orientation.fov Target vertical fov in degree 목표 수직 fov (degree 단위)\n * @param {Number} duration Animation duration in milliseconds 애니메이션 시간 (밀리 초)\n */\n\n\n\tPanoViewer.prototype.lookAt = function lookAt(orientation, duration) {\n\t\tif (!this._isReady) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar yaw = orientation.yaw !== undefined ? orientation.yaw : this._yaw;\n\t\tvar pitch = orientation.pitch !== undefined ? orientation.pitch : this._pitch;\n\t\tvar pitchRange = this._yawPitchControl.option(\"pitchRange\");\n\t\tvar verticalAngleOfImage = pitchRange[1] - pitchRange[0];\n\t\tvar fov = orientation.fov !== undefined ? orientation.fov : this._fov;\n\n\t\tif (verticalAngleOfImage < fov) {\n\t\t\tfov = verticalAngleOfImage;\n\t\t}\n\n\t\tthis._yawPitchControl.lookAt({ yaw: yaw, pitch: pitch, fov: fov }, duration);\n\n\t\tif (duration === 0) {\n\t\t\tthis._photoSphereRenderer.render(yaw, pitch, fov);\n\t\t}\n\t};\n\n\tPanoViewer.prototype._activate = function _activate() {\n\t\tthis._photoSphereRenderer.attachTo(this._container);\n\t\tthis._yawPitchControl.enable();\n\n\t\tthis.updateViewportDimensions();\n\n\t\tthis._isReady = true;\n\t\tthis._triggerEvent(_consts.EVENTS.READY);\n\t\tthis._startRender();\n\t};\n\n\t/**\n * Register the callback on the raf to call _renderLoop every frame.\n */\n\n\n\tPanoViewer.prototype._startRender = function _startRender() {\n\t\tthis._renderLoop = this._renderLoop.bind(this);\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._renderLoop = function _renderLoop() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.render(this._yaw, this._pitch, this._fov);\n\t\t}\n\t\tthis._rafId = window.requestAnimationFrame(this._renderLoop);\n\t};\n\n\tPanoViewer.prototype._stopRender = function _stopRender() {\n\t\tif (this._rafId) {\n\t\t\twindow.cancelAnimationFrame(this._rafId);\n\t\t\tdelete this._rafId;\n\t\t}\n\t};\n\n\t/**\n * Destroy webgl context and block user interaction and stop rendering\n */\n\n\n\tPanoViewer.prototype._deactivate = function _deactivate() {\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tif (this._isReady) {\n\t\t\tthis._yawPitchControl.disable();\n\t\t\tthis._stopRender();\n\t\t\tthis._isReady = false;\n\t\t}\n\t};\n\n\t/**\n * Destroy viewer. Remove all registered event listeners and remove viewer canvas.\n * @ko 뷰어 인스턴스를 해제합니다. 모든 등록된 이벤트리스너를 제거하고 뷰어 캔버스를 삭제한다.\n * @method eg.view360.PanoViewer#destroy\n */\n\n\n\tPanoViewer.prototype.destroy = function destroy() {\n\t\tthis._deactivate();\n\n\t\tif (this._yawPitchControl) {\n\t\t\tthis._yawPitchControl.destroy();\n\t\t\tthis._yawPitchControl = null;\n\t\t}\n\n\t\tif (this._photoSphereRenderer) {\n\t\t\tthis._photoSphereRenderer.destroy();\n\t\t\tthis._photoSphereRenderer = null;\n\t\t}\n\n\t\tthis._isReady = false;\n\t};\n\n\tPanoViewer.isWebGLAvailable = function isWebGLAvailable() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isWebGLAvailable();\n\t};\n\n\tPanoViewer.isStableWebGL = function isStableWebGL() {\n\t\treturn _PanoImageRenderer.WebGLUtils.isStableWebGL();\n\t};\n\n\t/**\n * Check whether the current environment supports the gyro sensor.\n * @ko 현재 브라우저 환경이 자이로 센서를 지원하는지 여부를 확인합니다.\n * @function isGyroSensorAvailable\n * @memberof eg.view360.PanoViewer\n * @param {Function} callback Function to take the gyro sensor availability as argument 자이로 센서를 지원하는지 여부를 인자로 받는 함수\n * @static\n */\n\n\n\tPanoViewer.isGyroSensorAvailable = function isGyroSensorAvailable(callback) {\n\t\tif (\"DeviceMotionEvent\" in window === false || !window.DeviceMotionEvent) {\n\t\t\tcallback && callback(false);\n\t\t\treturn;\n\t\t}\n\n\t\tvar onDeviceMotionChange = void 0;\n\n\t\tfunction checkGyro() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tonDeviceMotionChange = function onDeviceMotionChange(deviceMotion) {\n\t\t\t\t\tvar isGyroSensorAvailable = deviceMotion.rotationRate.alpha !== null;\n\n\t\t\t\t\tres(isGyroSensorAvailable);\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener(\"devicemotion\", onDeviceMotionChange);\n\t\t\t});\n\t\t}\n\n\t\tfunction timeout() {\n\t\t\treturn new _Promise(function (res, rej) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\treturn res(false);\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t_Promise.race([checkGyro(), timeout()]).then(function (isGyroSensorAvailable) {\n\t\t\twindow.removeEventListener(\"devicemotion\", onDeviceMotionChange);\n\n\t\t\tcallback && callback(isGyroSensorAvailable);\n\n\t\t\tPanoViewer.isGyroSensorAvailable = function (fb) {\n\t\t\t\tfb && fb(isGyroSensorAvailable);\n\t\t\t\treturn isGyroSensorAvailable;\n\t\t\t};\n\t\t});\n\t};\n\n\treturn PanoViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoViewer;\n\n\nPanoViewer.ERROR_TYPE = _consts.ERROR_TYPE;\nPanoViewer.EVENTS = _consts.EVENTS;\nPanoViewer.ProjectionType = _PanoImageRenderer.PanoImageRenderer.ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/PanoViewer.js\n// module id = 16\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.PanoViewer = undefined;\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _PanoViewer2 = _interopRequireDefault(_PanoViewer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoViewer = _PanoViewer2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/index.js\n// module id = 17\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\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 DEFAULT_PAN_SCALE = 0.21;\n\n/**\n * @class eg.view360.SpinViewer\n * @classdesc A module used to displays each image sequentially according to the direction of the user's touch movement (left / right) of the sprite image that is collected by rotating the object.\n * @ko 물체 주위를 회전하여 촬영한 이미지들을 모은 스프라이트 이미지를 사용자의 터치 이동 방향(좌 / 우) 에 따라 각 이미지들을 순차적으로 보여주는 컴포넌트입니다.\n * @extends eg.Component\n *\n * @param {HTMLElement} element The element to show the image 이미지를 보여줄 대상 요소\n * @param {Object} options The option object파라미터 객체\n * @param {String} options.imageUrl The url of the sprite image 스프라이트 이미지의 url\n * @param {Number} [options.rowCount=1] Number of horizontal frames in the sprite image 스프라이트 이미지의 가로 프레임 갯수\n * @param {Number} [options.colCount=1] Number of vertical frames in the sprite image 스프라이트 이미지의 세로 프레임 갯수\n * @param {Number|String} [options.width=\"auto\"] The width of the target element to show the image 이미지를 보여줄 대상 요소의 너비\n * @param {Number|String} [options.height=\"auto\"] The height of the target element to show the image 이미지를 보여줄 대상 요소의 높이\n * @param {Boolean} [options.autoHeight=true] Whether to automatically set the height of the image area to match the original image's proportion 원본 이미지 비율에 맞게 이미지 영역의 높이를 자동으로 설정할지 여부\n * @param {Number[]} [options.colRow=[0, 0]] The column, row coordinates of the first frame of the sprite image (based on 0 index) 스프라이트 이미지 중 처음 보여줄 프레임의 (column, row) 좌표 (0 index 기반)\n * @param {Number} [options.scale=1] Spin scale (The larger the spin, the more).Spin 배율 (클 수록 더 많이 움직임)\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // Initialize SpinViewer\n * var el = document.getElementById(\"product-360\");\n * var viewer = new eg.view360.SpinViewer(el, {\n * \timageUrl: \"/img/bag360.jpg\", // required\n * \trowCount: 24 //required\n * });\n */\n\nvar SpinViewer = function (_Component) {\n\t_inherits(SpinViewer, _Component);\n\n\tfunction SpinViewer(element, options) {\n\t\t_classCallCheck(this, SpinViewer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._el = element;\n\n\t\tvar opt = options || {};\n\t\tvar colCount = opt.colCount || 1;\n\t\tvar rowCount = opt.rowCount || 1;\n\n\t\t_this._scale = (opt.scale || 1) * DEFAULT_PAN_SCALE;\n\n\t\t_this._frameCount = colCount * rowCount;\n\n\t\t// Init SpriteImage\n\t\t_this._sprites = new _SpriteImage2[\"default\"](element, opt).on({\n\t\t\t\"load\": function load(evt) {\n\t\t\t\t/**\n * Events that occur when component loading is complete\n * @ko 컴포넌트 로딩이 완료되면 발생하는 이벤트\n * @name eg.view360.SpinViewer#load\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {HTMLElement} param.target The target element for which to display the image 이미지를 보여줄 대상 엘리먼트\n * @param {HTMLElement} param.bgElement Generated background image element 생성된 background 이미지 엘리먼트\n *\n * @example\n *\n * viwer.on({\n *\t\"load\" : function(evt) {\n *\t\tthis.spinBy({angle: 360, duration: 300});\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"load\", evt);\n\t\t\t},\n\t\t\t\"imageError\": function imageError(evt) {\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#imageError\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {String} param.imageUrl User-specified image URL 사용자가 지정한 이미지 URL\n *\n * @example\n *\n * viewer.on({\n *\t\"imageError\" : function(evt) {\n *\t\t// Error handling\n *\t\tconsole.log(e.imageUrl);\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"imageError\", {\n\t\t\t\t\timageUrl: evt.imageUrl\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Init Axes\n\t\t_this._panInput = new _axes2[\"default\"].PanInput(_this._el, {\n\t\t\tscale: [_this._scale, _this._scale]\n\t\t});\n\t\t_this._axes = new _axes2[\"default\"]({\n\t\t\tangle: {\n\t\t\t\trange: [0, 359],\n\t\t\t\tcircular: true\n\t\t\t}\n\t\t}).on({\n\t\t\t\"change\": function change(evt) {\n\t\t\t\tvar curr = Math.floor(evt.pos.angle / (360 / _this._frameCount));\n\t\t\t\tvar frameIndex = _this._frameCount - curr - 1;\n\n\t\t\t\t_this._sprites.setFrameIndex(frameIndex);\n\n\t\t\t\t/**\n * An event that occurs when the image index is changed by the user's left / right panning\n * @ko 사용자의 좌우 Panning 에 의해 이미지 인덱스가 변경되었을때 발생하는 이벤트\n * @name eg.view360.SpinViewer#change\n * @event\n * @param {Object} param The object of data to be sent to an event 이벤트에 전달되는 데이터 객체\n * @param {Number[]} param.colRow Column, row of the frame in the sprite image 스프라이트 이미지 내 프레임의 column, row\n * @param {Number} param.frameIndex Index value that is sequentially appended in Z direction based on col and row.col, row 를 기반으로 Z 방향으로 순차적으로 붙여지는 index 값\n * @param {Number} param.angle The angle that is currently internally held at an angle between 0 and 359. (not a real product angle) 0 ~ 359 범위의 각도로 현재 내부적으로 유지하고 있는 각도 (실제 이미지의 각도가 아님)\n *\n * @example\n *\n * viwer.on({\n *\t\"change\" : function(evt) {\n *\t\tconsole.log(event.frameIndex, event.colRow, event.angle); // event.colRow = [0, 4] event.frameIndex = 4, event = 30\n *\t}\n * });\n */\n\t\t\t\t_this.trigger(\"change\", {\n\t\t\t\t\tframeIndex: frameIndex,\n\t\t\t\t\tcolRow: _this._sprites.getColRow(),\n\t\t\t\t\tangle: evt.pos.angle\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_this._axes.connect(\"angle\", _this._panInput);\n\t\treturn _this;\n\t}\n\n\t/**\n * Set spin scale\n * @ko scale 을 조정할 수 있는 함수\n * @method eg.view360.SpinViewer#setScale\n * @param {Number} scale Rotation multiples at spin, the larger the rotationSpin 시 회전 배수값, 커질 수록 더 많이 회전\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.setScale(2);// It moves twice as much.\n */\n\n\n\tSpinViewer.prototype.setScale = function setScale(scale) {\n\t\tif (isNaN(scale) || scale < 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scale = scale * DEFAULT_PAN_SCALE;\n\t\tthis._panInput.options.scale = [this._scale, this._scale];\n\n\t\treturn this;\n\t};\n\n\t/**\n * It gives the effect of rotating at a specified angle for a certain period of time(duration).\n * @ko 지정된 각도(angle)로 일정 시간동안(duration) 회전하는 효과를 준다.\n * @method eg.view360.SpinViewer#spinBy\n * @param {Object} param The parameter object파라미터 객체\n * @param {Number} [param.angle=0] angle회전 각도\n * @param {Number} [param.duration=400] duration회전할 시간 - 밀리세컨드 단위\n *\n * @return {Object} Instance of SpinViewer SpinViewer 인스턴스\n *\n * @example\n *\n * viewer.spinBy({angle: 720, duration: 500});\n */\n\n\n\tSpinViewer.prototype.spinBy = function spinBy(_ref) {\n\t\tvar _ref$angle = _ref.angle,\n\t\t angle = _ref$angle === undefined ? 0 : _ref$angle,\n\t\t _ref$duration = _ref.duration,\n\t\t duration = _ref$duration === undefined ? 400 : _ref$duration;\n\n\t\tthis._axes.setBy({ angle: angle }, duration);\n\n\t\treturn this;\n\t};\n\n\treturn SpinViewer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = SpinViewer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/SpinViewer.js\n// module id = 18\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\nexports.SpriteImage = exports.SpinViewer = undefined;\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar _SpinViewer2 = _interopRequireDefault(_SpinViewer);\n\nvar _SpriteImage = require(\"./SpriteImage\");\n\nvar _SpriteImage2 = _interopRequireDefault(_SpriteImage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.SpinViewer = _SpinViewer2[\"default\"];\nexports.SpriteImage = _SpriteImage2[\"default\"];\n\n\n_SpinViewer2[\"default\"].VERSION = \"3.0.0-rc\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/SpinViewer/index.js\n// module id = 19\n// module chunks = 0 1 4 5","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar STATUS = {\n\t\"NONE\": 0,\n\t\"LOADING\": 1,\n\t\"LOADED\": 2,\n\t\"ERROR\": 3\n};\n\nvar ImageLoader = function () {\n\tfunction ImageLoader(image) {\n\t\t_classCallCheck(this, ImageLoader);\n\n\t\tthis._image = null;\n\t\tthis._onceHandlers = [];\n\t\tthis._loadStatus = STATUS.NONE;\n\n\t\timage && this.set(image);\n\t}\n\n\tImageLoader.prototype.get = function get() {\n\t\tvar _this = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this._image) {\n\t\t\t\trej(\"ImageLoader: image is not defiend\");\n\t\t\t} else if (_this._loadStatus === STATUS.LOADED) {\n\t\t\t\t/* Check isMaybeLoaded() first because there may have posibilities that image already loaded before get is called. for example calling get on external image onload callback.*/\n\t\t\t\tres(_this._image);\n\t\t\t} else if (_this._loadStatus === STATUS.LOADING) {\n\t\t\t\t_this._once(\"load\", function () {\n\t\t\t\t\treturn res(_this._image);\n\t\t\t\t});\n\t\t\t\t_this._once(\"error\", function () {\n\t\t\t\t\treturn rej(\"ImageLoader: failed to load images.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trej(\"ImageLoader: failed to load images\");\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n * @param image img element or img url\n */\n\n\n\tImageLoader.prototype.set = function set(image) {\n\t\tvar _this2 = this;\n\n\t\tthis._loadStatus = STATUS.LOADING;\n\n\t\tif (typeof image === \"string\") {\n\t\t\tthis._image = new Image();\n\t\t\tthis._image.crossOrigin = \"anonymous\";\n\t\t\tthis._image.src = image;\n\t\t} else if ((typeof image === \"undefined\" ? \"undefined\" : _typeof(image)) === \"object\") {\n\t\t\tthis._image = image;\n\t\t}\n\n\t\tif (ImageLoader._isMaybeLoaded(this._image)) {\n\t\t\t// Already loaded image\n\t\t\tthis._loadStatus = STATUS.LOADED;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._once(\"load\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.LOADED;\n\t\t});\n\t\tthis._once(\"error\", function () {\n\t\t\treturn _this2._loadStatus = STATUS.ERROR;\n\t\t});\n\t};\n\n\tImageLoader.prototype.getElement = function getElement() {\n\t\treturn this._image;\n\t};\n\n\tImageLoader._isMaybeLoaded = function _isMaybeLoaded(image) {\n\t\treturn image && image.naturalWidth !== 0;\n\t};\n\n\tImageLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._image;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, fn);\n\t\tthis._onceHandlers.push({ type: type, fn: fn });\n\t};\n\n\tImageLoader.prototype.getStatus = function getStatus() {\n\t\treturn this._loadStatus;\n\t};\n\n\tImageLoader.prototype.destroy = function destroy() {\n\t\tvar _this3 = this;\n\n\t\tthis._onceHandlers.forEach(function (handler) {\n\t\t\t_this3._image.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._onceHandlers = [];\n\t\tthis._image.src = \"\";\n\t\tthis._image = null;\n\t\tthis._loadStatus = STATUS.NONE;\n\t};\n\n\treturn ImageLoader;\n}();\n\nexports[\"default\"] = ImageLoader;\n\n\nImageLoader.STATUS = STATUS;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/ImageLoader.js\n// module id = 20\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _ImageLoader = require(\"./ImageLoader\");\n\nvar _ImageLoader2 = _interopRequireDefault(_ImageLoader);\n\nvar _VideoLoader = require(\"./VideoLoader\");\n\nvar _VideoLoader2 = _interopRequireDefault(_VideoLoader);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nvar _CubeRenderer = require(\"./renderer/CubeRenderer\");\n\nvar _CubeRenderer2 = _interopRequireDefault(_CubeRenderer);\n\nvar _SphereRenderer = require(\"./renderer/SphereRenderer\");\n\nvar _SphereRenderer2 = _interopRequireDefault(_SphereRenderer);\n\nvar _mathUtil = require(\"../utils/math-util.js\");\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 _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\nvar ImageType = {\n\tEQUIRECTANGULAR: \"equirectangular\",\n\tVERTICAL_CUBESTRIP: \"vertical_cubestrip\"\n};\n\nvar DEVICE_PIXEL_RATIO = window.devicePixelRatio || 1;\n\n// DEVICE_PIXEL_RATIO 가 2를 초과하는 경우는 리소스 낭비이므로 2로 맞춘다.\nif (DEVICE_PIXEL_RATIO > 2) {\n\tDEVICE_PIXEL_RATIO = 2;\n}\n\n// define custom events name\n/**\n * TODO: how to manage events/errortype with PanoViewer\n *\n * I think renderer events should be seperated from viewer events although it has same name.\n */\nvar EVENTS = {\n\tBIND_TEXTURE: \"bindTexture\",\n\tIMAGE_LOADED: \"imageLoaded\",\n\tERROR: \"error\",\n\tRENDERING_CONTEXT_LOST: \"renderingContextLost\",\n\tRENDERING_CONTEXT_RESTORE: \"renderingContextRestore\"\n};\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12\n};\n\nvar PanoImageRenderer = function (_Component) {\n\t_inherits(PanoImageRenderer, _Component);\n\n\tfunction PanoImageRenderer(image, width, height, isVideo, sphericalConfig) {\n\t\t_classCallCheck(this, PanoImageRenderer);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\t\t// Super constructor\n\n\n\t\t_this.sphericalConfig = sphericalConfig;\n\t\t_this.fieldOfView = sphericalConfig.fieldOfView;\n\n\t\t_this.width = width;\n\t\t_this.height = height;\n\n\t\t_this._lastQuaternion = null;\n\t\t_this._lastYaw = null;\n\t\t_this._lastPitch = null;\n\t\t_this._lastFieldOfView = null;\n\n\t\t_this.pMatrix = _mathUtil.mat4.create();\n\t\t_this.mvMatrix = _mathUtil.mat4.create();\n\n\t\t// initialzie pMatrix\n\t\t_mathUtil.mat4.perspective(_this.pMatrix, _mathUtil.glMatrix.toRadian(_this.fieldOfView), width / height, 0.1, 100);\n\n\t\t_this.textureCoordBuffer = null;\n\t\t_this.vertexBuffer = null;\n\t\t_this.indexBuffer = null;\n\t\t_this.canvas = _this._initCanvas(width, height);\n\n\t\t_this._image = null;\n\t\t_this._imageIsReady = false;\n\t\t_this._keepUpdate = false; // Flag to specify 'continuous update' on video even when still.\n\n\t\t_this._onContentLoad = _this._onContentLoad.bind(_this);\n\t\t_this._onContentError = _this._onContentError.bind(_this);\n\n\t\tif (image) {\n\t\t\t_this.setImage({ image: image, imageType: sphericalConfig.imageType, isVideo: isVideo });\n\t\t}\n\t\treturn _this;\n\t}\n\n\tPanoImageRenderer.prototype.getContent = function getContent() {\n\t\treturn this._image;\n\t};\n\n\tPanoImageRenderer.prototype.setImage = function setImage(_ref) {\n\t\tvar image = _ref.image,\n\t\t imageType = _ref.imageType,\n\t\t _ref$isVideo = _ref.isVideo,\n\t\t isVideo = _ref$isVideo === undefined ? false : _ref$isVideo;\n\n\t\tthis._imageIsReady = false;\n\t\tthis._isVideo = isVideo;\n\t\tthis._setImageType(imageType);\n\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tif (isVideo) {\n\t\t\tthis._contentLoader = new _VideoLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = true;\n\t\t} else {\n\t\t\tthis._contentLoader = new _ImageLoader2[\"default\"]();\n\t\t\tthis._keepUpdate = false;\n\t\t}\n\n\t\t// img element or img url\n\t\tthis._contentLoader.set(image);\n\n\t\t// 이미지의 사이즈를 캐시한다.\n\t\t// image is reference for content in contentLoader, so it may be not valid if contentLoader is destroyed.\n\t\tthis._image = this._contentLoader.getElement();\n\n\t\treturn this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError);\n\t};\n\n\tPanoImageRenderer.prototype._setImageType = function _setImageType(imageType) {\n\t\tif (!imageType || this._imageType === imageType) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._imageType = imageType;\n\t\tthis._isCubeStrip = imageType === ImageType.VERTICAL_CUBESTRIP;\n\t\tthis._renderer = this._isCubeStrip ? _CubeRenderer2[\"default\"] : _SphereRenderer2[\"default\"];\n\t\tthis._initWebGL();\n\t};\n\n\tPanoImageRenderer.prototype._initCanvas = function _initCanvas(width, height) {\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.bottom = 0;\n\t\tcanvas.style.left = 0;\n\t\tcanvas.style.right = 0;\n\t\tcanvas.style.top = 0;\n\t\tcanvas.style.margin = \"auto\";\n\t\tcanvas.style.maxHeight = \"100%\";\n\t\tcanvas.style.maxWidth = \"100%\";\n\t\tcanvas.style.outline = \"none\";\n\t\tcanvas.style.position = \"absolute\";\n\n\t\t// webgl context lost & restore 관련 이벤트 핸들링\n\t\t// TODO : 어떤 상황에서 발생하는 지 더 알아보자\n\t\tthis._onWebglcontextlost = this._onWebglcontextlost.bind(this);\n\t\tthis._onWebglcontextrestored = this._onWebglcontextrestored.bind(this);\n\n\t\tcanvas.addEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tcanvas.addEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\n\t\treturn canvas;\n\t};\n\n\tPanoImageRenderer.prototype._onContentError = function _onContentError(error) {\n\t\tthis._imageIsReady = false;\n\t\tthis._image = null;\n\n\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\ttype: ERROR_TYPE.FAIL_IMAGE_LOAD,\n\t\t\tmessage: \"failed to load image\"\n\t\t});\n\n\t\treturn false;\n\t};\n\n\tPanoImageRenderer.prototype._onContentLoad = function _onContentLoad(image) {\n\t\tthis._imageIsReady = true;\n\n\t\t// 이벤트 발생. 여기에 핸들러로 render 하는 걸 넣어준다.\n\t\tthis.trigger(EVENTS.IMAGE_LOADED, {\n\t\t\tcontent: this._image,\n\t\t\tisVideo: this._isVideo,\n\t\t\tprojectionType: this._imageType\n\t\t});\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype.isImageLoaded = function isImageLoaded() {\n\t\treturn !!this._image && this._imageIsReady && (!this._isVideo || this._image.readyState >= 2 /* HAVE_CURRENT_DATA */);\n\t};\n\n\tPanoImageRenderer.prototype.cancelLoadImage = function cancelLoadImage() {\n\t\tthis._contentLoader.destroy();\n\t};\n\n\tPanoImageRenderer.prototype.bindTexture = function bindTexture() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._contentLoader) {\n\t\t\t\trej(\"ImageLoader is not initialized\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_this2._contentLoader.get().then(function () {\n\t\t\t\treturn _this2._bindTexture();\n\t\t\t}, rej).then(res);\n\t\t});\n\t};\n\n\t// 부모 엘리먼트에 canvas 를 붙임\n\n\n\tPanoImageRenderer.prototype.attachTo = function attachTo(parentElement) {\n\t\tthis.detach();\n\t\tparentElement.appendChild(this.canvas);\n\t};\n\n\tPanoImageRenderer.prototype.forceContextLoss = function forceContextLoss() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\tvar loseContextExtension = this.context.getExtension(\"WEBGL_lose_context\");\n\n\t\t\tif (loseContextExtension) {\n\t\t\t\tloseContextExtension.loseContext();\n\t\t\t}\n\t\t}\n\t};\n\n\t// 부모 엘리먼트에서 canvas 를 제거\n\n\n\tPanoImageRenderer.prototype.detach = function detach() {\n\t\tif (this.canvas.parentElement) {\n\t\t\tthis.canvas.parentElement.removeChild(this.canvas);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.isAttached = function isAttached() {\n\t\treturn this._image && this.canvas && this.canvas.parentNode;\n\t};\n\n\tPanoImageRenderer.prototype.destroy = function destroy() {\n\t\tif (this._contentLoader) {\n\t\t\tthis._contentLoader.destroy();\n\t\t}\n\n\t\tthis.detach();\n\t\tthis.forceContextLoss();\n\n\t\tthis.off();\n\n\t\tthis.canvas.removeEventListener(\"webglcontextlost\", this._onWebglcontextlost);\n\t\tthis.canvas.removeEventListener(\"webglcontextrestored\", this._onWebglcontextrestored);\n\t};\n\n\tPanoImageRenderer.prototype.hasRenderingContext = function hasRenderingContext() {\n\t\tif (!this.context) {\n\t\t\treturn false;\n\t\t} else if (!this.context.getProgramParameter(this.shaderProgram, this.context.LINK_STATUS) && !this.context.isContextLost()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextlost = function _onWebglcontextlost(e) {\n\t\te.preventDefault();\n\t\tthis.trigger(\"renderingContextLost\");\n\t};\n\n\tPanoImageRenderer.prototype._onWebglcontextrestored = function _onWebglcontextrestored(e) {\n\t\tthis._initWebGL();\n\t\tthis.trigger(\"renderingContextRestore\");\n\t};\n\n\tPanoImageRenderer.prototype.updateFieldOfView = function updateFieldOfView(fieldOfView) {\n\t\tif (this.fieldOfView === fieldOfView) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fieldOfView = fieldOfView;\n\t\tthis._updateViewport();\n\t};\n\n\tPanoImageRenderer.prototype.updateViewportDimensions = function updateViewportDimensions(width, height) {\n\t\tvar viewPortChanged = false;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tvar w = width * DEVICE_PIXEL_RATIO;\n\t\tvar h = height * DEVICE_PIXEL_RATIO;\n\n\t\tif (w !== this.canvas.width) {\n\t\t\tthis.canvas.width = w;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (h !== this.canvas.height) {\n\t\t\tthis.canvas.height = h;\n\t\t\tviewPortChanged = true;\n\t\t}\n\n\t\tif (!viewPortChanged) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateViewport();\n\t\tthis._shouldForceDraw = true;\n\t};\n\n\tPanoImageRenderer.prototype._updateViewport = function _updateViewport() {\n\t\t_mathUtil.mat4.perspective(this.pMatrix, _mathUtil.glMatrix.toRadian(this.fieldOfView), this.canvas.width / this.canvas.height, 0.1, 100);\n\n\t\tthis.context.viewport(0, 0, this.context.drawingBufferWidth, this.context.drawingBufferHeight);\n\t};\n\n\tPanoImageRenderer.prototype._initWebGL = function _initWebGL() {\n\t\t// TODO: Following code does need to be executed only if width/height, cubicStrip property is changed.\n\t\ttry {\n\t\t\tthis._initRenderingContext();\n\t\t\tthis.updateViewportDimensions(this.width, this.height);\n\n\t\t\tif (this.shaderProgram) {\n\t\t\t\tthis.context.deleteProgram(this.shaderProgram);\n\t\t\t}\n\n\t\t\tthis.shaderProgram = this._initShaderProgram(this.context);\n\t\t\tif (!this.shaderProgram) {\n\t\t\t\tthrow new Error(\"Failed to intialize shaders: \" + _WebGLUtils2[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));\n\t\t\t}\n\n\t\t\t// Buffers for shader\n\t\t\tthis._initBuffers();\n\t\t} catch (e) {\n\t\t\tthis.trigger(EVENTS.ERROR, {\n\t\t\t\ttype: ERROR_TYPE.NO_WEBGL,\n\t\t\t\tmessage: \"no webgl support\"\n\t\t\t});\n\t\t\tthis.destroy();\n\t\t\treturn;\n\t\t}\n\t\t// 캔버스를 투명으로 채운다.\n\t\tthis.context.clearColor(0, 0, 0, 0);\n\t\tvar textureTarget = this._isCubeStrip ? this.context.TEXTURE_CUBE_MAP : this.context.TEXTURE_2D;\n\n\t\tif (this.texture) {\n\t\t\tthis.context.deleteTexture(this.texture);\n\t\t}\n\n\t\tthis.texture = _WebGLUtils2[\"default\"].createTexture(this.context, textureTarget);\n\t};\n\n\tPanoImageRenderer.prototype._initRenderingContext = function _initRenderingContext() {\n\t\tif (this.hasRenderingContext()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window.WebGLRenderingContext) {\n\t\t\tthrow new Error(\"WebGLRenderingContext not available.\");\n\t\t}\n\n\t\tthis.context = _WebGLUtils2[\"default\"].getWebglContext(this.canvas);\n\n\t\tif (!this.context) {\n\t\t\tthrow new Error(\"Failed to acquire 3D rendering context\");\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._initShaderProgram = function _initShaderProgram(gl) {\n\t\tvar vertexShaderSource = this._renderer.getVertexShaderSource();\n\t\tvar vertexShader = _WebGLUtils2[\"default\"].createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n\n\t\tif (!vertexShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar fragmentShaderSource = this._renderer.getFragmentShaderSource();\n\t\tvar fragmentShader = _WebGLUtils2[\"default\"].createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);\n\n\t\tif (!fragmentShader) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar shaderProgram = _WebGLUtils2[\"default\"].createProgram(gl, vertexShader, fragmentShader);\n\n\t\tif (!shaderProgram) {\n\t\t\treturn null;\n\t\t}\n\n\t\tgl.useProgram(shaderProgram);\n\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\n\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"uPMatrix\");\n\t\tshaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, \"uMVMatrix\");\n\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\tif (!this._isCubeStrip) {\n\t\t\tshaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\n\t\t\tgl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\n\t\t}\n\n\t\treturn shaderProgram;\n\t};\n\n\tPanoImageRenderer.prototype._initBuffers = function _initBuffers() {\n\t\tvar vertexPositionData = this._renderer.getVertexPositionData();\n\t\tvar indexData = this._renderer.getIndexData();\n\t\tvar textureCoordData = this._renderer.getTextureCoordData();\n\t\tvar gl = this.context;\n\n\t\tthis.vertexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(vertexPositionData), 3, this.shaderProgram.vertexPositionAttribute);\n\n\t\tthis.indexBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), 1);\n\n\t\tif (textureCoordData !== null) {\n\t\t\tthis.textureCoordBuffer = _WebGLUtils2[\"default\"].initBuffer(gl, gl.ARRAY_BUFFER, new Float32Array(textureCoordData), 2, this.shaderProgram.textureCoordAttribute);\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._bindTexture = function _bindTexture() {\n\t\tthis._renderer.bindTexture(this.context, this.texture, this._image);\n\t\tthis._shouldForceDraw = true;\n\n\t\tthis.trigger(EVENTS.BIND_TEXTURE);\n\t};\n\n\tPanoImageRenderer.prototype.renderWithQuaternion = function renderWithQuaternion(quaternion, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 항상 그려줄려고 강제로 플래그 올림... 원래 이러면 안됨\n\t\tthis._shouldForceDraw = true;\n\n\t\tif (this._lastQuaternion && _mathUtil.quat.exactEquals(this._lastQuaternion, quaternion) && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\tvar adgustedQ = void 0;\n\n\t\t// equirectangular 의 경우 이미지의 중심을 0,0 으로 맞추기 위해 렌더링 시 yaw 축을 조정한다.\n\t\tif (!this._isCubeStrip) {\n\t\t\tvar adjustYaw = _mathUtil.quat.rotateY(_mathUtil.quat.create(), _mathUtil.quat.create(), _mathUtil.glMatrix.toRadian(-90));\n\n\t\t\tadgustedQ = _mathUtil.quat.multiply(_mathUtil.quat.create(), adjustYaw, quaternion);\n\t\t} else {\n\t\t\tadgustedQ = quaternion;\n\t\t}\n\n\t\tthis.mvMatrix = _mathUtil.mat4.fromQuat(_mathUtil.mat4.create(), _mathUtil.quat.conjugate(_mathUtil.quat.create(), adgustedQ));\n\n\t\tthis._draw();\n\n\t\tthis._lastQuaternion = _mathUtil.quat.clone(quaternion);\n\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype.keepUpdate = function keepUpdate(doUpdate) {\n\t\tif (doUpdate && this.isImageLoaded() === false) {\n\t\t\t// Force to draw a frame after image is loaded on render()\n\t\t\tthis._shouldForceDraw = true;\n\t\t}\n\n\t\tthis._keepUpdate = doUpdate;\n\t};\n\n\tPanoImageRenderer.prototype.render = function render(yaw, pitch, fieldOfView) {\n\t\tif (!this.isImageLoaded()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._keepUpdate === false && this._lastYaw !== null && this._lastYaw === yaw && this._lastPitch !== null && this._lastPitch === pitch && this.fieldOfView && this.fieldOfView === fieldOfView && this._shouldForceDraw === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// fieldOfView 가 존재하면서 기존의 값과 다를 경우에만 업데이트 호출\n\t\tif (fieldOfView !== undefined && fieldOfView !== this.fieldOfView) {\n\t\t\tthis.updateFieldOfView(fieldOfView);\n\t\t}\n\n\t\t_mathUtil.mat4.identity(this.mvMatrix);\n\t\t_mathUtil.mat4.rotateX(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(pitch));\n\t\t_mathUtil.mat4.rotateY(this.mvMatrix, this.mvMatrix, -_mathUtil.glMatrix.toRadian(yaw - (this._isCubeStrip ? 0 : 90)));\n\n\t\tthis._draw();\n\n\t\tthis._lastYaw = yaw;\n\t\tthis._lastPitch = pitch;\n\t\tif (this._shouldForceDraw) {\n\t\t\tthis._shouldForceDraw = false;\n\t\t}\n\t};\n\n\tPanoImageRenderer.prototype._draw = function _draw() {\n\t\tvar gl = this.context;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n\t\tgl.uniform1i(this.shaderProgram.samplerUniform, 0);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform, false, this.pMatrix);\n\t\tgl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.mvMatrix);\n\n\t\tif (this._isVideo) {\n\t\t\tthis._renderer.texImage2D(this.context, this._image);\n\t\t}\n\n\t\tif (this.indexBuffer) {\n\t\t\tgl.drawElements(gl.TRIANGLES, this.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\n\t\t}\n\t};\n\n\treturn PanoImageRenderer;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = PanoImageRenderer;\n\n\nPanoImageRenderer.EVENTS = EVENTS;\nPanoImageRenderer.ERROR_TYPE = ERROR_TYPE;\nPanoImageRenderer.ImageType = ImageType;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/PanoImageRenderer.js\n// module id = 21\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Promise = typeof Promise === 'undefined' ? require('es6-promise').Promise : Promise;\n\n/* Ref https://www.w3schools.com/tags/av_prop_readystate.asp */\nvar READY_STATUS = {\n\tHAVE_NOTHING: 0, // no information whether or not the audio/video is ready\n\tHAVE_METADATA: 1, // HAVE_METADATA - metadata for the audio/video is ready\n\tHAVE_CURRENT_DATA: 2, // data for the current playback position is available, but not enough data to play next frame/millisecond\n\tHAVE_FUTURE_DATA: 3, // data for the current and at least the next frame is available\n\tHAVE_ENOUGH_DATA: 4 // enough data available to start playing\n};\n\nvar VideoLoader = function () {\n\tfunction VideoLoader(video) {\n\t\t_classCallCheck(this, VideoLoader);\n\n\t\tthis._handlers = [];\n\t\tthis._sourceCount = 0;\n\n\t\tvideo && this.set(video);\n\t}\n\n\t/**\n *\n * @param {Object | String} video Object or String containing Video Source URL비디오 URL 정보를 담고 있는 문자열이나 객체 {type, src}\n */\n\n\n\tVideoLoader.prototype._appendSourceElement = function _appendSourceElement(videoUrl) {\n\t\tvar videoSrc = void 0;\n\t\tvar videoType = void 0;\n\n\t\tif ((typeof videoUrl === \"undefined\" ? \"undefined\" : _typeof(videoUrl)) === \"object\") {\n\t\t\tvideoSrc = videoUrl.src;\n\t\t\tvideoType = videoUrl.type;\n\t\t} else if (typeof videoUrl === \"string\") {\n\t\t\tvideoSrc = videoUrl;\n\t\t}\n\n\t\tif (!videoSrc) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar sourceElement = document.createElement(\"source\");\n\n\t\tsourceElement.src = videoSrc;\n\t\tvideoType && (sourceElement.type = videoType);\n\n\t\tthis._video.appendChild(sourceElement);\n\t\tthis._sourceCount++;\n\t\treturn true;\n\t};\n\n\tVideoLoader.prototype.set = function set(video) {\n\t\tvar _this = this;\n\n\t\tthis._reset(); // reset resources.\n\n\t\tif (video instanceof HTMLVideoElement) {\n\t\t\t// video tag\n\t\t\tthis._video = video;\n\t\t} else if (typeof video === \"string\" || (typeof video === \"undefined\" ? \"undefined\" : _typeof(video)) === \"object\") {\n\t\t\t// url\n\t\t\tthis._video = document.createElement(\"video\");\n\t\t\tthis._video.crossOrigin = \"anonymous\";\n\n\t\t\tif (video instanceof Array) {\n\t\t\t\tvideo.forEach(function (v) {\n\t\t\t\t\treturn _this._appendSourceElement(v);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis._appendSourceElement(video);\n\t\t\t}\n\n\t\t\tif (this._sourceCount > 0) {\n\t\t\t\tthis._video.load();\n\t\t\t} else {\n\t\t\t\tthis._video = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tVideoLoader.prototype.get = function get() {\n\t\tvar _this2 = this;\n\n\t\treturn new _Promise(function (res, rej) {\n\t\t\tif (!_this2._video) {\n\t\t\t\trej(\"VideoLoader: video is undefined\");\n\t\t\t} else if (_this2._video.readyState >= READY_STATUS.HAVE_CURRENT_DATA) {\n\t\t\t\tres(_this2._video);\n\t\t\t} else {\n\t\t\t\t_this2._once(\"loadeddata\", function () {\n\t\t\t\t\treturn res(_this2._video);\n\t\t\t\t});\n\t\t\t\t// DO NOT HANDLE ERRORS, DELEGATE IT TO USER BY USING VIDEO ELEMENT.\n\t\t\t\t// this._once(\"error\", e => rej(`VideoLoader: failed to load ${e.target.src}`));\n\t\t\t}\n\t\t});\n\t};\n\n\tVideoLoader.prototype.getElement = function getElement() {\n\t\treturn this._video;\n\t};\n\n\tVideoLoader.prototype.destroy = function destroy() {\n\t\tthis._reset();\n\t};\n\n\tVideoLoader.prototype._reset = function _reset() {\n\t\tvar _this3 = this;\n\n\t\tthis._handlers.forEach(function (handler) {\n\t\t\t_this3._video.removeEventListener(handler.type, handler.fn);\n\t\t});\n\t\tthis._handlers = [];\n\t\tthis._video = null;\n\n\t\tthis._sourceCount = 0;\n\t};\n\n\tVideoLoader.prototype._once = function _once(type, listener) {\n\t\tvar target = this._video;\n\n\t\tvar fn = function fn(event) {\n\t\t\ttarget.removeEventListener(type, fn);\n\t\t\tlistener(event);\n\t\t};\n\n\t\t/* By useCapture mode enabled, you can capture the error event being fired on source(child)*/\n\t\ttarget.addEventListener(type, fn, true);\n\t\tthis._handlers.push({ type: type, fn: fn });\n\t};\n\n\treturn VideoLoader;\n}();\n\nexports[\"default\"] = VideoLoader;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/VideoLoader.js\n// module id = 22\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.WebGLUtils = exports.PanoImageRenderer = undefined;\n\nvar _PanoImageRenderer = require(\"./PanoImageRenderer\");\n\nvar _PanoImageRenderer2 = _interopRequireDefault(_PanoImageRenderer);\n\nvar _WebGLUtils = require(\"./WebGLUtils\");\n\nvar _WebGLUtils2 = _interopRequireDefault(_WebGLUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.PanoImageRenderer = _PanoImageRenderer2[\"default\"];\nexports.WebGLUtils = _WebGLUtils2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/index.js\n// module id = 23\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _agent = require(\"@egjs/agent\");\n\nvar _agent2 = _interopRequireDefault(_agent);\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\n\nvar _mathUtil = require(\"../../utils/math-util.js\");\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 CubeRenderer = function (_Renderer) {\n\t_inherits(CubeRenderer, _Renderer);\n\n\tfunction CubeRenderer() {\n\t\t_classCallCheck(this, CubeRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tCubeRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tCubeRenderer._VERTEX_POSITION_DATA = CubeRenderer._VERTEX_POSITION_DATA !== null ? CubeRenderer._VERTEX_POSITION_DATA : [\n\t\t// back\n\t\t1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,\n\n\t\t// front\n\t\t-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n\n\t\t// top\n\t\t1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1,\n\n\t\t// bottom\n\t\t-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,\n\n\t\t// right\n\t\t1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,\n\n\t\t// left\n\t\t-1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1];\n\n\t\treturn CubeRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tCubeRenderer.getIndexData = function getIndexData() {\n\t\tif (CubeRenderer._INDEX_DATA) {\n\t\t\treturn CubeRenderer._INDEX_DATA;\n\t\t}\n\n\t\tvar indexData = [];\n\t\tvar vertexPositionData = CubeRenderer.getVertexPositionData();\n\n\t\tfor (var i = 0; i < vertexPositionData.length / 3; i += 4) {\n\t\t\tindexData.push(i, i + 2, i + 1, i, i + 3, i + 2);\n\t\t}\n\n\t\tCubeRenderer._INDEX_DATA = indexData;\n\t\treturn indexData;\n\t};\n\n\tCubeRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\treturn null;\n\t};\n\n\tCubeRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvVertexDirectionVector = aVertexPosition;\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec3 vVertexDirectionVector;\\n\\t\\t\\tuniform samplerCube uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = textureCube(uSampler, vVertexDirectionVector);\\n\\t\\t\\t}\";\n\t};\n\n\tCubeRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n\n\t\t\tthis.texImage2D(gl, image);\n\t\t} catch (e) {}\n\t};\n\n\tCubeRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tvar agent = (0, _agent2[\"default\"])();\n\t\tvar width = image.naturalWidth || image.videoWidth;\n\t\tvar height = image.naturalHeight || image.videoHeight;\n\t\tvar hasDrawImageBug = CubeRenderer.hasDrawImageBug(agent);\n\t\tvar maxCubeMapTextureSize = CubeRenderer.getMaxCubeMapTextureSize(gl, image, agent);\n\t\tvar heightScale = CubeRenderer.getHightScale(width, agent);\n\n\t\tif (!hasDrawImageBug) {\n\t\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\t\tcanvas.width = maxCubeMapTextureSize;\n\t\t\tcanvas.height = maxCubeMapTextureSize;\n\t\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t\tfor (var surfaceIdx = 0; surfaceIdx < 6; surfaceIdx++) {\n\t\t\t\tcontext.drawImage(image, 0, surfaceIdx * (width * heightScale), width, width * heightScale, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + surfaceIdx, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);\n\t\t\t}\n\t\t} else {\n\t\t\t// #288, drawImage bug\n\t\t\tvar halfCanvas = document.createElement(\"canvas\");\n\t\t\tvar _context = halfCanvas.getContext(\"2d\");\n\n\t\t\thalfCanvas.width = maxCubeMapTextureSize * 3;\n\t\t\thalfCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tvar tileCanvas = document.createElement(\"canvas\");\n\t\t\tvar tileContext = tileCanvas.getContext(\"2d\");\n\n\t\t\ttileCanvas.width = maxCubeMapTextureSize;\n\t\t\ttileCanvas.height = maxCubeMapTextureSize;\n\n\t\t\tfor (var i = 0; i < 2; i++) {\n\t\t\t\t_context.save();\n\t\t\t\t_context.translate(0, maxCubeMapTextureSize);\n\t\t\t\t_context.rotate(-Math.PI / 2);\n\t\t\t\t_context.scale(1 / 3, 3);\n\t\t\t\t_context.drawImage(image, 0, width * 3 * i * heightScale, width, height / 2 * heightScale, 0, 0, halfCanvas.width, halfCanvas.height);\n\t\t\t\t_context.restore();\n\t\t\t\tfor (var j = 0; j < 3; j++) {\n\t\t\t\t\ttileContext.save();\n\t\t\t\t\ttileContext.translate(maxCubeMapTextureSize, 0);\n\t\t\t\t\ttileContext.rotate(Math.PI / 2);\n\t\t\t\t\ttileContext.drawImage(halfCanvas, j * width, 0, width, width, 0, 0, maxCubeMapTextureSize, maxCubeMapTextureSize);\n\t\t\t\t\ttileContext.restore();\n\t\t\t\t\tgl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i * 3 + j, 0, gl.RGBA, maxCubeMapTextureSize, maxCubeMapTextureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE, tileCanvas);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tCubeRenderer.getMaxCubeMapTextureSize = function getMaxCubeMapTextureSize(gl, image, agent) {\n\t\tvar maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tvar _imageWidth = image.naturalWidth || image.videoWidth;\n\n\t\tif (agent.browser.name === \"ie\" && parseInt(agent.browser.version, 10) === 11) {\n\t\t\tif (!_mathUtil.util.isPowerOfTwo(_imageWidth)) {\n\t\t\t\tfor (var i = 1; i < maxCubeMapTextureSize; i *= 2) {\n\t\t\t\t\tif (i < _imageWidth) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_imageWidth = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// ios 9 의 경우 텍스쳐 최대사이즈는 1024 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 9) {\n\t\t\t_imageWidth = 1024;\n\t\t}\n\t\t// ios 8 의 경우 텍스쳐 최대사이즈는 512 이다.\n\t\tif (agent.os.name === \"ios\" && parseInt(agent.os.version, 10) === 8) {\n\t\t\t_imageWidth = 512;\n\t\t}\n\t\t// maxCubeMapTextureSize 보다는 작고, imageWidth 보다 큰 2의 승수 중 가장 작은 수\n\t\treturn Math.min(maxCubeMapTextureSize, _imageWidth);\n\t};\n\n\tCubeRenderer.getHightScale = function getHightScale(width, agent) {\n\t\t// 안드로이드 4.3 이하 크롬과 안드로이드 5.0.2 삼성브라우저 버그해결을 위해 세로크기에 스케일값 적용\n\t\t// 참고 : https://code.google.com/p/android/issues/detail?id=5141\n\t\tvar heightScale = 1;\n\n\t\t// TODO : 갤럭시 S브라우저에서 drawImage 메서드의 이미지, height 값이 일정 비율로 뻥튀기 되는 버그가 있다.\n\t\t// 추후 drawImage 메서드를 사용하지 않는 방식으로 개선하여 해당 버그를 접할 일이 없도록 해야 함.\n\t\tif (agent.os.name === \"android\") {\n\t\t\tif (parseFloat(agent.os.version) <= 4.3 && agent.browser.name === \"chrome\" || agent.os.version === \"5.0.2\" && agent.browser.name === \"samsung internet\" || agent.os.version === \"5.1.1\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-N920\") !== -1 &&\n\t\t\t// 삼성인터넷 버전 4 미만\n\t\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 4) {\n\t\t\t\theightScale = 768 / width;\n\t\t\t} else if (agent.os.version === \"5.0\" && agent.browser.name === \"samsung internet\" && window.navigator.userAgent.indexOf(\"SM-G900\") !== -1) {\n\t\t\t\theightScale = 1344 / width;\n\t\t\t}\n\t\t}\n\n\t\treturn heightScale;\n\t};\n\n\tCubeRenderer.hasDrawImageBug = function hasDrawImageBug(agent) {\n\t\tvar hasBug = false;\n\n\t\tif (agent.browser.name === \"samsung internet\" &&\n\t\t// 삼성인터넷 버전 5 미만\n\t\tparseFloat(window.navigator.userAgent.split(\"SamsungBrowser/\")[1].split(\" \")[0]) < 5 || agent.os.name === \"ios\" && parseInt(agent.os.version, 10) <= 9) {\n\t\t\thasBug = true;\n\t\t}\n\n\t\treturn hasBug;\n\t};\n\n\treturn CubeRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = CubeRenderer;\n\n\nCubeRenderer._VERTEX_POSITION_DATA = null;\nCubeRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/CubeRenderer.js\n// module id = 24\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _Renderer2 = require(\"./Renderer.js\");\n\nvar _Renderer3 = _interopRequireDefault(_Renderer2);\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 SphereRenderer = function (_Renderer) {\n\t_inherits(SphereRenderer, _Renderer);\n\n\tfunction SphereRenderer() {\n\t\t_classCallCheck(this, SphereRenderer);\n\n\t\treturn _possibleConstructorReturn(this, _Renderer.apply(this, arguments));\n\t}\n\n\tSphereRenderer.getVertexPositionData = function getVertexPositionData() {\n\t\tif (SphereRenderer._VERTEX_POSITION_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._VERTEX_POSITION_DATA;\n\t};\n\n\tSphereRenderer.getIndexData = function getIndexData() {\n\t\tif (SphereRenderer._INDEX_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._INDEX_DATA;\n\t};\n\n\tSphereRenderer.getTextureCoordData = function getTextureCoordData() {\n\t\tif (SphereRenderer._TEXTURE_COORD_DATA === null) {\n\t\t\tSphereRenderer._initData();\n\t\t}\n\n\t\treturn SphereRenderer._TEXTURE_COORD_DATA;\n\t};\n\n\tSphereRenderer.getVertexShaderSource = function getVertexShaderSource() {\n\t\treturn \"\\n\\t\\t\\tattribute vec3 aVertexPosition;\\n\\t\\t\\tattribute vec2 aTextureCoord;\\n\\t\\t\\tuniform mat4 uMVMatrix;\\n\\t\\t\\tuniform mat4 uPMatrix;\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\\n\\t\\t\\t\\tvTextureCoord = aTextureCoord;\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.getFragmentShaderSource = function getFragmentShaderSource() {\n\t\treturn \"\\n\\t\\t\\tvarying highp vec2 vTextureCoord;\\n\\t\\t\\tuniform sampler2D uSampler;\\n\\t\\t\\tvoid main(void) {\\n\\t\\t\\t\\tgl_FragColor = texture2D(\\n\\t\\t\\t\\t\\tuSampler,\\n\\t\\t\\t\\t\\tvec2(vTextureCoord.s, vTextureCoord.t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\";\n\t};\n\n\tSphereRenderer.bindTexture = function bindTexture(gl, texture, image) {\n\t\tif (!image) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure image isn't too big\n\t\tvar width = Math.max(image.width, image.height);\n\t\tvar maxWidth = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\n\t\tif (width > maxWidth) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(\"Image width(\" + width + \") exceeds device limit(\" + maxWidth + \"))\");\n\t\t\t/* eslint-enable no-console */\n\t\t\treturn;\n\t\t}\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\t// Draw first frame\n\t\tthis.texImage2D(gl, image);\n\t};\n\n\t/**\n * https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexImage2D.xml\n */\n\n\n\tSphereRenderer.texImage2D = function texImage2D(gl, image) {\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t};\n\n\tSphereRenderer._initData = function _initData() {\n\t\tvar latitudeBands = 60;\n\t\tvar longitudeBands = 60;\n\t\tvar radius = 2;\n\n\t\tvar textureCoordData = [];\n\t\tvar vertexPositionData = [];\n\t\tvar indexData = [];\n\t\tvar latIdx = void 0;\n\t\tvar lngIdx = void 0;\n\n\t\tfor (latIdx = 0; latIdx <= latitudeBands; latIdx++) {\n\t\t\tvar theta = (latIdx / latitudeBands - 0.5) * Math.PI;\n\t\t\tvar sinTheta = Math.sin(theta);\n\t\t\tvar cosTheta = Math.cos(theta);\n\n\t\t\tfor (lngIdx = 0; lngIdx <= longitudeBands; lngIdx++) {\n\t\t\t\tvar phi = (lngIdx / longitudeBands - 0.5) * 2 * Math.PI;\n\t\t\t\tvar sinPhi = Math.sin(phi);\n\t\t\t\tvar cosPhi = Math.cos(phi);\n\t\t\t\tvar x = cosPhi * cosTheta;\n\t\t\t\tvar y = sinTheta;\n\t\t\t\tvar z = sinPhi * cosTheta;\n\t\t\t\tvar u = lngIdx / longitudeBands;\n\t\t\t\tvar v = latIdx / latitudeBands;\n\n\t\t\t\ttextureCoordData.push(u, v);\n\t\t\t\tvertexPositionData.push(radius * x, radius * y, radius * z);\n\n\t\t\t\tif (lngIdx !== longitudeBands && latIdx !== latitudeBands) {\n\t\t\t\t\tvar a = latIdx * (longitudeBands + 1) + lngIdx;\n\t\t\t\t\tvar b = a + longitudeBands + 1;\n\n\t\t\t\t\tindexData.push(a, b, a + 1, b, b + 1, a + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSphereRenderer._VERTEX_POSITION_DATA = vertexPositionData;\n\t\tSphereRenderer._TEXTURE_COORD_DATA = textureCoordData;\n\t\tSphereRenderer._INDEX_DATA = indexData;\n\t};\n\n\treturn SphereRenderer;\n}(_Renderer3[\"default\"]);\n\nexports[\"default\"] = SphereRenderer;\n\n\nSphereRenderer._VERTEX_POSITION_DATA = null;\nSphereRenderer._TEXTURE_COORD_DATA = null;\nSphereRenderer._INDEX_DATA = null;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoImageRenderer/renderer/SphereRenderer.js\n// module id = 25\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _consts = require(\"../YawPitchControl/consts\");\n\nvar ERROR_TYPE = {\n\tINVALID_DEVICE: 10,\n\tNO_WEBGL: 11,\n\tFAIL_IMAGE_LOAD: 12,\n\tFAIL_BIND_TEXTURE: 13,\n\tINVALID_RESOURCE: 14,\n\tRENDERING_CONTEXT_LOST: 15\n};\n\nvar EVENTS = {\n\tREADY: \"ready\",\n\tVIEW_CHANGE: \"viewChange\",\n\tANIMATION_END: \"animationEnd\",\n\tERROR: \"error\",\n\tCONTENT_LOADED: \"contentLoaded\"\n};\n\nmodule.exports = {\n\tGYRO_MODE: _consts.GYRO_MODE,\n\tEVENTS: EVENTS,\n\tERROR_TYPE: ERROR_TYPE\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/PanoViewer/consts.js\n// module id = 26\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _axes = require(\"@egjs/axes\");\n\nvar _axes2 = _interopRequireDefault(_axes);\n\nvar _browser = require(\"./browser\");\n\nvar _WheelInput = require(\"./input/WheelInput\");\n\nvar _WheelInput2 = _interopRequireDefault(_WheelInput);\n\nvar _TiltMotionInput = require(\"./input/TiltMotionInput\");\n\nvar _TiltMotionInput2 = _interopRequireDefault(_TiltMotionInput);\n\nvar _mathUtil = require(\"../utils/math-util\");\n\nvar _consts = require(\"./consts\");\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 DEFAULT_YAW_RANGE = [-_consts.YAW_RANGE_HALF, _consts.YAW_RANGE_HALF];\nvar DEFAULT_PITCH_RANGE = [-_consts.PITCH_RANGE_HALF, _consts.PITCH_RANGE_HALF];\n/**\n * A module used to provide coordinate based on yaw/pitch orientation. This module receives user touch action, keyboard, mouse and device orientation(if it exists) as input, then combines them and converts it to yaw/pitch coordinates.\n *\n * @alias eg.YawPitchControl\n * @extends eg.Component\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nvar YawPitchControl = function (_Component) {\n\t_inherits(YawPitchControl, _Component);\n\n\t/**\n * @param {Object} options The option object of the eg.YawPitch module\n * @param {Element}[options.element=null] element A base element for the eg.YawPitch module\n * @param {Number} [options.yaw=0] initial yaw (degree)\n * @param {Number} [options.pitch=0] initial pitch (degree)\n * @param {Number} [options.fov=65] initial field of view (degree)\n * @param {Boolean} [optiosn.showPolePoint=true] Indicates whether pole is shown\n * @param {Boolean} [options.useZoom=true] Indicates whether zoom is available\n * @param {Boolean} [options.useKeyboard=true] Indicates whether keyboard is enabled\n * @param {String} [config.useGyro=yawPitch] Enables control through device motion.\n * @param {Number} [options.touchDirection=TOUCH_DIRECTION_ALL] Direction of the touch movement (TOUCH_DIRECTION_ALL: all, TOUCH_DIRECTION_YAW: horizontal, TOUCH_DIRECTION_PITCH: vertical, TOUCH_DIRECTION_NONE: no move)\n * @param {Array} [options.yawRange=[-180, 180] Range of visible yaw\n * @param {Array} [options.pitchRange=[-90, 90] Range of visible pitch\n * @param {Array} [options.fovRange=[30, 110] Range of FOV\n * @param {Number} [options.aspectRatio=1] Aspect Ratio\n */\n\tfunction YawPitchControl(options) {\n\t\t_classCallCheck(this, YawPitchControl);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\tvar opt = _extends({\n\t\t\telement: null,\n\t\t\tyaw: 0,\n\t\t\tpitch: 0,\n\t\t\tfov: 65,\n\t\t\tshowPolePoint: false,\n\t\t\tuseZoom: true,\n\t\t\tuseKeyboard: true,\n\t\t\tuseGyro: _consts.GYRO_MODE.YAWPITCH,\n\t\t\ttouchDirection: _consts.TOUCH_DIRECTION_ALL,\n\t\t\tyawRange: DEFAULT_YAW_RANGE,\n\t\t\tpitchRange: DEFAULT_PITCH_RANGE,\n\t\t\tfovRange: [30, 110],\n\t\t\taspectRatio: 1 /* TODO: Need Mandatory? */\n\t\t}, options);\n\n\t\t_this._element = opt.element;\n\t\t_this._initialFov = opt.fov;\n\t\t_this._enabled = false;\n\t\t_this._isAnimating = false;\n\n\t\t_this._initAxes(opt);\n\t\t_this.option(opt);\n\t\treturn _this;\n\t}\n\n\tYawPitchControl.prototype._initAxes = function _initAxes(opt) {\n\t\tvar _this2 = this;\n\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, opt.fov, opt.aspectRatio);\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, opt.fov, opt.showPolePoint);\n\t\tvar circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\tthis.axesPanInput = new _axes2[\"default\"].PanInput(this._element);\n\t\tthis.axesWheelInput = new _WheelInput2[\"default\"](this._element, { scale: 4 });\n\t\tthis.axesTiltMotionInput = _browser.SUPPORT_DEVICEMOTION ? new _TiltMotionInput2[\"default\"](this._element) : null;\n\t\tthis.axesPinchInput = _browser.SUPPORT_TOUCH ? new _axes2[\"default\"].PinchInput(this._element, { scale: -1 }) : null;\n\t\tthis.axesMoveKeyInput = new _axes2[\"default\"].MoveKeyInput(this._element, { scale: [-6, 6] });\n\n\t\tthis.axes = new _axes2[\"default\"]({\n\t\t\tyaw: {\n\t\t\t\trange: yRange,\n\t\t\t\tcircular: circular,\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tpitch: {\n\t\t\t\trange: pRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t},\n\t\t\tfov: {\n\t\t\t\trange: opt.fovRange,\n\t\t\t\tcircular: [false, false],\n\t\t\t\tbounce: [0, 0]\n\t\t\t}\n\t\t}, {\n\t\t\tdeceleration: _consts.MC_DECELERATION,\n\t\t\tmaximumDuration: _consts.MC_MAXIMUM_DURATION\n\t\t}, {\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}).on({\n\t\t\thold: function hold(evt) {\n\t\t\t\t_this2.trigger(\"hold\");\n\t\t\t},\n\t\t\tchange: function change(evt) {\n\t\t\t\tif (evt.delta.fov !== 0) {\n\t\t\t\t\t_this2._setPanScale(evt.pos.fov);\n\t\t\t\t\t_this2._updateControlScale(evt);\n\t\t\t\t}\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\trelease: function release(evt) {\n\t\t\t\t_this2._triggerChange();\n\t\t\t},\n\t\t\tanimationStart: function animationStart(evt) {},\n\t\t\tanimationEnd: function animationEnd(evt) {\n\t\t\t\t_this2.trigger(\"animationEnd\");\n\t\t\t}\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._setPanScale = function _setPanScale(fov) {\n\t\tvar areaHeight = parseInt((0, _browser.getComputedStyle)(this._element).height, 10);\n\t\tvar scale = _consts.MC_BIND_SCALE[0] * fov / this._initialFov * _consts.PAN_SCALE / areaHeight;\n\n\t\tthis.axesPanInput.options.scale = [scale, scale];\n\t\tthis.axes.options.deceleration = _consts.MC_DECELERATION * fov / _consts.MAX_FIELD_OF_VIEW;\n\t};\n\n\t/*\n * Override component's option method\n * to call method for updating values which is affected by option change.\n *\n * @param {*} args\n */\n\n\n\tYawPitchControl.prototype.option = function option() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tvar argLen = args.length;\n\n\t\t// Getter\n\t\tif (argLen === 0) {\n\t\t\treturn this._getOptions();\n\t\t} else if (argLen === 1 && typeof args[0] === \"string\") {\n\t\t\treturn this._getOptions(args[0]);\n\t\t}\n\n\t\t// Setter\n\t\tvar beforeOptions = _extends({}, this.options);\n\t\tvar newOptions = {};\n\t\tvar changedKeyList = []; // TODO: if value is not changed, then do not push on changedKeyList.\n\n\t\tif (argLen === 1) {\n\t\t\tchangedKeyList = Object.keys(args[0]);\n\t\t\tnewOptions = _extends({}, args[0]);\n\t\t} else if (argLen >= 2) {\n\t\t\tchangedKeyList.push(args[0]);\n\t\t\tnewOptions[args[0]] = args[1];\n\t\t}\n\n\t\tthis._setOptions(this._getValidatedOptions(newOptions));\n\t\tthis._applyOptions(changedKeyList, beforeOptions);\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._getValidatedOptions = function _getValidatedOptions(newOptions) {\n\t\tif (newOptions.yawRange) {\n\t\t\tnewOptions.yawRange = this._getValidYawRange(newOptions.yawRange, newOptions.fov, newOptions.aspectRatio);\n\t\t}\n\t\tif (newOptions.pitchRange) {\n\t\t\tnewOptions.pitchRange = this._getValidPitchRange(newOptions.pitchRange, newOptions.fov);\n\t\t}\n\t\treturn newOptions;\n\t};\n\n\tYawPitchControl.prototype._getOptions = function _getOptions(key) {\n\t\tvar value = void 0;\n\n\t\tif (typeof key === \"string\") {\n\t\t\tvalue = this.options[key];\n\t\t} else if (arguments.length === 0) {\n\t\t\tvalue = this.options;\n\t\t}\n\t\treturn value;\n\t};\n\n\tYawPitchControl.prototype._setOptions = function _setOptions(options) {\n\t\tfor (var key in options) {\n\t\t\tthis.options[key] = options[key];\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._applyOptions = function _applyOptions(keys, prevOptions) {\n\t\t// If one of below is changed, call updateControlScale()\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"showPolePoint\" || key === \"fov\" || key === \"aspectRatio\" || key === \"yawRange\" || key === \"pitchRange\";\n\t\t})) {\n\t\t\tthis._updateControlScale();\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"fovRange\";\n\t\t})) {\n\t\t\tvar fovRange = this.options.fovRange;\n\t\t\tvar prevFov = this.axes.get().fov;\n\t\t\tvar nextFov = this.axes.get().fov;\n\n\t\t\t_mathUtil.vec2.copy(this.axes.axis.fov.range, fovRange);\n\n\t\t\tif (nextFov < fovRange[0]) {\n\t\t\t\tnextFov = fovRange[0];\n\t\t\t} else if (prevFov > fovRange[1]) {\n\t\t\t\tnextFov = fovRange[1];\n\t\t\t}\n\n\t\t\tif (prevFov !== nextFov) {\n\t\t\t\tthis.axes.setTo({\n\t\t\t\t\tfov: nextFov\n\t\t\t\t}, 0);\n\t\t\t\tthis._updateControlScale();\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useGyro\";\n\t\t}) && this.axesTiltMotionInput) {\n\t\t\tvar useGyro = this.options.useGyro;\n\n\t\t\tif (useGyro === _consts.GYRO_MODE.YAWPITCH) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesTiltMotionInput);\n\t\t\t} else if (useGyro === _consts.GYRO_MODE.NONE) {\n\t\t\t\tthis.axes.disconnect(this.axesTiltMotionInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useKeyboard\";\n\t\t})) {\n\t\t\tvar useKeyboard = this.options.useKeyboard;\n\n\t\t\tif (useKeyboard) {\n\t\t\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesMoveKeyInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesMoveKeyInput);\n\t\t\t}\n\t\t}\n\n\t\tif (keys.some(function (key) {\n\t\t\treturn key === \"useZoom\";\n\t\t})) {\n\t\t\tvar useZoom = this.options.useZoom;\n\n\t\t\tif (useZoom) {\n\t\t\t\tthis.axes.connect([\"fov\"], this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.connect([\"fov\"], this.axesPinchInput);\n\t\t\t} else {\n\t\t\t\tthis.axes.disconnect(this.axesWheelInput);\n\t\t\t\tthis.axesPinchInput && this.axes.disconnect(this.axesPinchInput);\n\t\t\t}\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidYawRange = function _getValidYawRange(newYawRange, newFov, newAspectRatio) {\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(newAspectRatio || this.options.aspectRatio || 1);\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar horizontalFov = fov * ratio;\n\t\tvar isValid = newYawRange[1] - newYawRange[0] >= horizontalFov;\n\n\t\tif (isValid) {\n\t\t\treturn newYawRange;\n\t\t} else {\n\t\t\treturn this.options.yawRange || DEFAULT_YAW_RANGE;\n\t\t}\n\t};\n\n\tYawPitchControl.prototype._getValidPitchRange = function _getValidPitchRange(newPitchRange, newFov) {\n\t\tvar fov = newFov || this.axes.get().fov;\n\t\tvar isValid = newPitchRange[1] - newPitchRange[0] >= fov;\n\n\t\tif (isValid) {\n\t\t\treturn newPitchRange;\n\t\t} else {\n\t\t\treturn this.options.pitchRange || DEFAULT_PITCH_RANGE;\n\t\t}\n\t};\n\n\t/**\n * Update yaw/pitch min/max by 5 factor\n *\n * 1. showPolePoint\n * 2. fov\n * 3. yawRange\n * 4. pitchRange\n * 5. aspectRatio\n *\n * If one of above is changed, call this function\n */\n\n\n\tYawPitchControl.prototype._updateControlScale = function _updateControlScale(changeEvt) {\n\t\tvar opt = this.options;\n\t\tvar fov = this.axes.get().fov;\n\n\t\tvar pRange = YawPitchControl._updatePitchRange(opt.pitchRange, fov, opt.showPolePoint);\n\t\tvar yRange = YawPitchControl._updateYawRange(opt.yawRange, fov, opt.aspectRatio);\n\n\t\t// TODO: If not changed!?\n\t\tvar pos = this.axes.get();\n\t\tvar y = pos.yaw;\n\t\tvar p = pos.pitch;\n\n\t\t_mathUtil.vec2.copy(this.axes.axis.yaw.range, yRange);\n\t\t_mathUtil.vec2.copy(this.axes.axis.pitch.range, pRange);\n\t\tthis.axes.axis.yaw.circular = yRange[1] - yRange[0] < 360 ? [false, false] : [true, true];\n\n\t\t/**\n * update yaw/pitch by it's range.\n */\n\t\tif (y < yRange[0]) {\n\t\t\ty = yRange[0];\n\t\t} else if (y > yRange[1]) {\n\t\t\ty = yRange[1];\n\t\t}\n\n\t\tif (p < pRange[0]) {\n\t\t\tp = pRange[0];\n\t\t} else if (p > pRange[1]) {\n\t\t\tp = pRange[1];\n\t\t}\n\n\t\tif (changeEvt) {\n\t\t\tchangeEvt.set({\n\t\t\t\tyaw: y,\n\t\t\t\tpitch: p\n\t\t\t});\n\t\t}\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: y,\n\t\t\tpitch: p\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\tYawPitchControl._updatePitchRange = function _updatePitchRange(pitchRange, fov, showPolePoint) {\n\t\tvar verticalAngle = pitchRange[1] - pitchRange[0];\n\t\tvar halfFov = fov / 2;\n\t\tvar isPanorama = verticalAngle < 180;\n\n\t\tif (showPolePoint && !isPanorama) {\n\t\t\t// Use full pinch range\n\t\t\treturn pitchRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [pitchRange[0] + halfFov, pitchRange[1] - halfFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl._updateYawRange = function _updateYawRange(yawRange, fov, aspectRatio) {\n\t\tvar horizontalAngle = yawRange[1] - yawRange[0];\n\n\t\t/**\n * Full 360 Mode\n */\n\t\tif (horizontalAngle >= 360) {\n\t\t\t// Don't limit yaw range on Full 360 mode.\n\t\t\treturn yawRange.map(function (v) {\n\t\t\t\treturn +v.toFixed(5);\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Panorama mode\n */\n\t\tvar MAGIC_NUMBER = 1;\n\t\tvar ratio = YawPitchControl.adjustAspectRatio(aspectRatio);\n\t\tvar halfHorizontalFov = fov / 2 * ratio;\n\n\t\t// TODO: Magic Number Fix!\n\t\tif (horizontalAngle > 290) {\n\t\t\tMAGIC_NUMBER = 0.794; // horizontalAngle = 286;\n\t\t} else if (horizontalAngle > 125) {\n\t\t\tMAGIC_NUMBER = 0.98; // horizontalAngle *= 0.98;\n\t\t}\n\n\t\t// Round value as movableCood do.\n\t\treturn [yawRange[0] * MAGIC_NUMBER + halfHorizontalFov, yawRange[1] * MAGIC_NUMBER - halfHorizontalFov].map(function (v) {\n\t\t\treturn +v.toFixed(5);\n\t\t});\n\t};\n\n\tYawPitchControl.prototype._triggerChange = function _triggerChange() {\n\t\tvar pos = this.axes.get();\n\t\tvar opt = this.options;\n\t\tvar event = {\n\t\t\ttargetElement: opt.element\n\t\t};\n\n\t\tevent.yaw = pos.yaw;\n\t\tevent.pitch = pos.pitch;\n\t\tevent.fov = pos.fov;\n\n\t\tthis.trigger(\"change\", event);\n\t};\n\n\t// TODO: makes constant to be logic\n\n\n\tYawPitchControl.adjustAspectRatio = function adjustAspectRatio(input) {\n\t\tvar inputRange = [0.520, 0.540, 0.563, 0.570, 0.584, 0.590, 0.609, 0.670, 0.702, 0.720, 0.760, 0.780, 0.820, 0.920, 0.970, 1.00, 1.07, 1.14, 1.19, 1.25, 1.32, 1.38, 1.40, 1.43, 1.53, 1.62, 1.76, 1.77, 1.86, 1.96, 2.26, 2.30, 2.60, 3.00, 5.00, 6.00];\n\t\tvar outputRange = [0.510, 0.540, 0.606, 0.560, 0.628, 0.630, 0.647, 0.710, 0.736, 0.757, 0.780, 0.770, 0.800, 0.890, 0.975, 1.00, 1.07, 1.10, 1.15, 1.18, 1.22, 1.27, 1.30, 1.33, 1.39, 1.45, 1.54, 1.55, 1.58, 1.62, 1.72, 1.82, 1.92, 2.00, 2.24, 2.30];\n\n\t\tvar rangeIdx = -1;\n\n\t\tfor (var i = 0; i < inputRange.length - 1; i++) {\n\t\t\tif (inputRange[i] <= input && inputRange[i + 1] >= input) {\n\t\t\t\trangeIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (rangeIdx === -1) {\n\t\t\tif (inputRange[0] > input) {\n\t\t\t\treturn outputRange[0];\n\t\t\t} else {\n\t\t\t\treturn outputRange[outputRange[0].length - 1];\n\t\t\t}\n\t\t}\n\n\t\tvar inputA = inputRange[rangeIdx];\n\t\tvar inputB = inputRange[rangeIdx + 1];\n\t\tvar outputA = outputRange[rangeIdx];\n\t\tvar outputB = outputRange[rangeIdx + 1];\n\n\t\treturn YawPitchControl.lerp(outputA, outputB, (input - inputA) / (inputB - inputA));\n\t};\n\n\tYawPitchControl.lerp = function lerp(a, b, fraction) {\n\t\treturn a + fraction * (b - a);\n\t};\n\n\t/**\n * Enable YawPitch functionality\n *\n * @method eg.YawPitch#enable\n */\n\n\n\tYawPitchControl.prototype.enable = function enable() {\n\t\tif (this._enabled) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.axes.connect([\"yaw\", \"pitch\"], this.axesPanInput);\n\t\tthis._applyOptions(Object.keys(this.options), this.options);\n\t\tthis._setPanScale(this.getFov());\n\n\t\tthis._enabled = true;\n\t\treturn this;\n\t};\n\n\t/**\n * Disable YawPitch functionality\n *\n * @method eg.YawPitch#disable\n */\n\n\n\tYawPitchControl.prototype.disable = function disable(persistOrientation) {\n\t\tif (!this._enabled) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// TODO: Check peristOrientation is needed!\n\t\tif (!persistOrientation) {\n\t\t\tthis._resetOrientation();\n\t\t}\n\t\tthis.axes.disconnect();\n\t\tthis._enabled = false;\n\t\treturn this;\n\t};\n\n\tYawPitchControl.prototype._resetOrientation = function _resetOrientation() {\n\t\tvar opt = this.options;\n\n\t\tthis.axes.setTo({\n\t\t\tyaw: opt.yaw,\n\t\t\tpitch: opt.pitch,\n\t\t\tfov: opt.fov\n\t\t}, 0);\n\n\t\treturn this;\n\t};\n\n\t/**\n * Set one or more of yaw, pitch, fov\n *\n * @param {Object} coordinate yaw, pitch, fov\n * @param {Number} duration Animation duration. if it is above 0 then it's animated.\n */\n\n\n\tYawPitchControl.prototype.lookAt = function lookAt(_ref, duration) {\n\t\tvar yaw = _ref.yaw,\n\t\t pitch = _ref.pitch,\n\t\t fov = _ref.fov;\n\n\t\tvar pos = this.axes.get();\n\n\t\tvar y = yaw === undefined ? 0 : yaw - pos.yaw;\n\t\tvar p = pitch === undefined ? 0 : pitch - pos.pitch;\n\t\tvar f = fov === undefined ? 0 : fov - pos.fov;\n\n\t\tthis.axes.setBy({\n\t\t\tyaw: y,\n\t\t\tpitch: p,\n\t\t\tfov: f\n\t\t}, duration);\n\t};\n\n\tYawPitchControl.prototype.get = function get() {\n\t\treturn this.axes.get();\n\t};\n\n\tYawPitchControl.prototype.getYaw = function getYaw() {\n\t\treturn this.axes.get().yaw;\n\t};\n\n\tYawPitchControl.prototype.getPitch = function getPitch() {\n\t\treturn this.axes.get().pitch;\n\t};\n\n\tYawPitchControl.prototype.getFov = function getFov() {\n\t\treturn this.axes.get().fov;\n\t};\n\n\t/**\n * Destroys objects\n */\n\n\n\tYawPitchControl.prototype.destroy = function destroy() {\n\t\tthis.axes && this.axes.destroy();\n\t\tthis.axisPanInput && this.axisPanInput.destroy();\n\t\tthis.axesWheelInput && this.axesWheelInput.destroy();\n\t\tthis.axesTiltMotionInput && this.axesTiltMotionInput.destroy();\n\t\tthis.axesPinchInput && this.axesPinchInput.destroy();\n\t\tthis.axesMoveKeyInput && this.axesMoveKeyInput.destroy();\n\t};\n\n\treturn YawPitchControl;\n}(_component2[\"default\"]);\n\nYawPitchControl.VERSION = \"3.0.0-rc\";\nexports[\"default\"] = YawPitchControl;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/YawPitchControl.js\n// module id = 27\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _complementaryFilter = require(\"webvr-polyfill/src/sensor-fusion/complementary-filter\");\n\nvar _complementaryFilter2 = _interopRequireDefault(_complementaryFilter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_complementaryFilter2[\"default\"].prototype.run_ = function () {\n\tif (!this.isOrientationInitialized) {\n\t\tthis.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n\t\tthis.previousFilterQ.copy(this.accelQ);\n\t\tthis.isOrientationInitialized = true;\n\t\treturn;\n\t}\n\n\tvar deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n\n\t// Convert gyro rotation vector to a quaternion delta.\n\tvar gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n\n\tthis.gyroIntegralQ.multiply(gyroDeltaQ);\n\n\t// filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n\tthis.filterQ.copy(this.previousFilterQ);\n\tthis.filterQ.multiply(gyroDeltaQ);\n\n\t// Calculate the delta between the current estimated gravity and the real\n\t// gravity vector from accelerometer.\n\tvar invFilterQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tinvFilterQ.copy(this.filterQ);\n\tinvFilterQ.inverse();\n\n\tthis.estimatedGravity.set(0, 0, -1);\n\tthis.estimatedGravity.applyQuaternion(invFilterQ);\n\tthis.estimatedGravity.normalize();\n\n\tthis.measuredGravity.copy(this.currentAccelMeasurement.sample);\n\tthis.measuredGravity.normalize();\n\n\t// Compare estimated gravity with measured gravity, get the delta quaternion\n\t// between the two.\n\tvar deltaQ = new _mathUtil2[\"default\"].Quaternion();\n\n\tdeltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n\tdeltaQ.inverse();\n\n\tif (_util2[\"default\"].isDebug()) {\n\t\tconsole.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\", _mathUtil2[\"default\"].radToDeg * _util2[\"default\"].getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n\t}\n\n\t// Calculate the SLERP target: current orientation plus the measured-estimated\n\t// quaternion delta.\n\tvar targetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\ttargetQ.copy(this.filterQ);\n\ttargetQ.multiply(deltaQ);\n\n\t// SLERP factor: 0 is pure gyro, 1 is pure accel.\n\tthis.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n\tthis.previousFilterQ.copy(this.filterQ);\n\n\tif (!this.isFilterQuaternionInitialized) {\n\t\tthis.isFilterQuaternionInitialized = true;\n\t}\n};\n\n_complementaryFilter2[\"default\"].prototype.getOrientation = function () {\n\tif (this.isFilterQuaternionInitialized) {\n\t\treturn this.filterQ;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports[\"default\"] = _complementaryFilter2[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/ComplementaryFilter.js\n// module id = 28\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _mathUtil = require(\"../../utils/math-util\");\n\nvar _browser = require(\"../browser\");\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 STILLNESS_THRESHOLD = 200; // millisecond\n\nvar DeviceMotion = function (_Component) {\n\t_inherits(DeviceMotion, _Component);\n\n\tfunction DeviceMotion() {\n\t\t_classCallCheck(this, DeviceMotion);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this._onDeviceMotion = _this._onDeviceMotion.bind(_this);\n\t\t_this._onDeviceOrientation = _this._onDeviceOrientation.bind(_this);\n\n\t\t_this.isAndroid = _browser.window.navigator.userAgent.indexOf(\"Android\") !== -1;\n\n\t\t_this.stillGyroVec = _mathUtil.vec3.create();\n\t\t_this.rawGyroVec = _mathUtil.vec3.create();\n\t\t_this.adjustedGyroVec = _mathUtil.vec3.create();\n\n\t\t_this._timer = null;\n\n\t\t_this.lastDevicemotionTimestamp = 0;\n\t\t_this._isEnabled = false;\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tDeviceMotion.prototype._onDeviceOrientation = function _onDeviceOrientation() {\n\t\tvar _this2 = this;\n\n\t\tthis._timer && clearTimeout(this._timer);\n\t\tthis._timer = setTimeout(function () {\n\t\t\tif (new Date().getTime() - _this2.lastDevicemotionTimestamp < STILLNESS_THRESHOLD) {\n\t\t\t\t_mathUtil.vec3.copy(_this2.stillGyroVec, _this2.rawGyroVec);\n\t\t\t}\n\t\t}, STILLNESS_THRESHOLD);\n\t};\n\n\tDeviceMotion.prototype._onDeviceMotion = function _onDeviceMotion(e) {\n\t\t// TODO: 브라우저에서는 이벤트 등록 시점에도 이벤트가 발생한다. 이렇게 체크하는 게 맞나??? @happyhj\n\t\tif (e.interval === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isAndroid) {\n\t\t\t_mathUtil.vec3.set(this.rawGyroVec, e.rotationRate.alpha || 0, e.rotationRate.beta || 0, e.rotationRate.gamma || 0);\n\t\t\t_mathUtil.vec3.subtract(this.adjustedGyroVec, this.rawGyroVec, this.stillGyroVec);\n\t\t\tthis.lastDevicemotionTimestamp = new Date().getTime();\n\n\t\t\te.adjustedRotationRate = {\n\t\t\t\talpha: this.adjustedGyroVec[0],\n\t\t\t\tbeta: this.adjustedGyroVec[1],\n\t\t\t\tgamma: this.adjustedGyroVec[2] };\n\t\t}\n\n\t\tthis.trigger(\"devicemotion\", {\n\t\t\tinputEvent: e\n\t\t});\n\t};\n\n\tDeviceMotion.prototype.enable = function enable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.addEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.addEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = true;\n\t};\n\n\tDeviceMotion.prototype.disable = function disable() {\n\t\tif (this.isAndroid) {\n\t\t\t_browser.window.removeEventListener(\"deviceorientation\", this._onDeviceOrientation);\n\t\t}\n\t\t_browser.window.removeEventListener(\"devicemotion\", this._onDeviceMotion);\n\t\tthis._isEnabled = false;\n\t};\n\n\tDeviceMotion.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\treturn DeviceMotion;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = DeviceMotion;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/DeviceMotion.js\n// module id = 29\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _posePredictor = require(\"webvr-polyfill/src/sensor-fusion/pose-predictor\");\n\nvar _posePredictor2 = _interopRequireDefault(_posePredictor);\n\nvar _mathUtil = require(\"webvr-polyfill/src/math-util\");\n\nvar _mathUtil2 = _interopRequireDefault(_mathUtil);\n\nvar _util = require(\"webvr-polyfill/src/util\");\n\nvar _util2 = _interopRequireDefault(_util);\n\nvar _browser = require(\"../browser\");\n\nvar _mathUtil3 = require(\"../../utils/math-util\");\n\nvar _DeviceMotion = require(\"./DeviceMotion\");\n\nvar _DeviceMotion2 = _interopRequireDefault(_DeviceMotion);\n\nvar _ComplementaryFilter = require(\"./ComplementaryFilter\");\n\nvar _ComplementaryFilter2 = _interopRequireDefault(_ComplementaryFilter);\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 K_FILTER = 0.98;\nvar PREDICTION_TIME_S = 0.040;\n\nvar FusionPoseSensor = function (_Component) {\n\t_inherits(FusionPoseSensor, _Component);\n\n\tfunction FusionPoseSensor() {\n\t\t_classCallCheck(this, FusionPoseSensor);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.deviceMotion = new _DeviceMotion2[\"default\"]();\n\n\t\t_this.accelerometer = new _mathUtil2[\"default\"].Vector3();\n\t\t_this.gyroscope = new _mathUtil2[\"default\"].Vector3();\n\n\t\t_this._onDeviceMotionChange = _this._onDeviceMotionChange.bind(_this);\n\t\t_this._onScreenOrientationChange = _this._onScreenOrientationChange.bind(_this);\n\n\t\t_this.filter = new _ComplementaryFilter2[\"default\"](K_FILTER);\n\t\t_this.posePredictor = new _posePredictor2[\"default\"](PREDICTION_TIME_S);\n\n\t\t_this.filterToWorldQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.isFirefoxAndroid = _util2[\"default\"].isFirefoxAndroid();\n\t\t_this.isIOS = _util2[\"default\"].isIOS();\n\t\t_this._isEnabled = false;\n\n\t\t// Set the filter to world transform, depending on OS.\n\t\tif (_this.isIOS) {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), Math.PI / 2);\n\t\t} else {\n\t\t\t_this.filterToWorldQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(1, 0, 0), -Math.PI / 2);\n\t\t}\n\n\t\t_this.inverseWorldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.worldToScreenQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ = new _mathUtil2[\"default\"].Quaternion();\n\t\t_this.originalPoseAdjustQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -_browser.window.orientation * Math.PI / 180);\n\n\t\t_this._setScreenTransform();\n\t\t// Adjust this filter for being in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\t_this.filterToWorldQ.multiply(_this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Keep track of a reset transform for resetSensor.\n\t\t_this.resetQ = new _mathUtil2[\"default\"].Quaternion();\n\n\t\t_this.deviceMotion.on(\"devicemotion\", _this._onDeviceMotionChange);\n\t\t_this.enable();\n\t\treturn _this;\n\t}\n\n\tFusionPoseSensor.prototype.enable = function enable() {\n\t\tif (this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.enable();\n\t\tthis._isEnabled = true;\n\t\t_browser.window.addEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.disable = function disable() {\n\t\tif (!this.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.deviceMotion.disable();\n\t\tthis._isEnabled = false;\n\t\t_browser.window.removeEventListener(\"orientationchange\", this._onScreenOrientationChange);\n\t};\n\n\tFusionPoseSensor.prototype.isEnabled = function isEnabled() {\n\t\treturn this._isEnabled;\n\t};\n\n\tFusionPoseSensor.prototype.destroy = function destroy() {\n\t\tthis.disable();\n\t\tthis.deviceMotion = null;\n\t};\n\n\tFusionPoseSensor.prototype._triggerChange = function _triggerChange() {\n\t\tvar orientation = this.getOrientation();\n\n\t\t// if orientation is not prepared. don't trigger change event\n\t\tif (!orientation) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._prevOrientation) {\n\t\t\tthis._prevOrientation = orientation;\n\t\t\treturn;\n\t\t}\n\n\t\tif (_mathUtil3.quat.equals(this._prevOrientation, orientation)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger(\"change\", { quaternion: orientation });\n\t};\n\n\tFusionPoseSensor.prototype.getOrientation = function getOrientation() {\n\t\t// Convert from filter space to the the same system used by the\n\t\t// deviceorientation event.\n\t\tvar orientation = this.filter.getOrientation();\n\n\t\tif (!orientation) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Predict orientation.\n\t\tvar out = this._convertFusionToPredicted(orientation);\n\n\t\t// return quaternion as glmatrix quaternion object\n\t\tout = _mathUtil3.quat.fromValues(out.x, out.y, out.z, out.w);\n\n\t\treturn _mathUtil3.quat.normalize(out, out);\n\t};\n\n\tFusionPoseSensor.prototype._convertFusionToPredicted = function _convertFusionToPredicted(orientation) {\n\t\t// Predict orientation.\n\t\tthis.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n\t\t// Convert to THREE coordinate system: -Z forward, Y up, X right.\n\t\tvar out = new _mathUtil2[\"default\"].Quaternion();\n\n\t\tout.copy(this.filterToWorldQ);\n\t\tout.multiply(this.resetQ);\n\t\tout.multiply(this.predictedQ);\n\t\tout.multiply(this.worldToScreenQ);\n\n\t\treturn out;\n\t};\n\n\tFusionPoseSensor.prototype.resetPose = function resetPose() {\n\t\t// Reduce to inverted yaw-only.\n\t\tthis.resetQ.copy(this.filter.getOrientation());\n\t\tthis.resetQ.x = 0;\n\t\tthis.resetQ.y = 0;\n\t\tthis.resetQ.z *= -1;\n\t\tthis.resetQ.normalize();\n\n\t\t// Take into account extra transformations in landscape mode.\n\t\tif (_util2[\"default\"].isLandscapeMode()) {\n\t\t\tthis.resetQ.multiply(this.inverseWorldToScreenQ);\n\t\t}\n\n\t\t// Take into account original pose.\n\t\tthis.resetQ.multiply(this.originalPoseAdjustQ);\n\t};\n\n\tFusionPoseSensor.prototype._onDeviceMotionChange = function _onDeviceMotionChange(_ref) {\n\t\tvar inputEvent = _ref.inputEvent;\n\n\t\tvar deviceMotion = inputEvent;\n\t\tvar accGravity = deviceMotion.accelerationIncludingGravity;\n\t\tvar rotRate = deviceMotion.adjustedRotationRate || deviceMotion.rotationRate;\n\t\tvar timestampS = deviceMotion.timeStamp / 1000;\n\n\t\t// Firefox Android timeStamp returns one thousandth of a millisecond.\n\t\tif (this.isFirefoxAndroid) {\n\t\t\ttimestampS /= 1000;\n\t\t}\n\n\t\tthis.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n\t\tthis.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n\n\t\t// With iOS and Firefox Android, rotationRate is reported in degrees,\n\t\t// so we first convert to radians.\n\t\tif (this.isIOS || this.isFirefoxAndroid) {\n\t\t\tthis.gyroscope.multiplyScalar(Math.PI / 180);\n\t\t}\n\n\t\tthis.filter.addAccelMeasurement(this.accelerometer, timestampS);\n\t\tthis.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n\t\tthis._triggerChange();\n\n\t\tthis.previousTimestampS = timestampS;\n\t};\n\n\tFusionPoseSensor.prototype._onScreenOrientationChange = function _onScreenOrientationChange(screenOrientation) {\n\t\tthis._setScreenTransform(_browser.window.orientation);\n\t};\n\n\tFusionPoseSensor.prototype._setScreenTransform = function _setScreenTransform() {\n\t\tthis.worldToScreenQ.set(0, 0, 0, 1);\n\t\tswitch (_browser.window.orientation) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase -90:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), -90 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tcase 180:\n\t\t\t\tthis.worldToScreenQ.setFromAxisAngle(new _mathUtil2[\"default\"].Vector3(0, 0, 1), 180 / -180 * Math.PI);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n\t\tthis.inverseWorldToScreenQ.inverse();\n\t};\n\n\treturn FusionPoseSensor;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = FusionPoseSensor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/FusionPoseSensor.js\n// module id = 30\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\n\nvar _FusionPoseSensor = require(\"./FusionPoseSensor\");\n\nvar _FusionPoseSensor2 = _interopRequireDefault(_FusionPoseSensor);\n\nvar _mathUtil = require(\"../../utils/math-util\");\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\nfunction getDeltaYaw(prvQ, curQ) {\n\tvar yawDeltaByYaw = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);\n\tvar yawDeltaByRoll = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL) * Math.sin(_mathUtil.util.extractPitchFromQuat(curQ));\n\n\treturn yawDeltaByRoll + yawDeltaByYaw;\n}\n\nfunction getDeltaPitch(prvQ, curQ) {\n\tvar pitchDelta = _mathUtil.util.getRotationDelta(prvQ, curQ, _mathUtil.ROTATE_CONSTANT.PITCH_DELTA);\n\n\treturn pitchDelta;\n}\n\nvar TiltMotionInput = function (_Component) {\n\t_inherits(TiltMotionInput, _Component);\n\n\tfunction TiltMotionInput(el, options) {\n\t\t_classCallCheck(this, TiltMotionInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this._prevQuaternion = null;\n\t\t_this._quaternion = null;\n\n\t\t_this.fusionPoseSensor = null;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onPoseChange = _this._onPoseChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tTiltMotionInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tTiltMotionInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis.fusionPoseSensor = new _FusionPoseSensor2[\"default\"]();\n\t\tthis.fusionPoseSensor.enable();\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._dettachEvent();\n\t\tthis.fusionPoseSensor.disable();\n\t\tthis.fusionPoseSensor.destroy();\n\t\tthis.fusionPoseSensor = null;\n\t\tthis.observer = null;\n\t\treturn this;\n\t};\n\n\tTiltMotionInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t\tthis._prevQuaternion = null;\n\t\tthis._quaternion = null;\n\t};\n\n\tTiltMotionInput.prototype._onPoseChange = function _onPoseChange(event) {\n\t\tif (!this._prevQuaternion) {\n\t\t\tthis._prevQuaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\tthis._quaternion = _mathUtil.quat.clone(event.quaternion);\n\t\t\treturn;\n\t\t}\n\n\t\t_mathUtil.quat.copy(this._prevQuaternion, this._quaternion);\n\t\t_mathUtil.quat.copy(this._quaternion, event.quaternion);\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [getDeltaYaw(this._prevQuaternion, this._quaternion), getDeltaPitch(this._prevQuaternion, this._quaternion)]));\n\t};\n\n\tTiltMotionInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.fusionPoseSensor.on(\"change\", this._onPoseChange);\n\t};\n\n\tTiltMotionInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.fusionPoseSensor.off(\"change\", this._onPoseChange);\n\t};\n\n\treturn TiltMotionInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = TiltMotionInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/TiltMotionInput.js\n// module id = 31\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _component = require(\"@egjs/component\");\n\nvar _component2 = _interopRequireDefault(_component);\n\nvar _utils = require(\"../utils\");\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 WheelInput = function (_Component) {\n\t_inherits(WheelInput, _Component);\n\n\tfunction WheelInput(el, options) {\n\t\t_classCallCheck(this, WheelInput);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.element = el;\n\n\t\t_this.options = _extends({\n\t\t\tscale: 1,\n\t\t\tthreshold: 0\n\t\t}, options);\n\n\t\t_this._onWheel = _this._onWheel.bind(_this);\n\t\treturn _this;\n\t}\n\n\tWheelInput.prototype.mapAxes = function mapAxes(axes) {\n\t\tthis.axes = axes;\n\t};\n\n\tWheelInput.prototype.connect = function connect(observer) {\n\t\tif (this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = observer;\n\t\tthis._attachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.disconnect = function disconnect() {\n\t\tif (!this.observer) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.observer = null;\n\t\tthis._dettachEvent();\n\t\treturn this;\n\t};\n\n\tWheelInput.prototype.destroy = function destroy() {\n\t\tthis.disconnect();\n\t\tthis.element = null;\n\t\tthis.options = null;\n\t\tthis.axes = null;\n\t};\n\n\tWheelInput.prototype._onWheel = function _onWheel(event) {\n\t\tevent.preventDefault();\n\n\t\tif (event.deltaY === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observer.change(this, event, (0, _utils.toAxis)(this.axes, [(event.deltaY < 0 ? -1 : 1) * this.options.scale]));\n\t};\n\n\tWheelInput.prototype._attachEvent = function _attachEvent() {\n\t\tthis.element.addEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\tWheelInput.prototype._dettachEvent = function _dettachEvent() {\n\t\tthis.element.removeEventListener(\"wheel\", this._onWheel, false);\n\t};\n\n\treturn WheelInput;\n}(_component2[\"default\"]);\n\nexports[\"default\"] = WheelInput;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YawPitchControl/input/WheelInput.js\n// module id = 32\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/mat4.js\n * 4x4 Matrix util\n * modified by egjs\n */\nmat4.create = function () {\n var out = new _common2[\"default\"].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 * 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 * 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.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) {\n // 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 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.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) {\n // 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 * 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],\n y = q[1],\n z = q[2],\n w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\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 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\nmodule.exports = mat4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/mat4.js\n// module id = 33\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/quat.js\n * Quaternion util\n * modified by egjs\n */\nquat.create = function () {\n var out = new _common2[\"default\"].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 * 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 = function (a) {\n var out = new _common2[\"default\"].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 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 = function (x, y, z, w) {\n var out = new _common2[\"default\"].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 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 = 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = b[0],\n by = b[1],\n bz = b[2],\n 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 * 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n bx = Math.sin(rad),\n 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],\n ay = a[1],\n az = a[2],\n aw = a[3],\n by = Math.sin(rad),\n 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 * 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 * 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 = 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 * Returns whether or not the quaternions have approximately 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.equals = function (a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common2[\"default\"].EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\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 = function (a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\nmodule.exports = quat;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/quat.js\n// module id = 34\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec2.js\n * 2 Dimensional Vector Util\n * modified by egjs\n */\nvec2.create = function () {\n var out = new _common2[\"default\"].ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\nvec2.copy = function (out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\nmodule.exports = vec2;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec2.js\n// module id = 35\n// module chunks = 0 1 2 3","\"use strict\";\n\nvar _common = require(\"./common.js\");\n\nvar _common2 = _interopRequireDefault(_common);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\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 */\n/**\n * Original Code\n * https://github.com/toji/gl-matrix/blob/v2.3.2/src/gl-matrix/vec3.js\n * 3 Dimensional Vector Util\n * modified by egjs\n */\nvec3.create = function () {\n var out = new _common2[\"default\"].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 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 _common2[\"default\"].ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\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\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 * 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 * 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 * 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 * 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],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n 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 * 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],\n y = a[1],\n z = a[2],\n qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n\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\nmodule.exports = vec3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/utils/mathUtil/vec3.js\n// module id = 36\n// module chunks = 0 1 2 3","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 37\n// module chunks = 0 1 2 3","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 38\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar SensorSample = require('./sensor-sample.js');\nvar MathUtil = require('../math-util.js');\nvar Util = require('../util.js');\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n * on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n * short term.\n */\nfunction ComplementaryFilter(kFilter) {\n this.kFilter = kFilter;\n\n // Raw sensor measurements.\n this.currentAccelMeasurement = new SensorSample();\n this.currentGyroMeasurement = new SensorSample();\n this.previousGyroMeasurement = new SensorSample();\n\n // Set default look direction to be in the correct direction.\n if (Util.isIOS()) {\n this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n } else {\n this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n }\n this.previousFilterQ = new MathUtil.Quaternion();\n this.previousFilterQ.copy(this.filterQ);\n\n // Orientation based on the accelerometer.\n this.accelQ = new MathUtil.Quaternion();\n // Whether or not the orientation has been initialized.\n this.isOrientationInitialized = false;\n // Running estimate of gravity based on the current orientation.\n this.estimatedGravity = new MathUtil.Vector3();\n // Measured gravity based on accelerometer.\n this.measuredGravity = new MathUtil.Vector3();\n\n // Debug only quaternion of gyro-based orientation.\n this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n this.currentGyroMeasurement.set(vector, timestampS);\n\n var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n if (Util.isTimestampDeltaValid(deltaT)) {\n this.run_();\n }\n\n this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n if (!this.isOrientationInitialized) {\n this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n this.previousFilterQ.copy(this.accelQ);\n this.isOrientationInitialized = true;\n return;\n }\n\n var deltaT = this.currentGyroMeasurement.timestampS -\n this.previousGyroMeasurement.timestampS;\n\n // Convert gyro rotation vector to a quaternion delta.\n var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n this.filterQ.copy(this.previousFilterQ);\n this.filterQ.multiply(gyroDeltaQ);\n\n // Calculate the delta between the current estimated gravity and the real\n // gravity vector from accelerometer.\n var invFilterQ = new MathUtil.Quaternion();\n invFilterQ.copy(this.filterQ);\n invFilterQ.inverse();\n\n this.estimatedGravity.set(0, 0, -1);\n this.estimatedGravity.applyQuaternion(invFilterQ);\n this.estimatedGravity.normalize();\n\n this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n this.measuredGravity.normalize();\n\n // Compare estimated gravity with measured gravity, get the delta quaternion\n // between the two.\n var deltaQ = new MathUtil.Quaternion();\n deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n deltaQ.inverse();\n\n if (Util.isDebug()) {\n console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n (this.estimatedGravity.x).toFixed(1),\n (this.estimatedGravity.y).toFixed(1),\n (this.estimatedGravity.z).toFixed(1),\n (this.measuredGravity.x).toFixed(1),\n (this.measuredGravity.y).toFixed(1),\n (this.measuredGravity.z).toFixed(1));\n }\n\n // Calculate the SLERP target: current orientation plus the measured-estimated\n // quaternion delta.\n var targetQ = new MathUtil.Quaternion();\n targetQ.copy(this.filterQ);\n targetQ.multiply(deltaQ);\n\n // SLERP factor: 0 is pure gyro, 1 is pure accel.\n this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n var normAccel = new MathUtil.Vector3();\n normAccel.copy(accel);\n normAccel.normalize();\n var quat = new MathUtil.Quaternion();\n quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n quat.inverse();\n return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n // Extract axis and angle from the gyroscope data.\n var quat = new MathUtil.Quaternion();\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n quat.setFromAxisAngle(axis, gyro.length() * dt);\n return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/complementary-filter.js\n// module id = 39\n// module chunks = 0 1 2 3","/*\n * Copyright 2015 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MathUtil = require('../math-util');\nvar Util = require('../util');\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n this.predictionTimeS = predictionTimeS;\n\n // The quaternion corresponding to the previous state.\n this.previousQ = new MathUtil.Quaternion();\n // Previous time a prediction occurred.\n this.previousTimestampS = null;\n\n // The delta quaternion that adjusts the current pose.\n this.deltaQ = new MathUtil.Quaternion();\n // The output quaternion.\n this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n if (!this.previousTimestampS) {\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n return currentQ;\n }\n\n // Calculate axis and angle based on gyroscope rotation rate data.\n var axis = new MathUtil.Vector3();\n axis.copy(gyro);\n axis.normalize();\n\n var angularSpeed = gyro.length();\n\n // If we're rotating slowly, don't do prediction.\n if (angularSpeed < MathUtil.degToRad * 20) {\n if (Util.isDebug()) {\n console.log('Moving slowly, at %s deg/s: no prediction',\n (MathUtil.radToDeg * angularSpeed).toFixed(1));\n }\n this.outQ.copy(currentQ);\n this.previousQ.copy(currentQ);\n return this.outQ;\n }\n\n // Get the predicted angle based on the time delta and latency.\n var deltaT = timestampS - this.previousTimestampS;\n var predictAngle = angularSpeed * this.predictionTimeS;\n\n this.deltaQ.setFromAxisAngle(axis, predictAngle);\n this.outQ.copy(this.previousQ);\n this.outQ.multiply(this.deltaQ);\n\n this.previousQ.copy(currentQ);\n this.previousTimestampS = timestampS;\n\n return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/pose-predictor.js\n// module id = 40\n// module chunks = 0 1 2 3","function SensorSample(sample, timestampS) {\n this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n this.sample = sample;\n this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/webvr-polyfill/src/sensor-fusion/sensor-sample.js\n// module id = 41\n// module chunks = 0 1 2 3","/* (ignored) */\n\n\n//////////////////\n// WEBPACK FOOTER\n// vertx (ignored)\n// module id = 42\n// module chunks = 0 1 2 3","\"use strict\";\n\nexports.__esModule = true;\nexports.VERSION = exports.SpriteImage = exports.SpinViewer = exports.PanoViewer = exports.YawPitchControl = undefined;\n\nvar _YawPitchControl = require(\"./YawPitchControl\");\n\nvar _PanoViewer = require(\"./PanoViewer\");\n\nvar _SpinViewer = require(\"./SpinViewer\");\n\nvar VERSION = \"3.0.0-rc\";\n\nexports.YawPitchControl = _YawPitchControl.YawPitchControl;\nexports.PanoViewer = _PanoViewer.PanoViewer;\nexports.SpinViewer = _SpinViewer.SpinViewer;\nexports.SpriteImage = _SpinViewer.SpriteImage;\nexports.VERSION = VERSION;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/index.js\n// module id = 43\n// module chunks = 0 1"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACr2EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AChdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACllFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACziBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/view360.pkgd.min.js b/dist/view360.pkgd.min.js index 064cd1052..5d78ce4b1 100644 --- a/dist/view360.pkgd.min.js +++ b/dist/view360.pkgd.min.js @@ -11,5 +11,5 @@ * NOTE: This is not an official distribution file and is only for user convenience. * */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("view360",[],e):"object"==typeof exports?exports.view360=e():(t.eg=t.eg||{},t.eg.view360=e())}(this,function(){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.i=function(t){return t},__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=43)}([function(t,e,n){!function(e,n){t.exports=n()}(0,function(){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=0)}([function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);r["default"].VERSION="2.1.0",t.exports=r["default"]},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=function(){function Component(){_classCallCheck(this,Component),this._eventHandler={},this.options={}}return Component.prototype.trigger=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var a=arguments.length,s=Array(a>2?a-2:0),u=2;u=1&&(r=r.concat(s)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if("object"===(void 0===t?"undefined":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if("string"==typeof t&&"function"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,_=a["default"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==d.YAW_DELTA_BY_YAW?a["default"].fromValues(0,f,0):a["default"].fromValues(f,0,0),a["default"].transformQuat(_,_,u),a["default"].transformQuat(m,m,u);var g=_,v=m,y=a["default"].create();a["default"].cross(y,g,v),a["default"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(l,l,u),c=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(c,c,s);var I=Math.abs(c[0]*w+c[1]*E+c[2]*T),b=a["default"].create();a["default"].subtract(b,c,a["default"].scale(a["default"].create(),y,I));var R=(b[0]*l[0]+b[1]*l[1]+b[2]*l[2])/(a["default"].length(b)*a["default"].length(l));R>1&&(R=1);var x=Math.acos(R),P=a["default"].cross(a["default"].create(),l,b);I=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?I>0?1:-1:I<0?1:-1;var C=x*A*f;return r["default"].toDegree(C)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),a=_interopRequireDefault(o),s=n(35),u=_interopRequireDefault(s),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return"number"!=typeof t?"Not a number":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h["default"].create();return h["default"].rotateY(n,n,r["default"].toRadian(t)),h["default"].rotateX(n,n,r["default"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r["default"].toDegree(f.extractYawFromQuat(t)),pitch:r["default"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r["default"],e.mat4=p["default"],e.quat=h["default"],e.vec2=u["default"],e.vec3=a["default"],e.ROTATE_CONSTANT=d},function(t,e,n){"use strict";var i={};i.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){"use strict";function objectOrFunction(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}function isFunction(t){return"function"==typeof t}function setScheduler(t){s=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*s)/u,h=Math.sin(e*s)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return"data:"+t+";base64,"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var a=t.createProgram();t.attachShader(a,r),t.attachShader(a,o);for(var s in i)t.bindAttribLocation(a,i[s],s);return t.linkProgram(a),t.deleteShader(r),t.deleteShader(o),a},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r="",o=0;o-1?t.split("/")[2]:t.split("/")[0],e=e.split(":")[0]},t.exports=n},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();i.Float32Array="undefined"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH="ontouchstart"in i,e.SUPPORT_DEVICEMOTION="ondevicemotion"in i},function(t,e,n){"use strict";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS="pinchstart pinchmove pinchend",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}("undefined"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){"use strict";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement("div");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?"jQuery"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},a=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=a(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){"use strict";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case"mouse":i=!0;break;case"touch":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%a+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION="3.0.0-rc",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e["default"]=p},function(t,n){t.exports=e},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r["default"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=a.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var a=this,s=this.createAnimationParam(t,e,n),u=i({},s.depaPos),c=this.em.triggerAnimationStart(s),h=this.getUserControll(s);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r["default"].isCircularable(t,n.range,n.circular)})&&console.warn("You can't stop the 'animation' event when 'circular' is true."),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return a.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r["default"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var a=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(a).length?(a=this.axm.map(a,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r["default"].getCirculatedPos(t,i.range,i.circular):r["default"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(a,i)?this:(e>0?this.animateTo(a,e):(this.em.triggerChange(a),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=s},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ta?a+e.am.easing((t-a)/(s[1]*n))*s[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o["default"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o["default"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,a){if(this.itm.isInterrupting()&&this.moveDistance){var s=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?s[e]+t:o["default"].getInsidePosition(s[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,s,a);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=a},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[s.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=s.convertInputType(this.options.inputType);if(!o)throw new Error("Wrong inputType parameter!");this.hammer=s.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[s.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[s.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get("pan").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,s.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,s.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on("hammer.input",this.onHammerInput).on("panstart panmove",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off("hammer.input",this.onHammerInput).off("panstart panmove",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener("wheel",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener("wheel",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=a},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nthis._rowCount-1||t>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-t+"% "+100*-e+"%"),this._colRow=[t,e])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(t){return"number"==typeof t?t+"px":t},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var t=this,e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=e.interval,i=e.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:i});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var r=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){r%=t._totalCount;var e=t.toColRow(r);t.setColRow(e[0],e[1]),r++,++a===t._totalCount&&(a=0,o++),i>0&&o===i&&clearInterval(t._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(t){var e=this._colCount,n=this._rowCount;return t<0?[0,0]:t>=this._totalCount?[e-1,n-1]:[t%e,Math.floor(t/e)]},SpriteImage}(r["default"]);e["default"]=o},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i=n(13),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={0:"NO_ERROR",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",37442:"CONTEXT_LOST_WEBGL"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(t,e,n){var i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),t.getShaderParameter(i,t.COMPILE_STATUS)?i:(t.deleteShader(i),null)},WebGLUtils.createProgram=function(t,e,n){var i=t.createProgram();return t.attachShader(i,e),t.attachShader(i,n),t.linkProgram(i),t.getProgramParameter(i,t.LINK_STATUS)?i:(t.deleteProgram(i),null)},WebGLUtils.initBuffer=function(t,e,n,i,r){var o=t.createBuffer();return t.bindBuffer(e,o),t.bufferData(e,n,t.STATIC_DRAW),o&&(o.itemSize=i,o.numItems=n.length/i),r!==undefined&&(t.enableVertexAttribArray(r),t.vertexAttribPointer(r,o.itemSize,t.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(t,e,n){null!==e&&null!==n&&(t.bindBuffer(t.ARRAY_BUFFER,e),t.vertexAttribPointer(n,e.itemSize,t.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(t){function onWebglcontextcreationerror(t){return t.statusMessage}var e=["webgl","experimental-webgl","webkit-3d","moz-webgl"],n=null;t.addEventListener("webglcontextcreationerror",onWebglcontextcreationerror);for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o["default"].setUa(t);var e={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),"ios"===e.os.name&&e.browser.webview&&(e.browser.version="-1"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{"default":t}}(r);agent.VERSION="2.1.2",e["default"]=agent,t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){"use strict";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,"i").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r["default"].browser,r["default"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r["default"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r["default"].defaultString.browser.version,i=new RegExp("("+t+")","i").exec(e);if(!i)return n;var o=i.index,a=i[0];if(o>-1){var s=o+a.length+1;n=e.substring(s).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r["default"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r["default"].os,t)}function getOsName(){return getIdentityStringFromArray(r["default"].os,r["default"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r["default"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var a=e.versionSearch||t,s=new RegExp("("+a+")\\s([\\d_\\.]+|\\d_0)","i");return s.exec(o)&&(i=s.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=void 0;e["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};e["default"]=i,t.exports=e["default"]}])})},function(t,e,n){var i;!function(r,o,a,s){"use strict";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==s)for(i=0;i\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||s:s,e):t}function ifUndefined(t,e){return t===s?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,a=n.firstMultiple,s=a?a.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(s,u),e.distance=getDistance(s,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=a?getScale(a.pointers,i):1,e.rotation=a?getRotation(a.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==I&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,a=t.lastInterval||e,u=e.timeStamp-a.timeStamp;if(e.eventType!=x&&(u>T||a.velocity===s)){var c=e.deltaX-a.deltaX,h=e.deltaY-a.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=a.velocity,i=a.velocityX,r=a.velocityY,o=a.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:C:e<0?O:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=U,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),"identifier",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(I|b)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,a=toArray(t.changedTouches),s=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===I)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&at||!(this.state&at)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&at)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&I)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&at)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=r,_possibleConstructorReturn(r,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),a=r,_possibleConstructorReturn(r,a)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})["catch"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new a.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on("change",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){"boolean"==typeof t&&this._yawPitchControl.option("useZoom",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option("useKeyboard",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option("useGyro",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option("fovRange",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option("yawRange",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option("pitchRange",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option("showPolePoint",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option("pitchRange"),o=r[1]-r[0],a=t.fov!==undefined?t.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,t.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=i,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/i,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,i),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),e&&a.setImage({image:e,imageType:o.imageType,isVideo:r}),a}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new a["default"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p["default"]:d["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement("canvas");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new m(function(e,n){if(!t._contentLoader)return void n("ImageLoader is not initialized");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension("WEBGL_lose_context");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*v,r=e*v;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+h["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h["default"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=h["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h["default"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h["default"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h["default"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,"aVertexPosition"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=t.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=t.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,"aTextureCoord"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h["default"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),i,t)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r["default"]);e["default"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=g},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if("object"===(void 0===t?"undefined":i(t))?(e=t.src,n=t.type):"string"==typeof t&&(e=t),!e)return!1;var r=document.createElement("source");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:"string"!=typeof t&&"object"!==(void 0===t?"undefined":i(t))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once("loadeddata",function(){return e(t._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e["default"]=a},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),a=_interopRequireDefault(o);e.PanoImageRenderer=r["default"],e.WebGLUtils=a["default"]},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn("Image width("+i+") exceeds device limit("+r+"))");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*s,p=a,f=c*s,d=r/60,_=i/60;if(t.push(d,_),e.push(2*l,2*p,2*f),60!==r&&60!==i){var m=61*i+r,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r["default"]);e["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){"use strict";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(s.push(e[0]),a[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return"string"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return"showPolePoint"===t||"fov"===t||"aspectRatio"===t||"yawRange"===t||"pitchRange"===t})&&this._updateControlScale(),t.some(function(t){return"fovRange"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return"useGyro"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return"useKeyboard"===t})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return"useZoom"===t})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],ar[1]&&(a=r[1]),si[1]&&(s=i[1]),t&&t.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),a=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+a,t[1]*r-a].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],a=e[i+1],s=n[i],u=n[i+1];return YawPitchControl.lerp(s,u,(t-o)/(a-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);g.VERSION="3.0.0-rc",e["default"]=g},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),a=_interopRequireDefault(o),s=n(39),u=_interopRequireDefault(s);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r["default"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),a["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",r["default"].radToDeg*a["default"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r["default"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e["default"]=u["default"]},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=n(1),a=n(6),s=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==a.window.navigator.userAgent.indexOf("Android"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener("deviceorientation",this._onDeviceOrientation),a.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener("deviceorientation",this._onDeviceOrientation),a.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r["default"]);e["default"]=s},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),_=n(28),m=_interopRequireDefault(_),g=.98,v=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d["default"],e.accelerometer=new u["default"].Vector3,e.gyroscope=new u["default"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new m["default"](g),e.posePredictor=new a["default"](v),e.filterToWorldQ=new u["default"].Quaternion,e.isFirefoxAndroid=h["default"].isFirefoxAndroid(),e.isIOS=h["default"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u["default"].Quaternion,e.worldToScreenQ=new u["default"].Quaternion,e.originalPoseAdjustQ=new u["default"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h["default"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u["default"].Quaternion,e.deviceMotion.on("devicemotion",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger("change",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u["default"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r["default"]);e["default"]=y},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(a=1/Math.sqrt(a),t[0]=n*a,t[1]=i*a,t[2]=r*a,t[3]=o*a),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],a=t[3],s=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-s)<=r["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(i-u)<=r["default"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-h)<=r["default"].EPSILON*Math.max(1,Math.abs(a),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r["default"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2];return t[0]=r*u-o*s,t[1]=o*a-i*u,t[2]=i*s-r*a,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2],c=n[3],h=c*i+s*o-u*r,l=c*r+u*i-a*o,p=c*o+a*r-s*i,f=-a*i-s*r-u*o;return t[0]=h*c+f*-a+l*-u-p*-s,t[1]=l*c+f*-s+p*-a-h*-u,t[2]=p*c+f*-u+h*-s-l*-a,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var t=runTimeout(cleanUpNextTick);s=!0;for(var e=a.length;e;){for(o=a,a=[];++u1)for(var n=1;n1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var a=arguments.length,s=Array(a>2?a-2:0),u=2;u=1&&(r=r.concat(s)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if("object"===(void 0===t?"undefined":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if("string"==typeof t&&"function"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,_=a["default"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==d.YAW_DELTA_BY_YAW?a["default"].fromValues(0,f,0):a["default"].fromValues(f,0,0),a["default"].transformQuat(_,_,u),a["default"].transformQuat(m,m,u);var g=_,v=m,y=a["default"].create();a["default"].cross(y,g,v),a["default"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(l,l,u),c=a["default"].fromValues(o[0],o[1],o[2]),a["default"].transformQuat(c,c,s);var I=Math.abs(c[0]*w+c[1]*E+c[2]*T),b=a["default"].create();a["default"].subtract(b,c,a["default"].scale(a["default"].create(),y,I));var R=(b[0]*l[0]+b[1]*l[1]+b[2]*l[2])/(a["default"].length(b)*a["default"].length(l));R>1&&(R=1);var x=Math.acos(R),P=a["default"].cross(a["default"].create(),l,b);I=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?I>0?1:-1:I<0?1:-1;var C=x*A*f;return r["default"].toDegree(C)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),a=_interopRequireDefault(o),s=n(35),u=_interopRequireDefault(s),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return"number"!=typeof t?"Not a number":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h["default"].create();return h["default"].rotateY(n,n,r["default"].toRadian(t)),h["default"].rotateX(n,n,r["default"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r["default"].toDegree(f.extractYawFromQuat(t)),pitch:r["default"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r["default"],e.mat4=p["default"],e.quat=h["default"],e.vec2=u["default"],e.vec3=a["default"],e.ROTATE_CONSTANT=d},function(t,e,n){"use strict";var i={};i.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){"use strict";function objectOrFunction(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}function isFunction(t){return"function"==typeof t}function setScheduler(t){s=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*s)/u,h=Math.sin(e*s)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return"data:"+t+";base64,"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var a=t.createProgram();t.attachShader(a,r),t.attachShader(a,o);for(var s in i)t.bindAttribLocation(a,i[s],s);return t.linkProgram(a),t.deleteShader(r),t.deleteShader(o),a},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r="",o=0;o-1?t.split("/")[2]:t.split("/")[0],e=e.split(":")[0]},t.exports=n},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();i.Float32Array="undefined"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH="ontouchstart"in i,e.SUPPORT_DEVICEMOTION="ondevicemotion"in i},function(t,e,n){"use strict";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:"none",YAWPITCH:"yawPitch"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS="pinchstart pinchmove pinchend",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}("undefined"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){"use strict";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement("div");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?"jQuery"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},a=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=a(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){"use strict";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case"mouse":i=!0;break;case"touch":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%a+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION="3.0.0-rc",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e["default"]=p},function(t,n){t.exports=e},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r["default"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=a.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var a=this,s=this.createAnimationParam(t,e,n),u=i({},s.depaPos),c=this.em.triggerAnimationStart(s),h=this.getUserControll(s);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r["default"].isCircularable(t,n.range,n.circular)})&&console.warn("You can't stop the 'animation' event when 'circular' is true."),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return a.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r["default"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var a=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(a).length?(a=this.axm.map(a,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r["default"].getCirculatedPos(t,i.range,i.circular):r["default"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(a,i)?this:(e>0?this.animateTo(a,e):(this.em.triggerChange(a),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=s},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ta?a+e.am.easing((t-a)/(s[1]*n))*s[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o["default"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o["default"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,a){if(this.itm.isInterrupting()&&this.moveDistance){var s=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?s[e]+t:o["default"].getInsidePosition(s[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,s,a);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=a},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[s.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=s.convertInputType(this.options.inputType);if(!o)throw new Error("Wrong inputType parameter!");this.hammer=s.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[s.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[s.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get("pan").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,s.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,s.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on("hammer.input",this.onHammerInput).on("panstart panmove",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off("hammer.input",this.onHammerInput).off("panstart panmove",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener("wheel",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener("wheel",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=a},function(t,e,n){"use strict";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nthis._rowCount-1||t>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-t+"% "+100*-e+"%"),this._colRow=[t,e])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(t){return"number"==typeof t?t+"px":t},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var t=this,e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=e.interval,i=e.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:i});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var r=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){r%=t._totalCount;var e=t.toColRow(r);t.setColRow(e[0],e[1]),r++,++a===t._totalCount&&(a=0,o++),i>0&&o===i&&clearInterval(t._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(t){var e=this._colCount,n=this._rowCount;return t<0?[0,0]:t>=this._totalCount?[e-1,n-1]:[t%e,Math.floor(t/e)]},SpriteImage}(r["default"]);e["default"]=o},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i=n(13),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={0:"NO_ERROR",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",37442:"CONTEXT_LOST_WEBGL"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(t,e,n){var i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),t.getShaderParameter(i,t.COMPILE_STATUS)?i:(t.deleteShader(i),null)},WebGLUtils.createProgram=function(t,e,n){var i=t.createProgram();return t.attachShader(i,e),t.attachShader(i,n),t.linkProgram(i),t.getProgramParameter(i,t.LINK_STATUS)?i:(t.deleteProgram(i),null)},WebGLUtils.initBuffer=function(t,e,n,i,r){var o=t.createBuffer();return t.bindBuffer(e,o),t.bufferData(e,n,t.STATIC_DRAW),o&&(o.itemSize=i,o.numItems=n.length/i),r!==undefined&&(t.enableVertexAttribArray(r),t.vertexAttribPointer(r,o.itemSize,t.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(t,e,n){null!==e&&null!==n&&(t.bindBuffer(t.ARRAY_BUFFER,e),t.vertexAttribPointer(n,e.itemSize,t.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(t){function onWebglcontextcreationerror(t){return t.statusMessage}var e=["webgl","experimental-webgl","webkit-3d","moz-webgl"],n=null;t.addEventListener("webglcontextcreationerror",onWebglcontextcreationerror);for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o["default"].setUa(t);var e={os:o["default"].getOs(),browser:o["default"].getBrowser(),isMobile:o["default"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),"ios"===e.os.name&&e.browser.webview&&(e.browser.version="-1"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{"default":t}}(r);agent.VERSION="2.1.2",e["default"]=agent,t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){"use strict";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,"i").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r["default"].browser,r["default"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r["default"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r["default"].defaultString.browser.version,i=new RegExp("("+t+")","i").exec(e);if(!i)return n;var o=i.index,a=i[0];if(o>-1){var s=o+a.length+1;n=e.substring(s).split(" ")[0].replace(/_/g,".").replace(/;|\)/g,"")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r["default"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r["default"].os,t)}function getOsName(){return getIdentityStringFromArray(r["default"].os,r["default"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r["default"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var a=e.versionSearch||t,s=new RegExp("("+a+")\\s([\\d_\\.]+|\\d_0)","i");return s.exec(o)&&(i=s.exec(o)[2].replace(/_/g,".").replace(/;|\)/g,"")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf("Mobi")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=void 0;e["default"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e["default"]},function(t,e,n){"use strict";e.__esModule=!0;var i={browser:[{criteria:"PhantomJS",identity:"PhantomJS"},{criteria:/Whale/,identity:"Whale",versionSearch:"Whale"},{criteria:/Edge/,identity:"Edge",versionSearch:"Edge"},{criteria:/MSIE|Trident|Windows Phone/,identity:"IE",versionSearch:"IEMobile|MSIE|rv"},{criteria:/MiuiBrowser/,identity:"MIUI Browser",versionSearch:"MiuiBrowser"},{criteria:/SamsungBrowser/,identity:"Samsung Internet",versionSearch:"SamsungBrowser"},{criteria:/SAMSUNG /,identity:"Samsung Internet",versionSearch:"Version"},{criteria:/Chrome|CriOS/,identity:"Chrome"},{criteria:/Android/,identity:"Android Browser",versionSearch:"Version"},{criteria:/iPhone|iPad/,identity:"Safari",versionSearch:"Version"},{criteria:"Apple",identity:"Safari",versionSearch:"Version"},{criteria:"Firefox",identity:"Firefox"}],os:[{criteria:/Windows Phone/,identity:"Windows Phone",versionSearch:"Windows Phone"},{criteria:"Windows 2000",identity:"Window",versionAlias:"5.0"},{criteria:/Windows NT/,identity:"Window",versionSearch:"Windows NT"},{criteria:/iPhone|iPad/,identity:"iOS",versionSearch:"iPhone OS|CPU OS"},{criteria:"Mac",versionSearch:"OS X",identity:"MAC"},{criteria:/Android/,identity:"Android"},{criteria:/Tizen/,identity:"Tizen"},{criteria:/Web0S/,identity:"WebOS"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:"Version",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:"-1",name:"unknown"},os:{version:"-1",name:"unknown"}}};e["default"]=i,t.exports=e["default"]}])})},function(t,e,n){var i;!function(r,o,a,s){"use strict";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==s)for(i=0;i\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||s:s,e):t}function ifUndefined(t,e){return t===s?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,a=n.firstMultiple,s=a?a.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(s,u),e.distance=getDistance(s,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=a?getScale(a.pointers,i):1,e.rotation=a?getRotation(a.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==I&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,a=t.lastInterval||e,u=e.timeStamp-a.timeStamp;if(e.eventType!=x&&(u>T||a.velocity===s)){var c=e.deltaX-a.deltaX,h=e.deltaY-a.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=a.velocity,i=a.velocityX,r=a.velocityY,o=a.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:C:e<0?O:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=U,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),"identifier",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(I|b)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,a=toArray(t.changedTouches),s=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===I)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&at||!(this.state&at)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&at)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&I)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&at)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:"invalid device"})},0),o=r,_possibleConstructorReturn(r,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:"no webgl support"})},0),a=r,_possibleConstructorReturn(r,a)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:"Specifying multi resouces(both image and video) is not valid."})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn("Currently not supporting to change content type(Image <--\x3e Video)"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})["catch"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:"failed to bind texture"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:"webgl rendering context lost"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new a.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on("change",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){"boolean"==typeof t&&this._yawPitchControl.option("useZoom",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option("useKeyboard",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option("useGyro",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option("fovRange",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option("fovRange")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option("aspectRatio",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option("yawRange")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option("pitchRange")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option("yawRange",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option("pitchRange",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option("showPolePoint",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option("pitchRange"),o=r[1]-r[0],a=t.fov!==undefined?t.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:"bindTexture",IMAGE_LOADED:"imageLoaded",ERROR:"error",RENDERING_CONTEXT_LOST:"renderingContextLost",RENDERING_CONTEXT_RESTORE:"renderingContextRestore"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,t.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=i,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/i,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,i),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),e&&a.setImage({image:e,imageType:o.imageType,isVideo:r}),a}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u["default"],this._keepUpdate=!0):(this._contentLoader=new a["default"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)["catch"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p["default"]:d["default"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement("canvas");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin="auto",n.style.maxHeight="100%",n.style.maxWidth="100%",n.style.outline="none",n.style.position="absolute",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener("webglcontextlost",this._onWebglcontextlost),n.addEventListener("webglcontextrestored",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:"failed to load image"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new m(function(e,n){if(!t._contentLoader)return void n("ImageLoader is not initialized");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension("WEBGL_lose_context");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener("webglcontextlost",this._onWebglcontextlost),this.canvas.removeEventListener("webglcontextrestored",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger("renderingContextLost")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger("renderingContextRestore")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*v,r=e*v;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error("Failed to intialize shaders: "+h["default"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:"no webgl support"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h["default"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error("WebGLRenderingContext not available.");if(this.context=h["default"].getWebglContext(this.canvas),!this.context)throw new Error("Failed to acquire 3D rendering context")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h["default"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h["default"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h["default"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,"aVertexPosition"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,"uPMatrix"),o.mvMatrixUniform=t.getUniformLocation(o,"uMVMatrix"),o.samplerUniform=t.getUniformLocation(o,"uSampler"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,"aTextureCoord"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h["default"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h["default"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),i,t)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r["default"]);e["default"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=g},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if("object"===(void 0===t?"undefined":i(t))?(e=t.src,n=t.type):"string"==typeof t&&(e=t),!e)return!1;var r=document.createElement("source");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:"string"!=typeof t&&"object"!==(void 0===t?"undefined":i(t))||(this._video=document.createElement("video"),this._video.crossOrigin="anonymous",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once("loadeddata",function(){return e(t._video)}):n("VideoLoader: video is undefined")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e["default"]=a},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),a=_interopRequireDefault(o);e.PanoImageRenderer=r["default"],e.WebGLUtils=a["default"]},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn("Image width("+i+") exceeds device limit("+r+"))");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*s,p=a,f=c*s,d=r/60,_=i/60;if(t.push(d,_),e.push(2*l,2*p,2*f),60!==r&&60!==i){var m=61*i+r,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r["default"]);e["default"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){"use strict";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:"ready",VIEW_CHANGE:"viewChange",ANIMATION_END:"animationEnd",ERROR:"error",CONTENT_LOADED:"contentLoaded"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(s.push(e[0]),a[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return"string"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return"showPolePoint"===t||"fov"===t||"aspectRatio"===t||"yawRange"===t||"pitchRange"===t})&&this._updateControlScale(),t.some(function(t){return"fovRange"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return"useGyro"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect(["yaw","pitch"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return"useKeyboard"===t})){this.options.useKeyboard?this.axes.connect(["yaw","pitch"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return"useZoom"===t})){this.options.useZoom?(this.axes.connect(["fov"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect(["fov"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],ar[1]&&(a=r[1]),si[1]&&(s=i[1]),t&&t.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),a=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+a,t[1]*r-a].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger("change",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],a=e[i+1],s=n[i],u=n[i+1];return YawPitchControl.lerp(s,u,(t-o)/(a-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect(["yaw","pitch"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o["default"]);g.VERSION="3.0.0-rc",e["default"]=g},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),a=_interopRequireDefault(o),s=n(39),u=_interopRequireDefault(s);u["default"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r["default"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r["default"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),a["default"].isDebug()&&console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)",r["default"].radToDeg*a["default"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r["default"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u["default"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e["default"]=u["default"]},function(t,e,n){"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o=n(1),a=n(6),s=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==a.window.navigator.userAgent.indexOf("Android"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger("devicemotion",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener("deviceorientation",this._onDeviceOrientation),a.window.addEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener("deviceorientation",this._onDeviceOrientation),a.window.removeEventListener("devicemotion",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r["default"]);e["default"]=s},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),_=n(28),m=_interopRequireDefault(_),g=.98,v=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d["default"],e.accelerometer=new u["default"].Vector3,e.gyroscope=new u["default"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new m["default"](g),e.posePredictor=new a["default"](v),e.filterToWorldQ=new u["default"].Quaternion,e.isFirefoxAndroid=h["default"].isFirefoxAndroid(),e.isIOS=h["default"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u["default"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u["default"].Quaternion,e.worldToScreenQ=new u["default"].Quaternion,e.originalPoseAdjustQ=new u["default"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h["default"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u["default"].Quaternion,e.deviceMotion.on("devicemotion",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener("orientationchange",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger("change",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u["default"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h["default"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u["default"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r["default"]);e["default"]=y},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(a=1/Math.sqrt(a),t[0]=n*a,t[1]=i*a,t[2]=r*a,t[3]=o*a),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],a=t[3],s=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-s)<=r["default"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(i-u)<=r["default"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r["default"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-h)<=r["default"].EPSILON*Math.max(1,Math.abs(a),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){"use strict";var i=n(2),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),o={};o.create=function(){var t=new r["default"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r["default"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2];return t[0]=r*u-o*s,t[1]=o*a-i*u,t[2]=i*s-r*a,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2],c=n[3],h=c*i+s*o-u*r,l=c*r+u*i-a*o,p=c*o+a*r-s*i,f=-a*i-s*r-u*o;return t[0]=h*c+f*-a+l*-u-p*-s,t[1]=l*c+f*-s+p*-a-h*-u,t[2]=p*c+f*-u+h*-s-l*-a,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var t=runTimeout(cleanUpNextTick);s=!0;for(var e=a.length;e;){for(o=a,a=[];++u1)for(var n=1;n1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var a=arguments.length,s=Array(a>2?a-2:0),u=2;u=1&&(r=r.concat(s)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if(\"object\"===(void 0===t?\"undefined\":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if(\"string\"==typeof t&&\"function\"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,_=a[\"default\"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==d.YAW_DELTA_BY_YAW?a[\"default\"].fromValues(0,f,0):a[\"default\"].fromValues(f,0,0),a[\"default\"].transformQuat(_,_,u),a[\"default\"].transformQuat(m,m,u);var g=_,v=m,y=a[\"default\"].create();a[\"default\"].cross(y,g,v),a[\"default\"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(l,l,u),c=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(c,c,s);var I=Math.abs(c[0]*w+c[1]*E+c[2]*T),b=a[\"default\"].create();a[\"default\"].subtract(b,c,a[\"default\"].scale(a[\"default\"].create(),y,I));var R=(b[0]*l[0]+b[1]*l[1]+b[2]*l[2])/(a[\"default\"].length(b)*a[\"default\"].length(l));R>1&&(R=1);var x=Math.acos(R),P=a[\"default\"].cross(a[\"default\"].create(),l,b);I=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?I>0?1:-1:I<0?1:-1;var C=x*A*f;return r[\"default\"].toDegree(C)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),a=_interopRequireDefault(o),s=n(35),u=_interopRequireDefault(s),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return\"number\"!=typeof t?\"Not a number\":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h[\"default\"].create();return h[\"default\"].rotateY(n,n,r[\"default\"].toRadian(t)),h[\"default\"].rotateX(n,n,r[\"default\"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r[\"default\"].toDegree(f.extractYawFromQuat(t)),pitch:r[\"default\"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r[\"default\"],e.mat4=p[\"default\"],e.quat=h[\"default\"],e.vec2=u[\"default\"],e.vec3=a[\"default\"],e.ROTATE_CONSTANT=d},function(t,e,n){\"use strict\";var i={};i.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){\"use strict\";function objectOrFunction(t){var e=typeof t;return null!==t&&(\"object\"===e||\"function\"===e)}function isFunction(t){return\"function\"==typeof t}function setScheduler(t){s=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*s)/u,h=Math.sin(e*s)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return\"data:\"+t+\";base64,\"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var a=t.createProgram();t.attachShader(a,r),t.attachShader(a,o);for(var s in i)t.bindAttribLocation(a,i[s],s);return t.linkProgram(a),t.deleteShader(r),t.deleteShader(o),a},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r=\"\",o=0;o-1?t.split(\"/\")[2]:t.split(\"/\")[0],e=e.split(\":\")[0]},t.exports=n},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();i.Float32Array=\"undefined\"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH=\"ontouchstart\"in i,e.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in i},function(t,e,n){\"use strict\";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}(\"undefined\"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t[\"default\"]}:function(){return t};return __webpack_require__.d(e,\"a\",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p=\"\",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){\"use strict\";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement(\"div\");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?\"jQuery\"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},a=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=a(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){\"use strict\";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case\"mouse\":i=!0;break;case\"touch\":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%a+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION=\"3.0.0-rc\",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e[\"default\"]=p},function(t,n){t.exports=e},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r[\"default\"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=a.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var a=this,s=this.createAnimationParam(t,e,n),u=i({},s.depaPos),c=this.em.triggerAnimationStart(s),h=this.getUserControll(s);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r[\"default\"].isCircularable(t,n.range,n.circular)})&&console.warn(\"You can't stop the 'animation' event when 'circular' is true.\"),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return a.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r[\"default\"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var a=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(a).length?(a=this.axm.map(a,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r[\"default\"].getCirculatedPos(t,i.range,i.circular):r[\"default\"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(a,i)?this:(e>0?this.animateTo(a,e):(this.em.triggerChange(a),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=s},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ta?a+e.am.easing((t-a)/(s[1]*n))*s[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o[\"default\"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o[\"default\"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,a){if(this.itm.isInterrupting()&&this.moveDistance){var s=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?s[e]+t:o[\"default\"].getInsidePosition(s[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,s,a);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=a},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[s.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=s.convertInputType(this.options.inputType);if(!o)throw new Error(\"Wrong inputType parameter!\");this.hammer=s.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[s.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[s.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get(\"pan\").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,s.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,s.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on(\"hammer.input\",this.onHammerInput).on(\"panstart panmove\",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off(\"hammer.input\",this.onHammerInput).off(\"panstart panmove\",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener(\"wheel\",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener(\"wheel\",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=a},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nthis._rowCount-1||t>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-t+\"% \"+100*-e+\"%\"),this._colRow=[t,e])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(t){return\"number\"==typeof t?t+\"px\":t},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var t=this,e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=e.interval,i=e.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:i});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var r=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){r%=t._totalCount;var e=t.toColRow(r);t.setColRow(e[0],e[1]),r++,++a===t._totalCount&&(a=0,o++),i>0&&o===i&&clearInterval(t._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(t){var e=this._colCount,n=this._rowCount;return t<0?[0,0]:t>=this._totalCount?[e-1,n-1]:[t%e,Math.floor(t/e)]},SpriteImage}(r[\"default\"]);e[\"default\"]=o},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}e.__esModule=!0;var i=n(13),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={0:\"NO_ERROR\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",37442:\"CONTEXT_LOST_WEBGL\"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(t,e,n){var i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),t.getShaderParameter(i,t.COMPILE_STATUS)?i:(t.deleteShader(i),null)},WebGLUtils.createProgram=function(t,e,n){var i=t.createProgram();return t.attachShader(i,e),t.attachShader(i,n),t.linkProgram(i),t.getProgramParameter(i,t.LINK_STATUS)?i:(t.deleteProgram(i),null)},WebGLUtils.initBuffer=function(t,e,n,i,r){var o=t.createBuffer();return t.bindBuffer(e,o),t.bufferData(e,n,t.STATIC_DRAW),o&&(o.itemSize=i,o.numItems=n.length/i),r!==undefined&&(t.enableVertexAttribArray(r),t.vertexAttribPointer(r,o.itemSize,t.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(t,e,n){null!==e&&null!==n&&(t.bindBuffer(t.ARRAY_BUFFER,e),t.vertexAttribPointer(n,e.itemSize,t.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(t){function onWebglcontextcreationerror(t){return t.statusMessage}var e=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],n=null;t.addEventListener(\"webglcontextcreationerror\",onWebglcontextcreationerror);for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o[\"default\"].setUa(t);var e={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),\"ios\"===e.os.name&&e.browser.webview&&(e.browser.version=\"-1\"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{\"default\":t}}(r);agent.VERSION=\"2.1.2\",e[\"default\"]=agent,t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){\"use strict\";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,\"i\").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r[\"default\"].browser,r[\"default\"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r[\"default\"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r[\"default\"].defaultString.browser.version,i=new RegExp(\"(\"+t+\")\",\"i\").exec(e);if(!i)return n;var o=i.index,a=i[0];if(o>-1){var s=o+a.length+1;n=e.substring(s).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r[\"default\"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r[\"default\"].os,t)}function getOsName(){return getIdentityStringFromArray(r[\"default\"].os,r[\"default\"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r[\"default\"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var a=e.versionSearch||t,s=new RegExp(\"(\"+a+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return s.exec(o)&&(i=s.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=void 0;e[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};e[\"default\"]=i,t.exports=e[\"default\"]}])})},function(t,e,n){var i;!function(r,o,a,s){\"use strict\";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==s)for(i=0;i\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||s:s,e):t}function ifUndefined(t,e){return t===s?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,a=n.firstMultiple,s=a?a.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(s,u),e.distance=getDistance(s,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=a?getScale(a.pointers,i):1,e.rotation=a?getRotation(a.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==I&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,a=t.lastInterval||e,u=e.timeStamp-a.timeStamp;if(e.eventType!=x&&(u>T||a.velocity===s)){var c=e.deltaX-a.deltaX,h=e.deltaY-a.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=a.velocity,i=a.velocityX,r=a.velocityY,o=a.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:C:e<0?O:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=U,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),\"identifier\",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(I|b)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,a=toArray(t.changedTouches),s=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===I)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&at||!(this.state&at)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&at)},emit:function(t){if(1!==t.scale){var e=t.scale<1?\"in\":\"out\";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&I)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+\"up\",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&at)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=r,_possibleConstructorReturn(r,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),a=r,_possibleConstructorReturn(r,a)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})[\"catch\"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new a.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on(\"change\",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){\"boolean\"==typeof t&&this._yawPitchControl.option(\"useZoom\",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option(\"useKeyboard\",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option(\"useGyro\",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option(\"fovRange\",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option(\"yawRange\",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option(\"pitchRange\",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option(\"showPolePoint\",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option(\"pitchRange\"),o=r[1]-r[0],a=t.fov!==undefined?t.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,t.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=i,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/i,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,i),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),e&&a.setImage({image:e,imageType:o.imageType,isVideo:r}),a}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new a[\"default\"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p[\"default\"]:d[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement(\"canvas\");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new m(function(e,n){if(!t._contentLoader)return void n(\"ImageLoader is not initialized\");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension(\"WEBGL_lose_context\");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*v,r=e*v;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+h[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h[\"default\"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=h[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h[\"default\"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h[\"default\"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h[\"default\"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,\"aVertexPosition\"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=t.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=t.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,\"aTextureCoord\"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h[\"default\"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),i,t)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r[\"default\"]);e[\"default\"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=g},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}e.__esModule=!0;var i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},r=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if(\"object\"===(void 0===t?\"undefined\":i(t))?(e=t.src,n=t.type):\"string\"==typeof t&&(e=t),!e)return!1;var r=document.createElement(\"source\");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:\"string\"!=typeof t&&\"object\"!==(void 0===t?\"undefined\":i(t))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once(\"loadeddata\",function(){return e(t._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e[\"default\"]=a},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),a=_interopRequireDefault(o);e.PanoImageRenderer=r[\"default\"],e.WebGLUtils=a[\"default\"]},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn(\"Image width(\"+i+\") exceeds device limit(\"+r+\"))\");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*s,p=a,f=c*s,d=r/60,_=i/60;if(t.push(d,_),e.push(2*l,2*p,2*f),60!==r&&60!==i){var m=61*i+r,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r[\"default\"]);e[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){\"use strict\";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(s.push(e[0]),a[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return\"string\"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return\"showPolePoint\"===t||\"fov\"===t||\"aspectRatio\"===t||\"yawRange\"===t||\"pitchRange\"===t})&&this._updateControlScale(),t.some(function(t){return\"fovRange\"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return\"useGyro\"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return\"useKeyboard\"===t})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return\"useZoom\"===t})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],ar[1]&&(a=r[1]),si[1]&&(s=i[1]),t&&t.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),a=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+a,t[1]*r-a].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],a=e[i+1],s=n[i],u=n[i+1];return YawPitchControl.lerp(s,u,(t-o)/(a-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);g.VERSION=\"3.0.0-rc\",e[\"default\"]=g},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),a=_interopRequireDefault(o),s=n(39),u=_interopRequireDefault(s);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r[\"default\"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),a[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",r[\"default\"].radToDeg*a[\"default\"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e[\"default\"]=u[\"default\"]},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=n(1),a=n(6),s=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==a.window.navigator.userAgent.indexOf(\"Android\"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r[\"default\"]);e[\"default\"]=s},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),_=n(28),m=_interopRequireDefault(_),g=.98,v=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d[\"default\"],e.accelerometer=new u[\"default\"].Vector3,e.gyroscope=new u[\"default\"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new m[\"default\"](g),e.posePredictor=new a[\"default\"](v),e.filterToWorldQ=new u[\"default\"].Quaternion,e.isFirefoxAndroid=h[\"default\"].isFirefoxAndroid(),e.isIOS=h[\"default\"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u[\"default\"].Quaternion,e.worldToScreenQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h[\"default\"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u[\"default\"].Quaternion,e.deviceMotion.on(\"devicemotion\",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger(\"change\",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u[\"default\"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r[\"default\"]);e[\"default\"]=y},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(a=1/Math.sqrt(a),t[0]=n*a,t[1]=i*a,t[2]=r*a,t[3]=o*a),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],a=t[3],s=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-s)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(i-u)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-h)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(a),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r[\"default\"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2];return t[0]=r*u-o*s,t[1]=o*a-i*u,t[2]=i*s-r*a,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2],c=n[3],h=c*i+s*o-u*r,l=c*r+u*i-a*o,p=c*o+a*r-s*i,f=-a*i-s*r-u*o;return t[0]=h*c+f*-a+l*-u-p*-s,t[1]=l*c+f*-s+p*-a-h*-u,t[2]=p*c+f*-u+h*-s-l*-a,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var t=runTimeout(cleanUpNextTick);s=!0;for(var e=a.length;e;){for(o=a,a=[];++u1)for(var n=1;n1&&arguments[1]!==undefined?arguments[1]:{},n=this._eventHandler[t]||[];if(!(n.length>0))return!0;n=n.concat(),e.eventType=t;var i=!1,r=[e],o=0;e.stop=function(){i=!0},e.currentTarget=this;for(var a=arguments.length,s=Array(a>2?a-2:0),u=2;u=1&&(r=r.concat(s)),o=0;n[o];o++)n[o].apply(this,r);return!i},Component.prototype.once=function(t,e){if(\"object\"===(void 0===t?\"undefined\":i(t))&&void 0===e){var n=t,r=void 0;for(r in n)this.once(r,n[r]);return this}if(\"string\"==typeof t&&\"function\"==typeof e){var o=this;this.on(t,function listener(){for(var n=arguments.length,i=Array(n),r=0;r0?1:-1,_=a[\"default\"].fromValues(o[0],o[1],o[2]),m=void 0;m=n!==d.YAW_DELTA_BY_YAW?a[\"default\"].fromValues(0,f,0):a[\"default\"].fromValues(f,0,0),a[\"default\"].transformQuat(_,_,u),a[\"default\"].transformQuat(m,m,u);var g=_,v=m,y=a[\"default\"].create();a[\"default\"].cross(y,g,v),a[\"default\"].normalize(y,y);var w=y[0],E=y[1],T=y[2];l=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(l,l,u),c=a[\"default\"].fromValues(o[0],o[1],o[2]),a[\"default\"].transformQuat(c,c,s);var I=Math.abs(c[0]*w+c[1]*E+c[2]*T),b=a[\"default\"].create();a[\"default\"].subtract(b,c,a[\"default\"].scale(a[\"default\"].create(),y,I));var R=(b[0]*l[0]+b[1]*l[1]+b[2]*l[2])/(a[\"default\"].length(b)*a[\"default\"].length(l));R>1&&(R=1);var x=Math.acos(R),P=a[\"default\"].cross(a[\"default\"].create(),l,b);I=w*P[0]+E*P[1]+T*P[2];var A=void 0;A=n!==d.YAW_DELTA_BY_YAW?I>0?1:-1:I<0?1:-1;var C=x*A*f;return r[\"default\"].toDegree(C)}e.__esModule=!0,e.ROTATE_CONSTANT=e.vec3=e.vec2=e.quat=e.mat4=e.glMatrix=e.util=undefined;var i=n(2),r=_interopRequireDefault(i),o=n(36),a=_interopRequireDefault(o),s=n(35),u=_interopRequireDefault(s),c=n(34),h=_interopRequireDefault(c),l=n(33),p=_interopRequireDefault(l),f={};f.isPowerOfTwo=function(t){return\"number\"!=typeof t?\"Not a number\":t&&0==(t&t-1)},f.extractYawFromQuat=function(t){var e=quatToVec3(t);return 1*Math.atan2(e[0],e[2])},f.extractPitchFromQuat=function(t){var e=quatToVec3(t);return-1*Math.atan2(e[1],Math.sqrt(Math.pow(e[0],2)+Math.pow(e[2],2)))},f.getQuaternionWithYawPitch=function(t,e){var n=h[\"default\"].create();return h[\"default\"].rotateY(n,n,r[\"default\"].toRadian(t)),h[\"default\"].rotateX(n,n,r[\"default\"].toRadian(e)),n},f.quatToYawPitch=function(t){return{yaw:r[\"default\"].toDegree(f.extractYawFromQuat(t)),pitch:r[\"default\"].toDegree(f.extractPitchFromQuat(t))}},f.yawPitchToPoint=function(t,e){return[Math.tan(t)/Math.cos(e),Math.tan(e)]};var d={PITCH_DELTA:1,YAW_DELTA_BY_ROLL:2,YAW_DELTA_BY_YAW:3};d[d.PITCH_DELTA]={targetAxis:[0,1,0],meshPoint:[0,0,1]},d[d.YAW_DELTA_BY_ROLL]={targetAxis:[0,1,0],meshPoint:[1,0,0]},d[d.YAW_DELTA_BY_YAW]={targetAxis:[1,0,0],meshPoint:[0,0,1]},f.getRotationDelta=getRotationDelta,e.util=f,e.glMatrix=r[\"default\"],e.mat4=p[\"default\"],e.quat=h[\"default\"],e.vec2=u[\"default\"],e.vec3=a[\"default\"],e.ROTATE_CONSTANT=d},function(t,e,n){\"use strict\";var i={};i.ARRAY_TYPE=\"undefined\"!=typeof Float32Array?Float32Array:Array;var r=Math.PI/180;i.toRadian=function(t){return t*r},i.toDegree=function(t){return t/r},i.EPSILON=1e-4,t.exports=i},function(t,e,n){(function(e,i){!function(e,n){t.exports=n()}(0,function(){\"use strict\";function objectOrFunction(t){var e=typeof t;return null!==t&&(\"object\"===e||\"function\"===e)}function isFunction(t){return\"function\"==typeof t}function setScheduler(t){s=t}function setAsap(t){u=t}function useVertxTimer(){return void 0!==a?function(){a(flush)}:useSetTimeout()}function useSetTimeout(){var t=setTimeout;return function(){return t(flush,1)}}function flush(){for(var t=0;t=1)return this.w=o,this.x=n,this.y=i,this.z=r,this;var s=Math.acos(a),u=Math.sqrt(1-a*a);if(Math.abs(u)<.001)return this.w=.5*(o+this.w),this.x=.5*(n+this.x),this.y=.5*(i+this.y),this.z=.5*(r+this.z),this;var c=Math.sin((1-e)*s)/u,h=Math.sin(e*s)/u;return this.w=o*c+this.w*h,this.x=n*c+this.x*h,this.y=i*c+this.y*h,this.z=r*c+this.z*h,this},setFromUnitVectors:function(){var t,e;return function(i,r){return t===undefined&&(t=new n.Vector3),e=i.dot(r)+1,e<1e-6?(e=0,Math.abs(i.x)>Math.abs(i.z)?t.set(-i.y,i.x,0):t.set(0,-i.z,i.y)):t.crossVectors(i,r),this.x=t.x,this.y=t.y,this.z=t.z,this.w=e,this.normalize(),this}}()},t.exports=n},function(t,e){var n=window.Util||{};n.MIN_TIMESTEP=.001,n.MAX_TIMESTEP=1,n.base64=function(t,e){return\"data:\"+t+\";base64,\"+e},n.clamp=function(t,e,n){return Math.min(Math.max(e,t),n)},n.lerp=function(t,e,n){return t+(e-t)*n},n.race=function(t){return Promise.race?Promise.race(t):new Promise(function(e,n){for(var i=0;in.MAX_TIMESTEP))},n.getScreenWidth=function(){return Math.max(window.screen.width,window.screen.height)*window.devicePixelRatio},n.getScreenHeight=function(){return Math.min(window.screen.width,window.screen.height)*window.devicePixelRatio},n.requestFullscreen=function(t){if(n.isWebViewAndroid())return!1;if(t.requestFullscreen)t.requestFullscreen();else if(t.webkitRequestFullscreen)t.webkitRequestFullscreen();else if(t.mozRequestFullScreen)t.mozRequestFullScreen();else{if(!t.msRequestFullscreen)return!1;t.msRequestFullscreen()}return!0},n.exitFullscreen=function(){if(document.exitFullscreen)document.exitFullscreen();else if(document.webkitExitFullscreen)document.webkitExitFullscreen();else if(document.mozCancelFullScreen)document.mozCancelFullScreen();else{if(!document.msExitFullscreen)return!1;document.msExitFullscreen()}return!0},n.getFullscreenElement=function(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement},n.linkProgram=function(t,e,n,i){var r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);var a=t.createProgram();t.attachShader(a,r),t.attachShader(a,o);for(var s in i)t.bindAttribLocation(a,i[s],s);return t.linkProgram(a),t.deleteShader(r),t.deleteShader(o),a},n.getProgramUniforms=function(t,e){for(var n={},i=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),r=\"\",o=0;o-1?t.split(\"/\")[2]:t.split(\"/\")[0],e=e.split(\":\")[0]},t.exports=n},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window.Math===Math?window:\"undefined\"!=typeof self&&self.Math===Math?self:Function(\"return this\")();i.Float32Array=\"undefined\"!=typeof i.Float32Array?i.Float32Array:i.Array,e.window=i;e.document=i.document,e.Float32Array=i.Float32Array,e.getComputedStyle=i.getComputedStyle,e.SUPPORT_TOUCH=\"ontouchstart\"in i,e.SUPPORT_DEVICEMOTION=\"ondevicemotion\"in i},function(t,e,n){\"use strict\";e.__esModule=!0;var i=[.2,.2],r={LEFT_ARROW:37,A:65,UP_ARROW:38,W:87,RIGHT_ARROW:39,D:68,DOWN_ARROW:40,S:83},o={NONE:\"none\",YAWPITCH:\"yawPitch\"};e.GYRO_MODE=o,e.CONTROL_MODE_VR=1,e.CONTROL_MODE_YAWPITCH=2,e.TOUCH_DIRECTION_NONE=1,e.TOUCH_DIRECTION_YAW=2,e.TOUCH_DIRECTION_PITCH=4,e.TOUCH_DIRECTION_ALL=6,e.MC_DECELERATION=.0014,e.MC_MAXIMUM_DURATION=1e3,e.MC_BIND_SCALE=i,e.MIN_FIELD_OF_VIEW=20,e.MAX_FIELD_OF_VIEW=110,e.PAN_SCALE=320,e.DELTA_THRESHOLD=.0375,e.YAW_RANGE_HALF=180,e.PITCH_RANGE_HALF=90,e.PINCH_EVENTS=\"pinchstart pinchmove pinchend\",e.KEYMAP=r},function(t,e,n){!function(e,i){t.exports=i(n(14),n(0))}(\"undefined\"!=typeof self&&self,function(t,e){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t[\"default\"]}:function(){return t};return __webpack_require__.d(e,\"a\",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p=\"\",__webpack_require__(__webpack_require__.s=6)}([function(t,e,n){\"use strict\";function toArray(t){for(var e=[],n=0,i=t.length;n]*)>/)){var i=document.createElement(\"div\");i.innerHTML=t,n=toArray(i.childNodes)}else n=toArray(document.querySelectorAll(t));e||(n=n.length>=1?n[0]:undefined)}else t===window?n=t:!t.nodeName||1!==t.nodeType&&9!==t.nodeType?\"jQuery\"in window&&t instanceof jQuery||t.constructor.prototype.jquery?n=e?t.toArray():t.get(0):Array.isArray(t)&&(n=t.map(function(t){return $(t)}),e||(n=n.length>=1?n[0]:undefined)):n=t;return n}function requestAnimationFrame(t){return i(t)}function cancelAnimationFrame(t){r(t)}e.__esModule=!0,e.toArray=toArray,e.$=$;var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame,r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;if(i&&!r){var o={},a=i;i=function(t){function wrapCallback(n){o[e]&&t(n)}var e=a(wrapCallback);return o[e]=!0,e},r=function(t){delete o[t]}}else i&&r||(i=function(t){return window.setTimeout(function(){t(window.performance&&window.performance.now&&window.performance.now()||(new Date).getTime())},16)},r=window.clearTimeout);e.requestAnimationFrame=requestAnimationFrame,e.cancelAnimationFrame=cancelAnimationFrame},function(t,e,n){\"use strict\";function toAxis(t,e){return e.reduce(function(e,n,i){return t[i]&&(e[t[i]]=n),e},{})}function createHammer(t,e){try{return new r.Manager(t,i({},e))}catch(n){return null}}function convertInputType(t){void 0===t&&(t=[]);var n=!1,i=!1;return t.forEach(function(t){switch(t){case\"mouse\":i=!0;break;case\"touch\":n=e.SUPPORT_TOUCH}}),n&&r.TouchInput||i&&r.MouseInput||null}var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;ne[1]},getDuration:function(t,e){var n=Math.sqrt(t/e*2);return n<100?0:n},isCircularable:function(t,e,n){return n[1]&&t>e[1]||n[0]&&to&&(i=(i-o)%a+r),n[0]&&t=0&&(this._inputs[e].disconnect(),this._inputs.splice(e,1))}else this._inputs.forEach(function(t){return t.disconnect()}),this._inputs=[];return this},Axes.prototype.get=function(t){return this.axm.get(t)},Axes.prototype.setTo=function(t,e){return void 0===e&&(e=0),this.am.setTo(t,e),this},Axes.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.am.setBy(t,e),this},Axes.prototype.isBounceArea=function(t){return this.axm.isOutside(t)},Axes.prototype.destroy=function(){this.disconnect(),this.em.destroy()},Axes.VERSION=\"3.0.0-rc\",Axes.TRANSFORM=l.TRANSFORM,Axes.DIRECTION_NONE=l.DIRECTION.DIRECTION_NONE,Axes.DIRECTION_LEFT=l.DIRECTION.DIRECTION_LEFT,Axes.DIRECTION_RIGHT=l.DIRECTION.DIRECTION_RIGHT,Axes.DIRECTION_UP=l.DIRECTION.DIRECTION_UP,Axes.DIRECTION_DOWN=l.DIRECTION.DIRECTION_DOWN,Axes.DIRECTION_HORIZONTAL=l.DIRECTION.DIRECTION_HORIZONTAL,Axes.DIRECTION_VERTICAL=l.DIRECTION.DIRECTION_VERTICAL,Axes.DIRECTION_ALL=l.DIRECTION.DIRECTION_ALL,Axes}(o);e[\"default\"]=p},function(t,n){t.exports=e},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&this.setTo(this.axm.map(e,function(t,e,n){return r[\"default\"].getCirculatedPos(t,n.range,n.circular)})),this.itm.setInterrupt(!1),this.em.triggerAnimationEnd(!!t),this.axm.isOutside()?this.restore(t):this.em.triggerFinish(!!t)},AnimationManager.prototype.animateLoop=function(t,e){if(this._animateParam=i({},t),this._animateParam.startTime=(new Date).getTime(),t.duration){var n=this._animateParam,r=this;!function loop(){if(r._raf=null,r.frame(n)>=1)return o.AxisManager.equal(t.destPos,r.axm.get(Object.keys(t.destPos)))||r.em.triggerChange(t.destPos),void e();r._raf=a.requestAnimationFrame(loop)}()}else this.em.triggerChange(t.destPos),e()},AnimationManager.prototype.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=AnimationManager.getDuration(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},AnimationManager.prototype.animateTo=function(t,e,n){var a=this,s=this.createAnimationParam(t,e,n),u=i({},s.depaPos),c=this.em.triggerAnimationStart(s),h=this.getUserControll(s);if(!c&&this.axm.every(h.destPos,function(t,e,n){return r[\"default\"].isCircularable(t,n.range,n.circular)})&&console.warn(\"You can't stop the 'animation' event when 'circular' is true.\"),c&&!o.AxisManager.equal(h.destPos,u)){var l=n&&n.event||null;this.animateLoop({depaPos:u,destPos:h.destPos,duration:h.duration,delta:this.axm.getDelta(u,h.destPos),isTrusted:!!l,inputEvent:l,input:n&&n.input||null},function(){return a.animationEnd()})}},AnimationManager.prototype.frame=function(t){var e=(new Date).getTime()-t.startTime,n=this.easing(e/t.duration),i=t.depaPos;return i=this.axm.map(i,function(e,i,o){return e+=t.delta[i]*n,r[\"default\"].getCirculatedPos(e,o.range,o.circular)}),this.em.triggerChange(i),n},AnimationManager.prototype.easing=function(t){return t>1?1:this.options.easing(t)},AnimationManager.prototype.setTo=function(t,e){void 0===e&&(e=0);var n=Object.keys(t);this.grab(n);var i=this.axm.get(n);if(o.AxisManager.equal(t,i))return this;this.itm.setInterrupt(!0);var a=this.axm.filter(t,function(t,e){return i[e]!==t});return Object.keys(a).length?(a=this.axm.map(a,function(t,n,i){return i.circular&&(i.circular[0]||i.circular[1])?e>0?t:r[\"default\"].getCirculatedPos(t,i.range,i.circular):r[\"default\"].getInsidePosition(t,i.range,i.circular)}),o.AxisManager.equal(a,i)?this:(e>0?this.animateTo(a,e):(this.em.triggerChange(a),this.itm.setInterrupt(!1)),this)):this},AnimationManager.prototype.setBy=function(t,e){return void 0===e&&(e=0),this.setTo(this.axm.map(this.axm.get(Object.keys(t)),function(e,n){return e+t[n]}),e)},AnimationManager}();e.AnimationManager=s},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nr?r:ta?a+e.am.easing((t-a)/(s[1]*n))*s[1]:t})},InputObserver.prototype.get=function(t){return this.axm.get(t.axes)},InputObserver.prototype.hold=function(t,e){if(!this.itm.isInterrupted()&&t.axes.length){var n={input:t,event:e};this.itm.setInterrupt(!0),this.am.grab(t.axes,n),!this.moveDistance&&this.em.triggerHold(this.axm.get(),n),this.isOutside=this.axm.isOutside(t.axes),this.moveDistance=this.axm.get(t.axes)}},InputObserver.prototype.change=function(t,e,n){if(this.itm.isInterrupting()&&!this.axm.every(n,function(t){return 0===t})){var i,r=this.axm.get(t.axes);i=this.axm.map(this.moveDistance||r,function(t,e){return t+(n[e]||0)}),this.moveDistance&&(this.moveDistance=i),i=this.axm.map(i,function(t,e,n){return o[\"default\"].getCirculatedPos(t,n.range,n.circular)}),this.isOutside&&this.axm.every(r,function(t,e,n){return!o[\"default\"].isOutside(t,n.range)})&&(this.isOutside=!1),i=this.atOutside(i),this.em.triggerChange(i,{input:t,event:e},!0)}},InputObserver.prototype.release=function(t,e,n,a){if(this.itm.isInterrupting()&&this.moveDistance){var s=this.axm.get(t.axes),u=this.axm.get(),c=this.axm.get(this.axm.map(n,function(t,e,n){return n.circular&&(n.circular[0]||n.circular[1])?s[e]+t:o[\"default\"].getInsidePosition(s[e]+t,n.range,n.circular,n.bounce)})),h=this.am.getDuration(c,s,a);0===h&&(c=i({},u));var l={depaPos:u,destPos:c,duration:h,delta:this.axm.getDelta(u,c),inputEvent:e,input:t,isTrusted:!0};this.em.triggerRelease(l),this.moveDistance=null;var p=this.am.getUserControll(l),f=r.AxisManager.equal(p.destPos,u),d={input:t,event:e};f||0===p.duration?(!f&&this.em.triggerChange(p.destPos,d,!0),this.itm.setInterrupt(!1),this.axm.isOutside()?this.am.restore(d):this.em.triggerFinish(!0)):this.am.animateTo(p.destPos,p.duration,d)}},InputObserver}();e.InputObserver=a},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n90)return o.DIRECTION.DIRECTION_NONE;var n=Math.abs(t);return n>e&&n<180-e?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_HORIZONTAL},PanInput.getNextOffset=function(t,e){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.abs(n/-e);return[t[0]/2*i,t[1]/2*i]},PanInput.useDirection=function(t,e,n){return n?!!(e===o.DIRECTION.DIRECTION_ALL||e&t&&n&t):!!(e&t)},PanInput.prototype.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?o.DIRECTION.DIRECTION_ALL:e?o.DIRECTION.DIRECTION_HORIZONTAL:n?o.DIRECTION.DIRECTION_VERTICAL:o.DIRECTION.DIRECTION_NONE,this.axes=t},PanInput.prototype.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.dettachEvent(),this.hammer.add(new r.Pan(e));else{var n=this.element[s.UNIQUEKEY];n?this.hammer&&this.hammer.destroy():n=String(Math.round(Math.random()*(new Date).getTime()));var o=s.convertInputType(this.options.inputType);if(!o)throw new Error(\"Wrong inputType parameter!\");this.hammer=s.createHammer(this.element,i({recognizers:[[r.Pan,e]],inputClass:o},this.options.hammerManagerOptions)),this.element[s.UNIQUEKEY]=n}return this.attachEvent(t),this},PanInput.prototype.disconnect=function(){return this.hammer&&this.dettachEvent(),this._direction=o.DIRECTION.DIRECTION_NONE,this},PanInput.prototype.destroy=function(){this.disconnect(),this.hammer&&this.hammer.destroy(),delete this.element[s.UNIQUEKEY],this.element=null,this.hammer=null},PanInput.prototype.enable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!0),this},PanInput.prototype.disable=function(){return this.hammer&&(this.hammer.get(\"pan\").options.enable=!1),this},PanInput.prototype.isEnable=function(){return!(!this.hammer||!this.hammer.get(\"pan\").options.enable)},PanInput.prototype.onHammerInput=function(t){this.isEnable()&&(t.isFirst?this.observer.hold(this,t):t.isFinal&&this.onPanend(t))},PanInput.prototype.onPanmove=function(t){var e=PanInput.getDirectionByAngle(t.angle,this.options.thresholdAngle),n=this.hammer.session.prevInput;n?(t.offsetX=t.deltaX-n.deltaX,t.offsetY=t.deltaY-n.deltaY):(t.offsetX=0,t.offsetY=0);var i=this.getOffset([t.offsetX,t.offsetY],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction,e),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction,e)]),r=i.some(function(t){return 0!==t});r&&(t.srcEvent.preventDefault(),t.srcEvent.stopPropagation()),t.preventSystemEvent=r,r&&this.observer.change(this,t,s.toAxis(this.axes,i))},PanInput.prototype.onPanend=function(t){var e=this.getOffset([Math.abs(t.velocityX)*(t.deltaX<0?-1:1),Math.abs(t.velocityY)*(t.deltaY<0?-1:1)],[PanInput.useDirection(o.DIRECTION.DIRECTION_HORIZONTAL,this._direction),PanInput.useDirection(o.DIRECTION.DIRECTION_VERTICAL,this._direction)]);e=PanInput.getNextOffset(e,this.observer.options.deceleration),this.observer.release(this,t,s.toAxis(this.axes,e))},PanInput.prototype.attachEvent=function(t){this.observer=t,this.hammer.on(\"hammer.input\",this.onHammerInput).on(\"panstart panmove\",this.onPanmove)},PanInput.prototype.dettachEvent=function(){this.hammer.off(\"hammer.input\",this.onHammerInput).off(\"panstart panmove\",this.onPanmove),this.observer=null},PanInput.prototype.getOffset=function(t,e){var n=[0,0],i=this.options.scale;return e[0]&&(n[0]=t[0]*i[0]),e[1]&&(n[1]=t[1]*i[1]),n},PanInput}();e.PanInput=u},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;n0?-1:1)*this.options.scale;this.observer.change(this,t,o.toAxis(this.axes,[n])),clearTimeout(this._timer),this._timer=setTimeout(function(){e._isHolded&&(e.observer.release(e,t,o.toAxis(e.axes,[0])),e._isHolded=!1)},50)}},WheelInput.prototype.attachEvent=function(t){this.observer=t,this.element.addEventListener(\"wheel\",this.onWheel),this._isEnabled=!0},WheelInput.prototype.dettachEvent=function(){this.element.removeEventListener(\"wheel\",this.onWheel),this._isEnabled=!1,this.observer=null},WheelInput.prototype.enable=function(){return this._isEnabled=!0,this},WheelInput.prototype.disable=function(){return this._isEnabled=!1,this},WheelInput.prototype.isEnable=function(){return this._isEnabled},WheelInput}();e.WheelInput=a},function(t,e,n){\"use strict\";var i=this&&this.__assign||Object.assign||function(t){for(var e,n=1,i=arguments.length;nthis._rowCount-1||t>this._colCount-1||(this._bg&&(this._bg.style.backgroundPosition=100*-t+\"% \"+100*-e+\"%\"),this._colRow=[t,e])},SpriteImage.prototype.getColRow=function(){return this._colRow},SpriteImage._getSizeString=function(t){return\"number\"==typeof t?t+\"px\":t},SpriteImage.prototype.stop=function(){this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null)},SpriteImage.prototype.play=function(){var t=this,e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{interval:1e3/this._totalCount,playCount:0},n=e.interval,i=e.playCount;if(!this._bg)return void(this._autoPlayReservedInfo={interval:n,playCount:i});this._autoPlayTimer&&(clearInterval(this._autoPlayTimer),this._autoPlayTimer=null);var r=this.getFrameIndex(),o=0,a=0;this._autoPlayTimer=setInterval(function(){r%=t._totalCount;var e=t.toColRow(r);t.setColRow(e[0],e[1]),r++,++a===t._totalCount&&(a=0,o++),i>0&&o===i&&clearInterval(t._autoPlayTimer)},n)},SpriteImage.prototype.toColRow=function(t){var e=this._colCount,n=this._rowCount;return t<0?[0,0]:t>=this._totalCount?[e-1,n-1]:[t%e,Math.floor(t/e)]},SpriteImage}(r[\"default\"]);e[\"default\"]=o},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}e.__esModule=!0;var i=n(13),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={0:\"NO_ERROR\",1280:\"INVALID_ENUM\",1281:\"INVALID_VALUE\",1282:\"INVALID_OPERATION\",1285:\"OUT_OF_MEMORY\",1286:\"INVALID_FRAMEBUFFER_OPERATION\",37442:\"CONTEXT_LOST_WEBGL\"},a=null,s=function(){function WebGLUtils(){_classCallCheck(this,WebGLUtils)}return WebGLUtils.createShader=function(t,e,n){var i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),t.getShaderParameter(i,t.COMPILE_STATUS)?i:(t.deleteShader(i),null)},WebGLUtils.createProgram=function(t,e,n){var i=t.createProgram();return t.attachShader(i,e),t.attachShader(i,n),t.linkProgram(i),t.getProgramParameter(i,t.LINK_STATUS)?i:(t.deleteProgram(i),null)},WebGLUtils.initBuffer=function(t,e,n,i,r){var o=t.createBuffer();return t.bindBuffer(e,o),t.bufferData(e,n,t.STATIC_DRAW),o&&(o.itemSize=i,o.numItems=n.length/i),r!==undefined&&(t.enableVertexAttribArray(r),t.vertexAttribPointer(r,o.itemSize,t.FLOAT,!1,0,0)),o},WebGLUtils.bindBufferToAttribute=function(t,e,n){null!==e&&null!==n&&(t.bindBuffer(t.ARRAY_BUFFER,e),t.vertexAttribPointer(n,e.itemSize,t.FLOAT,!1,0,0))},WebGLUtils.getWebglContext=function(t){function onWebglcontextcreationerror(t){return t.statusMessage}var e=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],n=null;t.addEventListener(\"webglcontextcreationerror\",onWebglcontextcreationerror);for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:i.navigator.userAgent;o[\"default\"].setUa(t);var e={os:o[\"default\"].getOs(),browser:o[\"default\"].getBrowser(),isMobile:o[\"default\"].getIsMobile()};return e.browser.name=e.browser.name.toLowerCase(),e.os.name=e.os.name.toLowerCase(),e.os.version=e.os.version.toLowerCase(),\"ios\"===e.os.name&&e.browser.webview&&(e.browser.version=\"-1\"),e}e.__esModule=!0;var i=n(2),r=n(3),o=function(t){return t&&t.__esModule?t:{\"default\":t}}(r);agent.VERSION=\"2.1.2\",e[\"default\"]=agent,t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i=\"undefined\"!=typeof window&&window||{};e.RegExp=i.RegExp,e.navigator=i.navigator},function(t,e,n){\"use strict\";function setUa(t){o=t}function isMatched(t,e){return e&&e.test?!!e.test(t):t.indexOf(e)>-1}function getIdentityStringFromArray(t,e){var n=t.filter(function(t){return isMatched(o,t.criteria)})[0];return n&&n.identity||e.name}function getRule(t,e){return t.filter(function(t){var n=t.criteria,i=new RegExp(t.identity,\"i\").test(e);return!!(n?i&&isMatched(o,n):i)})[0]}function getBrowserName(){return getIdentityStringFromArray(r[\"default\"].browser,r[\"default\"].defaultString.browser)}function getBrowserRule(t){var e=getRule(r[\"default\"].browser,t);return e||(e={criteria:t,versionSearch:t,identity:t}),e}function extractBrowserVersion(t,e){var n=r[\"default\"].defaultString.browser.version,i=new RegExp(\"(\"+t+\")\",\"i\").exec(e);if(!i)return n;var o=i.index,a=i[0];if(o>-1){var s=o+a.length+1;n=e.substring(s).split(\" \")[0].replace(/_/g,\".\").replace(/;|\\)/g,\"\")}return n}function getBrowserVersion(t){return t?extractBrowserVersion(getBrowserRule(t).versionSearch||t,o):undefined}function isWebview(){var t=r[\"default\"].webview,e=void 0;return t.filter(function(t){return isMatched(o,t.criteria)}).some(function(t){return e=extractBrowserVersion(t.browserVersionSearch,o),!(!isMatched(o,t.webviewToken)&&!isMatched(e,t.webviewBrowserVersion))})}function getOSRule(t){return getRule(r[\"default\"].os,t)}function getOsName(){return getIdentityStringFromArray(r[\"default\"].os,r[\"default\"].defaultString.os)}function getOsVersion(t){var e=getOSRule(t)||{},n=r[\"default\"].defaultString.os.version,i=void 0;if(!t)return undefined;if(e.versionAlias)return e.versionAlias;var a=e.versionSearch||t,s=new RegExp(\"(\"+a+\")\\\\s([\\\\d_\\\\.]+|\\\\d_0)\",\"i\");return s.exec(o)&&(i=s.exec(o)[2].replace(/_/g,\".\").replace(/;|\\)/g,\"\")),i||n}function getOs(){var t=getOsName();return{name:t,version:getOsVersion(t)}}function getBrowser(){var t=getBrowserName();return{name:t,version:getBrowserVersion(t),webview:isWebview()}}function getIsMobile(){return-1!==o.indexOf(\"Mobi\")}e.__esModule=!0;var i=n(4),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=void 0;e[\"default\"]={getOs:getOs,getBrowser:getBrowser,getIsMobile:getIsMobile,setUa:setUa},t.exports=e[\"default\"]},function(t,e,n){\"use strict\";e.__esModule=!0;var i={browser:[{criteria:\"PhantomJS\",identity:\"PhantomJS\"},{criteria:/Whale/,identity:\"Whale\",versionSearch:\"Whale\"},{criteria:/Edge/,identity:\"Edge\",versionSearch:\"Edge\"},{criteria:/MSIE|Trident|Windows Phone/,identity:\"IE\",versionSearch:\"IEMobile|MSIE|rv\"},{criteria:/MiuiBrowser/,identity:\"MIUI Browser\",versionSearch:\"MiuiBrowser\"},{criteria:/SamsungBrowser/,identity:\"Samsung Internet\",versionSearch:\"SamsungBrowser\"},{criteria:/SAMSUNG /,identity:\"Samsung Internet\",versionSearch:\"Version\"},{criteria:/Chrome|CriOS/,identity:\"Chrome\"},{criteria:/Android/,identity:\"Android Browser\",versionSearch:\"Version\"},{criteria:/iPhone|iPad/,identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{criteria:\"Firefox\",identity:\"Firefox\"}],os:[{criteria:/Windows Phone/,identity:\"Windows Phone\",versionSearch:\"Windows Phone\"},{criteria:\"Windows 2000\",identity:\"Window\",versionAlias:\"5.0\"},{criteria:/Windows NT/,identity:\"Window\",versionSearch:\"Windows NT\"},{criteria:/iPhone|iPad/,identity:\"iOS\",versionSearch:\"iPhone OS|CPU OS\"},{criteria:\"Mac\",versionSearch:\"OS X\",identity:\"MAC\"},{criteria:/Android/,identity:\"Android\"},{criteria:/Tizen/,identity:\"Tizen\"},{criteria:/Web0S/,identity:\"WebOS\"}],webview:[{criteria:/iPhone|iPad/,browserVersionSearch:\"Version\",webviewBrowserVersion:/-1/},{criteria:/iPhone|iPad|Android/,webviewToken:/NAVER|DAUM|; wv/}],defaultString:{browser:{version:\"-1\",name:\"unknown\"},os:{version:\"-1\",name:\"unknown\"}}};e[\"default\"]=i,t.exports=e[\"default\"]}])})},function(t,e,n){var i;!function(r,o,a,s){\"use strict\";function setTimeoutContext(t,e,n){return setTimeout(bindFn(t,n),e)}function invokeArrayArg(t,e,n){return!!Array.isArray(t)&&(each(t,n[e],n),!0)}function each(t,e,n){var i;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==s)for(i=0;i\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",o=r.console&&(r.console.warn||r.console.log);return o&&o.call(r.console,i,n),t.apply(this,arguments)}}function inherit(t,e,n){var i,r=e.prototype;i=t.prototype=Object.create(r),i.constructor=t,i._super=r,n&&u(i,n)}function bindFn(t,e){return function(){return t.apply(e,arguments)}}function boolOrFn(t,e){return typeof t==l?t.apply(e?e[0]||s:s,e):t}function ifUndefined(t,e){return t===s?e:t}function addEventListeners(t,e,n){each(splitStr(e),function(e){t.addEventListener(e,n,!1)})}function removeEventListeners(t,e,n){each(splitStr(e),function(e){t.removeEventListener(e,n,!1)})}function hasParent(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function inStr(t,e){return t.indexOf(e)>-1}function splitStr(t){return t.trim().split(/\\s+/g)}function inArray(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;in[e]}):i.sort()),i}function prefixed(t,e){for(var n,i,r=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=simpleCloneInputData(e):1===r&&(n.firstMultiple=!1);var o=n.firstInput,a=n.firstMultiple,s=a?a.center:o.center,u=e.center=getCenter(i);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=getAngle(s,u),e.distance=getDistance(s,u),computeDeltaXY(n,e),e.offsetDirection=getDirection(e.deltaX,e.deltaY);var c=getVelocity(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=f(c.x)>f(c.y)?c.x:c.y,e.scale=a?getScale(a.pointers,i):1,e.rotation=a?getRotation(a.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,computeIntervalInputData(n,e);var h=t.element;hasParent(e.srcEvent.target,h)&&(h=e.srcEvent.target),e.target=h}function computeDeltaXY(t,e){var n=e.center,i=t.offsetDelta||{},r=t.prevDelta||{},o=t.prevInput||{};e.eventType!==I&&o.eventType!==R||(r=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=r.x+(n.x-i.x),e.deltaY=r.y+(n.y-i.y)}function computeIntervalInputData(t,e){var n,i,r,o,a=t.lastInterval||e,u=e.timeStamp-a.timeStamp;if(e.eventType!=x&&(u>T||a.velocity===s)){var c=e.deltaX-a.deltaX,h=e.deltaY-a.deltaY,l=getVelocity(u,c,h);i=l.x,r=l.y,n=f(l.x)>f(l.y)?l.x:l.y,o=getDirection(c,h),t.lastInterval=e}else n=a.velocity,i=a.velocityX,r=a.velocityY,o=a.direction;e.velocity=n,e.velocityX=i,e.velocityY=r,e.direction=o}function simpleCloneInputData(t){for(var e=[],n=0;n=f(e)?t<0?A:C:e<0?O:M}function getDistance(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return Math.sqrt(i*i+r*r)}function getAngle(t,e,n){n||(n=L);var i=e[n[0]]-t[n[0]],r=e[n[1]]-t[n[1]];return 180*Math.atan2(r,i)/Math.PI}function getRotation(t,e){return getAngle(e[1],e[0],V)+getAngle(t[1],t[0],V)}function getScale(t,e){return getDistance(e[0],e[1],V)/getDistance(t[0],t[1],V)}function MouseInput(){this.evEl=W,this.evWin=U,this.pressed=!1,Input.apply(this,arguments)}function PointerEventInput(){this.evEl=z,this.evWin=q,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function SingleTouchInput(){this.evTarget=G,this.evWin=Q,this.started=!1,Input.apply(this,arguments)}function normalizeSingleTouches(t,e){var n=toArray(t.touches),i=toArray(t.changedTouches);return e&(R|x)&&(n=uniqueArray(n.concat(i),\"identifier\",!0)),[n,i]}function TouchInput(){this.evTarget=B,this.targetIds={},Input.apply(this,arguments)}function getTouches(t,e){var n=toArray(t.touches),i=this.targetIds;if(e&(I|b)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,a=toArray(t.changedTouches),s=[],u=this.target;if(o=n.filter(function(t){return hasParent(t.target,u)}),e===I)for(r=0;r-1&&i.splice(t,1)};setTimeout(r,X)}}function isSyntheticEvent(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function emit(n){e.manager.emit(n,t)}var e=this,n=this.state;n=ut&&emit(e.options.event+stateStr(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&r&e.direction},attrTest:function(t){return AttrRecognizer.prototype.attrTest.call(this,t)&&(this.state&at||!(this.state&at)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=directionStr(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&at)},emit:function(t){if(1!==t.scale){var e=t.scale<1?\"in\":\"out\";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),inherit(PressRecognizer,Recognizer,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[J]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distancee.time;if(this._input=t,!i||!n||t.eventType&(R|x)&&!r)this.reset();else if(t.eventType&I)this.reset(),this._timer=setTimeoutContext(function(){this.state=ct,this.tryEmit()},e.time,this);else if(t.eventType&R)return ct;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ct&&(t&&t.eventType&R?this.manager.emit(this.options.event+\"up\",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[et]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&at)}}),inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:S|D,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(S|D)?e=t.overallVelocity:n&S?e=t.overallVelocityX:n&D&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&f(e)>this.options.velocity&&t.eventType&R},emit:function(t){var e=directionStr(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),inherit(TapRecognizer,Recognizer,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[tt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,PanoViewer);var r=_possibleConstructorReturn(this,t.call(this));if(n.checkSupport&&!n.checkSupport()){var o;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_DEVICE,message:\"invalid device\"})},0),o=r,_possibleConstructorReturn(r,o)}if(!s.WebGLUtils.isWebGLAvailable()){var a;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.NO_WEBGL,message:\"no webgl support\"})},0),a=r,_possibleConstructorReturn(r,a)}if(n.image&&n.video){var c;return setTimeout(function(){r.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.INVALID_RESOURCE,message:\"Specifying multi resouces(both image and video) is not valid.\"})},0),c=r,_possibleConstructorReturn(r,c)}r._container=e,r._image=n.image||n.video,r._isVideo=!!n.video,r._projectionType=n.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,r._width=n.width||parseInt(window.getComputedStyle(e).width,10),r._height=n.height||parseInt(window.getComputedStyle(e).height,10),r._yaw=n.yaw||0,r._pitch=n.pitch||0,r._fov=n.fov||65,r._useGyro=n.useGyro||u.GYRO_MODE.YAWPITCH,r._aspectRatio=r._width/r._height;var h=n.fovRange||[30,110],l=i(n,{element:e,yaw:r._yaw,pitch:r._pitch,fov:r._fov,useGyro:r._useGyro,fovRange:h,aspectRatio:r._aspectRatio});return r._isReady=!1,r._initYawPitchControl(l),r._initRenderer(r._yaw,r._pitch,r._fov,r._projectionType),r}return _inherits(PanoViewer,t),PanoViewer.prototype.getVideo=function(){return this._isVideo?this._photoSphereRenderer.getContent():null},PanoViewer.prototype.setVideo=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR};return t?(this.setImage(t,{projectionType:e.projectionType,isVideo:!0}),this):this},PanoViewer.prototype.getImage=function(){return this._isVideo?null:this._photoSphereRenderer.getContent()},PanoViewer.prototype.setImage=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{projectionType:s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,isVideo:!1},n=e.projectionType||s.PanoImageRenderer.ImageType.EQUIRECTANGULAR,i=e.isVideo||!1;return this._image&&i!==this._isVideo?(console.warn(\"Currently not supporting to change content type(Image <--\\x3e Video)\"),this):t?(this._image=t,this._isVideo=i,this._projectionType=n,this._deactivate(),this._initRenderer(this._yaw,this._pitch,this._fov,this._projectionType),this):this},PanoViewer.prototype.keepUpdate=function(t){return this._photoSphereRenderer.keepUpdate(t),this},PanoViewer.prototype.getProjectionType=function(){return this._projectionType},PanoViewer.prototype._initRenderer=function(t,e,n,i){var r=this;this._photoSphereRenderer=new s.PanoImageRenderer(this._image,this._width,this._height,this._isVideo,{initialYaw:t,initialPitch:e,fieldOfView:n,imageType:i}),this._bindRendererHandler(),this._photoSphereRenderer.bindTexture().then(function(){return r._activate()})[\"catch\"](function(){r._triggerEvent(u.EVENTS.ERROR,{type:u.ERROR_TYPE.FAIL_BIND_TEXTURE,message:\"failed to bind texture\"})})},PanoViewer.prototype._bindRendererHandler=function(){var t=this;this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.IMAGE_LOADED,function(e){t.trigger(u.EVENTS.CONTENT_LOADED,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.ERROR,function(e){t.trigger(u.EVENTS.ERROR,e)}),this._photoSphereRenderer.on(s.PanoImageRenderer.EVENTS.RENDERING_CONTEXT_LOST,function(e){t._deactivate(),t.trigger(u.EVENTS.ERROR,{type:u.ERROR_TYPE.RENDERING_CONTEXT_LOST,message:\"webgl rendering context lost\"})})},PanoViewer.prototype._initYawPitchControl=function(t){var e=this;this._yawPitchControl=new a.YawPitchControl(t),this._yawPitchControl.on(u.EVENTS.ANIMATION_END,function(t){e._triggerEvent(u.EVENTS.ANIMATION_END,t)}),this._yawPitchControl.on(\"change\",function(t){e._yaw=t.yaw,e._pitch=t.pitch,e._fov=t.fov,e._triggerEvent(u.EVENTS.VIEW_CHANGE,t)})},PanoViewer.prototype._triggerEvent=function(t,e){var n=e||{};return this.trigger(t,n)},PanoViewer.prototype.setUseZoom=function(t){\"boolean\"==typeof t&&this._yawPitchControl.option(\"useZoom\",t)},PanoViewer.prototype.setUseKeyboard=function(t){this._yawPitchControl.option(\"useKeyboard\",t)},PanoViewer.prototype.setUseGyro=function(t){this._yawPitchControl.option(\"useGyro\",t)},PanoViewer.prototype.setFovRange=function(t){this._yawPitchControl.option(\"fovRange\",t)},PanoViewer.prototype.getFovRange=function(){return this._yawPitchControl.option(\"fovRange\")},PanoViewer.prototype.updateViewportDimensions=function(t){this._isReady&&(this._width=t&&t.width||parseInt(window.getComputedStyle(this._container).width,10),this._height=t&&t.height||parseInt(window.getComputedStyle(this._container).height,10),this._aspectRatio=this._width/this._height,this._photoSphereRenderer.updateViewportDimensions(this._width,this._height),this._yawPitchControl.option(\"aspectRatio\",this._aspectRatio),this.lookAt({},0))},PanoViewer.prototype.getFov=function(){return this._fov},PanoViewer.prototype._getHFov=function(){return c.glMatrix.toDegree(2*Math.atan(this._aspectRatio*Math.tan(c.glMatrix.toRadian(this._fov)/2)))},PanoViewer.prototype.getYaw=function(){return this._yaw},PanoViewer.prototype.getPitch=function(){return this._pitch},PanoViewer.prototype.getYawRange=function(){return this._yawPitchControl.option(\"yawRange\")},PanoViewer.prototype.getPitchRange=function(){return this._yawPitchControl.option(\"pitchRange\")},PanoViewer.prototype.setYawRange=function(t){return this._yawPitchControl.option(\"yawRange\",t)},PanoViewer.prototype.setPitchRange=function(t){return this._yawPitchControl.option(\"pitchRange\",t)},PanoViewer.prototype.setShowPolePoint=function(t){return this._yawPitchControl.option(\"showPolePoint\",t)},PanoViewer.prototype.lookAt=function(t,e){if(this._isReady){var n=t.yaw!==undefined?t.yaw:this._yaw,i=t.pitch!==undefined?t.pitch:this._pitch,r=this._yawPitchControl.option(\"pitchRange\"),o=r[1]-r[0],a=t.fov!==undefined?t.fov:this._fov;o2&&(v=2);var y={BIND_TEXTURE:\"bindTexture\",IMAGE_LOADED:\"imageLoaded\",ERROR:\"error\",RENDERING_CONTEXT_LOST:\"renderingContextLost\",RENDERING_CONTEXT_RESTORE:\"renderingContextRestore\"},w={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12},E=function(t){function PanoImageRenderer(e,n,i,r,o){_classCallCheck(this,PanoImageRenderer);var a=_possibleConstructorReturn(this,t.call(this));return a.sphericalConfig=o,a.fieldOfView=o.fieldOfView,a.width=n,a.height=i,a._lastQuaternion=null,a._lastYaw=null,a._lastPitch=null,a._lastFieldOfView=null,a.pMatrix=_.mat4.create(),a.mvMatrix=_.mat4.create(),_.mat4.perspective(a.pMatrix,_.glMatrix.toRadian(a.fieldOfView),n/i,.1,100),a.textureCoordBuffer=null,a.vertexBuffer=null,a.indexBuffer=null,a.canvas=a._initCanvas(n,i),a._image=null,a._imageIsReady=!1,a._keepUpdate=!1,a._onContentLoad=a._onContentLoad.bind(a),a._onContentError=a._onContentError.bind(a),e&&a.setImage({image:e,imageType:o.imageType,isVideo:r}),a}return _inherits(PanoImageRenderer,t),PanoImageRenderer.prototype.getContent=function(){return this._image},PanoImageRenderer.prototype.setImage=function(t){var e=t.image,n=t.imageType,i=t.isVideo,r=i!==undefined&&i;return this._imageIsReady=!1,this._isVideo=r,this._setImageType(n),this._contentLoader&&this._contentLoader.destroy(),r?(this._contentLoader=new u[\"default\"],this._keepUpdate=!0):(this._contentLoader=new a[\"default\"],this._keepUpdate=!1),this._contentLoader.set(e),this._image=this._contentLoader.getElement(),this._contentLoader.get().then(this._onContentLoad)[\"catch\"](this._onContentError)},PanoImageRenderer.prototype._setImageType=function(t){t&&this._imageType!==t&&(this._imageType=t,this._isCubeStrip=t===g.VERTICAL_CUBESTRIP,this._renderer=this._isCubeStrip?p[\"default\"]:d[\"default\"],this._initWebGL())},PanoImageRenderer.prototype._initCanvas=function(t,e){var n=document.createElement(\"canvas\");return n.width=t,n.height=e,n.style.bottom=0,n.style.left=0,n.style.right=0,n.style.top=0,n.style.margin=\"auto\",n.style.maxHeight=\"100%\",n.style.maxWidth=\"100%\",n.style.outline=\"none\",n.style.position=\"absolute\",this._onWebglcontextlost=this._onWebglcontextlost.bind(this),this._onWebglcontextrestored=this._onWebglcontextrestored.bind(this),n.addEventListener(\"webglcontextlost\",this._onWebglcontextlost),n.addEventListener(\"webglcontextrestored\",this._onWebglcontextrestored),n},PanoImageRenderer.prototype._onContentError=function(t){return this._imageIsReady=!1,this._image=null,this.trigger(y.ERROR,{type:w.FAIL_IMAGE_LOAD,message:\"failed to load image\"}),!1},PanoImageRenderer.prototype._onContentLoad=function(t){return this._imageIsReady=!0,this.trigger(y.IMAGE_LOADED,{content:this._image,isVideo:this._isVideo,projectionType:this._imageType}),!0},PanoImageRenderer.prototype.isImageLoaded=function(){return!!this._image&&this._imageIsReady&&(!this._isVideo||this._image.readyState>=2)},PanoImageRenderer.prototype.cancelLoadImage=function(){this._contentLoader.destroy()},PanoImageRenderer.prototype.bindTexture=function(){var t=this;return new m(function(e,n){if(!t._contentLoader)return void n(\"ImageLoader is not initialized\");t._contentLoader.get().then(function(){return t._bindTexture()},n).then(e)})},PanoImageRenderer.prototype.attachTo=function(t){this.detach(),t.appendChild(this.canvas)},PanoImageRenderer.prototype.forceContextLoss=function(){if(this.hasRenderingContext()){var t=this.context.getExtension(\"WEBGL_lose_context\");t&&t.loseContext()}},PanoImageRenderer.prototype.detach=function(){this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)},PanoImageRenderer.prototype.isAttached=function(){return this._image&&this.canvas&&this.canvas.parentNode},PanoImageRenderer.prototype.destroy=function(){this._contentLoader&&this._contentLoader.destroy(),this.detach(),this.forceContextLoss(),this.off(),this.canvas.removeEventListener(\"webglcontextlost\",this._onWebglcontextlost),this.canvas.removeEventListener(\"webglcontextrestored\",this._onWebglcontextrestored)},PanoImageRenderer.prototype.hasRenderingContext=function(){return!!this.context&&!(!this.context.getProgramParameter(this.shaderProgram,this.context.LINK_STATUS)&&!this.context.isContextLost())},PanoImageRenderer.prototype._onWebglcontextlost=function(t){t.preventDefault(),this.trigger(\"renderingContextLost\")},PanoImageRenderer.prototype._onWebglcontextrestored=function(t){this._initWebGL(),this.trigger(\"renderingContextRestore\")},PanoImageRenderer.prototype.updateFieldOfView=function(t){this.fieldOfView!==t&&(this.fieldOfView=t,this._updateViewport())},PanoImageRenderer.prototype.updateViewportDimensions=function(t,e){var n=!1;this.width=t,this.height=e;var i=t*v,r=e*v;i!==this.canvas.width&&(this.canvas.width=i,n=!0),r!==this.canvas.height&&(this.canvas.height=r,n=!0),n&&(this._updateViewport(),this._shouldForceDraw=!0)},PanoImageRenderer.prototype._updateViewport=function(){_.mat4.perspective(this.pMatrix,_.glMatrix.toRadian(this.fieldOfView),this.canvas.width/this.canvas.height,.1,100),this.context.viewport(0,0,this.context.drawingBufferWidth,this.context.drawingBufferHeight)},PanoImageRenderer.prototype._initWebGL=function(){try{if(this._initRenderingContext(),this.updateViewportDimensions(this.width,this.height),this.shaderProgram&&this.context.deleteProgram(this.shaderProgram),this.shaderProgram=this._initShaderProgram(this.context),!this.shaderProgram)throw new Error(\"Failed to intialize shaders: \"+h[\"default\"].getErrorNameFromWebGLErrorCode(this.context.getError()));this._initBuffers()}catch(e){return this.trigger(y.ERROR,{type:w.NO_WEBGL,message:\"no webgl support\"}),void this.destroy()}this.context.clearColor(0,0,0,0);var t=this._isCubeStrip?this.context.TEXTURE_CUBE_MAP:this.context.TEXTURE_2D;this.texture&&this.context.deleteTexture(this.texture),this.texture=h[\"default\"].createTexture(this.context,t)},PanoImageRenderer.prototype._initRenderingContext=function(){if(!this.hasRenderingContext()){if(!window.WebGLRenderingContext)throw new Error(\"WebGLRenderingContext not available.\");if(this.context=h[\"default\"].getWebglContext(this.canvas),!this.context)throw new Error(\"Failed to acquire 3D rendering context\")}},PanoImageRenderer.prototype._initShaderProgram=function(t){var e=this._renderer.getVertexShaderSource(),n=h[\"default\"].createShader(t,t.VERTEX_SHADER,e);if(!n)return!1;var i=this._renderer.getFragmentShaderSource(),r=h[\"default\"].createShader(t,t.FRAGMENT_SHADER,i);if(!r)return!1;var o=h[\"default\"].createProgram(t,n,r);return o?(t.useProgram(o),o.vertexPositionAttribute=t.getAttribLocation(o,\"aVertexPosition\"),t.enableVertexAttribArray(o.vertexPositionAttribute),o.pMatrixUniform=t.getUniformLocation(o,\"uPMatrix\"),o.mvMatrixUniform=t.getUniformLocation(o,\"uMVMatrix\"),o.samplerUniform=t.getUniformLocation(o,\"uSampler\"),this._isCubeStrip||(o.textureCoordAttribute=t.getAttribLocation(o,\"aTextureCoord\"),t.enableVertexAttribArray(o.textureCoordAttribute)),o):null},PanoImageRenderer.prototype._initBuffers=function(){var t=this._renderer.getVertexPositionData(),e=this._renderer.getIndexData(),n=this._renderer.getTextureCoordData(),i=this.context;this.vertexBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(t),3,this.shaderProgram.vertexPositionAttribute),this.indexBuffer=h[\"default\"].initBuffer(i,i.ELEMENT_ARRAY_BUFFER,new Uint16Array(e),1),null!==n&&(this.textureCoordBuffer=h[\"default\"].initBuffer(i,i.ARRAY_BUFFER,new Float32Array(n),2,this.shaderProgram.textureCoordAttribute))},PanoImageRenderer.prototype._bindTexture=function(){this._renderer.bindTexture(this.context,this.texture,this._image),this._shouldForceDraw=!0,this.trigger(y.BIND_TEXTURE)},PanoImageRenderer.prototype.renderWithQuaternion=function(t,e){if(this.isImageLoaded()&&(this._shouldForceDraw=!0,!(this._lastQuaternion&&_.quat.exactEquals(this._lastQuaternion,t)&&this.fieldOfView&&this.fieldOfView===e&&!1===this._shouldForceDraw))){e!==undefined&&e!==this.fieldOfView&&this.updateFieldOfView(e);var n=void 0;if(this._isCubeStrip)n=t;else{var i=_.quat.rotateY(_.quat.create(),_.quat.create(),_.glMatrix.toRadian(-90));n=_.quat.multiply(_.quat.create(),i,t)}this.mvMatrix=_.mat4.fromQuat(_.mat4.create(),_.quat.conjugate(_.quat.create(),n)),this._draw(),this._lastQuaternion=_.quat.clone(t),this._shouldForceDraw&&(this._shouldForceDraw=!1)}},PanoImageRenderer.prototype.keepUpdate=function(t){t&&!1===this.isImageLoaded()&&(this._shouldForceDraw=!0),this._keepUpdate=t},PanoImageRenderer.prototype.render=function(t,e,n){this.isImageLoaded()&&(!1===this._keepUpdate&&null!==this._lastYaw&&this._lastYaw===t&&null!==this._lastPitch&&this._lastPitch===e&&this.fieldOfView&&this.fieldOfView===n&&!1===this._shouldForceDraw||(n!==undefined&&n!==this.fieldOfView&&this.updateFieldOfView(n),_.mat4.identity(this.mvMatrix),_.mat4.rotateX(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(e)),_.mat4.rotateY(this.mvMatrix,this.mvMatrix,-_.glMatrix.toRadian(t-(this._isCubeStrip?0:90))),this._draw(),this._lastYaw=t,this._lastPitch=e,this._shouldForceDraw&&(this._shouldForceDraw=!1)))},PanoImageRenderer.prototype._draw=function(){var t=this.context;t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),t.uniform1i(this.shaderProgram.samplerUniform,0),t.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,!1,this.pMatrix),t.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.mvMatrix),this._isVideo&&this._renderer.texImage2D(this.context,this._image),this.indexBuffer&&t.drawElements(t.TRIANGLES,this.indexBuffer.numItems,t.UNSIGNED_SHORT,0)},PanoImageRenderer}(r[\"default\"]);e[\"default\"]=E,E.EVENTS=y,E.ERROR_TYPE=w,E.ImageType=g},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}e.__esModule=!0;var i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},r=\"undefined\"==typeof Promise?n(3).Promise:Promise,o={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},a=function(){function VideoLoader(t){_classCallCheck(this,VideoLoader),this._handlers=[],this._sourceCount=0,t&&this.set(t)}return VideoLoader.prototype._appendSourceElement=function(t){var e=void 0,n=void 0;if(\"object\"===(void 0===t?\"undefined\":i(t))?(e=t.src,n=t.type):\"string\"==typeof t&&(e=t),!e)return!1;var r=document.createElement(\"source\");return r.src=e,n&&(r.type=n),this._video.appendChild(r),this._sourceCount++,!0},VideoLoader.prototype.set=function(t){var e=this;this._reset(),t instanceof HTMLVideoElement?this._video=t:\"string\"!=typeof t&&\"object\"!==(void 0===t?\"undefined\":i(t))||(this._video=document.createElement(\"video\"),this._video.crossOrigin=\"anonymous\",t instanceof Array?t.forEach(function(t){return e._appendSourceElement(t)}):this._appendSourceElement(t),this._sourceCount>0?this._video.load():this._video=null)},VideoLoader.prototype.get=function(){var t=this;return new r(function(e,n){t._video?t._video.readyState>=o.HAVE_CURRENT_DATA?e(t._video):t._once(\"loadeddata\",function(){return e(t._video)}):n(\"VideoLoader: video is undefined\")})},VideoLoader.prototype.getElement=function(){return this._video},VideoLoader.prototype.destroy=function(){this._reset()},VideoLoader.prototype._reset=function(){var t=this;this._handlers.forEach(function(e){t._video.removeEventListener(e.type,e.fn)}),this._handlers=[],this._video=null,this._sourceCount=0},VideoLoader.prototype._once=function(t,e){var n=this._video,i=function fn(i){n.removeEventListener(t,fn),e(i)};n.addEventListener(t,i,!0),this._handlers.push({type:t,fn:i})},VideoLoader}();e[\"default\"]=a},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0,e.WebGLUtils=e.PanoImageRenderer=undefined;var i=n(21),r=_interopRequireDefault(i),o=n(10),a=_interopRequireDefault(o);e.PanoImageRenderer=r[\"default\"],e.WebGLUtils=a[\"default\"]},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(13),r=_interopRequireDefault(i),o=n(11),a=_interopRequireDefault(o),s=n(1),u=function(t){function CubeRenderer(){return _classCallCheck(this,CubeRenderer),_possibleConstructorReturn(this,t.apply(this,arguments))}return _inherits(CubeRenderer,t),CubeRenderer.getVertexPositionData=function(){return CubeRenderer._VERTEX_POSITION_DATA=null!==CubeRenderer._VERTEX_POSITION_DATA?CubeRenderer._VERTEX_POSITION_DATA:[1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1],CubeRenderer._VERTEX_POSITION_DATA},CubeRenderer.getIndexData=function(){if(CubeRenderer._INDEX_DATA)return CubeRenderer._INDEX_DATA;for(var t=[],e=CubeRenderer.getVertexPositionData(),n=0;nr)return void console.warn(\"Image width(\"+i+\") exceeds device limit(\"+r+\"))\");t.activeTexture(t.TEXTURE0),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.bindTexture(t.TEXTURE_2D,e),this.texImage2D(t,n)}},SphereRenderer.texImage2D=function(t,e){t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)},SphereRenderer._initData=function(){var t=[],e=[],n=[],i=void 0,r=void 0;for(i=0;i<=60;i++){var o=(i/60-.5)*Math.PI,a=Math.sin(o),s=Math.cos(o);for(r=0;r<=60;r++){var u=2*(r/60-.5)*Math.PI,c=Math.sin(u),h=Math.cos(u),l=h*s,p=a,f=c*s,d=r/60,_=i/60;if(t.push(d,_),e.push(2*l,2*p,2*f),60!==r&&60!==i){var m=61*i+r,g=m+60+1;n.push(m,g,m+1,g,g+1,m+1)}}}SphereRenderer._VERTEX_POSITION_DATA=e,SphereRenderer._TEXTURE_COORD_DATA=t,SphereRenderer._INDEX_DATA=n},SphereRenderer}(r[\"default\"]);e[\"default\"]=o,o._VERTEX_POSITION_DATA=null,o._TEXTURE_COORD_DATA=null,o._INDEX_DATA=null},function(t,e,n){\"use strict\";var i=n(7),r={INVALID_DEVICE:10,NO_WEBGL:11,FAIL_IMAGE_LOAD:12,FAIL_BIND_TEXTURE:13,INVALID_RESOURCE:14,RENDERING_CONTEXT_LOST:15},o={READY:\"ready\",VIEW_CHANGE:\"viewChange\",ANIMATION_END:\"animationEnd\",ERROR:\"error\",CONTENT_LOADED:\"contentLoaded\"};t.exports={GYRO_MODE:i.GYRO_MODE,EVENTS:o,ERROR_TYPE:r}},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e=2&&(s.push(e[0]),a[e[0]]=e[1]),this._setOptions(this._getValidatedOptions(a)),this._applyOptions(s,o),this},YawPitchControl.prototype._getValidatedOptions=function(t){return t.yawRange&&(t.yawRange=this._getValidYawRange(t.yawRange,t.fov,t.aspectRatio)),t.pitchRange&&(t.pitchRange=this._getValidPitchRange(t.pitchRange,t.fov)),t},YawPitchControl.prototype._getOptions=function(t){var e=void 0;return\"string\"==typeof t?e=this.options[t]:0===arguments.length&&(e=this.options),e},YawPitchControl.prototype._setOptions=function(t){for(var e in t)this.options[e]=t[e]},YawPitchControl.prototype._applyOptions=function(t,e){if(t.some(function(t){return\"showPolePoint\"===t||\"fov\"===t||\"aspectRatio\"===t||\"yawRange\"===t||\"pitchRange\"===t})&&this._updateControlScale(),t.some(function(t){return\"fovRange\"===t})){var n=this.options.fovRange,i=this.axes.get().fov,r=this.axes.get().fov;f.vec2.copy(this.axes.axis.fov.range,n),rn[1]&&(r=n[1]),i!==r&&(this.axes.setTo({fov:r},0),this._updateControlScale())}if(t.some(function(t){return\"useGyro\"===t})&&this.axesTiltMotionInput){var o=this.options.useGyro;o===d.GYRO_MODE.YAWPITCH?this.axes.connect([\"yaw\",\"pitch\"],this.axesTiltMotionInput):o===d.GYRO_MODE.NONE&&this.axes.disconnect(this.axesTiltMotionInput)}if(t.some(function(t){return\"useKeyboard\"===t})){this.options.useKeyboard?this.axes.connect([\"yaw\",\"pitch\"],this.axesMoveKeyInput):this.axes.disconnect(this.axesMoveKeyInput)}if(t.some(function(t){return\"useZoom\"===t})){this.options.useZoom?(this.axes.connect([\"fov\"],this.axesWheelInput),this.axesPinchInput&&this.axes.connect([\"fov\"],this.axesPinchInput)):(this.axes.disconnect(this.axesWheelInput),this.axesPinchInput&&this.axes.disconnect(this.axesPinchInput))}},YawPitchControl.prototype._getValidYawRange=function(t,e,n){var i=YawPitchControl.adjustAspectRatio(n||this.options.aspectRatio||1),r=e||this.axes.get().fov,o=r*i;return t[1]-t[0]>=o?t:this.options.yawRange||_},YawPitchControl.prototype._getValidPitchRange=function(t,e){var n=e||this.axes.get().fov;return t[1]-t[0]>=n?t:this.options.pitchRange||m},YawPitchControl.prototype._updateControlScale=function(t){var e=this.options,n=this.axes.get().fov,i=YawPitchControl._updatePitchRange(e.pitchRange,n,e.showPolePoint),r=YawPitchControl._updateYawRange(e.yawRange,n,e.aspectRatio),o=this.axes.get(),a=o.yaw,s=o.pitch;return f.vec2.copy(this.axes.axis.yaw.range,r),f.vec2.copy(this.axes.axis.pitch.range,i),this.axes.axis.yaw.circular=r[1]-r[0]<360?[!1,!1]:[!0,!0],ar[1]&&(a=r[1]),si[1]&&(s=i[1]),t&&t.set({yaw:a,pitch:s}),this.axes.setTo({yaw:a,pitch:s},0),this},YawPitchControl._updatePitchRange=function(t,e,n){var i=t[1]-t[0],r=e/2,o=i<180;return n&&!o?t.map(function(t){return+t.toFixed(5)}):[t[0]+r,t[1]-r].map(function(t){return+t.toFixed(5)})},YawPitchControl._updateYawRange=function(t,e,n){var i=t[1]-t[0];if(i>=360)return t.map(function(t){return+t.toFixed(5)});var r=1,o=YawPitchControl.adjustAspectRatio(n),a=e/2*o;return i>290?r=.794:i>125&&(r=.98),[t[0]*r+a,t[1]*r-a].map(function(t){return+t.toFixed(5)})},YawPitchControl.prototype._triggerChange=function(){var t=this.axes.get(),e=this.options,n={targetElement:e.element};n.yaw=t.yaw,n.pitch=t.pitch,n.fov=t.fov,this.trigger(\"change\",n)},YawPitchControl.adjustAspectRatio=function(t){for(var e=[.52,.54,.563,.57,.584,.59,.609,.67,.702,.72,.76,.78,.82,.92,.97,1,1.07,1.14,1.19,1.25,1.32,1.38,1.4,1.43,1.53,1.62,1.76,1.77,1.86,1.96,2.26,2.3,2.6,3,5,6],n=[.51,.54,.606,.56,.628,.63,.647,.71,.736,.757,.78,.77,.8,.89,.975,1,1.07,1.1,1.15,1.18,1.22,1.27,1.3,1.33,1.39,1.45,1.54,1.55,1.58,1.62,1.72,1.82,1.92,2,2.24,2.3],i=-1,r=0;r=t){i=r;break}if(-1===i)return e[0]>t?n[0]:n[n[0].length-1];var o=e[i],a=e[i+1],s=n[i],u=n[i+1];return YawPitchControl.lerp(s,u,(t-o)/(a-o))},YawPitchControl.lerp=function(t,e,n){return t+n*(e-t)},YawPitchControl.prototype.enable=function(){return this._enabled?this:(this.axes.connect([\"yaw\",\"pitch\"],this.axesPanInput),this._applyOptions(Object.keys(this.options),this.options),this._setPanScale(this.getFov()),this._enabled=!0,this)},YawPitchControl.prototype.disable=function(t){return this._enabled?(t||this._resetOrientation(),this.axes.disconnect(),this._enabled=!1,this):this},YawPitchControl.prototype._resetOrientation=function(){var t=this.options;return this.axes.setTo({yaw:t.yaw,pitch:t.pitch,fov:t.fov},0),this},YawPitchControl.prototype.lookAt=function(t,e){var n=t.yaw,i=t.pitch,r=t.fov,o=this.axes.get(),a=n===undefined?0:n-o.yaw,s=i===undefined?0:i-o.pitch,u=r===undefined?0:r-o.fov;this.axes.setBy({yaw:a,pitch:s,fov:u},e)},YawPitchControl.prototype.get=function(){return this.axes.get()},YawPitchControl.prototype.getYaw=function(){return this.axes.get().yaw},YawPitchControl.prototype.getPitch=function(){return this.axes.get().pitch},YawPitchControl.prototype.getFov=function(){return this.axes.get().fov},YawPitchControl.prototype.destroy=function(){this.axes&&this.axes.destroy(),this.axisPanInput&&this.axisPanInput.destroy(),this.axesWheelInput&&this.axesWheelInput.destroy(),this.axesTiltMotionInput&&this.axesTiltMotionInput.destroy(),this.axesPinchInput&&this.axesPinchInput.destroy(),this.axesMoveKeyInput&&this.axesMoveKeyInput.destroy()},YawPitchControl}(o[\"default\"]);g.VERSION=\"3.0.0-rc\",e[\"default\"]=g},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}e.__esModule=!0;var i=n(4),r=_interopRequireDefault(i),o=n(5),a=_interopRequireDefault(o),s=n(39),u=_interopRequireDefault(s);u[\"default\"].prototype.run_=function(){if(!this.isOrientationInitialized)return this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),void(this.isOrientationInitialized=!0);var t=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,e=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,t);this.gyroIntegralQ.multiply(e),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(e);var n=new r[\"default\"].Quaternion;n.copy(this.filterQ),n.inverse(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(n),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();var i=new r[\"default\"].Quaternion;i.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),i.inverse(),a[\"default\"].isDebug()&&console.log(\"Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)\",r[\"default\"].radToDeg*a[\"default\"].getQuaternionAngle(i),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));var o=new r[\"default\"].Quaternion;o.copy(this.filterQ),o.multiply(i),this.filterQ.slerp(o,1-this.kFilter),this.previousFilterQ.copy(this.filterQ),this.isFilterQuaternionInitialized||(this.isFilterQuaternionInitialized=!0)},u[\"default\"].prototype.getOrientation=function(){return this.isFilterQuaternionInitialized?this.filterQ:null},e[\"default\"]=u[\"default\"]},function(t,e,n){\"use strict\";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o=n(1),a=n(6),s=function(t){function DeviceMotion(){_classCallCheck(this,DeviceMotion);var e=_possibleConstructorReturn(this,t.call(this));return e._onDeviceMotion=e._onDeviceMotion.bind(e),e._onDeviceOrientation=e._onDeviceOrientation.bind(e),e.isAndroid=-1!==a.window.navigator.userAgent.indexOf(\"Android\"),e.stillGyroVec=o.vec3.create(),e.rawGyroVec=o.vec3.create(),e.adjustedGyroVec=o.vec3.create(),e._timer=null,e.lastDevicemotionTimestamp=0,e._isEnabled=!1,e.enable(),e}return _inherits(DeviceMotion,t),DeviceMotion.prototype._onDeviceOrientation=function(){var t=this;this._timer&&clearTimeout(this._timer),this._timer=setTimeout(function(){(new Date).getTime()-t.lastDevicemotionTimestamp<200&&o.vec3.copy(t.stillGyroVec,t.rawGyroVec)},200)},DeviceMotion.prototype._onDeviceMotion=function(t){0!==t.interval&&(this.isAndroid&&(o.vec3.set(this.rawGyroVec,t.rotationRate.alpha||0,t.rotationRate.beta||0,t.rotationRate.gamma||0),o.vec3.subtract(this.adjustedGyroVec,this.rawGyroVec,this.stillGyroVec),this.lastDevicemotionTimestamp=(new Date).getTime(),t.adjustedRotationRate={alpha:this.adjustedGyroVec[0],beta:this.adjustedGyroVec[1],gamma:this.adjustedGyroVec[2]}),this.trigger(\"devicemotion\",{inputEvent:t}))},DeviceMotion.prototype.enable=function(){this.isAndroid&&a.window.addEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.addEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!0},DeviceMotion.prototype.disable=function(){this.isAndroid&&a.window.removeEventListener(\"deviceorientation\",this._onDeviceOrientation),a.window.removeEventListener(\"devicemotion\",this._onDeviceMotion),this._isEnabled=!1},DeviceMotion.prototype.isEnabled=function(){return this._isEnabled},DeviceMotion}(r[\"default\"]);e[\"default\"]=s},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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)}e.__esModule=!0;var i=n(0),r=_interopRequireDefault(i),o=n(40),a=_interopRequireDefault(o),s=n(4),u=_interopRequireDefault(s),c=n(5),h=_interopRequireDefault(c),l=n(6),p=n(1),f=n(29),d=_interopRequireDefault(f),_=n(28),m=_interopRequireDefault(_),g=.98,v=.04,y=function(t){function FusionPoseSensor(){_classCallCheck(this,FusionPoseSensor);var e=_possibleConstructorReturn(this,t.call(this));return e.deviceMotion=new d[\"default\"],e.accelerometer=new u[\"default\"].Vector3,e.gyroscope=new u[\"default\"].Vector3,e._onDeviceMotionChange=e._onDeviceMotionChange.bind(e),e._onScreenOrientationChange=e._onScreenOrientationChange.bind(e),e.filter=new m[\"default\"](g),e.posePredictor=new a[\"default\"](v),e.filterToWorldQ=new u[\"default\"].Quaternion,e.isFirefoxAndroid=h[\"default\"].isFirefoxAndroid(),e.isIOS=h[\"default\"].isIOS(),e._isEnabled=!1,e.isIOS?e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),Math.PI/2):e.filterToWorldQ.setFromAxisAngle(new u[\"default\"].Vector3(1,0,0),-Math.PI/2),e.inverseWorldToScreenQ=new u[\"default\"].Quaternion,e.worldToScreenQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ=new u[\"default\"].Quaternion,e.originalPoseAdjustQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-l.window.orientation*Math.PI/180),e._setScreenTransform(),h[\"default\"].isLandscapeMode()&&e.filterToWorldQ.multiply(e.inverseWorldToScreenQ),e.resetQ=new u[\"default\"].Quaternion,e.deviceMotion.on(\"devicemotion\",e._onDeviceMotionChange),e.enable(),e}return _inherits(FusionPoseSensor,t),FusionPoseSensor.prototype.enable=function(){this.isEnabled()||(this.deviceMotion.enable(),this._isEnabled=!0,l.window.addEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.disable=function(){this.isEnabled()&&(this.deviceMotion.disable(),this._isEnabled=!1,l.window.removeEventListener(\"orientationchange\",this._onScreenOrientationChange))},FusionPoseSensor.prototype.isEnabled=function(){return this._isEnabled},FusionPoseSensor.prototype.destroy=function(){this.disable(),this.deviceMotion=null},FusionPoseSensor.prototype._triggerChange=function(){var t=this.getOrientation();if(t)return this._prevOrientation?void(p.quat.equals(this._prevOrientation,t)||this.trigger(\"change\",{quaternion:t})):void(this._prevOrientation=t)},FusionPoseSensor.prototype.getOrientation=function(){var t=this.filter.getOrientation();if(!t)return null;var e=this._convertFusionToPredicted(t);return e=p.quat.fromValues(e.x,e.y,e.z,e.w),p.quat.normalize(e,e)},FusionPoseSensor.prototype._convertFusionToPredicted=function(t){this.predictedQ=this.posePredictor.getPrediction(t,this.gyroscope,this.previousTimestampS);var e=new u[\"default\"].Quaternion;return e.copy(this.filterToWorldQ),e.multiply(this.resetQ),e.multiply(this.predictedQ),e.multiply(this.worldToScreenQ),e},FusionPoseSensor.prototype.resetPose=function(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),h[\"default\"].isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)},FusionPoseSensor.prototype._onDeviceMotionChange=function(t){var e=t.inputEvent,n=e,i=n.accelerationIncludingGravity,r=n.adjustedRotationRate||n.rotationRate,o=n.timeStamp/1e3;this.isFirefoxAndroid&&(o/=1e3),this.accelerometer.set(-i.x,-i.y,-i.z),this.gyroscope.set(r.alpha,r.beta,r.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,o),this.filter.addGyroMeasurement(this.gyroscope,o),this._triggerChange(),this.previousTimestampS=o},FusionPoseSensor.prototype._onScreenOrientationChange=function(t){this._setScreenTransform(l.window.orientation)},FusionPoseSensor.prototype._setScreenTransform=function(){switch(this.worldToScreenQ.set(0,0,0,1),l.window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-.5*Math.PI);break;case-90:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),.5*Math.PI);break;case 180:this.worldToScreenQ.setFromAxisAngle(new u[\"default\"].Vector3(0,0,1),-1*Math.PI)}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.inverse()},FusionPoseSensor}(r[\"default\"]);e[\"default\"]=y},function(t,e,n){\"use strict\";function _interopRequireDefault(t){return t&&t.__esModule?t:{\"default\":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function _possibleConstructorReturn(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 _inherits(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 getDeltaYaw(t,e){var n=c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_YAW);return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.YAW_DELTA_BY_ROLL)*Math.sin(c.util.extractPitchFromQuat(e))+n}function getDeltaPitch(t,e){return c.util.getRotationDelta(t,e,c.ROTATE_CONSTANT.PITCH_DELTA)}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&(a=1/Math.sqrt(a),t[0]=n*a,t[1]=i*a,t[2]=r*a,t[3]=o*a),t},o.equals=function(t,e){var n=t[0],i=t[1],o=t[2],a=t[3],s=e[0],u=e[1],c=e[2],h=e[3];return Math.abs(n-s)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(i-u)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(i),Math.abs(u))&&Math.abs(o-c)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(o),Math.abs(c))&&Math.abs(a-h)<=r[\"default\"].EPSILON*Math.max(1,Math.abs(a),Math.abs(h))},o.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},t.exports=o},function(t,e,n){\"use strict\";var i=n(2),r=function(t){return t&&t.__esModule?t:{\"default\":t}}(i),o={};o.create=function(){var t=new r[\"default\"].ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},o.fromValues=function(t,e,n){var i=new r[\"default\"].ARRAY_TYPE(3);return i[0]=t,i[1]=e,i[2]=n,i},o.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},o.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},o.subtract=function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t[2]=e[2]-n[2],t},o.length=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)},o.normalize=function(t,e){var n=e[0],i=e[1],r=e[2],o=n*n+i*i+r*r;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},o.cross=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2];return t[0]=r*u-o*s,t[1]=o*a-i*u,t[2]=i*s-r*a,t},o.transformQuat=function(t,e,n){var i=e[0],r=e[1],o=e[2],a=n[0],s=n[1],u=n[2],c=n[3],h=c*i+s*o-u*r,l=c*r+u*i-a*o,p=c*o+a*r-s*i,f=-a*i-s*r-u*o;return t[0]=h*c+f*-a+l*-u-p*-s,t[1]=l*c+f*-s+p*-a-h*-u,t[2]=p*c+f*-u+h*-s-l*-a,t},t.exports=o},function(t,e){function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}function runTimeout(t){if(n===setTimeout)return setTimeout(t,0);if((n===defaultSetTimout||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}function runClearTimeout(t){if(i===clearTimeout)return clearTimeout(t);if((i===defaultClearTimeout||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{return i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}function cleanUpNextTick(){s&&o&&(s=!1,o.length?a=o.concat(a):u=-1,a.length&&drainQueue())}function drainQueue(){if(!s){var t=runTimeout(cleanUpNextTick);s=!0;for(var e=a.length;e;){for(o=a,a=[];++u1)for(var n=1;n { - res(this._image); - }); + this._once("load", () => res(this._image)); this._once("error", () => rej("ImageLoader: failed to load images.")); } else { rej("ImageLoader: failed to load images"); @@ -52,9 +50,7 @@ export default class ImageLoader { return; } - this._once("load", () => { - this._loadStatus = STATUS.LOADED; - }); + this._once("load", () => (this._loadStatus = STATUS.LOADED)); this._once("error", () => (this._loadStatus = STATUS.ERROR)); } diff --git a/test/unit/PanoViewer/PanoViewer.spec.js b/test/unit/PanoViewer/PanoViewer.spec.js index 8a027a1c3..4a371a10a 100644 --- a/test/unit/PanoViewer/PanoViewer.spec.js +++ b/test/unit/PanoViewer/PanoViewer.spec.js @@ -161,31 +161,31 @@ describe("PanoViewer", function() { }); // Currently not available - // IT.skip("should replace image of other projection type", function(done) { - // // Given - // panoViewer = new PanoViewer(target, { - // image: "./images/test_equi.png" - // }); + IT.skip("should replace image of other projection type", function(done) { + // Given + panoViewer = new PanoViewer(target, { + image: "./images/test_equi.png" + }); - // // first `onContentLoad` event is for image specified in constructor. - // panoViewer.once(PanoViewer.EVENTS.CONTENT_LOADED, evt1 => { - // console.log("contentLoaded #1", evt1.content.src, evt1.projectionType); - // const prevContentSrc = evt1.content.src; - // const prevProjectionType = evt1.projectionType; - - // panoViewer.once(PanoViewer.EVENTS.CONTENT_LOADED, evt2 => { - // console.log("contentLoaded #2", evt2.content.src, evt2.projectionType); - // // Then - // expect(evt2.content.src).to.not.equal(prevContentSrc); - // expect(evt2.projectionType).to.not.equal(prevProjectionType); - // done(); - // }); + // first `onContentLoad` event is for image specified in constructor. + panoViewer.once(PanoViewer.EVENTS.CONTENT_LOADED, evt1 => { + console.log("contentLoaded #1", evt1.content.src, evt1.projectionType); + const prevContentSrc = evt1.content.src; + const prevProjectionType = evt1.projectionType; + + panoViewer.once(PanoViewer.EVENTS.CONTENT_LOADED, evt2 => { + console.log("contentLoaded #2", evt2.content.src, evt2.projectionType); + // Then + expect(evt2.content.src).to.not.equal(prevContentSrc); + expect(evt2.projectionType).to.not.equal(prevProjectionType); + done(); + }); - // // When - // // Change image of other projection type. - // panoViewer.setImage("./images/glasscITy_cube_1024.jpg", PanoViewer.ProjectionType.VERTICAL_CUBESTRIP); - // }); - // }); + // When + // Change image of other projection type. + panoViewer.setImage("./images/glasscITy_cube_1024.jpg", PanoViewer.ProjectionType.VERTICAL_CUBESTRIP); + }); + }); }); describe("event flow", function() {