diff --git a/dist/vizicities.js b/dist/vizicities.js index 476814d..2742581 100644 --- a/dist/vizicities.js +++ b/dist/vizicities.js @@ -7913,7 +7913,7 @@ return /******/ (function(modules) { // webpackBootstrap _classCallCheck(this, TopoJSONTileLayer); var defaults = { - maxLOD: 13, + maxLOD: 14, distance: 2000 }; @@ -8057,6 +8057,10 @@ return /******/ (function(modules) { // webpackBootstrap var _lodashAssign2 = _interopRequireDefault(_lodashAssign); + var _utilExtrudePolygon = __webpack_require__(56); + + var _utilExtrudePolygon2 = _interopRequireDefault(_utilExtrudePolygon); + // TODO: Perform tile request and processing in a Web Worker // // Use Operative (https://github.com/padolsey/operative) @@ -8237,6 +8241,8 @@ return /******/ (function(modules) { // webpackBootstrap value: function _processTileData(data) { var _this3 = this; + console.time(this._tile); + var geojson = _topojson2['default'].feature(data, data.objects.vectile); var offset = (0, _geoPoint2['default'])(0, 0); @@ -8246,7 +8252,6 @@ return /******/ (function(modules) { // webpackBootstrap var coordinates; var earcutData; var faces; - // var geometry; var allVertices = []; var allFaces = []; @@ -8296,85 +8301,29 @@ return /******/ (function(modules) { // webpackBootstrap faces = _this3._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions); + var groupedVertices = []; + for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) { + groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions)); + } + + var extruded = (0, _utilExtrudePolygon2['default'])(groupedVertices, faces); + colour.set(style.color); - allVertices.push(earcutData.vertices); + // allVertices.push(earcutData.vertices); + // allColours.push([colour.r, colour.g, colour.b]); + // allFaces.push(faces); + + allVertices.push(extruded.positions); allColours.push([colour.r, colour.g, colour.b]); - allFaces.push(faces); + allFaces.push(extruded.faces); - facesCount += faces.length; - - // console.log(earcutData.vertices); - // console.log(faces); - // return; - - // geometry = new THREE.BufferGeometry(); - // - // // Three components per vertex per face (3 x 3 = 9) - // var vertices = new Float32Array(faces.length * 9); - // - // var index; - // for (var i = 0; i < faces.length; i++) { - // // Array of vertex indexes for the face - // index = faces[i][0]; - // - // vertices[i * 9 + 0] = earcutData.vertices[index * dim]; - // vertices[i * 9 + 1] = 0; - // vertices[i * 9 + 2] = earcutData.vertices[index * dim + 1]; - // - // // Array of vertex indexes for the face - // index = faces[i][1]; - // - // vertices[i * 9 + 3] = earcutData.vertices[index * dim]; - // vertices[i * 9 + 4] = 0; - // vertices[i * 9 + 5] = earcutData.vertices[index * dim + 1]; - // - // // Array of vertex indexes for the face - // index = faces[i][2]; - // - // vertices[i * 9 + 6] = earcutData.vertices[index * dim]; - // vertices[i * 9 + 7] = 0; - // vertices[i * 9 + 8] = earcutData.vertices[index * dim + 1]; - // } - - // var shape = new THREE.Shape(); - // - // var outer = coordinates.shift(); - // var inners = coordinates; - // - // if (!outer || !outer[0] || !Array.isArray(outer[0])) { - // return; - // } - // - // // Create outer shape - // outer.forEach((coord, index) => { - // var latlon = LatLon(coord[1], coord[0]); - // var point = this._layer._world.latLonToPoint(latlon); - // - // // Move if first coordinate - // if (index === 0) { - // shape.moveTo(point.x + offset.x, point.y + offset.y); - // } else { - // shape.lineTo(point.x + offset.x, point.y + offset.y); - // } - // }); - // - // var geom = new THREE.ShapeGeometry(shape); - // var mesh = new THREE.Mesh(geom, new THREE.MeshBasicMaterial({ - // color: 0x0000ff, - // side: THREE.BackSide, - // depthWrite: false - // })); - // - // // Offset - // // mesh.position.x = -1 * offset.x; - // // mesh.position.z = -1 * offset.y; - // - // mesh.rotation.x = 90 * Math.PI / 180; - // - // this._mesh.add(mesh); + facesCount += extruded.faces.length; }); + // console.log(allVertices); + // return; + // Skip if no faces // // Need to check way before this if there are no faces, before even doing @@ -8413,22 +8362,38 @@ return /******/ (function(modules) { // webpackBootstrap for (var j = 0; j < _faces.length; j++) { // Array of vertex indexes for the face index = _faces[j][0]; + // + // var ax = _vertices[index * dim] + offset.x; + // var ay = 0; + // var az = _vertices[index * dim + 1] + offset.y; + // + // index = _faces[j][1]; + // + // var bx = _vertices[index * dim] + offset.x; + // var by = 0; + // var bz = _vertices[index * dim + 1] + offset.y; + // + // index = _faces[j][2]; + // + // var cx = _vertices[index * dim] + offset.x; + // var cy = 0; + // var cz = _vertices[index * dim + 1] + offset.y; - var ax = _vertices[index * dim] + offset.x; - var ay = 0; - var az = _vertices[index * dim + 1] + offset.y; + var ax = _vertices[index][0] + offset.x; + var ay = _vertices[index][1]; + var az = _vertices[index][2] + offset.y; index = _faces[j][1]; - var bx = _vertices[index * dim] + offset.x; - var by = 0; - var bz = _vertices[index * dim + 1] + offset.y; + var bx = _vertices[index][0] + offset.x; + var by = _vertices[index][1]; + var bz = _vertices[index][2] + offset.y; index = _faces[j][2]; - var cx = _vertices[index * dim] + offset.x; - var cy = 0; - var cz = _vertices[index * dim + 1] + offset.y; + var cx = _vertices[index][0] + offset.x; + var cy = _vertices[index][1]; + var cz = _vertices[index][2] + offset.y; // Flat face normals // From: http://threejs.org/examples/webgl_buffergeometry.html @@ -8493,17 +8458,19 @@ return /******/ (function(modules) { // webpackBootstrap geometry.computeBoundingBox(); - var material = new _three2['default'].MeshBasicMaterial({ + var material = new _three2['default'].MeshPhongMaterial({ vertexColors: _three2['default'].VertexColors, - side: _three2['default'].BackSide, - depthWrite: false + side: _three2['default'].BackSide + // depthWrite: false }); var mesh = new _three2['default'].Mesh(geometry, material); - mesh.renderOrder = 1; + // mesh.renderOrder = 1; this._mesh.add(mesh); this._ready = true; + console.timeEnd(this._tile); + console.log(this._tile + ': ' + features.length + ' features'); } }, { key: '_toEarcut', @@ -10348,6 +10315,93 @@ return /******/ (function(modules) { // webpackBootstrap } +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /* + * Extrude a polygon given its vertices and triangulated faces + * + * Based on: + * https://github.com/freeman-lab/extrude + */ + + var _lodashAssign = __webpack_require__(3); + + var _lodashAssign2 = _interopRequireDefault(_lodashAssign); + + var extrudePolygon = function extrudePolygon(points, faces, _options) { + var defaults = { + top: 1, + bottom: 0, + closed: true + }; + + var options = (0, _lodashAssign2['default'])(defaults, _options); + + var n = points.length; + var positions; + var cells; + + // If bottom and top values are identical then return the flat shape + options.top === options.bottom ? flat() : full(); + + function flat() { + positions = points.map(function (p) { + return [p[0], options.top, p[1]]; + }); + cells = faces; + } + + function full() { + positions = []; + points.forEach(function (p) { + positions.push([p[0], options.top, p[1]]); + }); + points.forEach(function (p) { + positions.push([p[0], options.bottom, p[1]]); + }); + + cells = []; + for (var i = 0; i < n; i++) { + if (i === n - 1) { + cells.push([i + n, n, i]); + cells.push([0, i, n]); + } else { + cells.push([i + n, i + n + 1, i]); + cells.push([i + 1, i, i + n + 1]); + } + } + + if (options.closed) { + var top = faces; + var bottom = top.map(function (p) { + return p.map(function (v) { + return v + n; + }); + }); + bottom = bottom.map(function (p) { + return [p[0], p[2], p[1]]; + }); + cells = cells.concat(top).concat(bottom); + } + } + + return { + positions: positions, + faces: cells + }; + }; + + exports['default'] = extrudePolygon; + module.exports = exports['default']; + /***/ } /******/ ]) }); diff --git a/dist/vizicities.min.js b/dist/vizicities.min.js index 15b40fa..0a228b8 100644 --- a/dist/vizicities.min.js +++ b/dist/vizicities.min.js @@ -1,5 +1,5 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("proj4"),require("THREE")):"function"==typeof define&&define.amd?define(["proj4","THREE"],t):"object"==typeof exports?exports.VIZI=t(require("proj4"),require("THREE")):e.VIZI=t(e.proj4,e.THREE)}(this,function(__WEBPACK_EXTERNAL_MODULE_22__,__WEBPACK_EXTERNAL_MODULE_24__){return function(e){function __webpack_require__(n){if(t[n])return t[n].exports;var r=t[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var t={};return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.p="",__webpack_require__(0)}([function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=_interopRequireDefault(r),o=n(28),a=_interopRequireDefault(o),u=n(31),s=_interopRequireDefault(u),l=n(33),c=_interopRequireDefault(l),f=n(50),p=_interopRequireDefault(f),h=n(11),d=_interopRequireDefault(h),v=n(10),y=_interopRequireDefault(v),_={version:"0.3",World:i["default"],Controls:a["default"],EnvironmentLayer:s["default"],ImageTileLayer:c["default"],TopoJSONTileLayer:p["default"],Point:d["default"],LatLon:y["default"]};t["default"]=_,e.exports=t["default"]},function(e,t,n){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 _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)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n-1&&this._layers.splice(t,1),this._engine._scene.remove(e._layer),e.destroy(),this.emit("layerRemoved"),this}},{key:"addControls",value:function(e){return e._addToWorld(this),this._controls.push(e),this.emit("controlsAdded",e),this}},{key:"removeControls",value:function(e){}}]),World}(a["default"]);t["default"]=function(e,t){return new _(e,t)},e.exports=t["default"]},function(e,t,n){"use strict";function EE(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function EventEmitter(){}var r="function"!=typeof Object.create?"~":!1;EventEmitter.prototype._events=void 0,EventEmitter.prototype.listeners=function(e,t){var n=r?r+e:e,i=this._events&&this._events[n];if(t)return!!i;if(!i)return[];if(i.fn)return[i.fn];for(var o=0,a=i.length,u=new Array(a);a>o;o++)u[o]=i[o].fn;return u},EventEmitter.prototype.emit=function(e,t,n,i,o,a){var u=r?r+e:e;if(!this._events||!this._events[u])return!1;var s,l,c=this._events[u],f=arguments.length;if("function"==typeof c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),f){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,i),!0;case 5:return c.fn.call(c.context,t,n,i,o),!0;case 6:return c.fn.call(c.context,t,n,i,o,a),!0}for(l=1,s=new Array(f-1);f>l;l++)s[l-1]=arguments[l];c.fn.apply(c.context,s)}else{var p,h=c.length;for(l=0;h>l;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),f){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;default:if(!s)for(p=1,s=new Array(f-1);f>p;p++)s[p-1]=arguments[p];c[l].fn.apply(c[l].context,s)}}return!0},EventEmitter.prototype.on=function(e,t,n){var i=new EE(t,n||this),o=r?r+e:e;return this._events||(this._events=r?{}:Object.create(null)),this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],i]:this._events[o].push(i):this._events[o]=i,this},EventEmitter.prototype.once=function(e,t,n){var i=new EE(t,n||this,!0),o=r?r+e:e;return this._events||(this._events=r?{}:Object.create(null)),this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],i]:this._events[o].push(i):this._events[o]=i,this},EventEmitter.prototype.removeListener=function(e,t,n,i){var o=r?r+e:e;if(!this._events||!this._events[o])return this;var a=this._events[o],u=[];if(t)if(a.fn)(a.fn!==t||i&&!a.once||n&&a.context!==n)&&u.push(a);else for(var s=0,l=a.length;l>s;s++)(a[s].fn!==t||i&&!a[s].once||n&&a[s].context!==n)&&u.push(a[s]);return u.length?this._events[o]=1===u.length?u[0]:u:delete this._events[o],this},EventEmitter.prototype.removeAllListeners=function(e){return this._events?(e?delete this._events[r?r+e:e]:this._events=r?{}:Object.create(null),this):this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prototype.setMaxListeners=function(){return this},EventEmitter.prefixed=r,e.exports=EventEmitter},function(e,t,n){function isIndex(e,t){return e="number"==typeof e||s.test(e)?+e:-1,t=null==t?o:t,e>-1&&e%1==0&&t>e}function assignValue(e,t,n){var r=e[t];(!eq(r,n)||eq(r,l[t])&&!c.call(e,t)||void 0===n&&!(t in e))&&(e[t]=n)}function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function copyObject(e,t,n){return copyObjectWith(e,t,n)}function copyObjectWith(e,t,n,r){n||(n={});for(var i=-1,o=t.length;++i1?n[i-1]:void 0,a=i>2?n[2]:void 0;for(o="function"==typeof o?(i--,o):void 0,a&&isIterateeCall(n[0],n[1],a)&&(o=3>i?void 0:o,i=1),t=Object(t);++r-1&&e%1==0&&o>=e}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var r=n(4),i=n(5),o=9007199254740991,a="[object Function]",u="[object GeneratorFunction]",s=/^(?:0|[1-9]\d*)$/,l=Object.prototype,c=l.hasOwnProperty,f=l.toString,p=baseProperty("length"),h=createAssigner(function(e,t){copyObject(t,r(t),e)});e.exports=h},function(e,t){function baseTimes(e,t){for(var n=-1,r=Array(e);++n-1&&e%1==0&&t>e}function baseHas(e,t){return l.call(e,t)||"object"==typeof e&&t in e&&null===f(e)}function baseKeys(e){return h(Object(e))}function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function indexKeys(e){var t=e?e.length:void 0;return isLength(t)&&(v(e)||isString(e)||isArguments(e))?baseTimes(t,String):null}function isPrototype(e){var t=e&&e.constructor,n="function"==typeof t&&t.prototype||s;return e===n}function isArguments(e){return isArrayLikeObject(e)&&l.call(e,"callee")&&(!p.call(e,"callee")||c.call(e)==r)}function isArrayLike(e){return null!=e&&!("function"==typeof e&&isFunction(e))&&isLength(d(e))}function isArrayLikeObject(e){return isObjectLike(e)&&isArrayLike(e)}function isFunction(e){var t=isObject(e)?c.call(e):"";return t==i||t==o}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&n>=e}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isString(e){return"string"==typeof e||!v(e)&&isObjectLike(e)&&c.call(e)==a}function keys(e){var t=isPrototype(e);if(!t&&!isArrayLike(e))return baseKeys(e);var n=indexKeys(e),r=!!n,i=n||[],o=i.length;for(var a in e)!baseHas(e,a)||r&&("length"==a||isIndex(a,o))||t&&"constructor"==a||i.push(a);return i}var n=9007199254740991,r="[object Arguments]",i="[object Function]",o="[object GeneratorFunction]",a="[object String]",u=/^(?:0|[1-9]\d*)$/,s=Object.prototype,l=s.hasOwnProperty,c=s.toString,f=Object.getPrototypeOf,p=s.propertyIsEnumerable,h=Object.keys,d=baseProperty("length"),v=Array.isArray;e.exports=keys},function(e,t){function apply(e,t,n){var r=n.length;switch(r){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function rest(e,t){if("function"!=typeof e)throw new TypeError(n);return t=v(void 0===t?e.length-1:toInteger(t),0),function(){for(var n=arguments,r=-1,i=v(n.length-t,0),o=Array(i);++re?-1:1;return t*i}var n=e%1;return e===e?n?e-n:e:0}function toNumber(e){if(isObject(e)){var t=isFunction(e.valueOf)?e.valueOf():e;e=isObject(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(s,"");var n=c.test(e);return n||f.test(e)?p(e.slice(2),n?2:8):l.test(e)?o:+e}var n="Expected a function",r=1/0,i=1.7976931348623157e308,o=NaN,a="[object Function]",u="[object GeneratorFunction]",s=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,f=/^0o[0-7]+$/i,p=parseInt,h=Object.prototype,d=h.toString,v=Math.max;e.exports=rest},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(7),i=_interopRequireDefault(r),o=n(15),a=_interopRequireDefault(o),u=n(17),s=_interopRequireDefault(u),l=n(19),c=_interopRequireDefault(l),f=n(20),p=_interopRequireDefault(f),h={};h.EPSG3857=i["default"],h.EPSG900913=r.EPSG900913,h.EPSG3395=a["default"],h.EPSG4326=s["default"],h.Simple=c["default"],h.Proj4=p["default"],t["default"]=h,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(13),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f={code:"EPSG:3857",projection:s["default"],transformScale:1/(Math.PI*s["default"].R),transformation:function(){var e=1/(Math.PI*s["default"].R);return new c["default"](e,0,-e,0)}()},p=(0,i["default"])({},a["default"],f),h=(0,i["default"])({},p,{code:"EPSG:900913"});t.EPSG900913=h,t["default"]=p},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(9),a=_interopRequireDefault(o),u=n(10),s=(_interopRequireDefault(u),{wrapLon:[-180,180],R:6378137,distance:function(e,t,n){var r,i,o,a=Math.PI/180;if(n){r=e.lat*a,i=t.lat*a;var u=e.lon*a,s=t.lon*a,l=i-r,c=s-u,f=l/2,p=c/2;o=Math.sin(f)*Math.sin(f)+Math.cos(r)*Math.cos(i)*Math.sin(p)*Math.sin(p);var h=2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o));return this.R*h}return r=e.lat*a,i=t.lat*a,o=Math.sin(r)*Math.sin(i)+Math.cos(r)*Math.cos(i)*Math.cos((t.lon-e.lon)*a),this.R*Math.acos(Math.min(o,1))},pointScale:function(e,t){return this.projection.pointScale?this.projection.pointScale(e,t):[1,1]},metresToProjected:function(e,t){return e*t[1]},projectedToMetres:function(e,t){return e/t[1]},metresToWorld:function(e,t,n){var r=this.metresToProjected(e,t),i=this.scale(n);n&&(i/=2);var o=i*(this.transformScale*r)/t[1];return o},worldToMetres:function(e,t,n){var r=this.scale(n);n&&(r/=2);var i=e/r/this.transformScale*t[1],o=this.projectedToMetres(i,t);return o}});t["default"]=(0,i["default"])({},a["default"],s),e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(10),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),u=n(12),s=_interopRequireDefault(u),l={scaleFactor:1e6,latLonToPoint:function(e,t){var n=this.projection.project(e),r=this.scale(t);return t&&(r/=2),this.transformation._transform(n,r)},pointToLatLon:function(e,t){var n=this.scale(t);t&&(n/=2);var r=this.transformation.untransform(e,n);return this.projection.unproject(r)},project:function(e){return this.projection.project(e)},unproject:function(e){return this.projection.unproject(e)},scale:function(e){return e>=0?256*Math.pow(2,e):this.scaleFactor},zoom:function(e){return Math.log(e/256)/Math.LN2},getProjectedBounds:function(e){if(this.infinite)return null;var t=this.projection.bounds,n=this.scale(e);e&&(n/=2);var r=this.transformation.transform((0,a["default"])(t[0]),n),i=this.transformation.transform((0,a["default"])(t[1]),n);return[r,i]},wrapLatLon:function(e){var t=this.wrapLat?(0,s["default"])(e.lat,this.wrapLat,!0):e.lat,n=this.wrapLon?(0,s["default"])(e.lon,this.wrapLon,!0):e.lon,r=e.alt;return(0,i["default"])(t,n,r)}};t["default"]=l,e.exports=t["default"]},function(e,t){function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function defineProperties(e,t){for(var n=0;nl&&Math.abs(c)>1e-7;l++)t=a*Math.sin(s),t=Math.pow((1-t)/(1+t),a/2),c=Math.PI/2-2*Math.atan(u*t)-s,s+=c;return(0,i["default"])(s*n,e.x*n/r)},pointScale:function(e){var t=Math.PI/180,n=e.lat*t,r=Math.sin(n),i=r*r,o=Math.cos(n),a=Math.sqrt(1-this.ECC2*i)/o;return[a,a]},bounds:[[-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]]};t["default"]=u,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(18),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f={code:"EPSG:4326",projection:s["default"],transformScale:1/180,transformation:new c["default"](1/180,0,-1/180,0)},p=(0,i["default"])({},a["default"],f);t["default"]=p,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(10),i=_interopRequireDefault(r),o=n(11),a=_interopRequireDefault(o),u={project:function(e){return(0,a["default"])(e.lon,e.lat)},unproject:function(e){return(0,i["default"])(e.y,e.x)},pointScale:function(e){var t=111132.92,n=-559.82,r=1.175,i=-.0023,o=111412.84,a=-93.5,u=.118,s=Math.PI/180,l=e.lat*s,c=t+n*Math.cos(2*l)+r*Math.cos(4*l)+i*Math.cos(6*l),f=o*Math.cos(l)+a*Math.cos(3*l)+u*Math.cos(5*l);return[1/c,1/f]},bounds:[[-180,-90],[180,90]]};t["default"]=u,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(9),a=_interopRequireDefault(o),u=n(18),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f={projection:s["default"],transformation:new c["default"](1,0,1,0),scale:function(e){return e?Math.pow(2,e):1},zoom:function(e){return Math.log(e)/Math.LN2},distance:function(e,t){var n=t.lon-e.lon,r=t.lat-e.lat;return Math.sqrt(n*n+r*r)},infinite:!0},p=(0,i["default"])({},a["default"],f);t["default"]=p,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=_interopRequireDefault(r),o=n(8),a=_interopRequireDefault(o),u=n(21),s=_interopRequireDefault(u),l=n(14),c=_interopRequireDefault(l),f=function(e,t,n){var r=(0,s["default"])(t,n),i=r.bounds[1][0]-r.bounds[0][0],o=r.bounds[1][1]-r.bounds[0][1],a=i/2,u=o/2,l=1/a,f=1/u,p=Math.min(l,f),h=p*(r.bounds[0][0]+a),d=p*(r.bounds[0][1]+u);return{code:e,projection:r,transformScale:p,transformation:new c["default"](p,-h,-p,d)}},p=function(e,t,n){return(0,i["default"])({},a["default"],f(e,t,n))};t["default"]=p,e.exports=t["default"]},function(e,t,n){function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(22),i=_interopRequireDefault(r),o=n(10),a=_interopRequireDefault(o),u=n(11),s=_interopRequireDefault(u),l=function(e,t){var n=(0,i["default"])(e),r=function(e){return(0,s["default"])(n.forward([e.lon,e.lat]))},o=function(e){var t=n.inverse([e.x,e.y]);return(0,a["default"])(t[1],t[0])};return{project:r,unproject:o,pointScale:function(e,t){return[1,1]},bounds:function(){if(t)return t;var e=r([-90,-180]),n=r([90,180]);return[e,n]}()}};t["default"]=l,e.exports=t["default"]},function(e,t){e.exports=__WEBPACK_EXTERNAL_MODULE_22__},function(e,t,n){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 _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)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n0?dollyIn(getZoomScale()):M.y<0&&dollyOut(getZoomScale()),E.copy(O),o.update()}function handleMouseMovePan(e){x.set(e.clientX,e.clientY),w.subVectors(x,b),R(w.x,w.y),b.copy(x),o.update()}function handleMouseUp(e){}function handleMouseWheel(e){var t=0;void 0!==e.wheelDelta?t=e.wheelDelta:void 0!==e.detail&&(t=-e.detail),t>0?dollyOut(getZoomScale()):0>t&&dollyIn(getZoomScale()),o.update()}function handleKeyDown(e){switch(e.keyCode){case o.keys.UP:R(0,o.keyPanSpeed),o.update();break;case o.keys.BOTTOM:R(0,-o.keyPanSpeed),o.update();break;case o.keys.LEFT:R(o.keyPanSpeed,0),o.update();break;case o.keys.RIGHT:R(-o.keyPanSpeed,0),o.update()}}function handleTouchStartRotate(e){_.set(e.touches[0].pageX,e.touches[0].pageY)}function handleTouchStartDolly(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);E.set(0,r)}function handleTouchStartPan(e){b.set(e.touches[0].pageX,e.touches[0].pageY)}function handleTouchMoveRotate(e){m.set(e.touches[0].pageX,e.touches[0].pageY),g.subVectors(m,_);var t=o.domElement===document?o.domElement.body:o.domElement;rotateLeft(2*Math.PI*g.x/t.clientWidth*o.rotateSpeed),rotateUp(2*Math.PI*g.y/t.clientHeight*o.rotateSpeed),_.copy(m),o.update()}function handleTouchMoveDolly(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);O.set(0,r),M.subVectors(O,E),M.y>0?dollyOut(getZoomScale()):M.y<0&&dollyIn(getZoomScale()),E.copy(O),o.update()}function handleTouchMovePan(e){x.set(e.touches[0].pageX,e.touches[0].pageY),w.subVectors(x,b),R(w.x,w.y),b.copy(x),o.update()}function handleTouchEnd(e){}function onMouseDown(e){if(o.enabled!==!1){if(e.preventDefault(),e.button===o.mouseButtons.ORBIT){if(o.enableRotate===!1)return;handleMouseDownRotate(e),c=l.ROTATE}else if(e.button===o.mouseButtons.ZOOM){if(o.enableZoom===!1)return;handleMouseDownDolly(e),c=l.DOLLY}else if(e.button===o.mouseButtons.PAN){if(o.enablePan===!1)return;handleMouseDownPan(e),c=l.PAN}c!==l.NONE&&(document.addEventListener("mousemove",onMouseMove,!1),document.addEventListener("mouseup",onMouseUp,!1),document.addEventListener("mouseout",onMouseUp,!1),o.dispatchEvent(u))}}function onMouseMove(e){if(o.enabled!==!1)if(e.preventDefault(),c===l.ROTATE){if(o.enableRotate===!1)return;handleMouseMoveRotate(e)}else if(c===l.DOLLY){if(o.enableZoom===!1)return;handleMouseMoveDolly(e)}else if(c===l.PAN){if(o.enablePan===!1)return;handleMouseMovePan(e)}}function onMouseUp(e){o.enabled!==!1&&(handleMouseUp(e),document.removeEventListener("mousemove",onMouseMove,!1),document.removeEventListener("mouseup",onMouseUp,!1),document.removeEventListener("mouseout",onMouseUp,!1),o.dispatchEvent(s),c=l.NONE)}function onMouseWheel(e){o.enabled!==!1&&o.enableZoom!==!1&&c===l.NONE&&(e.preventDefault(),e.stopPropagation(),handleMouseWheel(e),o.dispatchEvent(u),o.dispatchEvent(s))}function onKeyDown(e){o.enabled!==!1&&o.enableKeys!==!1&&o.enablePan!==!1&&handleKeyDown(e)}function onTouchStart(e){if(o.enabled!==!1){switch(e.touches.length){case 1:if(o.enableRotate===!1)return;handleTouchStartRotate(e),c=l.TOUCH_ROTATE;break;case 2:if(o.enableZoom===!1)return;handleTouchStartDolly(e),c=l.TOUCH_DOLLY;break;case 3:if(o.enablePan===!1)return;handleTouchStartPan(e),c=l.TOUCH_PAN;break;default:c=l.NONE}c!==l.NONE&&o.dispatchEvent(u)}}function onTouchMove(e){if(o.enabled!==!1)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:if(o.enableRotate===!1)return;if(c!==l.TOUCH_ROTATE)return;handleTouchMoveRotate(e);break;case 2:if(o.enableZoom===!1)return;if(c!==l.TOUCH_DOLLY)return;handleTouchMoveDolly(e);break;case 3:if(o.enablePan===!1)return;if(c!==l.TOUCH_PAN)return;handleTouchMovePan(e);break;default:c=l.NONE}}function onTouchEnd(e){o.enabled!==!1&&(handleTouchEnd(e),o.dispatchEvent(s),c=l.NONE)}function onContextMenu(e){e.preventDefault()}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.target=new i["default"].Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-(1/0),this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.25,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.enableKeys=!0,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40},this.mouseButtons={ORBIT:i["default"].MOUSE.LEFT,ZOOM:i["default"].MOUSE.MIDDLE,PAN:i["default"].MOUSE.RIGHT},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this.getPolarAngle=function(){return r},this.getAzimuthalAngle=function(){return n},this.reset=function(){o.target.copy(o.target0),o.object.position.copy(o.position0),o.object.zoom=o.zoom0,o.object.updateProjectionMatrix(),o.dispatchEvent(a),o.update(),c=l.NONE},this.update=function(){var t=new i["default"].Vector3,u=(new i["default"].Quaternion).setFromUnitVectors(e.up,new i["default"].Vector3(0,1,0)),s=u.clone().inverse(),_=new i["default"].Vector3,m=new i["default"].Quaternion;return function(){var e=o.object.position;t.copy(e).sub(o.target),t.applyQuaternion(u),n=Math.atan2(t.x,t.z),r=Math.atan2(Math.sqrt(t.x*t.x+t.z*t.z),t.y),o.autoRotate&&c===l.NONE&&rotateLeft(getAutoRotationAngle()),n+=h,r+=p,n=Math.max(o.minAzimuthAngle,Math.min(o.maxAzimuthAngle,n)),r=Math.max(o.minPolarAngle,Math.min(o.maxPolarAngle,r)),r=Math.max(f,Math.min(Math.PI-f,r));var i=t.length()*d;return i=Math.max(o.minDistance,Math.min(o.maxDistance,i)),o.target.add(v),t.x=i*Math.sin(r)*Math.sin(n),t.y=i*Math.cos(r),t.z=i*Math.sin(r)*Math.cos(n),t.applyQuaternion(s),e.copy(o.target).add(t),o.object.lookAt(o.target),o.enableDamping===!0?(h*=1-o.dampingFactor,p*=1-o.dampingFactor):(h=0,p=0),d=1,v.set(0,0,0),y||_.distanceToSquared(o.object.position)>f||8*(1-m.dot(o.object.quaternion))>f?(o.dispatchEvent(a),_.copy(o.object.position),m.copy(o.object.quaternion),y=!1,!0):!1}}(),this.dispose=function(){o.domElement.removeEventListener("contextmenu",onContextMenu,!1),o.domElement.removeEventListener("mousedown",onMouseDown,!1),o.domElement.removeEventListener("mousewheel",onMouseWheel,!1),o.domElement.removeEventListener("MozMousePixelScroll",onMouseWheel,!1),o.domElement.removeEventListener("touchstart",onTouchStart,!1),o.domElement.removeEventListener("touchend",onTouchEnd,!1),o.domElement.removeEventListener("touchmove",onTouchMove,!1),document.removeEventListener("mousemove",onMouseMove,!1),document.removeEventListener("mouseup",onMouseUp,!1),document.removeEventListener("mouseout",onMouseUp,!1),window.removeEventListener("keydown",onKeyDown,!1)};var n,r,o=this,a={type:"change"},u={type:"start"},s={type:"end"},l={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},c=l.NONE,f=1e-6,p=0,h=0,d=1,v=new i["default"].Vector3,y=!1,_=new i["default"].Vector2,m=new i["default"].Vector2,g=new i["default"].Vector2,b=new i["default"].Vector2,x=new i["default"].Vector2,w=new i["default"].Vector2,E=new i["default"].Vector2,O=new i["default"].Vector2,M=new i["default"].Vector2,P=function(){var e=new i["default"].Vector3;return function(t,n){var r=n.elements;e.set(r[0],0,r[2]),e.multiplyScalar(-t),v.add(e)}}(),j=function(){var e=new i["default"].Vector3;return function(t,n){var i=n.elements,o=t/Math.cos(r);e.set(i[4],0,i[6]),e.multiplyScalar(o),v.add(e)}}(),R=function(){var e=new i["default"].Vector3;return function(t,n){var r=o.domElement===document?o.domElement.body:o.domElement;if(o.object instanceof i["default"].PerspectiveCamera){var a=o.object.position;e.copy(a).sub(o.target);var u=e.length();u*=Math.tan(o.object.fov/2*Math.PI/180),P(2*t*u/r.clientHeight,o.object.matrix),j(2*n*u/r.clientHeight,o.object.matrix)}else o.object instanceof i["default"].OrthographicCamera?(P(t*(o.object.right-o.object.left)/r.clientWidth,o.object.matrix),j(n*(o.object.top-o.object.bottom)/r.clientHeight,o.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),o.enablePan=!1)}}();o.domElement.addEventListener("contextmenu",onContextMenu,!1),o.domElement.addEventListener("mousedown",onMouseDown,!1),o.domElement.addEventListener("mousewheel",onMouseWheel,!1),o.domElement.addEventListener("MozMousePixelScroll",onMouseWheel,!1),o.domElement.addEventListener("touchstart",onTouchStart,!1),o.domElement.addEventListener("touchend",onTouchEnd,!1),o.domElement.addEventListener("touchmove",onTouchMove,!1),window.addEventListener("keydown",onKeyDown,!1),this.update()};o.prototype=Object.create(i["default"].EventDispatcher.prototype),o.prototype.constructor=i["default"].OrbitControls,Object.defineProperties(o.prototype,{center:{get:function(){return console.warn("THREE.OrbitControls: .center has been renamed to .target"),this.target}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.constraint.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.constraint.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor=e}}}),t["default"]=o,e.exports=t["default"]},function(e,t,n){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 _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)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n0){var i=n.getCenter(),o=new p["default"].Vector3(i[0],0,i[1]).sub(t.position).length();if(o>e._options.distance)return}return n.getMesh()?void(n.isReady()&&e._tiles.add(n.getMesh())):void n.requestTileAsync()}})}}},{key:"_divide",value:function(e){for(var t,n,r=0;r!=e.length;)t=e[r],n=t.getQuadcode(),t.length!==this._maxLOD&&this._screenSpaceError(t)?(e.splice(r,1),e.push(this._requestTile(n+"0",this)),e.push(this._requestTile(n+"1",this)),e.push(this._requestTile(n+"2",this)),e.push(this._requestTile(n+"3",this))):r++}},{key:"_screenSpaceError",value:function(e){var t=this._minLOD,n=this._maxLOD,r=e.getQuadcode(),i=this._world.getCamera(),o=3;if(r.length===n)return!1;if(r.length1}},{key:"_removeTiles",value:function(){for(var e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e])}},{key:"_createTile",value:function(e,t){}},{key:"_requestTile",value:function(e,t){var n=this._tileCache.getTile(e);return n||(n=this._createTile(e,t),this._tileCache.setTile(e,n)),n}},{key:"_destroyTile",value:function(e){this._layer.remove(e),e.destroy()}},{key:"destroy",value:function(){var e;for(e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e]);for(e=this._layer.children.length-1;e>=0;e--)this._layer.remove(this._layer.children[e]);this._tileCache.destroy(),this._tileCache=null,this._world=null,this._tiles=null,this._layer=null,this._frustum=null}}]),TileLayer}(a["default"]);t["default"]=h,e.exports=t["default"]},function(e,t,n){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")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n=t)&&priv(this,"max",1/0);var n=e.length||naiveLength;"function"!=typeof n&&(n=naiveLength),priv(this,"lengthCalculator",n),priv(this,"allowStale",e.stale||!1),priv(this,"maxAge",e.maxAge||0),priv(this,"dispose",e.dispose),this.reset()}function forEachStep(e,t,n,r){var i=n.value;isStale(e,i)&&(del(e,n),priv(e,"allowStale")||(i=void 0)),i&&t.call(r,i.value,i.key,e)}function get(e,t,n){var r=priv(e,"cache").get(t);if(r){var i=r.value;isStale(e,i)?(del(e,r),priv(e,"allowStale")||(i=void 0)):n&&priv(e,"lruList").unshiftNode(r),i&&(i=i.value)}return i}function isStale(e,t){if(!t||!t.maxAge&&!priv(e,"maxAge"))return!1;var n=!1,r=Date.now()-t.now;return n=t.maxAge?r>t.maxAge:priv(e,"maxAge")&&r>priv(e,"maxAge")}function trim(e){if(priv(e,"length")>priv(e,"max"))for(var t=priv(e,"lruList").tail;priv(e,"length")>priv(e,"max")&&null!==t;){var n=t.prev;del(e,t),t=n}}function del(e,t){if(t){var n=t.value;priv(e,"dispose")&&priv(e,"dispose").call(this,n.key,n.value),priv(e,"length",priv(e,"length")-n.length),priv(e,"cache")["delete"](n.key),priv(e,"lruList").removeNode(t)}}function Entry(e,t,n,r,i){this.key=e,this.value=t,this.length=n,this.now=r,this.maxAge=i||0}e.exports=LRUCache;var r,i=n(37),o=n(40),a=n(43),u={},s="function"==typeof Symbol;r=s?function(e){return Symbol["for"](e)}:function(e){return"_"+e},Object.defineProperty(LRUCache.prototype,"max",{set:function(e){(!e||"number"!=typeof e||0>=e)&&(e=1/0),priv(this,"max",e),trim(this)},get:function(){return priv(this,"max")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"allowStale",{set:function(e){priv(this,"allowStale",!!e)},get:function(){return priv(this,"allowStale")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"maxAge",{set:function(e){(!e||"number"!=typeof e||0>e)&&(e=0),priv(this,"maxAge",e),trim(this)},get:function(){return priv(this,"maxAge")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"lengthCalculator",{set:function(e){"function"!=typeof e&&(e=naiveLength),e!==priv(this,"lengthCalculator")&&(priv(this,"lengthCalculator",e),priv(this,"length",0),priv(this,"lruList").forEach(function(e){e.length=priv(this,"lengthCalculator").call(this,e.value,e.key),priv(this,"length",priv(this,"length")+e.length)},this)),trim(this)},get:function(){return priv(this,"lengthCalculator")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"length",{get:function(){return priv(this,"length")},enumerable:!0}),Object.defineProperty(LRUCache.prototype,"itemCount",{get:function(){return priv(this,"lruList").length},enumerable:!0}),LRUCache.prototype.rforEach=function(e,t){t=t||this;for(var n=priv(this,"lruList").tail;null!==n;){var r=n.prev;forEachStep(this,e,n,t),n=r}},LRUCache.prototype.forEach=function(e,t){t=t||this;for(var n=priv(this,"lruList").head;null!==n;){var r=n.next;forEachStep(this,e,n,t),n=r}},LRUCache.prototype.keys=function(){return priv(this,"lruList").toArray().map(function(e){return e.key},this)},LRUCache.prototype.values=function(){return priv(this,"lruList").toArray().map(function(e){return e.value},this)},LRUCache.prototype.reset=function(){priv(this,"dispose")&&priv(this,"lruList")&&priv(this,"lruList").length&&priv(this,"lruList").forEach(function(e){priv(this,"dispose").call(this,e.key,e.value)},this),priv(this,"cache",new i),priv(this,"lruList",new a),priv(this,"length",0)},LRUCache.prototype.dump=function(){return priv(this,"lruList").map(function(e){return isStale(this,e)?void 0:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}},this).toArray().filter(function(e){return e})},LRUCache.prototype.dumpLru=function(){return priv(this,"lruList")},LRUCache.prototype.inspect=function(e,t){var n="LRUCache {",r=!1,i=priv(this,"allowStale");i&&(n+="\n allowStale: true",r=!0);var a=priv(this,"max");a&&a!==1/0&&(r&&(n+=","),n+="\n max: "+o.inspect(a,t),r=!0);var u=priv(this,"maxAge");u&&(r&&(n+=","),n+="\n maxAge: "+o.inspect(u,t),r=!0);var s=priv(this,"lengthCalculator");s&&s!==naiveLength&&(r&&(n+=","),n+="\n length: "+o.inspect(priv(this,"length"),t),r=!0);var l=!1;return priv(this,"lruList").forEach(function(e){l?n+=",\n ":(r&&(n+=",\n"),l=!0,n+="\n ");var i=o.inspect(e.key).split("\n").join("\n "),a={value:e.value};e.maxAge!==u&&(a.maxAge=e.maxAge),s!==naiveLength&&(a.length=e.length),isStale(this,e)&&(a.stale=!0),a=o.inspect(a,t).split("\n").join("\n "),n+=i+" => "+a}),(l||r)&&(n+="\n"),n+="}"},LRUCache.prototype.set=function(e,t,n){n=n||priv(this,"maxAge");var r=n?Date.now():0,i=priv(this,"lengthCalculator").call(this,t,e);if(priv(this,"cache").has(e)){if(i>priv(this,"max"))return del(this,priv(this,"cache").get(e)),!1;var o=priv(this,"cache").get(e),a=o.value;return priv(this,"dispose")&&priv(this,"dispose").call(this,e,a.value),a.now=r,a.maxAge=n,a.value=t,priv(this,"length",priv(this,"length")+(i-a.length)),a.length=i,this.get(e),trim(this),!0}var u=new Entry(e,t,i,r,n);return u.length>priv(this,"max")?(priv(this,"dispose")&&priv(this,"dispose").call(this,e,t),!1):(priv(this,"length",priv(this,"length")+u.length),priv(this,"lruList").unshift(u),priv(this,"cache").set(e,priv(this,"lruList").head),trim(this),!0)},LRUCache.prototype.has=function(e){if(!priv(this,"cache").has(e))return!1;var t=priv(this,"cache").get(e).value;return isStale(this,t)?!1:!0},LRUCache.prototype.get=function(e){return get(this,e,!0)},LRUCache.prototype.peek=function(e){return get(this,e,!1)},LRUCache.prototype.pop=function(){var e=priv(this,"lruList").tail;return e?(del(this,e),e.value):null},LRUCache.prototype.del=function(e){del(this,priv(this,"cache").get(e))},LRUCache.prototype.load=function(e){this.reset();for(var t=Date.now(),n=e.length-1;n>=0;n--){var r=e[n],i=r.e||0;if(0===i)this.set(r.k,r.v);else{var o=i-t;o>0&&this.set(r.k,r.v,o)}}},LRUCache.prototype.prune=function(){var e=this;priv(this,"cache").forEach(function(t,n){get(e,n,!1)})}},function(e,t,n){(function(t){"pseudomap"===t.env.npm_package_name&&"test"===t.env.npm_lifecycle_script&&(t.env.TEST_PSEUDOMAP="true"),"function"!=typeof Map||t.env.TEST_PSEUDOMAP?e.exports=n(39):e.exports=Map}).call(t,n(38))},function(e,t){function cleanUpNextTick(){o=!1,n.length?i=n.concat(i):a=-1,i.length&&drainQueue()}function drainQueue(){if(!o){var e=setTimeout(cleanUpNextTick);o=!0;for(var t=i.length;t;){for(n=i,i=[];++a1)for(var n=1;n=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),isBoolean(n)?r.showHidden=n:n&&t._extend(r,n),isUndefined(r.showHidden)&&(r.showHidden=!1),isUndefined(r.depth)&&(r.depth=2),isUndefined(r.colors)&&(r.colors=!1),isUndefined(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=stylizeWithColor),formatValue(r,e,r.depth)}function stylizeWithColor(e,t){var n=inspect.styles[t];return n?"["+inspect.colors[n][0]+"m"+e+"["+inspect.colors[n][1]+"m":e}function stylizeNoColor(e,t){return e}function arrayToHash(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function formatValue(e,n,r){if(e.customInspect&&n&&isFunction(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return isString(i)||(i=formatValue(e,i,r)),i}var o=formatPrimitive(e,n);if(o)return o;var a=Object.keys(n),u=arrayToHash(a);if(e.showHidden&&(a=Object.getOwnPropertyNames(n)),isError(n)&&(a.indexOf("message")>=0||a.indexOf("description")>=0))return formatError(n);if(0===a.length){if(isFunction(n)){var s=n.name?": "+n.name:"";return e.stylize("[Function"+s+"]","special")}if(isRegExp(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(isDate(n))return e.stylize(Date.prototype.toString.call(n),"date");if(isError(n))return formatError(n)}var l="",c=!1,f=["{","}"];if(isArray(n)&&(c=!0,f=["[","]"]),isFunction(n)){var p=n.name?": "+n.name:"";l=" [Function"+p+"]"}if(isRegExp(n)&&(l=" "+RegExp.prototype.toString.call(n)),isDate(n)&&(l=" "+Date.prototype.toUTCString.call(n)),isError(n)&&(l=" "+formatError(n)),0===a.length&&(!c||0==n.length))return f[0]+l+f[1];if(0>r)return isRegExp(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special");e.seen.push(n);var h;return h=c?formatArray(e,n,r,u,a):a.map(function(t){return formatProperty(e,n,r,u,t,c)}),e.seen.pop(),reduceToSingleString(h,l,f)}function formatPrimitive(e,t){if(isUndefined(t))return e.stylize("undefined","undefined");if(isString(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return isNumber(t)?e.stylize(""+t,"number"):isBoolean(t)?e.stylize(""+t,"boolean"):isNull(t)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,t,n,r,i){for(var o=[],a=0,u=t.length;u>a;++a)hasOwnProperty(t,String(a))?o.push(formatProperty(e,t,n,r,String(a),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,t,n,r,i,!0))}),o}function formatProperty(e,t,n,r,i,o){var a,u,s;if(s=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},s.get?u=s.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):s.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(r,i)||(a="["+i+"]"),u||(e.seen.indexOf(s.value)<0?(u=isNull(n)?formatValue(e,s.value,null):formatValue(e,s.value,n-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(a)){if(o&&i.match(/^\d+$/))return u;a=JSON.stringify(""+i),a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+u}function reduceToSingleString(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,t=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),u[e.getMonth()],t].join(" ")}function hasOwnProperty(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var i=/%[sdj%]/g;t.format=function(e){if(!isString(e)){for(var t=[],n=0;n=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(t){return"[Circular]"}default:return e}}),u=r[n];o>n;u=r[++n])a+=isNull(u)||!isObject(u)?" "+u:" "+inspect(u);return a},t.deprecate=function(n,i){function deprecated(){if(!o){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),o=!0}return n.apply(this,arguments)}if(isUndefined(e.process))return function(){return t.deprecate(n,i).apply(this,arguments)};if(r.noDeprecation===!0)return n;var o=!1;return deprecated};var o,a={};t.debuglog=function(e){if(isUndefined(o)&&(o=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!a[e])if(new RegExp("\\b"+e+"\\b","i").test(o)){var n=r.pid;a[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else a[e]=function(){};return a[e]},t.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=isArray,t.isBoolean=isBoolean,t.isNull=isNull,t.isNullOrUndefined=isNullOrUndefined,t.isNumber=isNumber,t.isString=isString,t.isSymbol=isSymbol,t.isUndefined=isUndefined,t.isRegExp=isRegExp,t.isObject=isObject,t.isDate=isDate,t.isError=isError,t.isFunction=isFunction,t.isPrimitive=isPrimitive,t.isBuffer=n(41);var u=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];t.log=function(){console.log("%s - %s",timestamp(),t.format.apply(t,arguments))},t.inherits=n(42),t._extend=function(e,t){if(!t||!isObject(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}).call(t,function(){return this}(),n(38))},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t){function Yallist(e){var t=this;if(t instanceof Yallist||(t=new Yallist),t.tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach(function(e){t.push(e)});else if(arguments.length>0)for(var n=0,r=arguments.length;r>n;n++)t.push(arguments[n]);return t}function push(e,t){e.tail=new Node(t,e.tail,null,e),e.head||(e.head=e.tail),e.length++}function unshift(e,t){e.head=new Node(t,null,e.head,e),e.tail||(e.tail=e.head),e.length++}function Node(e,t,n,r){return this instanceof Node?(this.list=r,this.value=e,t?(t.next=this,this.prev=t):this.prev=null,void(n?(n.prev=this,this.next=n):this.next=null)):new Node(e,t,n,r)}e.exports=Yallist,Yallist.Node=Node,Yallist.create=Yallist,Yallist.prototype.removeNode=function(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");var t=e.next,n=e.prev;t&&(t.prev=n),n&&(n.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=n),e.list.length--,e.next=null,e.prev=null,e.list=null},Yallist.prototype.unshiftNode=function(e){if(e!==this.head){e.list&&e.list.removeNode(e);var t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}},Yallist.prototype.pushNode=function(e){if(e!==this.tail){e.list&&e.list.removeNode(e);var t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}},Yallist.prototype.push=function(){for(var e=0,t=arguments.length;t>e;e++)push(this,arguments[e]);return this.length},Yallist.prototype.unshift=function(){for(var e=0,t=arguments.length;t>e;e++)unshift(this,arguments[e]);return this.length},Yallist.prototype.pop=function(){if(this.tail){var e=this.tail.value;return this.tail=this.tail.prev,this.tail.next=null,this.length--,e}},Yallist.prototype.shift=function(){if(this.head){var e=this.head.value;return this.head=this.head.next,this.head.prev=null,this.length--,e}},Yallist.prototype.forEach=function(e,t){t=t||this;for(var n=this.head,r=0;null!==n;r++)e.call(t,n.value,r,this),n=n.next},Yallist.prototype.forEachReverse=function(e,t){t=t||this;for(var n=this.tail,r=this.length-1;null!==n;r--)e.call(t,n.value,r,this),n=n.prev},Yallist.prototype.get=function(e){for(var t=0,n=this.head;null!==n&&e>t;t++)n=n.next;return t===e&&null!==n?n.value:void 0},Yallist.prototype.getReverse=function(e){for(var t=0,n=this.tail;null!==n&&e>t;t++)n=n.prev;return t===e&&null!==n?n.value:void 0},Yallist.prototype.map=function(e,t){t=t||this;for(var n=new Yallist,r=this.head;null!==r;)n.push(e.call(t,r.value,this)),r=r.next;return n},Yallist.prototype.mapReverse=function(e,t){t=t||this;for(var n=new Yallist,r=this.tail;null!==r;)n.push(e.call(t,r.value,this)),r=r.prev;return n},Yallist.prototype.reduce=function(e,t){var n,r=this.head;if(arguments.length>1)n=t;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");r=this.head.next,n=this.head.value}for(var i=0;null!==r;i++)n=e(n,r.value,i),r=r.next;return n},Yallist.prototype.reduceReverse=function(e,t){var n,r=this.tail;if(arguments.length>1)n=t;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");r=this.tail.prev,n=this.tail.value}for(var i=this.length-1;null!==r;i--)n=e(n,r.value,i),r=r.prev;return n},Yallist.prototype.toArray=function(){for(var e=new Array(this.length),t=0,n=this.head;null!==n;t++)e[t]=n.value,n=n.next;return e},Yallist.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,n=this.tail;null!==n;t++)e[t]=n.value,n=n.prev;return e},Yallist.prototype.slice=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var n=new Yallist;if(e>t||0>t)return n;0>e&&(e=0),t>this.length&&(t=this.length);for(var r=0,i=this.head;null!==i&&e>r;r++)i=i.next;for(;null!==i&&t>r;r++,i=i.next)n.push(i.value);return n},Yallist.prototype.sliceReverse=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var n=new Yallist;if(e>t||0>t)return n;0>e&&(e=0),t>this.length&&(t=this.length);for(var r=this.length,i=this.tail;null!==i&&r>t;r--)i=i.prev;for(;null!==i&&r>e;r--,i=i.prev)n.push(i.value);return n},Yallist.prototype.reverse=function(){for(var e=this.head,t=this.tail,n=e;null!==n;n=n.prev){var r=n.prev;n.prev=n.next,n.next=r}return this.head=t,this.tail=e,this}},function(e,t,n){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 _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)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;n0;i--){var o=1<=e||e>t?complete(c,o):l=setTimeout(delayed,e)}function flush(){return(l&&c||o&&y)&&(a=e.apply(s,i)),cancel(),a}function maxDelayed(){complete(y,l)}function debounced(){if(i=arguments,u=d(),s=this,c=y&&(l||!p),v===!1)var n=p&&!l;else{o||p||(f=u);var r=v-(u-f),h=0>=r||r>v;h?(o&&(o=clearTimeout(o)),f=u,a=e.apply(s,i)):o||(o=setTimeout(maxDelayed,r))}return h&&l?l=clearTimeout(l):l||t===v||(l=setTimeout(delayed,t)),n&&(h=!0,a=e.apply(s,i)),!h||l||o||(i=s=void 0),a}var i,o,a,u,s,l,c,f=0,p=!1,v=!1,y=!0;if("function"!=typeof e)throw new TypeError(n);return t=toNumber(t)||0,isObject(r)&&(p=!!r.leading,v="maxWait"in r&&h(toNumber(r.maxWait)||0,t),y="trailing"in r?!!r.trailing:y),debounced.cancel=cancel,debounced.flush=flush,debounced}function isFunction(e){var t=isObject(e)?p.call(e):"";return t==i||t==o}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function toNumber(e){if(isObject(e)){var t=isFunction(e.valueOf)?e.valueOf():e;e=isObject(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(a,"");var n=s.test(e);return n||l.test(e)?c(e.slice(2),n?2:8):u.test(e)?r:+e}var n="Expected a function",r=NaN,i="[object Function]",o="[object GeneratorFunction]",a=/^\s+|\s+$/g,u=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt,f=Object.prototype,p=f.toString,h=Math.max,d=Date.now;e.exports=debounce},function(e,t,n){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 _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)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function defineProperties(e,t){for(var n=0;na;a++)n.vertices.push(e[i][o][a]);i>0&&(r+=e[i-1].length,n.holes.push(r))}return n}},{key:"_triangulate",value:function(e,t,n){var r=(0,b["default"])(e,t,n),o=[];for(i=0,il=r.length;i0;)self._completeHandlers.shift()(e)}function success(resp){var type=o.type||resp&&setType(resp.getResponseHeader("Content-Type"));resp="jsonp"!==type?self.request:resp;var filteredResponse=globalSetupOptions.dataFilter(resp.responseText,type),r=filteredResponse;try{resp.responseText=r}catch(e){}if(r)switch(type){case"json":try{resp=context.JSON?context.JSON.parse(r):eval("("+r+")")}catch(err){return error(resp,"Could not parse JSON in response",err)}break;case"js":resp=eval(r);break;case"html":resp=r;break;case"xml":resp=resp.responseXML&&resp.responseXML.parseError&&resp.responseXML.parseError.errorCode&&resp.responseXML.parseError.reason?null:resp.responseXML}for(self._responseArgs.resp=resp,self._fulfilled=!0,fn(resp),self._successHandler(resp);self._fulfillmentHandlers.length>0;)resp=self._fulfillmentHandlers.shift()(resp);complete(resp)}function timedOut(){self._timedOut=!0,self.request.abort()}function error(e,t,n){for(e=self.request,self._responseArgs.resp=e,self._responseArgs.msg=t,self._responseArgs.t=n,self._erred=!0;self._errorHandlers.length>0;)self._errorHandlers.shift()(e,t,n);complete(e)}this.url="string"==typeof o?o:o.url,this.timeout=null,this._fulfilled=!1,this._successHandler=function(){},this._fulfillmentHandlers=[],this._errorHandlers=[],this._completeHandlers=[],this._erred=!1,this._responseArgs={};var self=this;fn=fn||function(){},o.timeout&&(this.timeout=setTimeout(function(){timedOut()},o.timeout)),o.success&&(this._successHandler=function(){o.success.apply(o,arguments)}),o.error&&this._errorHandlers.push(function(){o.error.apply(o,arguments)}),o.complete&&this._completeHandlers.push(function(){o.complete.apply(o,arguments)}),this.request=getRequest.call(this,success,error)}function reqwest(e,t){return new Reqwest(e,t)}function normalize(e){return e?e.replace(/\r?\n/g,"\r\n"):""}function serial(e,t){var n,r,i,o,a=e.name,u=e.tagName.toLowerCase(),s=function(e){e&&!e.disabled&&t(a,normalize(e.attributes.value&&e.attributes.value.specified?e.value:e.text))};if(!e.disabled&&a)switch(u){case"input":/reset|button|image|file/i.test(e.type)||(n=/checkbox/i.test(e.type),r=/radio/i.test(e.type),i=e.value,(!(n||r)||e.checked)&&t(a,normalize(n&&""===i?"on":i)));break;case"textarea":t(a,normalize(e.value));break;case"select":if("select-one"===e.type.toLowerCase())s(e.selectedIndex>=0?e.options[e.selectedIndex]:null);else for(o=0;e.length&&on;){var i=n+r>>>1;e[i]e?~e:e],a=0,u=o.length;u>a;++a)t.push(i=o[a].slice()),n(i,a);0>e&&reverse(t,u)}function point(e){return e=e.slice(),n(e,0),e}function line(e){for(var t=[],n=0,r=e.length;r>n;++n)arc(e[n],t);return t.length<2&&t.push(t[0].slice()),t}function ring(e){for(var t=line(e);t.length<4;)t.push(t[0].slice());return t}function polygon(e){return e.map(ring)}function geometry(e){var t=e.type;return"GeometryCollection"===t?{type:t,geometries:e.geometries.map(geometry)}:t in i?{type:t,coordinates:i[t](e)}:null}var n=absolute(e.transform),r=e.arcs,i={Point:function(e){return point(e.coordinates)},MultiPoint:function(e){return e.coordinates.map(point)},LineString:function(e){return line(e.arcs)},MultiLineString:function(e){return e.arcs.map(line)},Polygon:function(e){return polygon(e.arcs)},MultiPolygon:function(e){return e.arcs.map(polygon)}};return geometry(t)}function stitchArcs(e,t){function ends(t){var n,r=e.arcs[0>t?~t:t],i=r[0];return e.transform?(n=[0,0],r.forEach(function(e){n[0]+=e[0],n[1]+=e[1]})):n=r[r.length-1],0>t?[n,i]:[i,n]}function flush(e,t){for(var r in e){var i=e[r];delete t[i.start],delete i.start,delete i.end,i.forEach(function(e){n[0>e?~e:e]=1}),o.push(i)}}var n={},r={},i={},o=[],a=-1;return t.forEach(function(n,r){var i,o=e.arcs[0>n?~n:n];o.length<3&&!o[1][0]&&!o[1][1]&&(i=t[++a],t[a]=n,t[r]=i)}),t.forEach(function(e){var t,n,o=ends(e),a=o[0],u=o[1];if(t=i[a])if(delete i[t.end],t.push(e),t.end=u,n=r[u]){delete r[n.start];var s=n===t?t:t.concat(n);r[s.start=t.start]=i[s.end=n.end]=s}else r[t.start]=i[t.end]=t;else if(t=r[u])if(delete r[t.start],t.unshift(e),t.start=a,n=i[a]){delete i[n.end];var l=n===t?t:n.concat(t);r[l.start=n.start]=i[l.end=t.end]=l}else r[t.start]=i[t.end]=t;else t=[e],r[t.start=a]=i[t.end=u]=t}),flush(i,r),flush(r,i),t.forEach(function(e){n[0>e?~e:e]||o.push([e])}),o}function mesh(e){return object(e,meshArcs.apply(this,arguments))}function meshArcs(e,t,n){function arc(e){var t=0>e?~e:e;(o[t]||(o[t]=[])).push({i:e,g:i})}function line(e){e.forEach(arc)}function polygon(e){e.forEach(line)}function geometry(e){"GeometryCollection"===e.type?e.geometries.forEach(geometry):e.type in a&&(i=e,a[e.type](e.arcs))}var r=[];if(arguments.length>1){var i,o=[],a={LineString:line,MultiLineString:polygon,Polygon:polygon,MultiPolygon:function(e){e.forEach(polygon)}};geometry(t),o.forEach(arguments.length<3?function(e){r.push(e[0].i)}:function(e){n(e[0].g,e[e.length-1].g)&&r.push(e[0].i)})}else for(var u=0,s=e.arcs.length;s>u;++u)r.push(u);return{type:"MultiLineString",arcs:stitchArcs(e,r)}}function triangle(e){var t=e[0],n=e[1],r=e[2];return Math.abs((t[0]-r[0])*(n[1]-t[1])-(t[0]-n[0])*(r[1]-t[1]))}function ring(e){for(var t,n=-1,r=e.length,i=e[r-1],o=0;++nt?~t:t]||(n[t]=[])).push(e)})}),r.push(e)}function exterior(t){return ring(object(e,{type:"Polygon",arcs:[t]}).coordinates[0])>0}var n={},r=[],i=[];return t.forEach(function(e){"Polygon"===e.type?register(e.arcs):"MultiPolygon"===e.type&&e.arcs.forEach(register)}),r.forEach(function(e){if(!e._){var t=[],r=[e];for(e._=1,i.push(t);e=r.pop();)t.push(e),e.forEach(function(e){e.forEach(function(e){n[0>e?~e:e].forEach(function(e){e._||(e._=1,r.push(e))})})})}}),r.forEach(function(e){delete e._}),{type:"MultiPolygon",arcs:i.map(function(t){var r,i=[];if(t.forEach(function(e){e.forEach(function(e){e.forEach(function(e){n[0>e?~e:e].length<2&&i.push(e)})})}),i=stitchArcs(e,i),(r=i.length)>1)for(var o,a=exterior(t[0][0]),u=0;r>u;++u)if(a===exterior(i[u])){o=i[0],i[0]=i[u],i[u]=o;break}return i})}}function neighbors(e){function line(e,n){e.forEach(function(e){0>e&&(e=~e);var r=t[e];r?r.push(n):t[e]=[n]})}function polygon(e,t){e.forEach(function(e){line(e,t)})}function geometry(e,t){"GeometryCollection"===e.type?e.geometries.forEach(function(e){geometry(e,t)}):e.type in r&&r[e.type](e.arcs,t)}var t={},n=e.map(function(){return[]}),r={LineString:line,MultiLineString:polygon,Polygon:polygon,MultiPolygon:function(e,t){e.forEach(function(e){polygon(e,t)})}};e.forEach(geometry);for(var i in t)for(var o=t[i],a=o.length,u=0;a>u;++u)for(var s=u+1;a>s;++s){var l,c=o[u],f=o[s];(l=n[c])[i=bisect(l,f)]!==f&&l.splice(i,0,f),(l=n[f])[i=bisect(l,c)]!==c&&l.splice(i,0,c)}return n}function compareArea(e,t){return e[1][2]-t[1][2]}function minAreaHeap(){function up(e,n){for(;n>0;){var r=(n+1>>1)-1,i=t[r];if(compareArea(e,i)>=0)break;t[i._=n]=i,t[e._=n=r]=e}}function down(e,r){for(;;){var i=r+1<<1,o=i-1,a=r,u=t[a];if(n>o&&compareArea(t[o],u)<0&&(u=t[a=o]),n>i&&compareArea(t[i],u)<0&&(u=t[a=i]),a===r)break;t[u._=r]=u,t[e._=r=a]=e}}var e={},t=[],n=0;return e.push=function(e){return up(t[e._=n]=e,n++),n},e.pop=function(){if(!(0>=n)){var e,r=t[0];return--n>0&&(e=t[n],down(t[e._=0]=e,0)),r}},e.remove=function(e){var r,i=e._;if(t[i]===e)return i!==--n&&(r=t[n],(compareArea(r,e)<0?up:down)(t[r._=i]=r,i)),i},e}function presimplify(e,t){function update(e){i.remove(e),e[1][2]=t(e),i.push(e)}var n=absolute(e.transform),r=relative(e.transform),i=minAreaHeap();return t||(t=triangle),e.arcs.forEach(function(e){var o,a,u,s,l=[],c=0;for(a=0,u=e.length;u>a;++a)s=e[a],n(e[a]=[s[0],s[1],1/0],a);for(a=1,u=e.length-1;u>a;++a)o=e.slice(a-1,a+2),o[1][2]=t(o),l.push(o),i.push(o);for(a=0,u=l.length;u>a;++a)o=l[a],o.previous=l[a-1],o.next=l[a+1];for(;o=i.pop();){var f=o.previous,p=o.next;o[1][2]80*n){u=l=e[0],s=c=e[1];for(var d=n;i>d;d+=n)f=e[d],p=e[d+1],u>f&&(u=f),s>p&&(s=p),f>l&&(l=f),p>c&&(c=p);h=Math.max(l-u,c-s)}return earcutLinked(o,a,n,u,s,h),a}function linkedList(e,t,n,r,i){var o,a,u,s=0;for(o=t,a=n-r;n>o;o+=r)s+=(e[a]-e[o])*(e[o+1]+e[a+1]),a=o;if(i===s>0)for(o=t;n>o;o+=r)u=insertNode(o,e[o],e[o+1],u);else for(o=n-r;o>=t;o-=r)u=insertNode(o,e[o],e[o+1],u);return u}function filterPoints(e,t){if(!e)return e;t||(t=e);var n,r=e;do if(n=!1,r.steiner||!equals(r,r.next)&&0!==area(r.prev,r,r.next))r=r.next;else{if(removeNode(r),r=t=r.prev,r===r.next)return null;n=!0}while(n||r!==t);return t}function earcutLinked(e,t,n,r,i,o,a){if(e){!a&&o&&indexCurve(e,r,i,o);for(var u,s,l=e;e.prev!==e.next;)if(u=e.prev,s=e.next,o?isEarHashed(e,r,i,o):isEar(e))t.push(u.i/n),t.push(e.i/n),t.push(s.i/n),removeNode(e),e=s.next,l=s.next;else if(e=s,e===l){a?1===a?(e=cureLocalIntersections(e,t,n),earcutLinked(e,t,n,r,i,o,2)):2===a&&splitEarcut(e,t,n,r,i,o):earcutLinked(filterPoints(e),t,n,r,i,o,1);break}}}function isEar(e){var t=e.prev,n=e,r=e.next;if(area(t,n,r)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(pointInTriangle(t.x,t.y,n.x,n.y,r.x,r.y,i.x,i.y)&&area(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function isEarHashed(e,t,n,r){var i=e.prev,o=e,a=e.next;if(area(i,o,a)>=0)return!1;for(var u=i.xo.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,c=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,f=zOrder(u,s,t,n,r),p=zOrder(l,c,t,n,r),h=e.nextZ;h&&h.z<=p;){if(h!==e.prev&&h!==e.next&&pointInTriangle(i.x,i.y,o.x,o.y,a.x,a.y,h.x,h.y)&&area(h.prev,h,h.next)>=0)return!1;h=h.nextZ}for(h=e.prevZ;h&&h.z>=f;){if(h!==e.prev&&h!==e.next&&pointInTriangle(i.x,i.y,o.x,o.y,a.x,a.y,h.x,h.y)&&area(h.prev,h,h.next)>=0)return!1;h=h.prevZ}return!0}function cureLocalIntersections(e,t,n){var r=e;do{var i=r.prev,o=r.next.next;intersects(i,r,r.next,o)&&locallyInside(i,o)&&locallyInside(o,i)&&(t.push(i.i/n),t.push(r.i/n),t.push(o.i/n),removeNode(r),removeNode(r.next),r=e=o),r=r.next}while(r!==e);return r}function splitEarcut(e,t,n,r,i,o){var a=e;do{for(var u=a.next.next;u!==a.prev;){if(a.i!==u.i&&isValidDiagonal(a,u)){var s=splitPolygon(a,u);return a=filterPoints(a,a.next),s=filterPoints(s,s.next),earcutLinked(a,t,n,r,i,o),void earcutLinked(s,t,n,r,i,o)}u=u.next}a=a.next}while(a!==e)}function eliminateHoles(e,t,n,r){var i,o,a,u,s,l=[];for(i=0,o=t.length;o>i;i++)a=t[i]*r,u=o-1>i?t[i+1]*r:e.length,s=linkedList(e,a,u,r,!1),s===s.next&&(s.steiner=!0),l.push(getLeftmost(s));for(l.sort(compareX),i=0;i=r.next.y){var u=r.x+(o-r.y)*(r.next.x-r.x)/(r.next.y-r.y);i>=u&&u>a&&(a=u,n=r.x=r.x&&r.x>=n.x&&pointInTriangle(os||s===c&&r.x>n.x)&&locallyInside(r,e)&&(n=r,c=s)),r=r.next;return n}function indexCurve(e,t,n,r){var i=e;do null===i.z&&(i.z=zOrder(i.x,i.y,t,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,sortLinked(i)}function sortLinked(e){var t,n,r,i,o,a,u,s,l=1;do{for(n=e,e=null,o=null,a=0;n;){for(a++,r=n,u=0,t=0;l>t&&(u++,r=r.nextZ,r);t++);for(s=l;u>0||s>0&&r;)0===u?(i=r,r=r.nextZ,s--):0!==s&&r?n.z<=r.z?(i=n,n=n.nextZ,u--):(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,u--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;n=r}o.nextZ=null,l*=2}while(a>1);return e}function zOrder(e,t,n,r,i){return e=32767*(e-n)/i,t=32767*(t-r)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function getLeftmost(e){var t=e,n=e;do t.x=0&&(e-a)*(r-u)-(n-a)*(t-u)>=0&&(n-a)*(o-u)-(i-a)*(r-u)>=0}function isValidDiagonal(e,t){return equals(e,t)||e.next.i!==t.i&&e.prev.i!==t.i&&!intersectsPolygon(e,t)&&locallyInside(e,t)&&locallyInside(t,e)&&middleInside(e,t)}function area(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function equals(e,t){return e.x===t.x&&e.y===t.y}function intersects(e,t,n,r){return area(e,t,n)>0!=area(e,t,r)>0&&area(n,r,e)>0!=area(n,r,t)>0}function intersectsPolygon(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&intersects(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function locallyInside(e,t){return area(e.prev,e,e.next)<0?area(e,t,e.next)>=0&&area(e,e.prev,t)>=0:area(e,t,e.prev)<0||area(e,e.next,t)<0}function middleInside(e,t){var n=e,r=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do n.y>o!=n.next.y>o&&i<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==e);return r}function splitPolygon(e,t){var n=new Node(e.i,e.x,e.y),r=new Node(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,n.next=i,i.prev=n,r.next=n,n.prev=r,o.next=r,r.prev=o,r}function insertNode(e,t,n,r){var i=new Node(e,t,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function removeNode(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Node(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}e.exports=earcut}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("proj4"),require("THREE")):"function"==typeof define&&define.amd?define(["proj4","THREE"],t):"object"==typeof exports?exports.VIZI=t(require("proj4"),require("THREE")):e.VIZI=t(e.proj4,e.THREE)}(this,function(__WEBPACK_EXTERNAL_MODULE_22__,__WEBPACK_EXTERNAL_MODULE_24__){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),i=r(o),a=n(28),u=r(a),s=n(31),l=r(s),c=n(33),f=r(c),h=n(50),p=r(h),d=n(11),v=r(d),y=n(10),m=r(y),_={version:"0.3",World:i["default"],Controls:u["default"],EnvironmentLayer:l["default"],ImageTileLayer:f["default"],TopoJSONTileLayer:p["default"],Point:v["default"],LatLon:m["default"]};t["default"]=_,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(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)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n-1&&this._layers.splice(t,1),this._engine._scene.remove(e._layer),e.destroy(),this.emit("layerRemoved"),this}},{key:"addControls",value:function(e){return e._addToWorld(this),this._controls.push(e),this.emit("controlsAdded",e),this}},{key:"removeControls",value:function(e){}}]),t}(l["default"]);t["default"]=function(e,t){return new b(e,t)},e.exports=t["default"]},function(e,t,n){"use strict";function r(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(){}var i="function"!=typeof Object.create?"~":!1;o.prototype._events=void 0,o.prototype.listeners=function(e,t){var n=i?i+e:e,r=this._events&&this._events[n];if(t)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,a=r.length,u=new Array(a);a>o;o++)u[o]=r[o].fn;return u},o.prototype.emit=function(e,t,n,r,o,a){var u=i?i+e:e;if(!this._events||!this._events[u])return!1;var s,l,c=this._events[u],f=arguments.length;if("function"==typeof c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),f){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,r),!0;case 5:return c.fn.call(c.context,t,n,r,o),!0;case 6:return c.fn.call(c.context,t,n,r,o,a),!0}for(l=1,s=new Array(f-1);f>l;l++)s[l-1]=arguments[l];c.fn.apply(c.context,s)}else{var h,p=c.length;for(l=0;p>l;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),f){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;default:if(!s)for(h=1,s=new Array(f-1);f>h;h++)s[h-1]=arguments[h];c[l].fn.apply(c[l].context,s)}}return!0},o.prototype.on=function(e,t,n){var o=new r(t,n||this),a=i?i+e:e;return this._events||(this._events=i?{}:Object.create(null)),this._events[a]?this._events[a].fn?this._events[a]=[this._events[a],o]:this._events[a].push(o):this._events[a]=o,this},o.prototype.once=function(e,t,n){var o=new r(t,n||this,!0),a=i?i+e:e;return this._events||(this._events=i?{}:Object.create(null)),this._events[a]?this._events[a].fn?this._events[a]=[this._events[a],o]:this._events[a].push(o):this._events[a]=o,this},o.prototype.removeListener=function(e,t,n,r){var o=i?i+e:e;if(!this._events||!this._events[o])return this;var a=this._events[o],u=[];if(t)if(a.fn)(a.fn!==t||r&&!a.once||n&&a.context!==n)&&u.push(a);else for(var s=0,l=a.length;l>s;s++)(a[s].fn!==t||r&&!a[s].once||n&&a[s].context!==n)&&u.push(a[s]);return u.length?this._events[o]=1===u.length?u[0]:u:delete this._events[o],this},o.prototype.removeAllListeners=function(e){return this._events?(e?delete this._events[i?i+e:e]:this._events=i?{}:Object.create(null),this):this},o.prototype.off=o.prototype.removeListener,o.prototype.addListener=o.prototype.on,o.prototype.setMaxListeners=function(){return this},o.prefixed=i,e.exports=o},function(e,t,n){function r(e,t){return e="number"==typeof e||b.test(e)?+e:-1,t=null==t?m:t,e>-1&&e%1==0&&t>e}function o(e,t,n){var r=e[t];(!c(r,n)||c(r,x[t])&&!w.call(e,t)||void 0===n&&!(t in e))&&(e[t]=n)}function i(e){return function(t){return null==t?void 0:t[e]}}function a(e,t,n){return u(e,t,n)}function u(e,t,n,r){n||(n={});for(var i=-1,a=t.length;++i1?n[o-1]:void 0,a=o>2?n[2]:void 0;for(i="function"==typeof i?(o--,i):void 0,a&&l(n[0],n[1],a)&&(i=3>o?void 0:i,o=1),t=Object(t);++r-1&&e%1==0&&m>=e}function d(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var v=n(4),y=n(5),m=9007199254740991,_="[object Function]",g="[object GeneratorFunction]",b=/^(?:0|[1-9]\d*)$/,x=Object.prototype,w=x.hasOwnProperty,O=x.toString,E=i("length"),M=s(function(e,t){a(t,v(t),e)});e.exports=M},function(e,t){function n(e,t){for(var n=-1,r=Array(e);++n-1&&e%1==0&&t>e}function o(e,t){return M.call(e,t)||"object"==typeof e&&t in e&&null===P(e)}function i(e){return k(Object(e))}function a(e){return function(t){return null==t?void 0:t[e]}}function u(e){var t=e?e.length:void 0;return p(t)&&(A(e)||y(e)||l(e))?n(t,String):null}function s(e){var t=e&&e.constructor,n="function"==typeof t&&t.prototype||E;return e===n}function l(e){return f(e)&&M.call(e,"callee")&&(!T.call(e,"callee")||j.call(e)==g)}function c(e){return null!=e&&!("function"==typeof e&&h(e))&&p(L(e))}function f(e){return v(e)&&c(e)}function h(e){var t=d(e)?j.call(e):"";return t==b||t==x}function p(e){return"number"==typeof e&&e>-1&&e%1==0&&_>=e}function d(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function v(e){return!!e&&"object"==typeof e}function y(e){return"string"==typeof e||!A(e)&&v(e)&&j.call(e)==w}function m(e){var t=s(e);if(!t&&!c(e))return i(e);var n=u(e),a=!!n,l=n||[],f=l.length;for(var h in e)!o(e,h)||a&&("length"==h||r(h,f))||t&&"constructor"==h||l.push(h);return l}var _=9007199254740991,g="[object Arguments]",b="[object Function]",x="[object GeneratorFunction]",w="[object String]",O=/^(?:0|[1-9]\d*)$/,E=Object.prototype,M=E.hasOwnProperty,j=E.toString,P=Object.getPrototypeOf,T=E.propertyIsEnumerable,k=Object.keys,L=a("length"),A=Array.isArray;e.exports=m},function(e,t){function n(e,t,n){var r=n.length;switch(r){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function r(e,t){if("function"!=typeof e)throw new TypeError(s);return t=x(void 0===t?e.length-1:a(t),0),function(){for(var r=arguments,o=-1,i=x(r.length-t,0),a=Array(i);++oe?-1:1;return t*c}var n=e%1;return e===e?n?e-n:e:0}function u(e){if(i(e)){var t=o(e.valueOf)?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=y.test(e);return n||m.test(e)?_(e.slice(2),n?2:8):v.test(e)?f:+e}var s="Expected a function",l=1/0,c=1.7976931348623157e308,f=NaN,h="[object Function]",p="[object GeneratorFunction]",d=/^\s+|\s+$/g,v=/^[-+]0x[0-9a-f]+$/i,y=/^0b[01]+$/i,m=/^0o[0-7]+$/i,_=parseInt,g=Object.prototype,b=g.toString,x=Math.max;e.exports=r},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(7),i=r(o),a=n(15),u=r(a),s=n(17),l=r(s),c=n(19),f=r(c),h=n(20),p=r(h),d={};d.EPSG3857=i["default"],d.EPSG900913=o.EPSG900913,d.EPSG3395=u["default"],d.EPSG4326=l["default"],d.Simple=f["default"],d.Proj4=p["default"],t["default"]=d,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n(8),u=r(a),s=n(13),l=r(s),c=n(14),f=r(c),h={code:"EPSG:3857",projection:l["default"],transformScale:1/(Math.PI*l["default"].R),transformation:function(){var e=1/(Math.PI*l["default"].R);return new f["default"](e,0,-e,0)}()},p=(0,i["default"])({},u["default"],h),d=(0,i["default"])({},p,{code:"EPSG:900913"});t.EPSG900913=d,t["default"]=p},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n(9),u=r(a),s=n(10),l=(r(s),{wrapLon:[-180,180],R:6378137,distance:function(e,t,n){var r,o,i,a=Math.PI/180;if(n){r=e.lat*a,o=t.lat*a;var u=e.lon*a,s=t.lon*a,l=o-r,c=s-u,f=l/2,h=c/2;i=Math.sin(f)*Math.sin(f)+Math.cos(r)*Math.cos(o)*Math.sin(h)*Math.sin(h);var p=2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i));return this.R*p}return r=e.lat*a,o=t.lat*a,i=Math.sin(r)*Math.sin(o)+Math.cos(r)*Math.cos(o)*Math.cos((t.lon-e.lon)*a),this.R*Math.acos(Math.min(i,1))},pointScale:function(e,t){return this.projection.pointScale?this.projection.pointScale(e,t):[1,1]},metresToProjected:function(e,t){return e*t[1]},projectedToMetres:function(e,t){return e/t[1]},metresToWorld:function(e,t,n){var r=this.metresToProjected(e,t),o=this.scale(n);n&&(o/=2);var i=o*(this.transformScale*r)/t[1];return i},worldToMetres:function(e,t,n){var r=this.scale(n);n&&(r/=2);var o=e/r/this.transformScale*t[1],i=this.projectedToMetres(o,t);return i}});t["default"]=(0,i["default"])({},u["default"],l),e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(10),i=r(o),a=n(11),u=r(a),s=n(12),l=r(s),c={scaleFactor:1e6,latLonToPoint:function(e,t){var n=this.projection.project(e),r=this.scale(t);return t&&(r/=2),this.transformation._transform(n,r)},pointToLatLon:function(e,t){var n=this.scale(t);t&&(n/=2);var r=this.transformation.untransform(e,n);return this.projection.unproject(r)},project:function(e){return this.projection.project(e)},unproject:function(e){return this.projection.unproject(e)},scale:function(e){return e>=0?256*Math.pow(2,e):this.scaleFactor},zoom:function(e){return Math.log(e/256)/Math.LN2},getProjectedBounds:function(e){if(this.infinite)return null;var t=this.projection.bounds,n=this.scale(e);e&&(n/=2);var r=this.transformation.transform((0,u["default"])(t[0]),n),o=this.transformation.transform((0,u["default"])(t[1]),n);return[r,o]},wrapLatLon:function(e){var t=this.wrapLat?(0,l["default"])(e.lat,this.wrapLat,!0):e.lat,n=this.wrapLon?(0,l["default"])(e.lon,this.wrapLon,!0):e.lon,r=e.alt;return(0,i["default"])(t,n,r)}};t["default"]=c,e.exports=t["default"]},function(e,t){function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;nl&&Math.abs(c)>1e-7;l++)t=a*Math.sin(s),t=Math.pow((1-t)/(1+t),a/2),c=Math.PI/2-2*Math.atan(u*t)-s,s+=c;return(0,i["default"])(s*n,e.x*n/r)},pointScale:function(e){var t=Math.PI/180,n=e.lat*t,r=Math.sin(n),o=r*r,i=Math.cos(n),a=Math.sqrt(1-this.ECC2*o)/i;return[a,a]},bounds:[[-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]]};t["default"]=s,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n(8),u=r(a),s=n(18),l=r(s),c=n(14),f=r(c),h={code:"EPSG:4326",projection:l["default"],transformScale:1/180,transformation:new f["default"](1/180,0,-1/180,0)},p=(0,i["default"])({},u["default"],h);t["default"]=p,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(10),i=r(o),a=n(11),u=r(a),s={project:function(e){return(0,u["default"])(e.lon,e.lat)},unproject:function(e){return(0,i["default"])(e.y,e.x)},pointScale:function(e){var t=111132.92,n=-559.82,r=1.175,o=-.0023,i=111412.84,a=-93.5,u=.118,s=Math.PI/180,l=e.lat*s,c=t+n*Math.cos(2*l)+r*Math.cos(4*l)+o*Math.cos(6*l),f=i*Math.cos(l)+a*Math.cos(3*l)+u*Math.cos(5*l);return[1/c,1/f]},bounds:[[-180,-90],[180,90]]};t["default"]=s,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n(9),u=r(a),s=n(18),l=r(s),c=n(14),f=r(c),h={projection:l["default"],transformation:new f["default"](1,0,1,0),scale:function(e){return e?Math.pow(2,e):1},zoom:function(e){return Math.log(e)/Math.LN2},distance:function(e,t){var n=t.lon-e.lon,r=t.lat-e.lat;return Math.sqrt(n*n+r*r)},infinite:!0},p=(0,i["default"])({},u["default"],h);t["default"]=p,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=n(8),u=r(a),s=n(21),l=r(s),c=n(14),f=r(c),h=function(e,t,n){var r=(0,l["default"])(t,n),o=r.bounds[1][0]-r.bounds[0][0],i=r.bounds[1][1]-r.bounds[0][1],a=o/2,u=i/2,s=1/a,c=1/u,h=Math.min(s,c),p=h*(r.bounds[0][0]+a),d=h*(r.bounds[0][1]+u);return{code:e,projection:r,transformScale:h,transformation:new f["default"](h,-p,-h,d)}},p=function(e,t,n){return(0,i["default"])({},u["default"],h(e,t,n))};t["default"]=p,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(22),i=r(o),a=n(10),u=r(a),s=n(11),l=r(s),c=function(e,t){var n=(0,i["default"])(e),r=function(e){return(0,l["default"])(n.forward([e.lon,e.lat]))},o=function(e){var t=n.inverse([e.x,e.y]);return(0,u["default"])(t[1],t[0])};return{project:r,unproject:o,pointScale:function(e,t){return[1,1]},bounds:function(){if(t)return t;var e=r([-90,-180]),n=r([90,180]);return[e,n]}()}};t["default"]=c,e.exports=t["default"]},function(e,t){e.exports=__WEBPACK_EXTERNAL_MODULE_22__},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(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)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n0?u(r()):ne.y<0&&s(r()),ee.copy(te),q.update()}function d(e){J.set(e.clientX,e.clientY),Q.subVectors(J,$),ie(Q.x,Q.y),$.copy(J),q.update()}function v(e){}function y(e){var t=0;void 0!==e.wheelDelta?t=e.wheelDelta:void 0!==e.detail&&(t=-e.detail),t>0?s(r()):0>t&&u(r()),q.update()}function m(e){switch(e.keyCode){case q.keys.UP:ie(0,q.keyPanSpeed),q.update();break;case q.keys.BOTTOM:ie(0,-q.keyPanSpeed),q.update();break;case q.keys.LEFT:ie(q.keyPanSpeed,0),q.update();break;case q.keys.RIGHT:ie(-q.keyPanSpeed,0),q.update()}}function _(e){X.set(e.touches[0].pageX,e.touches[0].pageY)}function g(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);ee.set(0,r)}function b(e){$.set(e.touches[0].pageX,e.touches[0].pageY)}function x(e){Y.set(e.touches[0].pageX,e.touches[0].pageY),K.subVectors(Y,X);var t=q.domElement===document?q.domElement.body:q.domElement;o(2*Math.PI*K.x/t.clientWidth*q.rotateSpeed),a(2*Math.PI*K.y/t.clientHeight*q.rotateSpeed),X.copy(Y),q.update()}function w(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,o=Math.sqrt(t*t+n*n);te.set(0,o),ne.subVectors(te,ee),ne.y>0?s(r()):ne.y<0&&u(r()),ee.copy(te),q.update()}function O(e){J.set(e.touches[0].pageX,e.touches[0].pageY),Q.subVectors(J,$),ie(Q.x,Q.y),$.copy(J),q.update()}function E(e){}function M(e){if(q.enabled!==!1){if(e.preventDefault(),e.button===q.mouseButtons.ORBIT){if(q.enableRotate===!1)return;l(e),I=N.ROTATE}else if(e.button===q.mouseButtons.ZOOM){if(q.enableZoom===!1)return;c(e),I=N.DOLLY}else if(e.button===q.mouseButtons.PAN){if(q.enablePan===!1)return;f(e),I=N.PAN}I!==N.NONE&&(document.addEventListener("mousemove",j,!1),document.addEventListener("mouseup",P,!1),document.addEventListener("mouseout",P,!1),q.dispatchEvent(z))}}function j(e){if(q.enabled!==!1)if(e.preventDefault(),I===N.ROTATE){if(q.enableRotate===!1)return;h(e)}else if(I===N.DOLLY){if(q.enableZoom===!1)return;p(e)}else if(I===N.PAN){if(q.enablePan===!1)return;d(e)}}function P(e){q.enabled!==!1&&(v(e),document.removeEventListener("mousemove",j,!1),document.removeEventListener("mouseup",P,!1),document.removeEventListener("mouseout",P,!1),q.dispatchEvent(F),I=N.NONE)}function T(e){q.enabled!==!1&&q.enableZoom!==!1&&I===N.NONE&&(e.preventDefault(),e.stopPropagation(),y(e),q.dispatchEvent(z),q.dispatchEvent(F))}function k(e){q.enabled!==!1&&q.enableKeys!==!1&&q.enablePan!==!1&&m(e)}function L(e){if(q.enabled!==!1){switch(e.touches.length){case 1:if(q.enableRotate===!1)return;_(e),I=N.TOUCH_ROTATE;break;case 2:if(q.enableZoom===!1)return;g(e),I=N.TOUCH_DOLLY;break;case 3:if(q.enablePan===!1)return; +b(e),I=N.TOUCH_PAN;break;default:I=N.NONE}I!==N.NONE&&q.dispatchEvent(z)}}function A(e){if(q.enabled!==!1)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:if(q.enableRotate===!1)return;if(I!==N.TOUCH_ROTATE)return;x(e);break;case 2:if(q.enableZoom===!1)return;if(I!==N.TOUCH_DOLLY)return;w(e);break;case 3:if(q.enablePan===!1)return;if(I!==N.TOUCH_PAN)return;O(e);break;default:I=N.NONE}}function C(e){q.enabled!==!1&&(E(e),q.dispatchEvent(F),I=N.NONE)}function S(e){e.preventDefault()}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.target=new i["default"].Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-(1/0),this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.25,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.enableKeys=!0,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40},this.mouseButtons={ORBIT:i["default"].MOUSE.LEFT,ZOOM:i["default"].MOUSE.MIDDLE,PAN:i["default"].MOUSE.RIGHT},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this.getPolarAngle=function(){return D},this.getAzimuthalAngle=function(){return R},this.reset=function(){q.target.copy(q.target0),q.object.position.copy(q.position0),q.object.zoom=q.zoom0,q.object.updateProjectionMatrix(),q.dispatchEvent(H),q.update(),I=N.NONE},this.update=function(){var t=new i["default"].Vector3,r=(new i["default"].Quaternion).setFromUnitVectors(e.up,new i["default"].Vector3(0,1,0)),a=r.clone().inverse(),u=new i["default"].Vector3,s=new i["default"].Quaternion;return function(){var e=q.object.position;t.copy(e).sub(q.target),t.applyQuaternion(r),R=Math.atan2(t.x,t.z),D=Math.atan2(Math.sqrt(t.x*t.x+t.z*t.z),t.y),q.autoRotate&&I===N.NONE&&o(n()),R+=W,D+=B,R=Math.max(q.minAzimuthAngle,Math.min(q.maxAzimuthAngle,R)),D=Math.max(q.minPolarAngle,Math.min(q.maxPolarAngle,D)),D=Math.max(U,Math.min(Math.PI-U,D));var i=t.length()*Z;return i=Math.max(q.minDistance,Math.min(q.maxDistance,i)),q.target.add(V),t.x=i*Math.sin(D)*Math.sin(R),t.y=i*Math.cos(D),t.z=i*Math.sin(D)*Math.cos(R),t.applyQuaternion(a),e.copy(q.target).add(t),q.object.lookAt(q.target),q.enableDamping===!0?(W*=1-q.dampingFactor,B*=1-q.dampingFactor):(W=0,B=0),Z=1,V.set(0,0,0),G||u.distanceToSquared(q.object.position)>U||8*(1-s.dot(q.object.quaternion))>U?(q.dispatchEvent(H),u.copy(q.object.position),s.copy(q.object.quaternion),G=!1,!0):!1}}(),this.dispose=function(){q.domElement.removeEventListener("contextmenu",S,!1),q.domElement.removeEventListener("mousedown",M,!1),q.domElement.removeEventListener("mousewheel",T,!1),q.domElement.removeEventListener("MozMousePixelScroll",T,!1),q.domElement.removeEventListener("touchstart",L,!1),q.domElement.removeEventListener("touchend",C,!1),q.domElement.removeEventListener("touchmove",A,!1),document.removeEventListener("mousemove",j,!1),document.removeEventListener("mouseup",P,!1),document.removeEventListener("mouseout",P,!1),window.removeEventListener("keydown",k,!1)};var R,D,q=this,H={type:"change"},z={type:"start"},F={type:"end"},N={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},I=N.NONE,U=1e-6,B=0,W=0,Z=1,V=new i["default"].Vector3,G=!1,X=new i["default"].Vector2,Y=new i["default"].Vector2,K=new i["default"].Vector2,$=new i["default"].Vector2,J=new i["default"].Vector2,Q=new i["default"].Vector2,ee=new i["default"].Vector2,te=new i["default"].Vector2,ne=new i["default"].Vector2,re=function(){var e=new i["default"].Vector3;return function(t,n){var r=n.elements;e.set(r[0],0,r[2]),e.multiplyScalar(-t),V.add(e)}}(),oe=function(){var e=new i["default"].Vector3;return function(t,n){var r=n.elements,o=t/Math.cos(D);e.set(r[4],0,r[6]),e.multiplyScalar(o),V.add(e)}}(),ie=function(){var e=new i["default"].Vector3;return function(t,n){var r=q.domElement===document?q.domElement.body:q.domElement;if(q.object instanceof i["default"].PerspectiveCamera){var o=q.object.position;e.copy(o).sub(q.target);var a=e.length();a*=Math.tan(q.object.fov/2*Math.PI/180),re(2*t*a/r.clientHeight,q.object.matrix),oe(2*n*a/r.clientHeight,q.object.matrix)}else q.object instanceof i["default"].OrthographicCamera?(re(t*(q.object.right-q.object.left)/r.clientWidth,q.object.matrix),oe(n*(q.object.top-q.object.bottom)/r.clientHeight,q.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),q.enablePan=!1)}}();q.domElement.addEventListener("contextmenu",S,!1),q.domElement.addEventListener("mousedown",M,!1),q.domElement.addEventListener("mousewheel",T,!1),q.domElement.addEventListener("MozMousePixelScroll",T,!1),q.domElement.addEventListener("touchstart",L,!1),q.domElement.addEventListener("touchend",C,!1),q.domElement.addEventListener("touchmove",A,!1),window.addEventListener("keydown",k,!1),this.update()};a.prototype=Object.create(i["default"].EventDispatcher.prototype),a.prototype.constructor=i["default"].OrbitControls,Object.defineProperties(a.prototype,{center:{get:function(){return console.warn("THREE.OrbitControls: .center has been renamed to .target"),this.target}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.constraint.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.constraint.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.constraint.dampingFactor=e}}}),t["default"]=a,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(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)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n0){var o=n.getCenter(),i=new v["default"].Vector3(o[0],0,o[1]).sub(t.position).length();if(i>e._options.distance)return}return n.getMesh()?void(n.isReady()&&e._tiles.add(n.getMesh())):void n.requestTileAsync()}})}}},{key:"_divide",value:function(e){for(var t,n,r=0;r!=e.length;)t=e[r],n=t.getQuadcode(),t.length!==this._maxLOD&&this._screenSpaceError(t)?(e.splice(r,1),e.push(this._requestTile(n+"0",this)),e.push(this._requestTile(n+"1",this)),e.push(this._requestTile(n+"2",this)),e.push(this._requestTile(n+"3",this))):r++}},{key:"_screenSpaceError",value:function(e){var t=this._minLOD,n=this._maxLOD,r=e.getQuadcode(),o=this._world.getCamera(),i=3;if(r.length===n)return!1;if(r.length1}},{key:"_removeTiles",value:function(){for(var e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e])}},{key:"_createTile",value:function(e,t){}},{key:"_requestTile",value:function(e,t){var n=this._tileCache.getTile(e);return n||(n=this._createTile(e,t),this._tileCache.setTile(e,n)),n}},{key:"_destroyTile",value:function(e){this._layer.remove(e),e.destroy()}},{key:"destroy",value:function(){var e;for(e=this._tiles.children.length-1;e>=0;e--)this._tiles.remove(this._tiles.children[e]);for(e=this._layer.children.length-1;e>=0;e--)this._layer.remove(this._layer.children[e]);this._tileCache.destroy(),this._tileCache=null,this._world=null,this._tiles=null,this._layer=null,this._frustum=null}}]),t}(l["default"]);t["default"]=y,e.exports=t["default"]},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=t)&&r(this,"max",1/0);var n=e.length||o;"function"!=typeof n&&(n=o),r(this,"lengthCalculator",n),r(this,"allowStale",e.stale||!1),r(this,"maxAge",e.maxAge||0),r(this,"dispose",e.dispose),this.reset()}function a(e,t,n,o){var i=n.value;s(e,i)&&(c(e,n),r(e,"allowStale")||(i=void 0)),i&&t.call(o,i.value,i.key,e)}function u(e,t,n){var o=r(e,"cache").get(t);if(o){var i=o.value;s(e,i)?(c(e,o),r(e,"allowStale")||(i=void 0)):n&&r(e,"lruList").unshiftNode(o),i&&(i=i.value)}return i}function s(e,t){if(!t||!t.maxAge&&!r(e,"maxAge"))return!1;var n=!1,o=Date.now()-t.now;return n=t.maxAge?o>t.maxAge:r(e,"maxAge")&&o>r(e,"maxAge")}function l(e){if(r(e,"length")>r(e,"max"))for(var t=r(e,"lruList").tail;r(e,"length")>r(e,"max")&&null!==t;){var n=t.prev;c(e,t),t=n}}function c(e,t){if(t){var n=t.value;r(e,"dispose")&&r(e,"dispose").call(this,n.key,n.value),r(e,"length",r(e,"length")-n.length),r(e,"cache")["delete"](n.key),r(e,"lruList").removeNode(t)}}function f(e,t,n,r,o){this.key=e,this.value=t,this.length=n,this.now=r,this.maxAge=o||0}e.exports=i;var h,p=n(37),d=n(40),v=n(43),y={},m="function"==typeof Symbol;h=m?function(e){return Symbol["for"](e)}:function(e){return"_"+e},Object.defineProperty(i.prototype,"max",{set:function(e){(!e||"number"!=typeof e||0>=e)&&(e=1/0),r(this,"max",e),l(this)},get:function(){return r(this,"max")},enumerable:!0}),Object.defineProperty(i.prototype,"allowStale",{set:function(e){r(this,"allowStale",!!e)},get:function(){return r(this,"allowStale")},enumerable:!0}),Object.defineProperty(i.prototype,"maxAge",{set:function(e){(!e||"number"!=typeof e||0>e)&&(e=0),r(this,"maxAge",e),l(this)},get:function(){return r(this,"maxAge")},enumerable:!0}),Object.defineProperty(i.prototype,"lengthCalculator",{set:function(e){"function"!=typeof e&&(e=o),e!==r(this,"lengthCalculator")&&(r(this,"lengthCalculator",e),r(this,"length",0),r(this,"lruList").forEach(function(e){e.length=r(this,"lengthCalculator").call(this,e.value,e.key),r(this,"length",r(this,"length")+e.length)},this)),l(this)},get:function(){return r(this,"lengthCalculator")},enumerable:!0}),Object.defineProperty(i.prototype,"length",{get:function(){return r(this,"length")},enumerable:!0}),Object.defineProperty(i.prototype,"itemCount",{get:function(){return r(this,"lruList").length},enumerable:!0}),i.prototype.rforEach=function(e,t){t=t||this;for(var n=r(this,"lruList").tail;null!==n;){var o=n.prev;a(this,e,n,t),n=o}},i.prototype.forEach=function(e,t){t=t||this;for(var n=r(this,"lruList").head;null!==n;){var o=n.next;a(this,e,n,t),n=o}},i.prototype.keys=function(){return r(this,"lruList").toArray().map(function(e){return e.key},this)},i.prototype.values=function(){return r(this,"lruList").toArray().map(function(e){return e.value},this)},i.prototype.reset=function(){r(this,"dispose")&&r(this,"lruList")&&r(this,"lruList").length&&r(this,"lruList").forEach(function(e){r(this,"dispose").call(this,e.key,e.value)},this),r(this,"cache",new p),r(this,"lruList",new v),r(this,"length",0)},i.prototype.dump=function(){return r(this,"lruList").map(function(e){return s(this,e)?void 0:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}},this).toArray().filter(function(e){return e})},i.prototype.dumpLru=function(){return r(this,"lruList")},i.prototype.inspect=function(e,t){var n="LRUCache {",i=!1,a=r(this,"allowStale");a&&(n+="\n allowStale: true",i=!0);var u=r(this,"max");u&&u!==1/0&&(i&&(n+=","),n+="\n max: "+d.inspect(u,t),i=!0);var l=r(this,"maxAge");l&&(i&&(n+=","),n+="\n maxAge: "+d.inspect(l,t),i=!0);var c=r(this,"lengthCalculator");c&&c!==o&&(i&&(n+=","),n+="\n length: "+d.inspect(r(this,"length"),t),i=!0);var f=!1;return r(this,"lruList").forEach(function(e){f?n+=",\n ":(i&&(n+=",\n"),f=!0,n+="\n ");var r=d.inspect(e.key).split("\n").join("\n "),a={value:e.value};e.maxAge!==l&&(a.maxAge=e.maxAge),c!==o&&(a.length=e.length),s(this,e)&&(a.stale=!0),a=d.inspect(a,t).split("\n").join("\n "),n+=r+" => "+a}),(f||i)&&(n+="\n"),n+="}"},i.prototype.set=function(e,t,n){n=n||r(this,"maxAge");var o=n?Date.now():0,i=r(this,"lengthCalculator").call(this,t,e);if(r(this,"cache").has(e)){if(i>r(this,"max"))return c(this,r(this,"cache").get(e)),!1;var a=r(this,"cache").get(e),u=a.value;return r(this,"dispose")&&r(this,"dispose").call(this,e,u.value),u.now=o,u.maxAge=n,u.value=t,r(this,"length",r(this,"length")+(i-u.length)),u.length=i,this.get(e),l(this),!0}var s=new f(e,t,i,o,n);return s.length>r(this,"max")?(r(this,"dispose")&&r(this,"dispose").call(this,e,t),!1):(r(this,"length",r(this,"length")+s.length),r(this,"lruList").unshift(s),r(this,"cache").set(e,r(this,"lruList").head),l(this),!0)},i.prototype.has=function(e){if(!r(this,"cache").has(e))return!1;var t=r(this,"cache").get(e).value;return s(this,t)?!1:!0},i.prototype.get=function(e){return u(this,e,!0)},i.prototype.peek=function(e){return u(this,e,!1)},i.prototype.pop=function(){var e=r(this,"lruList").tail;return e?(c(this,e),e.value):null},i.prototype.del=function(e){c(this,r(this,"cache").get(e))},i.prototype.load=function(e){this.reset();for(var t=Date.now(),n=e.length-1;n>=0;n--){var r=e[n],o=r.e||0;if(0===o)this.set(r.k,r.v);else{var i=o-t;i>0&&this.set(r.k,r.v,i)}}},i.prototype.prune=function(){var e=this;r(this,"cache").forEach(function(t,n){u(e,n,!1)})}},function(e,t,n){(function(t){"pseudomap"===t.env.npm_package_name&&"test"===t.env.npm_lifecycle_script&&(t.env.TEST_PSEUDOMAP="true"),"function"!=typeof Map||t.env.TEST_PSEUDOMAP?e.exports=n(39):e.exports=Map}).call(t,n(38))},function(e,t){function n(){l=!1,a.length?s=a.concat(s):c=-1,s.length&&r()}function r(){if(!l){var e=setTimeout(n);l=!0;for(var t=s.length;t;){for(a=s,s=[];++c1)for(var n=1;n=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),v(n)?r.showHidden=n:n&&t._extend(r,n),x(r.showHidden)&&(r.showHidden=!1),x(r.depth)&&(r.depth=2),x(r.colors)&&(r.colors=!1),x(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=i),s(r,e,r.depth)}function i(e,t){var n=o.styles[t];return n?"["+o.colors[n][0]+"m"+e+"["+o.colors[n][1]+"m":e}function a(e,t){return e}function u(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function s(e,n,r){if(e.customInspect&&n&&j(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var o=n.inspect(r,e);return g(o)||(o=s(e,o,r)),o}var i=l(e,n);if(i)return i;var a=Object.keys(n),v=u(a);if(e.showHidden&&(a=Object.getOwnPropertyNames(n)),M(n)&&(a.indexOf("message")>=0||a.indexOf("description")>=0))return c(n);if(0===a.length){if(j(n)){var y=n.name?": "+n.name:"";return e.stylize("[Function"+y+"]","special")}if(w(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(E(n))return e.stylize(Date.prototype.toString.call(n),"date");if(M(n))return c(n)}var m="",_=!1,b=["{","}"];if(d(n)&&(_=!0,b=["[","]"]),j(n)){var x=n.name?": "+n.name:"";m=" [Function"+x+"]"}if(w(n)&&(m=" "+RegExp.prototype.toString.call(n)),E(n)&&(m=" "+Date.prototype.toUTCString.call(n)),M(n)&&(m=" "+c(n)),0===a.length&&(!_||0==n.length))return b[0]+m+b[1];if(0>r)return w(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special");e.seen.push(n);var O;return O=_?f(e,n,r,v,a):a.map(function(t){return h(e,n,r,v,t,_)}),e.seen.pop(),p(O,m,b)}function l(e,t){if(x(t))return e.stylize("undefined","undefined");if(g(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return _(t)?e.stylize(""+t,"number"):v(t)?e.stylize(""+t,"boolean"):y(t)?e.stylize("null","null"):void 0}function c(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,n,r,o){for(var i=[],a=0,u=t.length;u>a;++a)A(t,String(a))?i.push(h(e,t,n,r,String(a),!0)):i.push("");return o.forEach(function(o){o.match(/^\d+$/)||i.push(h(e,t,n,r,o,!0))}),i}function h(e,t,n,r,o,i){var a,u,l;if(l=Object.getOwnPropertyDescriptor(t,o)||{value:t[o]},l.get?u=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(u=e.stylize("[Setter]","special")),A(r,o)||(a="["+o+"]"),u||(e.seen.indexOf(l.value)<0?(u=y(n)?s(e,l.value,null):s(e,l.value,n-1),u.indexOf("\n")>-1&&(u=i?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),x(a)){if(i&&o.match(/^\d+$/))return u;a=JSON.stringify(""+o),a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+u}function p(e,t,n){var r=0,o=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return o>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function d(e){return Array.isArray(e)}function v(e){return"boolean"==typeof e}function y(e){return null===e}function m(e){return null==e}function _(e){return"number"==typeof e}function g(e){return"string"==typeof e}function b(e){return"symbol"==typeof e}function x(e){return void 0===e}function w(e){return O(e)&&"[object RegExp]"===T(e)}function O(e){return"object"==typeof e&&null!==e}function E(e){return O(e)&&"[object Date]"===T(e)}function M(e){return O(e)&&("[object Error]"===T(e)||e instanceof Error)}function j(e){return"function"==typeof e}function P(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function T(e){return Object.prototype.toString.call(e)}function k(e){return 10>e?"0"+e.toString(10):e.toString(10)}function L(){var e=new Date,t=[k(e.getHours()),k(e.getMinutes()),k(e.getSeconds())].join(":");return[e.getDate(),D[e.getMonth()],t].join(" ")}function A(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var C=/%[sdj%]/g;t.format=function(e){if(!g(e)){for(var t=[],n=0;n=i)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(t){return"[Circular]"}default:return e}}),u=r[n];i>n;u=r[++n])a+=y(u)||!O(u)?" "+u:" "+o(u);return a},t.deprecate=function(n,o){function i(){if(!a){if(r.throwDeprecation)throw new Error(o);r.traceDeprecation?console.trace(o):console.error(o),a=!0}return n.apply(this,arguments)}if(x(e.process))return function(){return t.deprecate(n,o).apply(this,arguments)};if(r.noDeprecation===!0)return n;var a=!1;return i};var S,R={};t.debuglog=function(e){if(x(S)&&(S=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!R[e])if(new RegExp("\\b"+e+"\\b","i").test(S)){var n=r.pid;R[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else R[e]=function(){};return R[e]},t.inspect=o,o.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39], +grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},o.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=d,t.isBoolean=v,t.isNull=y,t.isNullOrUndefined=m,t.isNumber=_,t.isString=g,t.isSymbol=b,t.isUndefined=x,t.isRegExp=w,t.isObject=O,t.isDate=E,t.isError=M,t.isFunction=j,t.isPrimitive=P,t.isBuffer=n(41);var D=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];t.log=function(){console.log("%s - %s",L(),t.format.apply(t,arguments))},t.inherits=n(42),t._extend=function(e,t){if(!t||!O(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}).call(t,function(){return this}(),n(38))},function(e,t){e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t){function n(e){var t=this;if(t instanceof n||(t=new n),t.tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach(function(e){t.push(e)});else if(arguments.length>0)for(var r=0,o=arguments.length;o>r;r++)t.push(arguments[r]);return t}function r(e,t){e.tail=new i(t,e.tail,null,e),e.head||(e.head=e.tail),e.length++}function o(e,t){e.head=new i(t,null,e.head,e),e.tail||(e.tail=e.head),e.length++}function i(e,t,n,r){return this instanceof i?(this.list=r,this.value=e,t?(t.next=this,this.prev=t):this.prev=null,void(n?(n.prev=this,this.next=n):this.next=null)):new i(e,t,n,r)}e.exports=n,n.Node=i,n.create=n,n.prototype.removeNode=function(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");var t=e.next,n=e.prev;t&&(t.prev=n),n&&(n.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=n),e.list.length--,e.next=null,e.prev=null,e.list=null},n.prototype.unshiftNode=function(e){if(e!==this.head){e.list&&e.list.removeNode(e);var t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}},n.prototype.pushNode=function(e){if(e!==this.tail){e.list&&e.list.removeNode(e);var t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}},n.prototype.push=function(){for(var e=0,t=arguments.length;t>e;e++)r(this,arguments[e]);return this.length},n.prototype.unshift=function(){for(var e=0,t=arguments.length;t>e;e++)o(this,arguments[e]);return this.length},n.prototype.pop=function(){if(this.tail){var e=this.tail.value;return this.tail=this.tail.prev,this.tail.next=null,this.length--,e}},n.prototype.shift=function(){if(this.head){var e=this.head.value;return this.head=this.head.next,this.head.prev=null,this.length--,e}},n.prototype.forEach=function(e,t){t=t||this;for(var n=this.head,r=0;null!==n;r++)e.call(t,n.value,r,this),n=n.next},n.prototype.forEachReverse=function(e,t){t=t||this;for(var n=this.tail,r=this.length-1;null!==n;r--)e.call(t,n.value,r,this),n=n.prev},n.prototype.get=function(e){for(var t=0,n=this.head;null!==n&&e>t;t++)n=n.next;return t===e&&null!==n?n.value:void 0},n.prototype.getReverse=function(e){for(var t=0,n=this.tail;null!==n&&e>t;t++)n=n.prev;return t===e&&null!==n?n.value:void 0},n.prototype.map=function(e,t){t=t||this;for(var r=new n,o=this.head;null!==o;)r.push(e.call(t,o.value,this)),o=o.next;return r},n.prototype.mapReverse=function(e,t){t=t||this;for(var r=new n,o=this.tail;null!==o;)r.push(e.call(t,o.value,this)),o=o.prev;return r},n.prototype.reduce=function(e,t){var n,r=this.head;if(arguments.length>1)n=t;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");r=this.head.next,n=this.head.value}for(var o=0;null!==r;o++)n=e(n,r.value,o),r=r.next;return n},n.prototype.reduceReverse=function(e,t){var n,r=this.tail;if(arguments.length>1)n=t;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");r=this.tail.prev,n=this.tail.value}for(var o=this.length-1;null!==r;o--)n=e(n,r.value,o),r=r.prev;return n},n.prototype.toArray=function(){for(var e=new Array(this.length),t=0,n=this.head;null!==n;t++)e[t]=n.value,n=n.next;return e},n.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,n=this.tail;null!==n;t++)e[t]=n.value,n=n.prev;return e},n.prototype.slice=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var r=new n;if(e>t||0>t)return r;0>e&&(e=0),t>this.length&&(t=this.length);for(var o=0,i=this.head;null!==i&&e>o;o++)i=i.next;for(;null!==i&&t>o;o++,i=i.next)r.push(i.value);return r},n.prototype.sliceReverse=function(e,t){t=t||this.length,0>t&&(t+=this.length),e=e||0,0>e&&(e+=this.length);var r=new n;if(e>t||0>t)return r;0>e&&(e=0),t>this.length&&(t=this.length);for(var o=this.length,i=this.tail;null!==i&&o>t;o--)i=i.prev;for(;null!==i&&o>e;o--,i=i.prev)r.push(i.value);return r},n.prototype.reverse=function(){for(var e=this.head,t=this.tail,n=e;null!==n;n=n.prev){var r=n.prev;n.prev=n.next,n.next=r}return this.head=t,this.tail=e,this}},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(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)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n0;o--){var i=1<=e||e>t?u(b,p):g=setTimeout(s,e)}function l(){return(g&&b||p&&E)&&(d=e.apply(y,h)),r(),d}function c(){u(E,g)}function f(){if(h=arguments,v=_(),y=this,b=E&&(g||!w),O===!1)var n=w&&!g;else{p||w||(x=v);var r=O-(v-x),o=0>=r||r>O;o?(p&&(p=clearTimeout(p)),x=v,d=e.apply(y,h)):p||(p=setTimeout(c,r))}return o&&g?g=clearTimeout(g):g||t===O||(g=setTimeout(s,t)),n&&(o=!0,d=e.apply(y,h)),!o||g||p||(h=y=void 0),d}var h,p,d,v,y,g,b,x=0,w=!1,O=!1,E=!0;if("function"!=typeof e)throw new TypeError(a);return t=i(t)||0,o(n)&&(w=!!n.leading,O="maxWait"in n&&m(i(n.maxWait)||0,t),E="trailing"in n?!!n.trailing:E),f.cancel=r,f.flush=l,f}function r(e){var t=o(e)?y.call(e):"";return t==s||t==l}function o(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function i(e){if(o(e)){var t=r(e.valueOf)?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(c,"");var n=h.test(e);return n||p.test(e)?d(e.slice(2),n?2:8):f.test(e)?u:+e}var a="Expected a function",u=NaN,s="[object Function]",l="[object GeneratorFunction]",c=/^\s+|\s+$/g,f=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,p=/^0o[0-7]+$/i,d=parseInt,v=Object.prototype,y=v.toString,m=Math.max,_=Date.now;e.exports=n},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(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)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;na;a++)n.vertices.push(e[o][i][a]);o>0&&(r+=e[o-1].length,n.holes.push(r))}return n}},{key:"_triangulate",value:function(e,t,n){var r=(0,O["default"])(e,t,n),o=[];for(i=0,il=r.length;i0;)self._completeHandlers.shift()(e)}function success(resp){var type=o.type||resp&&setType(resp.getResponseHeader("Content-Type"));resp="jsonp"!==type?self.request:resp;var filteredResponse=globalSetupOptions.dataFilter(resp.responseText,type),r=filteredResponse;try{resp.responseText=r}catch(e){}if(r)switch(type){case"json":try{resp=context.JSON?context.JSON.parse(r):eval("("+r+")")}catch(err){return error(resp,"Could not parse JSON in response",err)}break;case"js":resp=eval(r);break;case"html":resp=r;break;case"xml":resp=resp.responseXML&&resp.responseXML.parseError&&resp.responseXML.parseError.errorCode&&resp.responseXML.parseError.reason?null:resp.responseXML}for(self._responseArgs.resp=resp,self._fulfilled=!0,fn(resp),self._successHandler(resp);self._fulfillmentHandlers.length>0;)resp=self._fulfillmentHandlers.shift()(resp);complete(resp)}function timedOut(){self._timedOut=!0,self.request.abort()}function error(e,t,n){for(e=self.request,self._responseArgs.resp=e,self._responseArgs.msg=t,self._responseArgs.t=n,self._erred=!0;self._errorHandlers.length>0;)self._errorHandlers.shift()(e,t,n);complete(e)}this.url="string"==typeof o?o:o.url,this.timeout=null,this._fulfilled=!1,this._successHandler=function(){},this._fulfillmentHandlers=[],this._errorHandlers=[],this._completeHandlers=[],this._erred=!1,this._responseArgs={};var self=this;fn=fn||function(){},o.timeout&&(this.timeout=setTimeout(function(){timedOut()},o.timeout)),o.success&&(this._successHandler=function(){o.success.apply(o,arguments)}),o.error&&this._errorHandlers.push(function(){o.error.apply(o,arguments)}),o.complete&&this._completeHandlers.push(function(){o.complete.apply(o,arguments)}),this.request=getRequest.call(this,success,error)}function reqwest(e,t){return new Reqwest(e,t)}function normalize(e){return e?e.replace(/\r?\n/g,"\r\n"):""}function serial(e,t){var n,r,o,i,a=e.name,u=e.tagName.toLowerCase(),s=function(e){e&&!e.disabled&&t(a,normalize(e.attributes.value&&e.attributes.value.specified?e.value:e.text))};if(!e.disabled&&a)switch(u){case"input":/reset|button|image|file/i.test(e.type)||(n=/checkbox/i.test(e.type),r=/radio/i.test(e.type),o=e.value,(!(n||r)||e.checked)&&t(a,normalize(n&&""===o?"on":o)));break;case"textarea":t(a,normalize(e.value));break;case"select":if("select-one"===e.type.toLowerCase())s(e.selectedIndex>=0?e.options[e.selectedIndex]:null);else for(i=0;e.length&&in;){var o=n+r>>>1;e[o]e?~e:e],i=0,a=r.length;a>i;++i)t.push(n=r[i].slice()),c(n,i);0>e&&o(t,a)}function i(e){return e=e.slice(),c(e,0),e}function a(e){for(var t=[],n=0,o=e.length;o>n;++n)r(e[n],t);return t.length<2&&t.push(t[0].slice()),t}function u(e){for(var t=a(e);t.length<4;)t.push(t[0].slice());return t}function s(e){return e.map(u)}function l(e){var t=e.type;return"GeometryCollection"===t?{type:t,geometries:e.geometries.map(l)}:t in h?{type:t,coordinates:h[t](e)}:null}var c=n(e.transform),f=e.arcs,h={Point:function(e){return i(e.coordinates)},MultiPoint:function(e){return e.coordinates.map(i)},LineString:function(e){return a(e.arcs)},MultiLineString:function(e){return e.arcs.map(a)},Polygon:function(e){return s(e.arcs)},MultiPolygon:function(e){return e.arcs.map(s)}};return l(t)}function l(e,t){function n(t){var n,r=e.arcs[0>t?~t:t],o=r[0];return e.transform?(n=[0,0],r.forEach(function(e){n[0]+=e[0],n[1]+=e[1]})):n=r[r.length-1],0>t?[n,o]:[o,n]}function r(e,t){for(var n in e){var r=e[n];delete t[r.start],delete r.start,delete r.end,r.forEach(function(e){o[0>e?~e:e]=1}),u.push(r)}}var o={},i={},a={},u=[],s=-1;return t.forEach(function(n,r){var o,i=e.arcs[0>n?~n:n];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++s],t[s]=n,t[r]=o)}),t.forEach(function(e){var t,r,o=n(e),u=o[0],s=o[1];if(t=a[u])if(delete a[t.end],t.push(e),t.end=s,r=i[s]){delete i[r.start];var l=r===t?t:t.concat(r);i[l.start=t.start]=a[l.end=r.end]=l}else i[t.start]=a[t.end]=t;else if(t=i[s])if(delete i[t.start],t.unshift(e),t.start=u,r=a[u]){delete a[r.end];var c=r===t?t:r.concat(t);i[c.start=r.start]=a[c.end=t.end]=c}else i[t.start]=a[t.end]=t;else t=[e],i[t.start=u]=a[t.end=s]=t}),r(a,i),r(i,a),t.forEach(function(e){o[0>e?~e:e]||u.push([e])}),u}function c(e){return s(e,f.apply(this,arguments))}function f(e,t,n){function r(e){var t=0>e?~e:e;(c[t]||(c[t]=[])).push({i:e,g:s})}function o(e){e.forEach(r)}function i(e){e.forEach(o)}function a(e){"GeometryCollection"===e.type?e.geometries.forEach(a):e.type in f&&(s=e,f[e.type](e.arcs))}var u=[];if(arguments.length>1){var s,c=[],f={LineString:o,MultiLineString:i,Polygon:i,MultiPolygon:function(e){e.forEach(i)}};a(t),c.forEach(arguments.length<3?function(e){u.push(e[0].i)}:function(e){n(e[0].g,e[e.length-1].g)&&u.push(e[0].i)})}else for(var h=0,p=e.arcs.length;p>h;++h)u.push(h);return{type:"MultiLineString",arcs:l(e,u)}}function h(e){var t=e[0],n=e[1],r=e[2];return Math.abs((t[0]-r[0])*(n[1]-t[1])-(t[0]-n[0])*(r[1]-t[1]))}function p(e){for(var t,n=-1,r=e.length,o=e[r-1],i=0;++nt?~t:t]||(o[t]=[])).push(e)})}),i.push(e)}function r(t){return p(s(e,{type:"Polygon",arcs:[t]}).coordinates[0])>0}var o={},i=[],a=[];return t.forEach(function(e){"Polygon"===e.type?n(e.arcs):"MultiPolygon"===e.type&&e.arcs.forEach(n)}),i.forEach(function(e){if(!e._){var t=[],n=[e];for(e._=1,a.push(t);e=n.pop();)t.push(e),e.forEach(function(e){e.forEach(function(e){o[0>e?~e:e].forEach(function(e){e._||(e._=1,n.push(e))})})})}}),i.forEach(function(e){delete e._}),{type:"MultiPolygon",arcs:a.map(function(t){var n,i=[];if(t.forEach(function(e){e.forEach(function(e){e.forEach(function(e){o[0>e?~e:e].length<2&&i.push(e)})})}),i=l(e,i),(n=i.length)>1)for(var a,u=r(t[0][0]),s=0;n>s;++s)if(u===r(i[s])){a=i[0],i[0]=i[s],i[s]=a;break}return i})}}function y(e){function t(e,t){e.forEach(function(e){0>e&&(e=~e);var n=o[e];n?n.push(t):o[e]=[t]})}function n(e,n){e.forEach(function(e){t(e,n)})}function r(e,t){"GeometryCollection"===e.type?e.geometries.forEach(function(e){r(e,t)}):e.type in u&&u[e.type](e.arcs,t)}var o={},a=e.map(function(){return[]}),u={LineString:t,MultiLineString:n,Polygon:n,MultiPolygon:function(e,t){e.forEach(function(e){n(e,t)})}};e.forEach(r);for(var s in o)for(var l=o[s],c=l.length,f=0;c>f;++f)for(var h=f+1;c>h;++h){var p,d=l[f],v=l[h];(p=a[d])[s=i(p,v)]!==v&&p.splice(s,0,v),(p=a[v])[s=i(p,d)]!==d&&p.splice(s,0,d)}return a}function m(e,t){return e[1][2]-t[1][2]}function _(){function e(e,t){for(;t>0;){var n=(t+1>>1)-1,o=r[n];if(m(e,o)>=0)break;r[o._=t]=o,r[e._=t=n]=e}}function t(e,t){for(;;){var n=t+1<<1,i=n-1,a=t,u=r[a];if(o>i&&m(r[i],u)<0&&(u=r[a=i]),o>n&&m(r[n],u)<0&&(u=r[a=n]),a===t)break;r[u._=t]=u,r[e._=t=a]=e}}var n={},r=[],o=0;return n.push=function(t){return e(r[t._=o]=t,o++),o},n.pop=function(){if(!(0>=o)){var e,n=r[0];return--o>0&&(e=r[o],t(r[e._=0]=e,0)),n}},n.remove=function(n){var i,a=n._;if(r[a]===n)return a!==--o&&(i=r[o],(m(i,n)<0?e:t)(r[i._=a]=i,a)),a},n}function g(e,t){function o(e){u.remove(e),e[1][2]=t(e),u.push(e)}var i=n(e.transform),a=r(e.transform),u=_();return t||(t=h),e.arcs.forEach(function(e){var n,r,s,l,c=[],f=0;for(r=0,s=e.length;s>r;++r)l=e[r],i(e[r]=[l[0],l[1],1/0],r);for(r=1,s=e.length-1;s>r;++r)n=e.slice(r-1,r+2),n[1][2]=t(n),c.push(n),u.push(n);for(r=0,s=c.length;s>r;++r)n=c[r],n.previous=c[r-1],n.next=c[r+1];for(;n=u.pop();){var h=n.previous,p=n.next;n[1][2]80*n){l=h=e[0],f=p=e[1];for(var m=n;a>m;m+=n)d=e[m],v=e[m+1],l>d&&(l=d),f>v&&(f=v),d>h&&(h=d),v>p&&(p=v);y=Math.max(h-l,p-f)}return i(u,s,n,l,f,y),s}function r(e,t,n,r,o){var i,a,u,s=0;for(i=t,a=n-r;n>i;i+=r)s+=(e[a]-e[i])*(e[i+1]+e[a+1]),a=i;if(o===s>0)for(i=t;n>i;i+=r)u=P(i,e[i],e[i+1],u);else for(i=n-r;i>=t;i-=r)u=P(i,e[i],e[i+1],u);return u}function o(e,t){if(!e)return e;t||(t=e);var n,r=e;do if(n=!1,r.steiner||!x(r,r.next)&&0!==b(r.prev,r,r.next))r=r.next;else{if(T(r),r=t=r.prev,r===r.next)return null;n=!0}while(n||r!==t);return t}function i(e,t,n,r,c,f,h){if(e){!h&&f&&d(e,r,c,f);for(var p,v,y=e;e.prev!==e.next;)if(p=e.prev,v=e.next,f?u(e,r,c,f):a(e))t.push(p.i/n),t.push(e.i/n),t.push(v.i/n),T(e),e=v.next,y=v.next;else if(e=v,e===y){h?1===h?(e=s(e,t,n),i(e,t,n,r,c,f,2)):2===h&&l(e,t,n,r,c,f):i(o(e),t,n,r,c,f,1);break}}}function a(e){var t=e.prev,n=e,r=e.next;if(b(t,n,r)>=0)return!1;for(var o=e.next.next;o!==e.prev;){if(_(t.x,t.y,n.x,n.y,r.x,r.y,o.x,o.y)&&b(o.prev,o,o.next)>=0)return!1;o=o.next}return!0}function u(e,t,n,r){var o=e.prev,i=e,a=e.next;if(b(o,i,a)>=0)return!1;for(var u=o.xi.x?o.x>a.x?o.x:a.x:i.x>a.x?i.x:a.x,c=o.y>i.y?o.y>a.y?o.y:a.y:i.y>a.y?i.y:a.y,f=y(u,s,t,n,r),h=y(l,c,t,n,r),p=e.nextZ;p&&p.z<=h;){if(p!==e.prev&&p!==e.next&&_(o.x,o.y,i.x,i.y,a.x,a.y,p.x,p.y)&&b(p.prev,p,p.next)>=0)return!1;p=p.nextZ}for(p=e.prevZ;p&&p.z>=f;){if(p!==e.prev&&p!==e.next&&_(o.x,o.y,i.x,i.y,a.x,a.y,p.x,p.y)&&b(p.prev,p,p.next)>=0)return!1;p=p.prevZ}return!0}function s(e,t,n){var r=e;do{var o=r.prev,i=r.next.next;w(o,r,r.next,i)&&E(o,i)&&E(i,o)&&(t.push(o.i/n),t.push(r.i/n),t.push(i.i/n),T(r),T(r.next),r=e=i),r=r.next}while(r!==e);return r}function l(e,t,n,r,a,u){var s=e;do{for(var l=s.next.next;l!==s.prev;){if(s.i!==l.i&&g(s,l)){var c=j(s,l);return s=o(s,s.next),c=o(c,c.next),i(s,t,n,r,a,u),void i(c,t,n,r,a,u)}l=l.next}s=s.next}while(s!==e)}function c(e,t,n,i){var a,u,s,l,c,p=[];for(a=0,u=t.length;u>a;a++)s=t[a]*i,l=u-1>a?t[a+1]*i:e.length,c=r(e,s,l,i,!1),c===c.next&&(c.steiner=!0),p.push(m(c));for(p.sort(f),a=0;a=r.next.y){var u=r.x+(i-r.y)*(r.next.x-r.x)/(r.next.y-r.y);o>=u&&u>a&&(a=u,n=r.x=r.x&&r.x>=n.x&&_(is||s===c&&r.x>n.x)&&E(r,e)&&(n=r,c=s)),r=r.next;return n}function d(e,t,n,r){var o=e;do null===o.z&&(o.z=y(o.x,o.y,t,n,r)),o.prevZ=o.prev,o.nextZ=o.next,o=o.next;while(o!==e);o.prevZ.nextZ=null,o.prevZ=null,v(o)}function v(e){var t,n,r,o,i,a,u,s,l=1;do{for(n=e,e=null,i=null,a=0;n;){for(a++,r=n,u=0,t=0;l>t&&(u++,r=r.nextZ,r);t++);for(s=l;u>0||s>0&&r;)0===u?(o=r,r=r.nextZ,s--):0!==s&&r?n.z<=r.z?(o=n,n=n.nextZ,u--):(o=r,r=r.nextZ,s--):(o=n,n=n.nextZ,u--),i?i.nextZ=o:e=o,o.prevZ=i,i=o;n=r}i.nextZ=null,l*=2}while(a>1);return e}function y(e,t,n,r,o){return e=32767*(e-n)/o,t=32767*(t-r)/o,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function m(e){var t=e,n=e;do t.x=0&&(e-a)*(r-u)-(n-a)*(t-u)>=0&&(n-a)*(i-u)-(o-a)*(r-u)>=0}function g(e,t){return x(e,t)||e.next.i!==t.i&&e.prev.i!==t.i&&!O(e,t)&&E(e,t)&&E(t,e)&&M(e,t)}function b(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function x(e,t){return e.x===t.x&&e.y===t.y}function w(e,t,n,r){return b(e,t,n)>0!=b(e,t,r)>0&&b(n,r,e)>0!=b(n,r,t)>0}function O(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&w(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function E(e,t){return b(e.prev,e,e.next)<0?b(e,t,e.next)>=0&&b(e,e.prev,t)>=0:b(e,t,e.prev)<0||b(e,e.next,t)<0}function M(e,t){var n=e,r=!1,o=(e.x+t.x)/2,i=(e.y+t.y)/2;do n.y>i!=n.next.y>i&&o<(n.next.x-n.x)*(i-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==e);return r}function j(e,t){var n=new k(e.i,e.x,e.y),r=new k(t.i,t.x,t.y),o=e.next,i=t.prev;return e.next=t,t.prev=e,n.next=o,o.prev=n,r.next=n,n.prev=r,i.next=r,r.prev=i,r}function P(e,t,n,r){var o=new k(e,t,n);return r?(o.next=r.next,o.prev=r,r.next.prev=o,r.next=o):(o.prev=o,o.next=o),o}function T(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function k(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}e.exports=n},function(e,t,n){function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),i=r(o),a=function(e,t,n){function r(){a=e.map(function(e){return[e[0],l.top,e[1]]}),u=t}function o(){a=[],e.forEach(function(e){a.push([e[0],l.top,e[1]])}),e.forEach(function(e){a.push([e[0],l.bottom,e[1]])}),u=[];for(var n=0;c>n;n++)n===c-1?(u.push([n+c,c,n]),u.push([0,n,c])):(u.push([n+c,n+c+1,n]),u.push([n+1,n,n+c+1]));if(l.closed){var r=t,o=r.map(function(e){return e.map(function(e){return e+c})});o=o.map(function(e){return[e[0],e[2],e[1]]}),u=u.concat(r).concat(o)}}var a,u,s={top:1,bottom:0,closed:!0},l=(0,i["default"])(s,n),c=e.length;return l.top===l.bottom?r():o(),{positions:a,faces:u}};t["default"]=a,e.exports=t["default"]}])}); //# sourceMappingURL=vizicities.min.js.map diff --git a/dist/vizicities.min.js.map b/dist/vizicities.min.js.map index 5c089bb..5f8ce7d 100644 --- a/dist/vizicities.min.js.map +++ b/dist/vizicities.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","vizicities.min.js","webpack:/webpack/bootstrap 0911d5d7bb6e1622fcf5","webpack:///src/vizicities.js","webpack:///src/World.js","webpack:///~/eventemitter3/index.js","webpack:///~/lodash.assign/index.js","webpack:///~/lodash.keys/index.js","webpack:///~/lodash.rest/index.js","webpack:///src/geo/CRS/index.js","webpack:///src/geo/CRS/CRS.EPSG3857.js","webpack:///src/geo/CRS/CRS.Earth.js","webpack:///src/geo/CRS/CRS.js","webpack:///src/geo/LatLon.js","webpack:///src/geo/Point.js","webpack:///src/util/wrapNum.js","webpack:///src/geo/projection/Projection.SphericalMercator.js","webpack:///src/util/Transformation.js","webpack:///src/geo/CRS/CRS.EPSG3395.js","webpack:///src/geo/projection/Projection.Mercator.js","webpack:///src/geo/CRS/CRS.EPSG4326.js","webpack:///src/geo/projection/Projection.LatLon.js","webpack:///src/geo/CRS/CRS.Simple.js","webpack:///src/geo/CRS/CRS.Proj4.js","webpack:///src/geo/projection/Projection.Proj4.js","webpack:/external \"proj4\"","webpack:///src/engine/Engine.js","webpack:/external \"THREE\"","webpack:///src/engine/Scene.js","webpack:///src/engine/Renderer.js","webpack:///src/engine/Camera.js","webpack:///src/controls/index.js","webpack:///src/controls/Controls.Orbit.js","webpack:///src/vendor/OrbitControls.js","webpack:///src/layer/environment/EnvironmentLayer.js","webpack:///src/layer/Layer.js","webpack:///src/layer/tile/ImageTileLayer.js","webpack:///src/layer/tile/TileLayer.js","webpack:///src/layer/tile/TileCache.js","webpack:///~/lru-cache/lib/lru-cache.js","webpack:///~/pseudomap/map.js","webpack:///~/process/browser.js","webpack:///~/pseudomap/pseudomap.js","webpack:///~/util/util.js","webpack:///~/util/support/isBufferBrowser.js","webpack:///~/inherits/inherits_browser.js","webpack:///~/yallist/yallist.js","webpack:///src/layer/tile/ImageTile.js","webpack:///src/layer/tile/Tile.js","webpack:///src/vendor/BoxHelper.js","webpack:///src/layer/tile/ImageTileLayerBaseMaterial.js","webpack:///~/lodash.throttle/index.js","webpack:///~/lodash.throttle/~/lodash.debounce/index.js","webpack:///src/layer/tile/TopoJSONTileLayer.js","webpack:///src/layer/tile/TopoJSONTile.js","webpack:///~/reqwest/reqwest.js","webpack:///~/topojson/build/topojson.js","webpack:///~/earcut/src/earcut.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_22__","__WEBPACK_EXTERNAL_MODULE_24__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_World","_World2","_controlsIndex","_controlsIndex2","_layerEnvironmentEnvironmentLayer","_layerEnvironmentEnvironmentLayer2","_layerTileImageTileLayer","_layerTileImageTileLayer2","_layerTileTopoJSONTileLayer","_layerTileTopoJSONTileLayer2","_geoPoint","_geoPoint2","_geoLatLon","_geoLatLon2","VIZI","version","World","Controls","EnvironmentLayer","ImageTileLayer","TopoJSONTileLayer","Point","LatLon","_classCallCheck","instance","Constructor","TypeError","_inherits","subClass","superClass","prototype","create","constructor","enumerable","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","i","length","descriptor","key","protoProps","staticProps","_get","_x","_x2","_x3","_again","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","getter","get","parent","getPrototypeOf","_eventemitter3","_eventemitter32","_lodashAssign","_lodashAssign2","_geoCRSIndex","_geoCRSIndex2","_engineEngine","_engineEngine2","_EventEmitter","domId","options","defaults","crs","EPSG3857","_layers","_controls","_initContainer","_initEngine","_initEvents","_update","_container","document","getElementById","_engine","on","_onControlsMoveEnd","point","_point","x","z","_resetView","pointToLatLon","latlon","emit","_moveStart","_move","_moveEnd","_lastPosition","delta","clock","getDelta","window","requestAnimationFrame","bind","forEach","controls","update","_originLatlon","_originPoint","project","latLonToPoint","projectedPoint","_subtract","add","unproject","_camera","layer","_addToWorld","push","_scene","_layer","layerIndex","indexOf","splice","remove","destroy","EE","fn","context","once","EventEmitter","prefix","_events","listeners","event","exists","evt","available","l","ee","Array","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","listener","events","removeAllListeners","off","addListener","setMaxListeners","prefixed","isIndex","reIsUint","test","MAX_SAFE_INTEGER","assignValue","objValue","eq","objectProto","hasOwnProperty","baseProperty","copyObject","source","copyObjectWith","customizer","index","newValue","createAssigner","assigner","rest","sources","guard","isIterateeCall","isObject","type","isArrayLike","other","isFunction","isLength","getLength","tag","objectToString","funcTag","genTag","keys","toString","assign","baseTimes","n","iteratee","result","baseHas","baseKeys","nativeKeys","indexKeys","isArray","isString","isArguments","String","isPrototype","Ctor","proto","isArrayLikeObject","propertyIsEnumerable","argsTag","isObjectLike","stringTag","isProto","indexes","skipIndexes","func","thisArg","start","FUNC_ERROR_TEXT","nativeMax","toInteger","array","otherArgs","toNumber","INFINITY","sign","MAX_INTEGER","remainder","valueOf","replace","reTrim","isBinary","reIsBinary","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","parseInt","Math","max","_CRSEPSG3857","_CRSEPSG38572","_CRSEPSG3395","_CRSEPSG33952","_CRSEPSG4326","_CRSEPSG43262","_CRSSimple","_CRSSimple2","_CRSProj4","_CRSProj42","CRS","EPSG900913","EPSG3395","EPSG4326","Simple","Proj4","_CRSEarth","_CRSEarth2","_projectionProjectionSphericalMercator","_projectionProjectionSphericalMercator2","_utilTransformation","_utilTransformation2","_EPSG3857","code","projection","transformScale","PI","R","transformation","scale","_CRS","_CRS2","_LatLon","Earth","wrapLon","distance","latlon1","latlon2","accurate","lat1","lat2","a","rad","lat","lon1","lon","lon2","deltaLat","deltaLon","halfDeltaLat","halfDeltaLon","sin","cos","atan2","sqrt","acos","min","pointScale","metresToProjected","metres","projectedToMetres","projectedUnits","metresToWorld","zoom","projectedMetres","scaledMetres","worldToMetres","worldUnits","realMetres","_LatLon2","_Point","_Point2","_utilWrapNum","_utilWrapNum2","scaleFactor","_transform","untransformedPoint","untransform","pow","log","LN2","getProjectedBounds","infinite","b","bounds","s","transform","wrapLatLon","wrapLat","alt","isNaN","Error","lng","y","round","clone","_add","wrapNum","range","includeMax","d","SphericalMercator","MAX_LATITUDE","ECC","ECC2","atan","exp","k","sinLat","sinLat2","cosLat","v","h","Transformation","_a","_b","_c","_d","_projectionProjectionMercator","_projectionProjectionMercator2","_EPSG3395","Mercator","R_MINOR","r","tmp","e","con","ts","tan","phi","dphi","abs","_projectionProjectionLatLon","_projectionProjectionLatLon2","_EPSG4326","ProjectionLatLon","m1","m2","m3","m4","p1","p2","p3","latlen","lonlen","_Simple","dx","dy","_projectionProjectionProj4","_projectionProjectionProj42","_Proj4","def","diffX","diffY","halfX","halfY","scaleX","scaleY","offsetX","offsetY","_proj4","_proj42","proj","forward","inverse","bottomLeft","topRight","_three","_three2","_Scene","_Scene2","_Renderer","_Renderer2","_Camera","_Camera2","Engine","container","console","_renderer","Clock","_frustum","Frustum","render","scene","Scene","fog","Fog","renderer","WebGLRenderer","antialias","setClearColor","color","gammaInput","gammaOutput","appendChild","domElement","updateSize","setSize","clientWidth","clientHeight","addEventListener","camera","PerspectiveCamera","position","aspect","updateProjectionMatrix","_ControlsOrbit","_ControlsOrbit2","Orbit","_vendorOrbitControls","_vendorOrbitControls2","_this","_world","animate","pointDelta","metresDelta","angle","angleDelta","noZoom","world","addControls","maxPolarAngle","OrbitControls","getAutoRotationAngle","scope","autoRotateSpeed","getZoomScale","zoomSpeed","rotateLeft","thetaDelta","rotateUp","phiDelta","dollyIn","dollyScale","OrthographicCamera","minZoom","maxZoom","zoomChanged","warn","enableZoom","dollyOut","handleMouseDownRotate","rotateStart","set","clientX","clientY","handleMouseDownDolly","dollyStart","handleMouseDownPan","panStart","handleMouseMoveRotate","rotateEnd","rotateDelta","subVectors","element","body","rotateSpeed","copy","handleMouseMoveDolly","dollyEnd","dollyDelta","handleMouseMovePan","panEnd","panDelta","pan","handleMouseUp","handleMouseWheel","wheelDelta","detail","handleKeyDown","keyCode","UP","keyPanSpeed","BOTTOM","LEFT","RIGHT","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","handleTouchEnd","onMouseDown","enabled","preventDefault","button","mouseButtons","ORBIT","enableRotate","state","STATE","ROTATE","ZOOM","DOLLY","PAN","enablePan","NONE","onMouseMove","onMouseUp","dispatchEvent","startEvent","removeEventListener","endEvent","onMouseWheel","stopPropagation","onKeyDown","enableKeys","onTouchStart","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","onTouchMove","onTouchEnd","onContextMenu","Vector3","minDistance","maxDistance","Infinity","minPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","autoRotate","MOUSE","MIDDLE","target0","position0","zoom0","getPolarAngle","getAzimuthalAngle","theta","reset","changeEvent","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","sub","applyQuaternion","EPS","radius","panOffset","lookAt","distanceToSquared","dot","quaternion","dispose","Vector2","panLeft","objectMatrix","te","elements","multiplyScalar","panUp","adjDist","deltaX","deltaY","targetDistance","fov","matrix","right","left","top","bottom","EventDispatcher","center","noRotate","noPan","noKeys","staticMoving","constraint","dynamicDampingFactor","_Layer2","_Layer3","_Layer","_initLights","directionalLight","DirectionalLight","intesity","directionalLight2","helper","DirectionalLightHelper","helper2","size","step","gridHelper","GridHelper","_engineScene","Layer","Object3D","addLayer","_onAdd","_TileLayer2","_TileLayer3","_ImageTile","_ImageTile2","_ImageTileLayerBaseMaterial","_ImageTileLayerBaseMaterial2","_lodashThrottle","_lodashThrottle2","_TileLayer","path","_path","geom","PlaneBufferGeometry","mesh","Mesh","rotation","_baseLayer","setTimeout","_calculateLOD","_throttledWorldUpdate","_onWorldUpdate","_onWorldMove","_moveBaseLayer","quadcode","geometry","material","map","_TileCache","_TileCache2","TileLayer","maxCache","maxLOD","_options","_tileCache","tile","_destroyTile","_minLOD","_maxLOD","_tiles","getCamera","projScreenMatrix","Matrix4","multiplyMatrices","projectionMatrix","matrixWorldInverse","setFromMatrix","getBounds","intersectsBox","Box3","_this2","_stop","_updateFrustum","checkList","_checklist","_requestTile","_divide","_removeTiles","_tileInFrustum","getCenter","dist","getMesh","isReady","requestTileAsync","currentItem","count","getQuadcode","_screenSpaceError","minDepth","maxDepth","quality","error","getSide","children","getTile","_createTile","setTile","_lruCache","_lruCache2","TileCache","cacheLimit","onDestroyTile","_cache","priv","val","sym","symbols","makeSymbol","naiveLength","LRUCache","lc","stale","maxAge","forEachStep","self","node","thisp","hit","isStale","del","doUse","unshiftNode","diff","Date","now","trim","walker","tail","prev","removeNode","Entry","Map","util","Yallist","hasSymbol","Symbol","mL","allowStale","mA","lC","rforEach","head","next","toArray","values","dump","filter","dumpLru","inspect","opts","str","extras","as","didFirst","item","split","join","has","unshift","peek","pop","load","arr","expiresAt","prune","process","env","npm_package_name","npm_lifecycle_script","TEST_PSEUDOMAP","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","run","clearTimeout","Item","fun","noop","nextTick","title","browser","argv","versions","binding","name","cwd","chdir","dir","umask","PseudoMap","clear","kv","same","_index","find","data","_data","res","entries","global","ctx","seen","stylize","stylizeNoColor","depth","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","style","styles","arrayToHash","hash","idx","recurseTimes","ret","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","RegExp","isDate","base","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","isNumber","isNull","match","line","substr","numLinesEst","reduce","cur","ar","arg","isNullOrUndefined","isSymbol","re","isPrimitive","o","pad","timestamp","time","getHours","getMinutes","getSeconds","getDate","months","getMonth","prop","formatRegExp","format","f","objects","Number","_","deprecate","msg","deprecated","warned","throwDeprecation","traceDeprecation","trace","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","toUpperCase","pid","bold","italic","underline","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","regexp","isBuffer","inherits","origin","fill","readUInt8","ctor","superCtor","super_","TempCtor","list","Node","pushNode","shift","forEachReverse","getReverse","mapReverse","initial","acc","reduceReverse","toArrayReverse","from","to","sliceReverse","reverse","_Tile2","_Tile3","_vendorBoxHelper","ImageTile","_Tile","_mesh","_createMesh","_abortRequest","_image","_center","_side","MeshBasicMaterial","depthWrite","localMesh","renderOrder","canvas","createElement","width","height","getContext","font","fillStyle","fillText","_quadcode","_tile","texture","Texture","magFilter","LinearFilter","minFilter","LinearMipMapLinearFilter","anisotropy","needsUpdate","transparent","urlParams","url","_getTileURL","image","_texture","_ready","crossOrigin","src","r2d","tileURLRegex","Tile","_quadcodeToTile","_boundsLatLon","_tileBoundsWGS84","_boundsWorld","_tileBoundsFromWGS84","_boundsToCenter","_getSide","child","fromCharCode","floor","random","lastIndex","mask","q","boundsWGS84","sw","ne","_tile2lon","w","_tile2lat","BoxHelper","indices","Uint16Array","positions","Float32Array","BufferGeometry","setIndex","BufferAttribute","addAttribute","LineSegments","LineBasicMaterial","linewidth","box","setFromObject","isEmpty","attributes","computeBoundingSphere","colour","fillRect","throttle","wait","leading","trailing","debounce","maxWait","cancel","timeoutId","maxTimeoutId","lastCalled","trailingCall","complete","isCalled","delayed","remaining","stamp","flush","maxDelayed","debounced","leadingCall","_TopoJSONTile","_TopoJSONTile2","_reqwest","_reqwest2","_topojson","_topojson2","_earcut","_earcut2","TopoJSONTile","_request","then","_processTileData","err","_this3","geojson","feature","vectile","earcutData","faces","allVertices","allFaces","allColours","facesCount","Color","features","coordinates","ring","coordinate","_toEarcut","_triangulate","vertices","holes","dimensions","g","_faces","_vertices","_colour","normals","colours","pA","pB","pC","cb","ab","dim","ax","ay","az","bx","by","bz","cx","cy","cz","cross","normalize","nx","ny","nz","computeBoundingBox","vertexColors","VertexColors","side","BackSide","holeIndex","contour","il","abort","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","definition","succeed","protocol","protocolRe","exec","location","httpsRe","twoHundo","request","status","response","handleReadyState","success","_aborted","_timedOut","readyState","onreadystatechange","setHeaders","http","headers","defaultHeaders","isAFormData","FormData","requestedWith","contentType","setRequestHeader","setCredentials","withCredentials","generalCallback","lastValue","urlappend","handleJsonp","reqId","uniqid","cbkey","cbval","reqwest","getcallbackPrefix","cbreg","script","doc","isIE10","navigator","userAgent","async","htmlFor","onload","onclick","removeChild","getRequest","method","toQueryString","sendWait","xhr","open","xDomainRequest","onerror","onprogress","send","Reqwest","init","setType","header","resp","_completeHandlers","getResponseHeader","filteredResponse","globalSetupOptions","dataFilter","responseText","parse","eval","responseXML","parseError","errorCode","reason","_responseArgs","_fulfilled","_successHandler","_fulfillmentHandlers","timedOut","t","_erred","_errorHandlers","serial","el","ch","ra","tagName","toLowerCase","optCb","disabled","checked","selectedIndex","selected","eachFormElement","serializeSubtags","tags","fa","byTag","serializeQueryString","serializeArray","serializeHash","buildParams","traditional","rbracket","XHR2","ex","callbackPrefix","xmlHttpRequest","accept","*","xml","html","text","json","js","XMLHttpRequest","XDomainRequest","ActiveXObject","retry","fail","always","catch","serialize","opt","nodeType","trad","enc","encodeURIComponent","compat","ajaxSetup","absolute","x0","y0","kx","ky","translate","relative","x1","y1","bisect","lo","hi","mid","topology","geometries","feature$1","properties","arc","points","arcs","absolute$$","polygon","geometryType","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","stitchArcs","ends","p0","dp","fragmentByEnd","fragmentByStart","end","stitchedArcs","fragments","emptyIndex","fg","gf","meshArcs","geomsByArc","geoms","triangle","area","merge","mergeArcs","register","ring$$","polygonsByArc","polygons","exterior","components","component","neighbors","sgn","indexesByArc","ij","ik","compareArea","minAreaHeap","down","heap","removed","presimplify","triangleArea","relative$$","triangles","maxArea","previous","earcut","holeIndices","hasHoles","outerLen","outerNode","linkedList","minX","minY","maxX","maxY","eliminateHoles","earcutLinked","clockwise","last","sum","insertNode","filterPoints","again","steiner","equals","ear","pass","indexCurve","stop","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","zOrder","maxZ","nextZ","prevZ","intersects","locallyInside","isValidDiagonal","splitPolygon","getLeftmost","sort","compareX","eliminateHole","hole","findHoleBridge","hx","hy","qx","tanMin","sortLinked","numMerges","pSize","qSize","inSize","leftmost","px","py","intersectsPolygon","middleInside","q1","q2","inside","b2","an","bp"],"mappings":"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","file":"vizicities.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _World = __webpack_require__(1);\n\t\n\tvar _World2 = _interopRequireDefault(_World);\n\t\n\tvar _controlsIndex = __webpack_require__(28);\n\t\n\tvar _controlsIndex2 = _interopRequireDefault(_controlsIndex);\n\t\n\tvar _layerEnvironmentEnvironmentLayer = __webpack_require__(31);\n\t\n\tvar _layerEnvironmentEnvironmentLayer2 = _interopRequireDefault(_layerEnvironmentEnvironmentLayer);\n\t\n\tvar _layerTileImageTileLayer = __webpack_require__(33);\n\t\n\tvar _layerTileImageTileLayer2 = _interopRequireDefault(_layerTileImageTileLayer);\n\t\n\tvar _layerTileTopoJSONTileLayer = __webpack_require__(50);\n\t\n\tvar _layerTileTopoJSONTileLayer2 = _interopRequireDefault(_layerTileTopoJSONTileLayer);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar VIZI = {\n\t version: '0.3',\n\t\n\t // Public API\n\t World: _World2['default'],\n\t Controls: _controlsIndex2['default'],\n\t EnvironmentLayer: _layerEnvironmentEnvironmentLayer2['default'],\n\t ImageTileLayer: _layerTileImageTileLayer2['default'],\n\t TopoJSONTileLayer: _layerTileTopoJSONTileLayer2['default'],\n\t Point: _geoPoint2['default'],\n\t LatLon: _geoLatLon2['default']\n\t};\n\t\n\texports['default'] = VIZI;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _geoCRSIndex = __webpack_require__(6);\n\t\n\tvar _geoCRSIndex2 = _interopRequireDefault(_geoCRSIndex);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _engineEngine = __webpack_require__(23);\n\t\n\tvar _engineEngine2 = _interopRequireDefault(_engineEngine);\n\t\n\t// Pretty much any event someone using ViziCities would need will be emitted or\n\t// proxied by World (eg. render events, etc)\n\t\n\tvar World = (function (_EventEmitter) {\n\t _inherits(World, _EventEmitter);\n\t\n\t function World(domId, options) {\n\t _classCallCheck(this, World);\n\t\n\t _get(Object.getPrototypeOf(World.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t crs: _geoCRSIndex2['default'].EPSG3857\n\t };\n\t\n\t this.options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._layers = [];\n\t this._controls = [];\n\t\n\t this._initContainer(domId);\n\t this._initEngine();\n\t this._initEvents();\n\t\n\t // Kick off the update and render loop\n\t this._update();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(World, [{\n\t key: '_initContainer',\n\t value: function _initContainer(domId) {\n\t this._container = document.getElementById(domId);\n\t }\n\t }, {\n\t key: '_initEngine',\n\t value: function _initEngine() {\n\t this._engine = (0, _engineEngine2['default'])(this._container);\n\t\n\t // Engine events\n\t //\n\t // Consider proxying these through events on World for public access\n\t // this._engine.on('preRender', () => {});\n\t // this._engine.on('postRender', () => {});\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t this.on('controlsMoveEnd', this._onControlsMoveEnd);\n\t }\n\t }, {\n\t key: '_onControlsMoveEnd',\n\t value: function _onControlsMoveEnd(point) {\n\t var _point = (0, _geoPoint2['default'])(point.x, point.z);\n\t this._resetView(this.pointToLatLon(_point), _point);\n\t }\n\t\n\t // Reset world view\n\t }, {\n\t key: '_resetView',\n\t value: function _resetView(latlon, point) {\n\t this.emit('preResetView');\n\t\n\t this._moveStart();\n\t this._move(latlon, point);\n\t this._moveEnd();\n\t\n\t this.emit('postResetView');\n\t }\n\t }, {\n\t key: '_moveStart',\n\t value: function _moveStart() {\n\t this.emit('moveStart');\n\t }\n\t }, {\n\t key: '_move',\n\t value: function _move(latlon, point) {\n\t this._lastPosition = latlon;\n\t this.emit('move', latlon, point);\n\t }\n\t }, {\n\t key: '_moveEnd',\n\t value: function _moveEnd() {\n\t this.emit('moveEnd');\n\t }\n\t }, {\n\t key: '_update',\n\t value: function _update() {\n\t var delta = this._engine.clock.getDelta();\n\t\n\t // Once _update is called it will run forever, for now\n\t window.requestAnimationFrame(this._update.bind(this));\n\t\n\t // Update controls\n\t this._controls.forEach(function (controls) {\n\t controls.update();\n\t });\n\t\n\t this.emit('preUpdate');\n\t this._engine.update(delta);\n\t this.emit('postUpdate');\n\t }\n\t\n\t // Set world view\n\t }, {\n\t key: 'setView',\n\t value: function setView(latlon) {\n\t // Store initial geographic coordinate for the [0,0,0] world position\n\t //\n\t // The origin point doesn't move in three.js / 3D space so only set it once\n\t // here instead of every time _resetView is called\n\t //\n\t // If it was updated every time then coorindates would shift over time and\n\t // would be out of place / context with previously-placed points (0,0 would\n\t // refer to a different point each time)\n\t this._originLatlon = latlon;\n\t this._originPoint = this.project(latlon);\n\t\n\t this._resetView(latlon);\n\t return this;\n\t }\n\t\n\t // Return world geographic position\n\t }, {\n\t key: 'getPosition',\n\t value: function getPosition() {\n\t return this._lastPosition;\n\t }\n\t\n\t // Transform geographic coordinate to world point\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the origin point of the projection (not the world)\n\t }, {\n\t key: 'project',\n\t value: function project(latlon) {\n\t return this.options.crs.latLonToPoint((0, _geoLatLon2['default'])(latlon));\n\t }\n\t\n\t // Transform world point to geographic coordinate\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a point relative to the origin point of the\n\t // projection (not the world) and returns a geographic coordinate\n\t }, {\n\t key: 'unproject',\n\t value: function unproject(point) {\n\t return this.options.crs.pointToLatLon((0, _geoPoint2['default'])(point));\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the three.js / 3D origin (0,0)\n\t }, {\n\t key: 'latLonToPoint',\n\t value: function latLonToPoint(latlon) {\n\t var projectedPoint = this.project((0, _geoLatLon2['default'])(latlon));\n\t return projectedPoint._subtract(this._originPoint);\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a point relative to the three.js / 3D origin (0,0)\n\t // and returns the exact geographic coordinate at that point\n\t }, {\n\t key: 'pointToLatLon',\n\t value: function pointToLatLon(point) {\n\t var projectedPoint = (0, _geoPoint2['default'])(point).add(this._originPoint);\n\t return this.unproject(projectedPoint);\n\t }\n\t\n\t // Unsure if it's a good idea to expose this here for components like\n\t // GridLayer to use (eg. to keep track of a frustum)\n\t }, {\n\t key: 'getCamera',\n\t value: function getCamera() {\n\t return this._engine._camera;\n\t }\n\t }, {\n\t key: 'addLayer',\n\t value: function addLayer(layer) {\n\t layer._addToWorld(this);\n\t\n\t this._layers.push(layer);\n\t\n\t // Could move this into Layer but it'll do here for now\n\t this._engine._scene.add(layer._layer);\n\t\n\t this.emit('layerAdded', layer);\n\t return this;\n\t }\n\t\n\t // Remove layer and perform clean up operations\n\t }, {\n\t key: 'removeLayer',\n\t value: function removeLayer(layer) {\n\t var layerIndex = this._layers.indexOf(layer);\n\t\n\t if (layerIndex > -1) {\n\t // Remove from this._layers\n\t this._layers.splice(layerIndex, 1);\n\t };\n\t\n\t this._engine._scene.remove(layer._layer);\n\t\n\t layer.destroy();\n\t\n\t this.emit('layerRemoved');\n\t return this;\n\t }\n\t }, {\n\t key: 'addControls',\n\t value: function addControls(controls) {\n\t controls._addToWorld(this);\n\t\n\t this._controls.push(controls);\n\t\n\t this.emit('controlsAdded', controls);\n\t return this;\n\t }\n\t }, {\n\t key: 'removeControls',\n\t value: function removeControls(controls) {}\n\t }]);\n\t\n\t return World;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (domId, options) {\n\t return new World(domId, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t//\n\t// We store our EE objects in a plain object whose properties are event names.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// `~` to make sure that the built-in object properties are not overridden or\n\t// used as an attack vector.\n\t// We also assume that `Object.create(null)` is available when the event name\n\t// is an ES6 Symbol.\n\t//\n\tvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\t\n\t/**\n\t * Representation of a single EventEmitter function.\n\t *\n\t * @param {Function} fn Event handler to be called.\n\t * @param {Mixed} context Context for function execution.\n\t * @param {Boolean} once Only emit once\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\t\n\t/**\n\t * Minimal EventEmitter interface that is molded against the Node.js\n\t * EventEmitter interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() { /* Nothing to set */ }\n\t\n\t/**\n\t * Holds the assigned EventEmitters by name.\n\t *\n\t * @type {Object}\n\t * @private\n\t */\n\tEventEmitter.prototype._events = undefined;\n\t\n\t/**\n\t * Return a list of assigned event listeners.\n\t *\n\t * @param {String} event The events that should be listed.\n\t * @param {Boolean} exists We only need to know if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events && this._events[evt];\n\t\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\t\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\t\n\t return ee;\n\t};\n\t\n\t/**\n\t * Emit an event to all registered event listeners.\n\t *\n\t * @param {String} event The name of the event.\n\t * @returns {Boolean} Indication if we've emitted an event.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return false;\n\t\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\t\n\t if ('function' === typeof listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\t\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\t\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\t\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\t\n\t return true;\n\t};\n\t\n\t/**\n\t * Register a new EventListener for the given event.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Functon} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Add an EventListener that's only called once.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove event listeners.\n\t *\n\t * @param {String} event The event we want to remove.\n\t * @param {Function} fn The listener that we need to find.\n\t * @param {Mixed} context Only remove listeners matching this context.\n\t * @param {Boolean} once Only remove once listeners.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return this;\n\t\n\t var listeners = this._events[evt]\n\t , events = [];\n\t\n\t if (fn) {\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn !== fn\n\t || (once && !listeners.once)\n\t || (context && listeners.context !== context)\n\t ) {\n\t events.push(listeners);\n\t }\n\t } else {\n\t for (var i = 0, length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) {\n\t this._events[evt] = events.length === 1 ? events[0] : events;\n\t } else {\n\t delete this._events[evt];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove all listeners or only the listeners for the specified event.\n\t *\n\t * @param {String} event The event want to remove all listeners for.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t if (!this._events) return this;\n\t\n\t if (event) delete this._events[prefix ? prefix + event : event];\n\t else this._events = prefix ? {} : Object.create(null);\n\t\n\t return this;\n\t};\n\t\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\t\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\t\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\t\n\t//\n\t// Expose the module.\n\t//\n\tif (true) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar keys = __webpack_require__(4),\n\t rest = __webpack_require__(5);\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if ((!eq(objValue, value) ||\n\t (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object) {\n\t return copyObjectWith(source, props, object);\n\t}\n\t\n\t/**\n\t * This function is like `copyObject` except that it accepts a function to\n\t * customize copied values.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObjectWith(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index],\n\t newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\t\n\t assignValue(object, key, newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return rest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Checks if the provided arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Assigns own enumerable properties of source objects to the destination\n\t * object. Source objects are applied from left to right. Subsequent sources\n\t * overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.e = 5;\n\t * }\n\t *\n\t * Foo.prototype.d = 4;\n\t * Bar.prototype.f = 6;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3, 'e': 5 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t copyObject(source, keys(source), object);\n\t});\n\t\n\tmodule.exports = assign;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t stringTag = '[object String]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar getPrototypeOf = Object.getPrototypeOf,\n\t propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeKeys = Object.keys;\n\t\n\t/**\n\t * The base implementation of `_.has` without support for deep paths.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} key The key to check.\n\t * @returns {boolean} Returns `true` if `key` exists, else `false`.\n\t */\n\tfunction baseHas(object, key) {\n\t // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n\t // that are composed entirely of index properties, return `false` for\n\t // `hasOwnProperty` checks of them.\n\t return hasOwnProperty.call(object, key) ||\n\t (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't skip the constructor\n\t * property of prototypes or treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @type Function\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t return nativeKeys(Object(object));\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Creates an array of index keys for `object` values of arrays,\n\t * `arguments` objects, and strings, otherwise `null` is returned.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array|null} Returns index keys, else `null`.\n\t */\n\tfunction indexKeys(object) {\n\t var length = object ? object.length : undefined;\n\t if (isLength(length) &&\n\t (isArray(object) || isString(object) || isArguments(object))) {\n\t return baseTimes(length, String);\n\t }\n\t return null;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\tfunction isString(value) {\n\t return typeof value == 'string' ||\n\t (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n\t}\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t var isProto = isPrototype(object);\n\t if (!(isProto || isArrayLike(object))) {\n\t return baseKeys(object);\n\t }\n\t var indexes = indexKeys(object),\n\t skipIndexes = !!indexes,\n\t result = indexes || [],\n\t length = result.length;\n\t\n\t for (var key in object) {\n\t if (baseHas(object, key) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n\t !(isProto && key == 'constructor')) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\tmodule.exports = keys;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar INFINITY = 1 / 0,\n\t MAX_INTEGER = 1.7976931348623157e+308,\n\t NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {...*} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t var length = args.length;\n\t switch (length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Creates a function that invokes `func` with the `this` binding of the\n\t * created function and arguments from `start` and beyond provided as an array.\n\t *\n\t * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t * @example\n\t *\n\t * var say = _.rest(function(what, names) {\n\t * return what + ' ' + _.initial(names).join(', ') +\n\t * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n\t * });\n\t *\n\t * say('hello', 'fred', 'barney', 'pebbles');\n\t * // => 'hello fred, barney, & pebbles'\n\t */\n\tfunction rest(func, start) {\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t switch (start) {\n\t case 0: return func.call(this, array);\n\t case 1: return func.call(this, args[0], array);\n\t case 2: return func.call(this, args[0], args[1], array);\n\t }\n\t var otherArgs = Array(start + 1);\n\t index = -1;\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to an integer.\n\t *\n\t * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.toInteger(3);\n\t * // => 3\n\t *\n\t * _.toInteger(Number.MIN_VALUE);\n\t * // => 0\n\t *\n\t * _.toInteger(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toInteger('3');\n\t * // => 3\n\t */\n\tfunction toInteger(value) {\n\t if (!value) {\n\t return value === 0 ? value : 0;\n\t }\n\t value = toNumber(value);\n\t if (value === INFINITY || value === -INFINITY) {\n\t var sign = (value < 0 ? -1 : 1);\n\t return sign * MAX_INTEGER;\n\t }\n\t var remainder = value % 1;\n\t return value === value ? (remainder ? value - remainder : value) : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = rest;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _CRSEPSG3857 = __webpack_require__(7);\n\t\n\tvar _CRSEPSG38572 = _interopRequireDefault(_CRSEPSG3857);\n\t\n\tvar _CRSEPSG3395 = __webpack_require__(15);\n\t\n\tvar _CRSEPSG33952 = _interopRequireDefault(_CRSEPSG3395);\n\t\n\tvar _CRSEPSG4326 = __webpack_require__(17);\n\t\n\tvar _CRSEPSG43262 = _interopRequireDefault(_CRSEPSG4326);\n\t\n\tvar _CRSSimple = __webpack_require__(19);\n\t\n\tvar _CRSSimple2 = _interopRequireDefault(_CRSSimple);\n\t\n\tvar _CRSProj4 = __webpack_require__(20);\n\t\n\tvar _CRSProj42 = _interopRequireDefault(_CRSProj4);\n\t\n\tvar CRS = {};\n\t\n\tCRS.EPSG3857 = _CRSEPSG38572['default'];\n\tCRS.EPSG900913 = _CRSEPSG3857.EPSG900913;\n\tCRS.EPSG3395 = _CRSEPSG33952['default'];\n\tCRS.EPSG4326 = _CRSEPSG43262['default'];\n\tCRS.Simple = _CRSSimple2['default'];\n\tCRS.Proj4 = _CRSProj42['default'];\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionSphericalMercator = __webpack_require__(13);\n\t\n\tvar _projectionProjectionSphericalMercator2 = _interopRequireDefault(_projectionProjectionSphericalMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3857 = {\n\t code: 'EPSG:3857',\n\t projection: _projectionProjectionSphericalMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3857 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3857);\n\t\n\tvar EPSG900913 = (0, _lodashAssign2['default'])({}, EPSG3857, {\n\t code: 'EPSG:900913'\n\t});\n\t\n\texports.EPSG900913 = EPSG900913;\n\texports['default'] = EPSG3857;\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Earth is the base class for all CRS representing Earth.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar Earth = {\n\t wrapLon: [-180, 180],\n\t\n\t R: 6378137,\n\t\n\t // Distance between two geographical points using spherical law of cosines\n\t // approximation or Haversine\n\t //\n\t // See: http://www.movable-type.co.uk/scripts/latlong.html\n\t distance: function distance(latlon1, latlon2, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var lat1;\n\t var lat2;\n\t\n\t var a;\n\t\n\t if (!accurate) {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\t\n\t return this.R * Math.acos(Math.min(a, 1));\n\t } else {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t var lon1 = latlon1.lon * rad;\n\t var lon2 = latlon2.lon * rad;\n\t\n\t var deltaLat = lat2 - lat1;\n\t var deltaLon = lon2 - lon1;\n\t\n\t var halfDeltaLat = deltaLat / 2;\n\t var halfDeltaLon = deltaLon / 2;\n\t\n\t a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\t\n\t var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\n\t return this.R * c;\n\t }\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Defaults to a scale factor of 1 if no calculation method exists\n\t //\n\t // Probably need to run this through the CRS transformation or similar so the\n\t // resulting scale is relative to the dimensions of the world space\n\t // Eg. 1 metre in projected space is likly scaled up or down to some other\n\t // number\n\t pointScale: function pointScale(latlon, accurate) {\n\t return this.projection.pointScale ? this.projection.pointScale(latlon, accurate) : [1, 1];\n\t },\n\t\n\t // Convert real metres to projected units\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t metresToProjected: function metresToProjected(metres, pointScale) {\n\t return metres * pointScale[1];\n\t },\n\t\n\t // Convert projected units to real metres\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t projectedToMetres: function projectedToMetres(projectedUnits, pointScale) {\n\t return projectedUnits / pointScale[1];\n\t },\n\t\n\t // Convert real metres to a value in world (WebGL) units\n\t metresToWorld: function metresToWorld(metres, pointScale, zoom) {\n\t // Transform metres to projected metres using the latitude point scale\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t var projectedMetres = this.metresToProjected(metres, pointScale);\n\t\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t // Scale projected metres\n\t var scaledMetres = scale * (this.transformScale * projectedMetres) / pointScale[1];\n\t\n\t return scaledMetres;\n\t },\n\t\n\t // Convert world (WebGL) units to a value in real metres\n\t worldToMetres: function worldToMetres(worldUnits, pointScale, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var projectedUnits = worldUnits / scale / this.transformScale * pointScale[1];\n\t var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\t\n\t return realMetres;\n\t }\n\t};\n\t\n\texports['default'] = (0, _lodashAssign2['default'])({}, _CRS2['default'], Earth);\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar _utilWrapNum = __webpack_require__(12);\n\t\n\tvar _utilWrapNum2 = _interopRequireDefault(_utilWrapNum);\n\t\n\tvar CRS = {\n\t // Scale factor determines final dimensions of world space\n\t //\n\t // Projection transformation in range -1 to 1 is multiplied by scale factor to\n\t // find final world coordinates\n\t //\n\t // Scale factor can be considered as half the amount of the desired dimension\n\t // for the largest side when transformation is equal to 1 or -1, or as the\n\t // distance between 0 and 1 on the largest side\n\t //\n\t // For example, if you want the world dimensions to be between -1000 and 1000\n\t // then the scale factor will be 1000\n\t scaleFactor: 1000000,\n\t\n\t // Converts geo coords to pixel / WebGL ones\n\t latLonToPoint: function latLonToPoint(latlon, zoom) {\n\t var projectedPoint = this.projection.project(latlon);\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t return this.transformation._transform(projectedPoint, scale);\n\t },\n\t\n\t // Converts pixel / WebGL coords to geo coords\n\t pointToLatLon: function pointToLatLon(point, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var untransformedPoint = this.transformation.untransform(point, scale);\n\t\n\t return this.projection.unproject(untransformedPoint);\n\t },\n\t\n\t // Converts geo coords to projection-specific coords (e.g. in meters)\n\t project: function project(latlon) {\n\t return this.projection.project(latlon);\n\t },\n\t\n\t // Converts projected coords to geo coords\n\t unproject: function unproject(point) {\n\t return this.projection.unproject(point);\n\t },\n\t\n\t // If zoom is provided, returns the map width in pixels for a given zoom\n\t // Else, provides fixed scale value\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom >= 0) {\n\t return 256 * Math.pow(2, zoom);\n\t // Else, return fixed scale value to expand projected coordinates from\n\t // their 0 to 1 range into something more practical\n\t } else {\n\t return this.scaleFactor;\n\t }\n\t },\n\t\n\t // Returns zoom level for a given scale value\n\t // This only works with a scale value that is based on map pixel width\n\t zoom: function zoom(scale) {\n\t return Math.log(scale / 256) / Math.LN2;\n\t },\n\t\n\t // Returns the bounds of the world in projected coords if applicable\n\t getProjectedBounds: function getProjectedBounds(zoom) {\n\t if (this.infinite) {\n\t return null;\n\t }\n\t\n\t var b = this.projection.bounds;\n\t var s = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t s /= 2;\n\t }\n\t\n\t // Bottom left\n\t var min = this.transformation.transform((0, _Point2['default'])(b[0]), s);\n\t\n\t // Top right\n\t var max = this.transformation.transform((0, _Point2['default'])(b[1]), s);\n\t\n\t return [min, max];\n\t },\n\t\n\t // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n\t // wrapLon: [min, max],\n\t // wrapLat: [min, max],\n\t\n\t // If true, the coordinate space will be unbounded (infinite in all directions)\n\t // infinite: false,\n\t\n\t // Wraps geo coords in certain ranges if applicable\n\t wrapLatLon: function wrapLatLon(latlon) {\n\t var lat = this.wrapLat ? (0, _utilWrapNum2['default'])(latlon.lat, this.wrapLat, true) : latlon.lat;\n\t var lon = this.wrapLon ? (0, _utilWrapNum2['default'])(latlon.lon, this.wrapLon, true) : latlon.lon;\n\t var alt = latlon.alt;\n\t\n\t return (0, _LatLon2['default'])(lat, lon, alt);\n\t }\n\t};\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * LatLon is a helper class for ensuring consistent geographic coordinates.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n\t */\n\t\n\tvar LatLon = (function () {\n\t function LatLon(lat, lon, alt) {\n\t _classCallCheck(this, LatLon);\n\t\n\t if (isNaN(lat) || isNaN(lon)) {\n\t throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n\t }\n\t\n\t this.lat = +lat;\n\t this.lon = +lon;\n\t\n\t if (alt !== undefined) {\n\t this.alt = +alt;\n\t }\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t //\n\t // Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n\t // Also converts between lng and lon\n\t\n\t _createClass(LatLon, [{\n\t key: 'clone',\n\t value: function clone() {\n\t return new LatLon(this.lat, this.lon, this.alt);\n\t }\n\t }]);\n\t\n\t return LatLon;\n\t})();\n\t\n\texports['default'] = function (a, b, c) {\n\t if (a instanceof LatLon) {\n\t return a;\n\t }\n\t if (Array.isArray(a) && typeof a[0] !== 'object') {\n\t if (a.length === 3) {\n\t return new LatLon(a[0], a[1], a[2]);\n\t }\n\t if (a.length === 2) {\n\t return new LatLon(a[0], a[1]);\n\t }\n\t return null;\n\t }\n\t if (a === undefined || a === null) {\n\t return a;\n\t }\n\t if (typeof a === 'object' && 'lat' in a) {\n\t return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n\t }\n\t if (b === undefined) {\n\t return null;\n\t }\n\t return new LatLon(a, b, c);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * Point is a helper class for ensuring consistent world positions.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n\t */\n\t\n\tvar Point = (function () {\n\t function Point(x, y, round) {\n\t _classCallCheck(this, Point);\n\t\n\t this.x = round ? Math.round(x) : x;\n\t this.y = round ? Math.round(y) : y;\n\t }\n\t\n\t // Accepts (point), ([x, y]) and (x, y, round)\n\t\n\t _createClass(Point, [{\n\t key: \"clone\",\n\t value: function clone() {\n\t return new Point(this.x, this.y);\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"add\",\n\t value: function add(point) {\n\t return this.clone()._add(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_add\",\n\t value: function _add(point) {\n\t this.x += point.x;\n\t this.y += point.y;\n\t return this;\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"subtract\",\n\t value: function subtract(point) {\n\t return this.clone()._subtract(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_subtract\",\n\t value: function _subtract(point) {\n\t this.x -= point.x;\n\t this.y -= point.y;\n\t return this;\n\t }\n\t }]);\n\t\n\t return Point;\n\t})();\n\t\n\tvar _point = function _point(x, y, round) {\n\t if (x instanceof Point) {\n\t return x;\n\t }\n\t if (Array.isArray(x)) {\n\t return new Point(x[0], x[1]);\n\t }\n\t if (x === undefined || x === null) {\n\t return x;\n\t }\n\t return new Point(x, y, round);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports[\"default\"] = _point;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/*\n\t * Wrap the given number to lie within a certain range (eg. longitude)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n\t */\n\t\n\tvar wrapNum = function wrapNum(x, range, includeMax) {\n\t var max = range[1];\n\t var min = range[0];\n\t var d = max - min;\n\t return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n\t};\n\t\n\texports[\"default\"] = wrapNum;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n\t * used by default.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar SphericalMercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t MAX_LATITUDE: 85.0511287798,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var max = this.MAX_LATITUDE;\n\t var lat = Math.max(Math.min(max, latlon.lat), -max);\n\t var sin = Math.sin(lat * d);\n\t\n\t return (0, _Point2['default'])(this.R * latlon.lon * d, this.R * Math.log((1 + sin) / (1 - sin)) / 2);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t\n\t return (0, _LatLon2['default'])((2 * Math.atan(Math.exp(point.y / this.R)) - Math.PI / 2) * d, point.x * d / this.R);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Accurate scale factor uses proper Web Mercator scaling\n\t // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t // See: http://jsfiddle.net/robhawkes/yws924cf/\n\t pointScale: function pointScale(latlon, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var k;\n\t\n\t if (!accurate) {\n\t k = 1 / Math.cos(latlon.lat * rad);\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t } else {\n\t var lat = latlon.lat * rad;\n\t var lon = latlon.lon * rad;\n\t\n\t var a = this.R;\n\t\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t\n\t var cosLat = Math.cos(lat);\n\t\n\t // Radius meridian\n\t var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\t\n\t // Radius prime meridian\n\t var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\t\n\t // Scale N/S\n\t var h = a / p / cosLat;\n\t\n\t // Scale E/W\n\t k = a / v / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, h];\n\t }\n\t },\n\t\n\t // Not using this.R due to scoping\n\t bounds: (function () {\n\t var d = 6378137 * Math.PI;\n\t return [[-d, -d], [d, d]];\n\t })()\n\t};\n\t\n\texports['default'] = SphericalMercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * Transformation is an utility class to perform simple point transformations\n\t * through a 2d-matrix.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n\t */\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar Transformation = (function () {\n\t function Transformation(a, b, c, d) {\n\t _classCallCheck(this, Transformation);\n\t\n\t this._a = a;\n\t this._b = b;\n\t this._c = c;\n\t this._d = d;\n\t }\n\t\n\t _createClass(Transformation, [{\n\t key: 'transform',\n\t value: function transform(point, scale) {\n\t // Copy input point as to not destroy the original data\n\t return this._transform(point.clone(), scale);\n\t }\n\t\n\t // Destructive transform (faster)\n\t }, {\n\t key: '_transform',\n\t value: function _transform(point, scale) {\n\t scale = scale || 1;\n\t\n\t point.x = scale * (this._a * point.x + this._b);\n\t point.y = scale * (this._c * point.y + this._d);\n\t return point;\n\t }\n\t }, {\n\t key: 'untransform',\n\t value: function untransform(point, scale) {\n\t scale = scale || 1;\n\t return (0, _geoPoint2['default'])((point.x / scale - this._b) / this._a, (point.y / scale - this._d) / this._c);\n\t }\n\t }]);\n\t\n\t return Transformation;\n\t})();\n\t\n\texports['default'] = Transformation;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionMercator = __webpack_require__(16);\n\t\n\tvar _projectionProjectionMercator2 = _interopRequireDefault(_projectionProjectionMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3395 = {\n\t code: 'EPSG:3395',\n\t projection: _projectionProjectionMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3395 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3395);\n\t\n\texports['default'] = EPSG3395;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Mercator projection that takes into account that the Earth is not a perfect\n\t * sphere. Less popular than spherical mercator; used by projections like\n\t * EPSG:3395.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Mercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t R_MINOR: 6356752.314245179,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var r = this.R;\n\t var y = latlon.lat * d;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var con = e * Math.sin(y);\n\t\n\t var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n\t y = -r * Math.log(Math.max(ts, 1E-10));\n\t\n\t return (0, _Point2['default'])(latlon.lon * d * r, y);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t var r = this.R;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var ts = Math.exp(-point.y / r);\n\t var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\t\n\t for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n\t con = e * Math.sin(phi);\n\t con = Math.pow((1 - con) / (1 + con), e / 2);\n\t dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n\t phi += dphi;\n\t }\n\t\n\t return (0, _LatLon2['default'])(phi * d, point.x * d / r);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t pointScale: function pointScale(latlon) {\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t var cosLat = Math.cos(lat);\n\t\n\t var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t },\n\t\n\t bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n\t};\n\t\n\texports['default'] = Mercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG4326 = {\n\t code: 'EPSG:4326',\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / 180,\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t //\n\t // TODO: Cannot use this.transformScale due to scope\n\t transformation: new _utilTransformation2['default'](1 / 180, 0, -1 / 180, 0)\n\t};\n\t\n\tvar EPSG4326 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG4326);\n\t\n\texports['default'] = EPSG4326;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n\t * and Simple.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar ProjectionLatLon = {\n\t project: function project(latlon) {\n\t return (0, _Point2['default'])(latlon.lon, latlon.lat);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t return (0, _LatLon2['default'])(point.y, point.x);\n\t },\n\t\n\t // Scale factor for converting between real metres and degrees\n\t //\n\t // degrees = realMetres * pointScale\n\t // realMetres = degrees / pointScale\n\t //\n\t // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n\t // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n\t pointScale: function pointScale(latlon) {\n\t var m1 = 111132.92;\n\t var m2 = -559.82;\n\t var m3 = 1.175;\n\t var m4 = -0.0023;\n\t var p1 = 111412.84;\n\t var p2 = -93.5;\n\t var p3 = 0.118;\n\t\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t\n\t var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n\t var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\t\n\t return [1 / latlen, 1 / lonlen];\n\t },\n\t\n\t bounds: [[-180, -90], [180, 90]]\n\t};\n\t\n\texports['default'] = ProjectionLatLon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n\t * maps.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Simple = {\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Straight 1:1 mapping (-1, -1 would be top-left)\n\t transformation: new _utilTransformation2['default'](1, 0, 1, 0),\n\t\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom) {\n\t return Math.pow(2, zoom);\n\t // Else, make no change to scale – may need to increase this or make it a\n\t // user-definable variable\n\t } else {\n\t return 1;\n\t }\n\t },\n\t\n\t zoom: function zoom(scale) {\n\t return Math.log(scale) / Math.LN2;\n\t },\n\t\n\t distance: function distance(latlon1, latlon2) {\n\t var dx = latlon2.lon - latlon1.lon;\n\t var dy = latlon2.lat - latlon1.lat;\n\t\n\t return Math.sqrt(dx * dx + dy * dy);\n\t },\n\t\n\t infinite: true\n\t};\n\t\n\tvar Simple = (0, _lodashAssign2['default'])({}, _CRS2['default'], _Simple);\n\t\n\texports['default'] = Simple;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Proj4 for any Proj4-supported CRS.\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionProj4 = __webpack_require__(21);\n\t\n\tvar _projectionProjectionProj42 = _interopRequireDefault(_projectionProjectionProj4);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Proj4 = function _Proj4(code, def, bounds) {\n\t var projection = (0, _projectionProjectionProj42['default'])(def, bounds);\n\t\n\t // Transformation calcuations\n\t var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n\t var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\t\n\t var halfX = diffX / 2;\n\t var halfY = diffY / 2;\n\t\n\t // This is the raw scale factor\n\t var scaleX = 1 / halfX;\n\t var scaleY = 1 / halfY;\n\t\n\t // Find the minimum scale factor\n\t //\n\t // The minimum scale factor comes from the largest side and is the one\n\t // you want to use for both axis so they stay relative in dimension\n\t var scale = Math.min(scaleX, scaleY);\n\t\n\t // Find amount to offset each axis by to make the central point lie on\n\t // the [0,0] origin\n\t var offsetX = scale * (projection.bounds[0][0] + halfX);\n\t var offsetY = scale * (projection.bounds[0][1] + halfY);\n\t\n\t return {\n\t code: code,\n\t projection: projection,\n\t\n\t transformScale: scale,\n\t\n\t // Map the input to a [-1,1] range with [0,0] in the centre\n\t transformation: new _utilTransformation2['default'](scale, -offsetX, -scale, offsetY)\n\t };\n\t};\n\t\n\tvar Proj4 = function Proj4(code, def, bounds) {\n\t return (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _Proj4(code, def, bounds));\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Proj4 support for any projection.\n\t */\n\t\n\tvar _proj4 = __webpack_require__(22);\n\t\n\tvar _proj42 = _interopRequireDefault(_proj4);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Proj4 = function Proj4(def, bounds) {\n\t var proj = (0, _proj42['default'])(def);\n\t\n\t var project = function project(latlon) {\n\t return (0, _Point2['default'])(proj.forward([latlon.lon, latlon.lat]));\n\t };\n\t\n\t var unproject = function unproject(point) {\n\t var inverse = proj.inverse([point.x, point.y]);\n\t return (0, _LatLon2['default'])(inverse[1], inverse[0]);\n\t };\n\t\n\t return {\n\t project: project,\n\t unproject: unproject,\n\t\n\t // Scale factor for converting between real metres and projected metres\\\n\t //\n\t // Need to work out the best way to provide the pointScale calculations\n\t // for custom, unknown projections (if wanting to override default)\n\t //\n\t // For now, user can manually override crs.pointScale or\n\t // crs.projection.pointScale\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t pointScale: function pointScale(latlon, accurate) {\n\t return [1, 1];\n\t },\n\t\n\t // Try and calculate bounds if none are provided\n\t //\n\t // This will provide incorrect bounds for some projections, so perhaps make\n\t // bounds a required input instead\n\t bounds: (function () {\n\t if (bounds) {\n\t return bounds;\n\t } else {\n\t var bottomLeft = project([-90, -180]);\n\t var topRight = project([90, 180]);\n\t\n\t return [bottomLeft, topRight];\n\t }\n\t })()\n\t };\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\tvar _Renderer = __webpack_require__(26);\n\t\n\tvar _Renderer2 = _interopRequireDefault(_Renderer);\n\t\n\tvar _Camera = __webpack_require__(27);\n\t\n\tvar _Camera2 = _interopRequireDefault(_Camera);\n\t\n\tvar Engine = (function (_EventEmitter) {\n\t _inherits(Engine, _EventEmitter);\n\t\n\t function Engine(container) {\n\t _classCallCheck(this, Engine);\n\t\n\t console.log('Init Engine');\n\t\n\t _get(Object.getPrototypeOf(Engine.prototype), 'constructor', this).call(this);\n\t\n\t this._scene = _Scene2['default'];\n\t this._renderer = (0, _Renderer2['default'])(container);\n\t this._camera = (0, _Camera2['default'])(container);\n\t this.clock = new _three2['default'].Clock();\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(Engine, [{\n\t key: 'update',\n\t value: function update(delta) {\n\t this.emit('preRender');\n\t this._renderer.render(this._scene, this._camera);\n\t this.emit('postRender');\n\t }\n\t }]);\n\t\n\t return Engine;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (container) {\n\t return new Engine(container);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can be imported from anywhere and will still reference the same scene,\n\t// though there is a helper reference in Engine.scene\n\t\n\texports['default'] = (function () {\n\t var scene = new _three2['default'].Scene();\n\t scene.fog = new _three2['default'].Fog(0xffffff, 1, 15000);\n\t return scene;\n\t})();\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\t// This can only be accessed from Engine.renderer if you want to reference the\n\t// same scene in multiple places\n\t\n\texports['default'] = function (container) {\n\t var renderer = new _three2['default'].WebGLRenderer({\n\t antialias: true\n\t });\n\t\n\t renderer.setClearColor(_Scene2['default'].fog.color, 1);\n\t\n\t // Gamma settings make things look nicer\n\t renderer.gammaInput = true;\n\t renderer.gammaOutput = true;\n\t\n\t container.appendChild(renderer.domElement);\n\t\n\t var updateSize = function updateSize() {\n\t renderer.setSize(container.clientWidth, container.clientHeight);\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return renderer;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can only be accessed from Engine.camera if you want to reference the\n\t// same scene in multiple places\n\t\n\t// TODO: Ensure that FOV looks natural on all aspect ratios\n\t// http://stackoverflow.com/q/26655930/997339\n\t\n\texports['default'] = function (container) {\n\t var camera = new _three2['default'].PerspectiveCamera(45, 1, 1, 40000);\n\t camera.position.y = 400;\n\t camera.position.z = 400;\n\t\n\t var updateSize = function updateSize() {\n\t camera.aspect = container.clientWidth / container.clientHeight;\n\t camera.updateProjectionMatrix();\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return camera;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _ControlsOrbit = __webpack_require__(29);\n\t\n\tvar _ControlsOrbit2 = _interopRequireDefault(_ControlsOrbit);\n\t\n\tvar Controls = {\n\t Orbit: _ControlsOrbit2['default']\n\t};\n\t\n\texports['default'] = Controls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _vendorOrbitControls = __webpack_require__(30);\n\t\n\tvar _vendorOrbitControls2 = _interopRequireDefault(_vendorOrbitControls);\n\t\n\tvar Orbit = (function (_EventEmitter) {\n\t _inherits(Orbit, _EventEmitter);\n\t\n\t function Orbit() {\n\t _classCallCheck(this, Orbit);\n\t\n\t _get(Object.getPrototypeOf(Orbit.prototype), 'constructor', this).call(this);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Proxy control events\n\t //\n\t // There's currently no distinction between pan, orbit and zoom events\n\t\n\t _createClass(Orbit, [{\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t var _this = this;\n\t\n\t this._controls.addEventListener('start', function (event) {\n\t _this._world.emit('controlsMoveStart', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('change', function (event) {\n\t _this._world.emit('controlsMove', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('end', function (event) {\n\t _this._world.emit('controlsMoveEnd', event.target.target);\n\t });\n\t }\n\t\n\t // Moving the camera along the [x,y,z] axis based on a target position\n\t }, {\n\t key: '_panTo',\n\t value: function _panTo(point, animate) {}\n\t }, {\n\t key: '_panBy',\n\t value: function _panBy(pointDelta, animate) {}\n\t\n\t // Zooming the camera in and out\n\t }, {\n\t key: '_zoomTo',\n\t value: function _zoomTo(metres, animate) {}\n\t }, {\n\t key: '_zoomBy',\n\t value: function _zoomBy(metresDelta, animate) {}\n\t\n\t // Force camera to look at something other than the target\n\t }, {\n\t key: '_lookAt',\n\t value: function _lookAt(point, animate) {}\n\t\n\t // Make camera look at the target\n\t }, {\n\t key: '_lookAtTarget',\n\t value: function _lookAtTarget() {}\n\t\n\t // Tilt (up and down)\n\t }, {\n\t key: '_tiltTo',\n\t value: function _tiltTo(angle, animate) {}\n\t }, {\n\t key: '_tiltBy',\n\t value: function _tiltBy(angleDelta, animate) {}\n\t\n\t // Rotate (left and right)\n\t }, {\n\t key: '_rotateTo',\n\t value: function _rotateTo(angle, animate) {}\n\t }, {\n\t key: '_rotateBy',\n\t value: function _rotateBy(angleDelta, animate) {}\n\t\n\t // Fly to the given point, animating pan and tilt/rotation to final position\n\t // with nice zoom out and in\n\t //\n\t // Calling flyTo a second time before the previous animation has completed\n\t // will immediately start the new animation from wherever the previous one\n\t // has got to\n\t }, {\n\t key: '_flyTo',\n\t value: function _flyTo(point, noZoom) {}\n\t\n\t // Proxy to OrbitControls.update()\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t this._controls.update();\n\t }\n\t\n\t // Add controls to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addControls(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addControls to actually add the controls\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t\n\t // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n\t // See: http://stackoverflow.com/a/26188674/997339\n\t this._controls = new _vendorOrbitControls2['default'](world._engine._camera, world._container);\n\t\n\t // Disable keys for now as no events are fired for them anyway\n\t this._controls.keys = false;\n\t\n\t // 89 degrees\n\t this._controls.maxPolarAngle = 1.5533;\n\t\n\t // this._controls.enableDamping = true;\n\t // this._controls.dampingFactor = 0.25;\n\t\n\t this._initEvents();\n\t\n\t this.emit('added');\n\t }\n\t }]);\n\t\n\t return Orbit;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function () {\n\t return new Orbit();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\t\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finter swipe\n\t\n\tvar OrbitControls = function OrbitControls(object, domElement) {\n\t\n\t\tthis.object = object;\n\t\n\t\tthis.domElement = domElement !== undefined ? domElement : document;\n\t\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\t\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new _three2['default'].Vector3();\n\t\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\t\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\t\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\t\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\t\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\t\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\t\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\t\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\t\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\t\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\t\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\t\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: _three2['default'].MOUSE.LEFT, ZOOM: _three2['default'].MOUSE.MIDDLE, PAN: _three2['default'].MOUSE.RIGHT };\n\t\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\t\n\t\t//\n\t\t// public methods\n\t\t//\n\t\n\t\tthis.getPolarAngle = function () {\n\t\n\t\t\treturn phi;\n\t\t};\n\t\n\t\tthis.getAzimuthalAngle = function () {\n\t\n\t\t\treturn theta;\n\t\t};\n\t\n\t\tthis.reset = function () {\n\t\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\tscope.update();\n\t\n\t\t\tstate = STATE.NONE;\n\t\t};\n\t\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new _three2['default'].Quaternion().setFromUnitVectors(object.up, new _three2['default'].Vector3(0, 1, 0));\n\t\t\tvar quatInverse = quat.clone().inverse();\n\t\n\t\t\tvar lastPosition = new _three2['default'].Vector3();\n\t\t\tvar lastQuaternion = new _three2['default'].Quaternion();\n\t\n\t\t\treturn function () {\n\t\n\t\t\t\tvar position = scope.object.position;\n\t\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\n\t\t\t\t// angle from z-axis around y-axis\n\t\n\t\t\t\ttheta = Math.atan2(offset.x, offset.z);\n\t\n\t\t\t\t// angle from y-axis\n\t\n\t\t\t\tphi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);\n\t\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\n\t\t\t\ttheta += thetaDelta;\n\t\t\t\tphi += phiDelta;\n\t\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\ttheta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, theta));\n\t\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tphi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, phi));\n\t\n\t\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\t\tphi = Math.max(EPS, Math.min(Math.PI - EPS, phi));\n\t\n\t\t\t\tvar radius = offset.length() * scale;\n\t\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tradius = Math.max(scope.minDistance, Math.min(scope.maxDistance, radius));\n\t\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\n\t\t\t\toffset.x = radius * Math.sin(phi) * Math.sin(theta);\n\t\t\t\toffset.y = radius * Math.cos(phi);\n\t\t\t\toffset.z = radius * Math.sin(phi) * Math.cos(theta);\n\t\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\n\t\t\t\tif (scope.enableDamping === true) {\n\t\n\t\t\t\t\tthetaDelta *= 1 - scope.dampingFactor;\n\t\t\t\t\tphiDelta *= 1 - scope.dampingFactor;\n\t\t\t\t} else {\n\t\n\t\t\t\t\tthetaDelta = 0;\n\t\t\t\t\tphiDelta = 0;\n\t\t\t\t}\n\t\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\n\t\t\t\tif (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\n\t\t\t\treturn false;\n\t\t\t};\n\t\t})();\n\t\n\t\tthis.dispose = function () {\n\t\n\t\t\tscope.domElement.removeEventListener('contextmenu', onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener('mousedown', onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener('mousewheel', onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\t\tscope.domElement.removeEventListener('touchstart', onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener('touchend', onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener('touchmove', onTouchMove, false);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\twindow.removeEventListener('keydown', onKeyDown, false);\n\t\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\t\t};\n\t\n\t\t//\n\t\t// internals\n\t\t//\n\t\n\t\tvar scope = this;\n\t\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\t\n\t\tvar STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\n\t\tvar state = STATE.NONE;\n\t\n\t\tvar EPS = 0.000001;\n\t\n\t\t// current position in spherical coordinates\n\t\tvar theta;\n\t\tvar phi;\n\t\n\t\tvar phiDelta = 0;\n\t\tvar thetaDelta = 0;\n\t\tvar scale = 1;\n\t\tvar panOffset = new _three2['default'].Vector3();\n\t\tvar zoomChanged = false;\n\t\n\t\tvar rotateStart = new _three2['default'].Vector2();\n\t\tvar rotateEnd = new _three2['default'].Vector2();\n\t\tvar rotateDelta = new _three2['default'].Vector2();\n\t\n\t\tvar panStart = new _three2['default'].Vector2();\n\t\tvar panEnd = new _three2['default'].Vector2();\n\t\tvar panDelta = new _three2['default'].Vector2();\n\t\n\t\tvar dollyStart = new _three2['default'].Vector2();\n\t\tvar dollyEnd = new _three2['default'].Vector2();\n\t\tvar dollyDelta = new _three2['default'].Vector2();\n\t\n\t\tfunction getAutoRotationAngle() {\n\t\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\n\t\tfunction getZoomScale() {\n\t\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\n\t\tfunction rotateLeft(angle) {\n\t\n\t\t\tthetaDelta -= angle;\n\t\t}\n\t\n\t\tfunction rotateUp(angle) {\n\t\n\t\t\tphiDelta -= angle;\n\t\t}\n\t\n\t\tvar panLeft = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panLeft( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get X column of objectMatrix\n\t\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( - distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\t// Fixed panning to x/y plane\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\t// var adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[0], 0, te[2]);\n\t\t\t\tv.multiplyScalar(-distance);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// Fixed panning to x/y plane\n\t\tvar panUp = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panUp( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get Y column of objectMatrix\n\t\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\tvar adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[4], 0, te[6]);\n\t\t\t\tv.multiplyScalar(adjDist);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\treturn function (deltaX, deltaY) {\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tvar targetDistance = offset.length();\n\t\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0);\n\t\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else {\n\t\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\t\n\t\tfunction dollyIn(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale /= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\tfunction dollyOut(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale *= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\n\t\tfunction handleMouseDownRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\t\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\t\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownPan(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownPan' );\n\t\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\t\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMovePan(event) {\n\t\n\t\t\t//console.log( 'handleMouseMovePan' );\n\t\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseUp(event) {\n\t\n\t\t\t//console.log( 'handleMouseUp' );\n\t\n\t\t}\n\t\n\t\tfunction handleMouseWheel(event) {\n\t\n\t\t\t//console.log( 'handleMouseWheel' );\n\t\n\t\t\tvar delta = 0;\n\t\n\t\t\tif (event.wheelDelta !== undefined) {\n\t\n\t\t\t\t// WebKit / Opera / Explorer 9\n\t\n\t\t\t\tdelta = event.wheelDelta;\n\t\t\t} else if (event.detail !== undefined) {\n\t\n\t\t\t\t// Firefox\n\t\n\t\t\t\tdelta = -event.detail;\n\t\t\t}\n\t\n\t\t\tif (delta > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (delta < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleKeyDown(event) {\n\t\n\t\t\t//console.log( 'handleKeyDown' );\n\t\n\t\t\tswitch (event.keyCode) {\n\t\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction handleTouchStartRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\t\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchStartDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\t\n\t\t\tvar dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tvar dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\n\t\tfunction handleTouchStartPan(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartPan' );\n\t\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\t\n\t\t\tvar dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tvar dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyEnd.set(0, distance);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMovePan(event) {\n\t\n\t\t\t//console.log( 'handleTouchMovePan' );\n\t\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchEnd(event) {}\n\t\n\t\t//console.log( 'handleTouchEnd' );\n\t\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\n\t\tfunction onMouseDown(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (event.button === scope.mouseButtons.ORBIT) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseDownRotate(event);\n\t\n\t\t\t\tstate = STATE.ROTATE;\n\t\t\t} else if (event.button === scope.mouseButtons.ZOOM) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseDownDolly(event);\n\t\n\t\t\t\tstate = STATE.DOLLY;\n\t\t\t} else if (event.button === scope.mouseButtons.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseDownPan(event);\n\t\n\t\t\t\tstate = STATE.PAN;\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tdocument.addEventListener('mousemove', onMouseMove, false);\n\t\t\t\tdocument.addEventListener('mouseup', onMouseUp, false);\n\t\t\t\tdocument.addEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (state === STATE.ROTATE) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t} else if (state === STATE.DOLLY) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t} else if (state === STATE.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseMovePan(event);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseUp(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleMouseUp(event);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onMouseWheel(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\thandleMouseWheel(event);\n\t\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\n\t\tfunction onKeyDown(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return;\n\t\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\n\t\tfunction onTouchStart(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\t\thandleTouchStartPan(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMovePan(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchEnd(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleTouchEnd(event);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onContextMenu(event) {\n\t\n\t\t\tevent.preventDefault();\n\t\t}\n\t\n\t\t//\n\t\n\t\tscope.domElement.addEventListener('contextmenu', onContextMenu, false);\n\t\n\t\tscope.domElement.addEventListener('mousedown', onMouseDown, false);\n\t\tscope.domElement.addEventListener('mousewheel', onMouseWheel, false);\n\t\tscope.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\tscope.domElement.addEventListener('touchstart', onTouchStart, false);\n\t\tscope.domElement.addEventListener('touchend', onTouchEnd, false);\n\t\tscope.domElement.addEventListener('touchmove', onTouchMove, false);\n\t\n\t\twindow.addEventListener('keydown', onKeyDown, false);\n\t\n\t\t// force an update at start\n\t\n\t\tthis.update();\n\t};\n\t\n\tOrbitControls.prototype = Object.create(_three2['default'].EventDispatcher.prototype);\n\tOrbitControls.prototype.constructor = _three2['default'].OrbitControls;\n\t\n\tObject.defineProperties(OrbitControls.prototype, {\n\t\n\t\tcenter: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .center has been renamed to .target');\n\t\t\t\treturn this.target;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t// backward compatibility\n\t\n\t\tnoZoom: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\treturn !this.enableZoom;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\tthis.enableZoom = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoRotate: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\treturn !this.enableRotate;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\tthis.enableRotate = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoPan: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\treturn !this.enablePan;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\tthis.enablePan = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoKeys: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\treturn !this.enableKeys;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\tthis.enableKeys = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tstaticMoving: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\treturn !this.constraint.enableDamping;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\tthis.constraint.enableDamping = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tdynamicDampingFactor: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\treturn this.constraint.dampingFactor;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\tthis.constraint.dampingFactor = value;\n\t\t\t}\n\t\n\t\t}\n\t\n\t});\n\t\n\texports['default'] = OrbitControls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar EnvironmentLayer = (function (_Layer) {\n\t _inherits(EnvironmentLayer, _Layer);\n\t\n\t function EnvironmentLayer() {\n\t _classCallCheck(this, EnvironmentLayer);\n\t\n\t _get(Object.getPrototypeOf(EnvironmentLayer.prototype), 'constructor', this).call(this);\n\t\n\t this._initLights();\n\t // this._initGrid();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(EnvironmentLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd() {}\n\t\n\t // Not fleshed out or thought through yet\n\t //\n\t // Lights could potentially be put it their own 'layer' to keep this class\n\t // much simpler and less messy\n\t }, {\n\t key: '_initLights',\n\t value: function _initLights() {\n\t // Position doesn't really matter (the angle is important), however it's\n\t // used here so the helpers look more natural.\n\t\n\t var directionalLight = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight.intesity = 0.1;\n\t directionalLight.position.x = 100;\n\t directionalLight.position.y = 100;\n\t directionalLight.position.z = 100;\n\t\n\t var directionalLight2 = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight2.intesity = 0.1;\n\t directionalLight2.position.x = -100;\n\t directionalLight2.position.y = 100;\n\t directionalLight2.position.z = -100;\n\t\n\t var helper = new _three2['default'].DirectionalLightHelper(directionalLight, 10);\n\t var helper2 = new _three2['default'].DirectionalLightHelper(directionalLight2, 10);\n\t\n\t this._layer.add(directionalLight);\n\t this._layer.add(directionalLight2);\n\t\n\t this._layer.add(helper);\n\t this._layer.add(helper2);\n\t }\n\t\n\t // Add grid helper for context during initial development\n\t }, {\n\t key: '_initGrid',\n\t value: function _initGrid() {\n\t var size = 4000;\n\t var step = 100;\n\t\n\t var gridHelper = new _three2['default'].GridHelper(size, step);\n\t this._layer.add(gridHelper);\n\t }\n\t }]);\n\t\n\t return EnvironmentLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = function () {\n\t return new EnvironmentLayer();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _engineScene = __webpack_require__(25);\n\t\n\tvar _engineScene2 = _interopRequireDefault(_engineScene);\n\t\n\tvar Layer = (function (_EventEmitter) {\n\t _inherits(Layer, _EventEmitter);\n\t\n\t function Layer() {\n\t _classCallCheck(this, Layer);\n\t\n\t _get(Object.getPrototypeOf(Layer.prototype), 'constructor', this).call(this);\n\t\n\t this._layer = new _three2['default'].Object3D();\n\t }\n\t\n\t // Add layer to world instance and store world reference\n\t\n\t _createClass(Layer, [{\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addLayer(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addLayer to actually add the layer\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t this._onAdd(world);\n\t this.emit('added');\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world = null;\n\t this._layer = null;\n\t }\n\t }]);\n\t\n\t return Layer;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = Layer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _TileLayer2 = __webpack_require__(34);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _ImageTile = __webpack_require__(44);\n\t\n\tvar _ImageTile2 = _interopRequireDefault(_ImageTile);\n\t\n\tvar _ImageTileLayerBaseMaterial = __webpack_require__(47);\n\t\n\tvar _ImageTileLayerBaseMaterial2 = _interopRequireDefault(_ImageTileLayerBaseMaterial);\n\t\n\tvar _lodashThrottle = __webpack_require__(48);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n\t// being removed and the new tiles being ready for display\n\t//\n\t// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n\t// of the basemap ground so it blends in a little more, or have a huge ground\n\t// plane underneath all the tiles that shows through between tile updates.\n\t//\n\t// Could keep the old tiles around until the new ones are ready, though they'd\n\t// probably need to be layered in a way so the old tiles don't overlap new ones,\n\t// which is similar to how Leaflet approaches this (it has 2 layers)\n\t//\n\t// Could keep the tile from the previous quadtree level visible until all 4\n\t// tiles at the new / current level have finished loading and are displayed.\n\t// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n\t// child quadcodes showing whether they are loaded and in view. If all true then\n\t// remove the parent tile, otherwise keep it on a lower layer.\n\t\n\t// TODO: Load and display a base layer separate to the LOD grid that is at a low\n\t// resolution – used as a backup / background to fill in empty areas / distance\n\t\n\t// DONE: Fix the issue where some tiles just don't load, or at least the texture\n\t// never shows up – tends to happen if you quickly zoom in / out past it while\n\t// it's still loading, leaving a blank space\n\t\n\t// TODO: Optimise the request of many image tiles – look at how Leaflet and\n\t// OpenWebGlobe approach this (eg. batching, queues, etc)\n\t\n\t// TODO: Cancel pending tile requests if they get removed from view before they\n\t// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n\t// images are re-requested when the tile is next in scene (even if from cache)\n\t\n\t// TODO: Consider not performing an LOD calculation on every frame, instead only\n\t// on move end so panning, orbiting and zooming stays smooth. Otherwise it's\n\t// possible for performance to tank if you pan, orbit or zoom rapidly while all\n\t// the LOD calculations are being made and new tiles requested.\n\t//\n\t// Pending tiles should continue to be requested and output to the scene on each\n\t// frame, but no new LOD calculations should be made.\n\t\n\tvar ImageTileLayer = (function (_TileLayer) {\n\t _inherits(ImageTileLayer, _TileLayer);\n\t\n\t function ImageTileLayer(path, options) {\n\t _classCallCheck(this, ImageTileLayer);\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(ImageTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t // Add base layer\n\t var geom = new _three2['default'].PlaneBufferGeometry(40000, 40000, 1);\n\t var mesh = new _three2['default'].Mesh(geom, (0, _ImageTileLayerBaseMaterial2['default'])('#f5f5f3'));\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t this._baseLayer = mesh;\n\t this._layer.add(mesh);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t _this._initEvents();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_moveBaseLayer',\n\t value: function _moveBaseLayer(point) {\n\t this._baseLayer.position.x = point.x;\n\t this._baseLayer.position.z = point.y;\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t return (0, _ImageTile2['default'])(quadcode, this._path, layer);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Dispose of mesh and materials\n\t this._baseLayer.geometry.dispose();\n\t this._baseLayer.geometry = null;\n\t\n\t if (this._baseLayer.material.map) {\n\t this._baseLayer.material.map.dispose();\n\t this._baseLayer.material.map = null;\n\t }\n\t\n\t this._baseLayer.material.dispose();\n\t this._baseLayer.material = null;\n\t\n\t this._baseLayer = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return ImageTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new ImageTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _TileCache = __webpack_require__(35);\n\t\n\tvar _TileCache2 = _interopRequireDefault(_TileCache);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// TODO: Consider keeping a single TileLayer / LOD instance running by default\n\t// that keeps a standard LOD grid for other layers to utilise, rather than\n\t// having to create their own, unique LOD grid and duplicate calculations when\n\t// they're going to use the same grid setup anyway\n\t//\n\t// It still makes sense to be able to have a custom LOD grid for some layers as\n\t// they may want to customise things, maybe not even using a quadtree at all!\n\t//\n\t// Perhaps it makes sense to split out the quadtree stuff into a singleton and\n\t// pass in the necessary parameters each time for the calculation step.\n\t//\n\t// Either way, it seems silly to force layers to have to create a new LOD grid\n\t// each time and create extra, duplicated processing every frame.\n\t\n\t// TODO: Allow passing in of options to define min/max LOD and a distance to use\n\t// for culling tiles beyond that distance.\n\t\n\t// DONE: Prevent tiles from being loaded if they are further than a certain\n\t// distance from the camera and are unlikely to be seen anyway\n\t\n\t// TODO: Avoid performing LOD calculation when it isn't required. For example,\n\t// when nothing has changed since the last frame and there are no tiles to be\n\t// loaded or in need of rendering\n\t\n\t// TODO: Only remove tiles from the layer that aren't to be rendered in the\n\t// current frame – it seems excessive to remove all tiles and re-add them on\n\t// every single frame, even if it's just array manipulation\n\t\n\t// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n\t// problems (eg. making min above 5 causes all sorts of issues)\n\t\n\t// TODO: Reuse THREE objects where possible instead of creating new instances\n\t// on every LOD calculation\n\t\n\t// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n\t// to avoid creating unnecessary memory for garbage collection\n\t\n\t// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n\t// closest to the camera) so visual inconsistancies during loading are minimised\n\t\n\tvar TileLayer = (function (_Layer) {\n\t _inherits(TileLayer, _Layer);\n\t\n\t function TileLayer(options) {\n\t var _this = this;\n\t\n\t _classCallCheck(this, TileLayer);\n\t\n\t _get(Object.getPrototypeOf(TileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t var defaults = {\n\t maxCache: 1000,\n\t maxLOD: 18\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._tileCache = (0, _TileCache2['default'])(this._options.maxCache, function (tile) {\n\t _this._destroyTile(tile);\n\t });\n\t\n\t // TODO: Work out why changing the minLOD causes loads of issues\n\t this._minLOD = 3;\n\t this._maxLOD = this._options.maxLOD;\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t this._tiles = new _three2['default'].Object3D();\n\t }\n\t\n\t _createClass(TileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t this._layer.add(this._tiles);\n\t }\n\t }, {\n\t key: '_updateFrustum',\n\t value: function _updateFrustum() {\n\t var camera = this._world.getCamera();\n\t var projScreenMatrix = new _three2['default'].Matrix4();\n\t projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\n\t this._frustum.setFromMatrix(camera.projectionMatrix);\n\t this._frustum.setFromMatrix(new _three2['default'].Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n\t }\n\t }, {\n\t key: '_tileInFrustum',\n\t value: function _tileInFrustum(tile) {\n\t var bounds = tile.getBounds();\n\t return this._frustum.intersectsBox(new _three2['default'].Box3(new _three2['default'].Vector3(bounds[0], 0, bounds[3]), new _three2['default'].Vector3(bounds[2], 0, bounds[1])));\n\t }\n\t }, {\n\t key: '_calculateLOD',\n\t value: function _calculateLOD() {\n\t var _this2 = this;\n\t\n\t if (this._stop || !this._world) {\n\t return;\n\t }\n\t\n\t // var start = performance.now();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // 1. Update and retrieve camera frustum\n\t this._updateFrustum(this._frustum, camera);\n\t\n\t // 2. Add the four root items of the quadtree to a check list\n\t var checkList = this._checklist;\n\t checkList = [];\n\t checkList.push(this._requestTile('0', this));\n\t checkList.push(this._requestTile('1', this));\n\t checkList.push(this._requestTile('2', this));\n\t checkList.push(this._requestTile('3', this));\n\t\n\t // 3. Call Divide, passing in the check list\n\t this._divide(checkList);\n\t\n\t // 4. Remove all tiles from layer\n\t this._removeTiles();\n\t\n\t // 5. Render the tiles remaining in the check list\n\t checkList.forEach(function (tile, index) {\n\t // Skip tile if it's not in the current view frustum\n\t if (!_this2._tileInFrustum(tile)) {\n\t return;\n\t }\n\t\n\t if (_this2._options.distance && _this2._options.distance > 0) {\n\t // TODO: Can probably speed this up\n\t var center = tile.getCenter();\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t // Manual distance limit to cut down on tiles so far away\n\t if (dist > _this2._options.distance) {\n\t return;\n\t }\n\t }\n\t\n\t // Does the tile have a mesh?\n\t //\n\t // If yes, continue\n\t // If no, generate tile mesh, request texture and skip\n\t if (!tile.getMesh()) {\n\t tile.requestTileAsync();\n\t return;\n\t }\n\t\n\t // Are the mesh and texture ready?\n\t //\n\t // If yes, continue\n\t // If no, skip\n\t if (!tile.isReady()) {\n\t return;\n\t }\n\t\n\t // Add tile to layer (and to scene)\n\t _this2._tiles.add(tile.getMesh());\n\t });\n\t\n\t // console.log(performance.now() - start);\n\t }\n\t }, {\n\t key: '_divide',\n\t value: function _divide(checkList) {\n\t var count = 0;\n\t var currentItem;\n\t var quadcode;\n\t\n\t // 1. Loop until count equals check list length\n\t while (count != checkList.length) {\n\t currentItem = checkList[count];\n\t quadcode = currentItem.getQuadcode();\n\t\n\t // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n\t if (currentItem.length === this._maxLOD) {\n\t count++;\n\t continue;\n\t }\n\t\n\t // 3. Else, calculate screen-space error metric for quadcode\n\t if (this._screenSpaceError(currentItem)) {\n\t // 4. If error is sufficient...\n\t\n\t // 4a. Remove parent item from the check list\n\t checkList.splice(count, 1);\n\t\n\t // 4b. Add 4 child items to the check list\n\t checkList.push(this._requestTile(quadcode + '0', this));\n\t checkList.push(this._requestTile(quadcode + '1', this));\n\t checkList.push(this._requestTile(quadcode + '2', this));\n\t checkList.push(this._requestTile(quadcode + '3', this));\n\t\n\t // 4d. Continue the loop without increasing count\n\t continue;\n\t } else {\n\t // 5. Else, increase count and continue loop\n\t count++;\n\t }\n\t }\n\t }\n\t }, {\n\t key: '_screenSpaceError',\n\t value: function _screenSpaceError(tile) {\n\t var minDepth = this._minLOD;\n\t var maxDepth = this._maxLOD;\n\t\n\t var quadcode = tile.getQuadcode();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // Tweak this value to refine specific point that each quad is subdivided\n\t //\n\t // It's used to multiple the dimensions of the tile sides before\n\t // comparing against the tile distance from camera\n\t var quality = 3.0;\n\t\n\t // 1. Return false if quadcode length equals maxDepth (stop dividing)\n\t if (quadcode.length === maxDepth) {\n\t return false;\n\t }\n\t\n\t // 2. Return true if quadcode length is less than minDepth\n\t if (quadcode.length < minDepth) {\n\t return true;\n\t }\n\t\n\t // 3. Return false if quadcode bounds are not in view frustum\n\t if (!this._tileInFrustum(tile)) {\n\t return false;\n\t }\n\t\n\t var center = tile.getCenter();\n\t\n\t // 4. Calculate screen-space error metric\n\t // TODO: Use closest distance to one of the 4 tile corners\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t var error = quality * tile.getSide() / dist;\n\t\n\t // 5. Return true if error is greater than 1.0, else return false\n\t return error > 1.0;\n\t }\n\t }, {\n\t key: '_removeTiles',\n\t value: function _removeTiles() {\n\t for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t }\n\t\n\t // Return a new tile instance\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {}\n\t\n\t // Get a cached tile or request a new one if not in cache\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile(quadcode, layer) {\n\t var tile = this._tileCache.getTile(quadcode);\n\t\n\t if (!tile) {\n\t // Set up a brand new tile\n\t tile = this._createTile(quadcode, layer);\n\t\n\t // Add tile to cache, though it won't be ready yet as the data is being\n\t // requested from various places asynchronously\n\t this._tileCache.setTile(quadcode, tile);\n\t }\n\t\n\t return tile;\n\t }\n\t }, {\n\t key: '_destroyTile',\n\t value: function _destroyTile(tile) {\n\t // Remove tile from scene\n\t this._layer.remove(tile);\n\t\n\t // Delete any references to the tile within this component\n\t\n\t // Call destory on tile instance\n\t tile.destroy();\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t var i;\n\t\n\t // Remove all tiles\n\t for (i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t\n\t // Remove everything else in the layer\n\t for (i = this._layer.children.length - 1; i >= 0; i--) {\n\t this._layer.remove(this._layer.children[i]);\n\t }\n\t\n\t this._tileCache.destroy();\n\t this._tileCache = null;\n\t\n\t this._world = null;\n\t this._tiles = null;\n\t this._layer = null;\n\t this._frustum = null;\n\t }\n\t }]);\n\t\n\t return TileLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = TileLayer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _lruCache = __webpack_require__(36);\n\t\n\tvar _lruCache2 = _interopRequireDefault(_lruCache);\n\t\n\t// This process is based on a similar approach taken by OpenWebGlobe\n\t// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\t\n\tvar TileCache = (function () {\n\t function TileCache(cacheLimit, onDestroyTile) {\n\t _classCallCheck(this, TileCache);\n\t\n\t this._cache = (0, _lruCache2['default'])({\n\t max: cacheLimit,\n\t dispose: function dispose(key, tile) {\n\t onDestroyTile(tile);\n\t }\n\t });\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Returns true if all specified tile providers are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(TileCache, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return false;\n\t }\n\t\n\t // Get a cached tile without requesting a new one\n\t }, {\n\t key: 'getTile',\n\t value: function getTile(quadcode) {\n\t return this._cache.get(quadcode);\n\t }\n\t\n\t // Add tile to cache\n\t }, {\n\t key: 'setTile',\n\t value: function setTile(quadcode, tile) {\n\t this._cache.set(quadcode, tile);\n\t }\n\t\n\t // Destroy the cache and remove it from memory\n\t //\n\t // TODO: Call destroy method on items in cache\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cache.reset();\n\t this._cache = null;\n\t }\n\t }]);\n\t\n\t return TileCache;\n\t})();\n\t\n\texports['default'] = function (cacheLimit, onDestroyTile) {\n\t return new TileCache(cacheLimit, onDestroyTile);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = LRUCache\n\t\n\t// This will be a proper iterable 'Map' in engines that support it,\n\t// or a fakey-fake PseudoMap in older versions.\n\tvar Map = __webpack_require__(37)\n\tvar util = __webpack_require__(40)\n\t\n\t// A linked list to keep track of recently-used-ness\n\tvar Yallist = __webpack_require__(43)\n\t\n\t// use symbols if possible, otherwise just _props\n\tvar symbols = {}\n\tvar hasSymbol = typeof Symbol === 'function'\n\tvar makeSymbol\n\tif (hasSymbol) {\n\t makeSymbol = function (key) {\n\t return Symbol.for(key)\n\t }\n\t} else {\n\t makeSymbol = function (key) {\n\t return '_' + key\n\t }\n\t}\n\t\n\tfunction priv (obj, key, val) {\n\t var sym\n\t if (symbols[key]) {\n\t sym = symbols[key]\n\t } else {\n\t sym = makeSymbol(key)\n\t symbols[key] = sym\n\t }\n\t if (arguments.length === 2) {\n\t return obj[sym]\n\t } else {\n\t obj[sym] = val\n\t return val\n\t }\n\t}\n\t\n\tfunction naiveLength () { return 1 }\n\t\n\t// lruList is a yallist where the head is the youngest\n\t// item, and the tail is the oldest. the list contains the Hit\n\t// objects as the entries.\n\t// Each Hit object has a reference to its Yallist.Node. This\n\t// never changes.\n\t//\n\t// cache is a Map (or PseudoMap) that matches the keys to\n\t// the Yallist.Node object.\n\tfunction LRUCache (options) {\n\t if (!(this instanceof LRUCache)) {\n\t return new LRUCache(options)\n\t }\n\t\n\t if (typeof options === 'number') {\n\t options = { max: options }\n\t }\n\t\n\t if (!options) {\n\t options = {}\n\t }\n\t\n\t var max = priv(this, 'max', options.max)\n\t // Kind of weird to have a default max of Infinity, but oh well.\n\t if (!max ||\n\t !(typeof max === 'number') ||\n\t max <= 0) {\n\t priv(this, 'max', Infinity)\n\t }\n\t\n\t var lc = options.length || naiveLength\n\t if (typeof lc !== 'function') {\n\t lc = naiveLength\n\t }\n\t priv(this, 'lengthCalculator', lc)\n\t\n\t priv(this, 'allowStale', options.stale || false)\n\t priv(this, 'maxAge', options.maxAge || 0)\n\t priv(this, 'dispose', options.dispose)\n\t this.reset()\n\t}\n\t\n\t// resize the cache when the max changes.\n\tObject.defineProperty(LRUCache.prototype, 'max', {\n\t set: function (mL) {\n\t if (!mL || !(typeof mL === 'number') || mL <= 0) {\n\t mL = Infinity\n\t }\n\t priv(this, 'max', mL)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'max')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'allowStale', {\n\t set: function (allowStale) {\n\t priv(this, 'allowStale', !!allowStale)\n\t },\n\t get: function () {\n\t return priv(this, 'allowStale')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'maxAge', {\n\t set: function (mA) {\n\t if (!mA || !(typeof mA === 'number') || mA < 0) {\n\t mA = 0\n\t }\n\t priv(this, 'maxAge', mA)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'maxAge')\n\t },\n\t enumerable: true\n\t})\n\t\n\t// resize the cache when the lengthCalculator changes.\n\tObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n\t set: function (lC) {\n\t if (typeof lC !== 'function') {\n\t lC = naiveLength\n\t }\n\t if (lC !== priv(this, 'lengthCalculator')) {\n\t priv(this, 'lengthCalculator', lC)\n\t priv(this, 'length', 0)\n\t priv(this, 'lruList').forEach(function (hit) {\n\t hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t }, this)\n\t }\n\t trim(this)\n\t },\n\t get: function () { return priv(this, 'lengthCalculator') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'length', {\n\t get: function () { return priv(this, 'length') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'itemCount', {\n\t get: function () { return priv(this, 'lruList').length },\n\t enumerable: true\n\t})\n\t\n\tLRUCache.prototype.rforEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n\t var prev = walker.prev\n\t forEachStep(this, fn, walker, thisp)\n\t walker = prev\n\t }\n\t}\n\t\n\tfunction forEachStep (self, fn, node, thisp) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) {\n\t hit = undefined\n\t }\n\t }\n\t if (hit) {\n\t fn.call(thisp, hit.value, hit.key, self)\n\t }\n\t}\n\t\n\tLRUCache.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').head; walker !== null;) {\n\t var next = walker.next\n\t forEachStep(this, fn, walker, thisp)\n\t walker = next\n\t }\n\t}\n\t\n\tLRUCache.prototype.keys = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.key\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.values = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.value\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.reset = function () {\n\t if (priv(this, 'dispose') &&\n\t priv(this, 'lruList') &&\n\t priv(this, 'lruList').length) {\n\t priv(this, 'lruList').forEach(function (hit) {\n\t priv(this, 'dispose').call(this, hit.key, hit.value)\n\t }, this)\n\t }\n\t\n\t priv(this, 'cache', new Map()) // hash of items by key\n\t priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n\t priv(this, 'length', 0) // length of items in the list\n\t}\n\t\n\tLRUCache.prototype.dump = function () {\n\t return priv(this, 'lruList').map(function (hit) {\n\t if (!isStale(this, hit)) {\n\t return {\n\t k: hit.key,\n\t v: hit.value,\n\t e: hit.now + (hit.maxAge || 0)\n\t }\n\t }\n\t }, this).toArray().filter(function (h) {\n\t return h\n\t })\n\t}\n\t\n\tLRUCache.prototype.dumpLru = function () {\n\t return priv(this, 'lruList')\n\t}\n\t\n\tLRUCache.prototype.inspect = function (n, opts) {\n\t var str = 'LRUCache {'\n\t var extras = false\n\t\n\t var as = priv(this, 'allowStale')\n\t if (as) {\n\t str += '\\n allowStale: true'\n\t extras = true\n\t }\n\t\n\t var max = priv(this, 'max')\n\t if (max && max !== Infinity) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n max: ' + util.inspect(max, opts)\n\t extras = true\n\t }\n\t\n\t var maxAge = priv(this, 'maxAge')\n\t if (maxAge) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n\t extras = true\n\t }\n\t\n\t var lc = priv(this, 'lengthCalculator')\n\t if (lc && lc !== naiveLength) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n\t extras = true\n\t }\n\t\n\t var didFirst = false\n\t priv(this, 'lruList').forEach(function (item) {\n\t if (didFirst) {\n\t str += ',\\n '\n\t } else {\n\t if (extras) {\n\t str += ',\\n'\n\t }\n\t didFirst = true\n\t str += '\\n '\n\t }\n\t var key = util.inspect(item.key).split('\\n').join('\\n ')\n\t var val = { value: item.value }\n\t if (item.maxAge !== maxAge) {\n\t val.maxAge = item.maxAge\n\t }\n\t if (lc !== naiveLength) {\n\t val.length = item.length\n\t }\n\t if (isStale(this, item)) {\n\t val.stale = true\n\t }\n\t\n\t val = util.inspect(val, opts).split('\\n').join('\\n ')\n\t str += key + ' => ' + val\n\t })\n\t\n\t if (didFirst || extras) {\n\t str += '\\n'\n\t }\n\t str += '}'\n\t\n\t return str\n\t}\n\t\n\tLRUCache.prototype.set = function (key, value, maxAge) {\n\t maxAge = maxAge || priv(this, 'maxAge')\n\t\n\t var now = maxAge ? Date.now() : 0\n\t var len = priv(this, 'lengthCalculator').call(this, value, key)\n\t\n\t if (priv(this, 'cache').has(key)) {\n\t if (len > priv(this, 'max')) {\n\t del(this, priv(this, 'cache').get(key))\n\t return false\n\t }\n\t\n\t var node = priv(this, 'cache').get(key)\n\t var item = node.value\n\t\n\t // dispose of the old one before overwriting\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, item.value)\n\t }\n\t\n\t item.now = now\n\t item.maxAge = maxAge\n\t item.value = value\n\t priv(this, 'length', priv(this, 'length') + (len - item.length))\n\t item.length = len\n\t this.get(key)\n\t trim(this)\n\t return true\n\t }\n\t\n\t var hit = new Entry(key, value, len, now, maxAge)\n\t\n\t // oversized objects fall out of cache automatically.\n\t if (hit.length > priv(this, 'max')) {\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, value)\n\t }\n\t return false\n\t }\n\t\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t priv(this, 'lruList').unshift(hit)\n\t priv(this, 'cache').set(key, priv(this, 'lruList').head)\n\t trim(this)\n\t return true\n\t}\n\t\n\tLRUCache.prototype.has = function (key) {\n\t if (!priv(this, 'cache').has(key)) return false\n\t var hit = priv(this, 'cache').get(key).value\n\t if (isStale(this, hit)) {\n\t return false\n\t }\n\t return true\n\t}\n\t\n\tLRUCache.prototype.get = function (key) {\n\t return get(this, key, true)\n\t}\n\t\n\tLRUCache.prototype.peek = function (key) {\n\t return get(this, key, false)\n\t}\n\t\n\tLRUCache.prototype.pop = function () {\n\t var node = priv(this, 'lruList').tail\n\t if (!node) return null\n\t del(this, node)\n\t return node.value\n\t}\n\t\n\tLRUCache.prototype.del = function (key) {\n\t del(this, priv(this, 'cache').get(key))\n\t}\n\t\n\tLRUCache.prototype.load = function (arr) {\n\t // reset the cache\n\t this.reset()\n\t\n\t var now = Date.now()\n\t // A previous serialized cache has the most recent items first\n\t for (var l = arr.length - 1; l >= 0; l--) {\n\t var hit = arr[l]\n\t var expiresAt = hit.e || 0\n\t if (expiresAt === 0) {\n\t // the item was created without expiration in a non aged cache\n\t this.set(hit.k, hit.v)\n\t } else {\n\t var maxAge = expiresAt - now\n\t // dont add already expired items\n\t if (maxAge > 0) {\n\t this.set(hit.k, hit.v, maxAge)\n\t }\n\t }\n\t }\n\t}\n\t\n\tLRUCache.prototype.prune = function () {\n\t var self = this\n\t priv(this, 'cache').forEach(function (value, key) {\n\t get(self, key, false)\n\t })\n\t}\n\t\n\tfunction get (self, key, doUse) {\n\t var node = priv(self, 'cache').get(key)\n\t if (node) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) hit = undefined\n\t } else {\n\t if (doUse) {\n\t priv(self, 'lruList').unshiftNode(node)\n\t }\n\t }\n\t if (hit) hit = hit.value\n\t }\n\t return hit\n\t}\n\t\n\tfunction isStale (self, hit) {\n\t if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n\t return false\n\t }\n\t var stale = false\n\t var diff = Date.now() - hit.now\n\t if (hit.maxAge) {\n\t stale = diff > hit.maxAge\n\t } else {\n\t stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n\t }\n\t return stale\n\t}\n\t\n\tfunction trim (self) {\n\t if (priv(self, 'length') > priv(self, 'max')) {\n\t for (var walker = priv(self, 'lruList').tail;\n\t priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n\t // We know that we're about to delete this one, and also\n\t // what the next least recently used key will be, so just\n\t // go ahead and set it now.\n\t var prev = walker.prev\n\t del(self, walker)\n\t walker = prev\n\t }\n\t }\n\t}\n\t\n\tfunction del (self, node) {\n\t if (node) {\n\t var hit = node.value\n\t if (priv(self, 'dispose')) {\n\t priv(self, 'dispose').call(this, hit.key, hit.value)\n\t }\n\t priv(self, 'length', priv(self, 'length') - hit.length)\n\t priv(self, 'cache').delete(hit.key)\n\t priv(self, 'lruList').removeNode(node)\n\t }\n\t}\n\t\n\t// classy, since V8 prefers predictable objects.\n\tfunction Entry (key, value, length, now, maxAge) {\n\t this.key = key\n\t this.value = value\n\t this.length = length\n\t this.now = now\n\t this.maxAge = maxAge || 0\n\t}\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {if (process.env.npm_package_name === 'pseudomap' &&\n\t process.env.npm_lifecycle_script === 'test')\n\t process.env.TEST_PSEUDOMAP = 'true'\n\t\n\tif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n\t module.exports = Map\n\t} else {\n\t module.exports = __webpack_require__(39)\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(38)))\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\t\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = setTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t clearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t setTimeout(drainQueue, 0);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty\n\t\n\tmodule.exports = PseudoMap\n\t\n\tfunction PseudoMap (set) {\n\t if (!(this instanceof PseudoMap)) // whyyyyyyy\n\t throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\t\n\t this.clear()\n\t\n\t if (set) {\n\t if ((set instanceof PseudoMap) ||\n\t (typeof Map === 'function' && set instanceof Map))\n\t set.forEach(function (value, key) {\n\t this.set(key, value)\n\t }, this)\n\t else if (Array.isArray(set))\n\t set.forEach(function (kv) {\n\t this.set(kv[0], kv[1])\n\t }, this)\n\t else\n\t throw new TypeError('invalid argument')\n\t }\n\t}\n\t\n\tPseudoMap.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t Object.keys(this._data).forEach(function (k) {\n\t if (k !== 'size')\n\t fn.call(thisp, this._data[k].value, this._data[k].key)\n\t }, this)\n\t}\n\t\n\tPseudoMap.prototype.has = function (k) {\n\t return !!find(this._data, k)\n\t}\n\t\n\tPseudoMap.prototype.get = function (k) {\n\t var res = find(this._data, k)\n\t return res && res.value\n\t}\n\t\n\tPseudoMap.prototype.set = function (k, v) {\n\t set(this._data, k, v)\n\t}\n\t\n\tPseudoMap.prototype.delete = function (k) {\n\t var res = find(this._data, k)\n\t if (res) {\n\t delete this._data[res._index]\n\t this._data.size--\n\t }\n\t}\n\t\n\tPseudoMap.prototype.clear = function () {\n\t var data = Object.create(null)\n\t data.size = 0\n\t\n\t Object.defineProperty(this, '_data', {\n\t value: data,\n\t enumerable: false,\n\t configurable: true,\n\t writable: false\n\t })\n\t}\n\t\n\tObject.defineProperty(PseudoMap.prototype, 'size', {\n\t get: function () {\n\t return this._data.size\n\t },\n\t set: function (n) {},\n\t enumerable: true,\n\t configurable: true\n\t})\n\t\n\tPseudoMap.prototype.values =\n\tPseudoMap.prototype.keys =\n\tPseudoMap.prototype.entries = function () {\n\t throw new Error('iterators are not implemented in this version')\n\t}\n\t\n\t// Either identical, or both NaN\n\tfunction same (a, b) {\n\t return a === b || a !== a && b !== b\n\t}\n\t\n\tfunction Entry (k, v, i) {\n\t this.key = k\n\t this.value = v\n\t this._index = i\n\t}\n\t\n\tfunction find (data, k) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k))\n\t return data[key]\n\t }\n\t}\n\t\n\tfunction set (data, k, v) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k)) {\n\t data[key].value = v\n\t return\n\t }\n\t }\n\t data.size++\n\t data[key] = new Entry(k, v, key)\n\t}\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tvar formatRegExp = /%[sdj%]/g;\n\texports.format = function(f) {\n\t if (!isString(f)) {\n\t var objects = [];\n\t for (var i = 0; i < arguments.length; i++) {\n\t objects.push(inspect(arguments[i]));\n\t }\n\t return objects.join(' ');\n\t }\n\t\n\t var i = 1;\n\t var args = arguments;\n\t var len = args.length;\n\t var str = String(f).replace(formatRegExp, function(x) {\n\t if (x === '%%') return '%';\n\t if (i >= len) return x;\n\t switch (x) {\n\t case '%s': return String(args[i++]);\n\t case '%d': return Number(args[i++]);\n\t case '%j':\n\t try {\n\t return JSON.stringify(args[i++]);\n\t } catch (_) {\n\t return '[Circular]';\n\t }\n\t default:\n\t return x;\n\t }\n\t });\n\t for (var x = args[i]; i < len; x = args[++i]) {\n\t if (isNull(x) || !isObject(x)) {\n\t str += ' ' + x;\n\t } else {\n\t str += ' ' + inspect(x);\n\t }\n\t }\n\t return str;\n\t};\n\t\n\t\n\t// Mark that a method should not be used.\n\t// Returns a modified function which warns once by default.\n\t// If --no-deprecation is set, then it is a no-op.\n\texports.deprecate = function(fn, msg) {\n\t // Allow for deprecating things in the process of starting up.\n\t if (isUndefined(global.process)) {\n\t return function() {\n\t return exports.deprecate(fn, msg).apply(this, arguments);\n\t };\n\t }\n\t\n\t if (process.noDeprecation === true) {\n\t return fn;\n\t }\n\t\n\t var warned = false;\n\t function deprecated() {\n\t if (!warned) {\n\t if (process.throwDeprecation) {\n\t throw new Error(msg);\n\t } else if (process.traceDeprecation) {\n\t console.trace(msg);\n\t } else {\n\t console.error(msg);\n\t }\n\t warned = true;\n\t }\n\t return fn.apply(this, arguments);\n\t }\n\t\n\t return deprecated;\n\t};\n\t\n\t\n\tvar debugs = {};\n\tvar debugEnviron;\n\texports.debuglog = function(set) {\n\t if (isUndefined(debugEnviron))\n\t debugEnviron = process.env.NODE_DEBUG || '';\n\t set = set.toUpperCase();\n\t if (!debugs[set]) {\n\t if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n\t var pid = process.pid;\n\t debugs[set] = function() {\n\t var msg = exports.format.apply(exports, arguments);\n\t console.error('%s %d: %s', set, pid, msg);\n\t };\n\t } else {\n\t debugs[set] = function() {};\n\t }\n\t }\n\t return debugs[set];\n\t};\n\t\n\t\n\t/**\n\t * Echos the value of a value. Trys to print the value out\n\t * in the best way possible given the different types.\n\t *\n\t * @param {Object} obj The object to print out.\n\t * @param {Object} opts Optional options object that alters the output.\n\t */\n\t/* legacy: obj, showHidden, depth, colors*/\n\tfunction inspect(obj, opts) {\n\t // default options\n\t var ctx = {\n\t seen: [],\n\t stylize: stylizeNoColor\n\t };\n\t // legacy...\n\t if (arguments.length >= 3) ctx.depth = arguments[2];\n\t if (arguments.length >= 4) ctx.colors = arguments[3];\n\t if (isBoolean(opts)) {\n\t // legacy...\n\t ctx.showHidden = opts;\n\t } else if (opts) {\n\t // got an \"options\" object\n\t exports._extend(ctx, opts);\n\t }\n\t // set default options\n\t if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n\t if (isUndefined(ctx.depth)) ctx.depth = 2;\n\t if (isUndefined(ctx.colors)) ctx.colors = false;\n\t if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n\t if (ctx.colors) ctx.stylize = stylizeWithColor;\n\t return formatValue(ctx, obj, ctx.depth);\n\t}\n\texports.inspect = inspect;\n\t\n\t\n\t// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n\tinspect.colors = {\n\t 'bold' : [1, 22],\n\t 'italic' : [3, 23],\n\t 'underline' : [4, 24],\n\t 'inverse' : [7, 27],\n\t 'white' : [37, 39],\n\t 'grey' : [90, 39],\n\t 'black' : [30, 39],\n\t 'blue' : [34, 39],\n\t 'cyan' : [36, 39],\n\t 'green' : [32, 39],\n\t 'magenta' : [35, 39],\n\t 'red' : [31, 39],\n\t 'yellow' : [33, 39]\n\t};\n\t\n\t// Don't use 'blue' not visible on cmd.exe\n\tinspect.styles = {\n\t 'special': 'cyan',\n\t 'number': 'yellow',\n\t 'boolean': 'yellow',\n\t 'undefined': 'grey',\n\t 'null': 'bold',\n\t 'string': 'green',\n\t 'date': 'magenta',\n\t // \"name\": intentionally not styling\n\t 'regexp': 'red'\n\t};\n\t\n\t\n\tfunction stylizeWithColor(str, styleType) {\n\t var style = inspect.styles[styleType];\n\t\n\t if (style) {\n\t return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n\t '\\u001b[' + inspect.colors[style][1] + 'm';\n\t } else {\n\t return str;\n\t }\n\t}\n\t\n\t\n\tfunction stylizeNoColor(str, styleType) {\n\t return str;\n\t}\n\t\n\t\n\tfunction arrayToHash(array) {\n\t var hash = {};\n\t\n\t array.forEach(function(val, idx) {\n\t hash[val] = true;\n\t });\n\t\n\t return hash;\n\t}\n\t\n\t\n\tfunction formatValue(ctx, value, recurseTimes) {\n\t // Provide a hook for user-specified inspect functions.\n\t // Check that value is an object with an inspect function on it\n\t if (ctx.customInspect &&\n\t value &&\n\t isFunction(value.inspect) &&\n\t // Filter out the util module, it's inspect function is special\n\t value.inspect !== exports.inspect &&\n\t // Also filter out any prototype objects using the circular check.\n\t !(value.constructor && value.constructor.prototype === value)) {\n\t var ret = value.inspect(recurseTimes, ctx);\n\t if (!isString(ret)) {\n\t ret = formatValue(ctx, ret, recurseTimes);\n\t }\n\t return ret;\n\t }\n\t\n\t // Primitive types cannot have properties\n\t var primitive = formatPrimitive(ctx, value);\n\t if (primitive) {\n\t return primitive;\n\t }\n\t\n\t // Look up the keys of the object.\n\t var keys = Object.keys(value);\n\t var visibleKeys = arrayToHash(keys);\n\t\n\t if (ctx.showHidden) {\n\t keys = Object.getOwnPropertyNames(value);\n\t }\n\t\n\t // IE doesn't make error fields non-enumerable\n\t // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n\t if (isError(value)\n\t && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n\t return formatError(value);\n\t }\n\t\n\t // Some type of object without properties can be shortcutted.\n\t if (keys.length === 0) {\n\t if (isFunction(value)) {\n\t var name = value.name ? ': ' + value.name : '';\n\t return ctx.stylize('[Function' + name + ']', 'special');\n\t }\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t }\n\t if (isDate(value)) {\n\t return ctx.stylize(Date.prototype.toString.call(value), 'date');\n\t }\n\t if (isError(value)) {\n\t return formatError(value);\n\t }\n\t }\n\t\n\t var base = '', array = false, braces = ['{', '}'];\n\t\n\t // Make Array say that they are Array\n\t if (isArray(value)) {\n\t array = true;\n\t braces = ['[', ']'];\n\t }\n\t\n\t // Make functions say that they are functions\n\t if (isFunction(value)) {\n\t var n = value.name ? ': ' + value.name : '';\n\t base = ' [Function' + n + ']';\n\t }\n\t\n\t // Make RegExps say that they are RegExps\n\t if (isRegExp(value)) {\n\t base = ' ' + RegExp.prototype.toString.call(value);\n\t }\n\t\n\t // Make dates with properties first say the date\n\t if (isDate(value)) {\n\t base = ' ' + Date.prototype.toUTCString.call(value);\n\t }\n\t\n\t // Make error with message first say the error\n\t if (isError(value)) {\n\t base = ' ' + formatError(value);\n\t }\n\t\n\t if (keys.length === 0 && (!array || value.length == 0)) {\n\t return braces[0] + base + braces[1];\n\t }\n\t\n\t if (recurseTimes < 0) {\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t } else {\n\t return ctx.stylize('[Object]', 'special');\n\t }\n\t }\n\t\n\t ctx.seen.push(value);\n\t\n\t var output;\n\t if (array) {\n\t output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n\t } else {\n\t output = keys.map(function(key) {\n\t return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n\t });\n\t }\n\t\n\t ctx.seen.pop();\n\t\n\t return reduceToSingleString(output, base, braces);\n\t}\n\t\n\t\n\tfunction formatPrimitive(ctx, value) {\n\t if (isUndefined(value))\n\t return ctx.stylize('undefined', 'undefined');\n\t if (isString(value)) {\n\t var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n\t .replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"') + '\\'';\n\t return ctx.stylize(simple, 'string');\n\t }\n\t if (isNumber(value))\n\t return ctx.stylize('' + value, 'number');\n\t if (isBoolean(value))\n\t return ctx.stylize('' + value, 'boolean');\n\t // For some reason typeof null is \"object\", so special case here.\n\t if (isNull(value))\n\t return ctx.stylize('null', 'null');\n\t}\n\t\n\t\n\tfunction formatError(value) {\n\t return '[' + Error.prototype.toString.call(value) + ']';\n\t}\n\t\n\t\n\tfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n\t var output = [];\n\t for (var i = 0, l = value.length; i < l; ++i) {\n\t if (hasOwnProperty(value, String(i))) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t String(i), true));\n\t } else {\n\t output.push('');\n\t }\n\t }\n\t keys.forEach(function(key) {\n\t if (!key.match(/^\\d+$/)) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t key, true));\n\t }\n\t });\n\t return output;\n\t}\n\t\n\t\n\tfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n\t var name, str, desc;\n\t desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n\t if (desc.get) {\n\t if (desc.set) {\n\t str = ctx.stylize('[Getter/Setter]', 'special');\n\t } else {\n\t str = ctx.stylize('[Getter]', 'special');\n\t }\n\t } else {\n\t if (desc.set) {\n\t str = ctx.stylize('[Setter]', 'special');\n\t }\n\t }\n\t if (!hasOwnProperty(visibleKeys, key)) {\n\t name = '[' + key + ']';\n\t }\n\t if (!str) {\n\t if (ctx.seen.indexOf(desc.value) < 0) {\n\t if (isNull(recurseTimes)) {\n\t str = formatValue(ctx, desc.value, null);\n\t } else {\n\t str = formatValue(ctx, desc.value, recurseTimes - 1);\n\t }\n\t if (str.indexOf('\\n') > -1) {\n\t if (array) {\n\t str = str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n').substr(2);\n\t } else {\n\t str = '\\n' + str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n');\n\t }\n\t }\n\t } else {\n\t str = ctx.stylize('[Circular]', 'special');\n\t }\n\t }\n\t if (isUndefined(name)) {\n\t if (array && key.match(/^\\d+$/)) {\n\t return str;\n\t }\n\t name = JSON.stringify('' + key);\n\t if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n\t name = name.substr(1, name.length - 2);\n\t name = ctx.stylize(name, 'name');\n\t } else {\n\t name = name.replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"')\n\t .replace(/(^\"|\"$)/g, \"'\");\n\t name = ctx.stylize(name, 'string');\n\t }\n\t }\n\t\n\t return name + ': ' + str;\n\t}\n\t\n\t\n\tfunction reduceToSingleString(output, base, braces) {\n\t var numLinesEst = 0;\n\t var length = output.reduce(function(prev, cur) {\n\t numLinesEst++;\n\t if (cur.indexOf('\\n') >= 0) numLinesEst++;\n\t return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n\t }, 0);\n\t\n\t if (length > 60) {\n\t return braces[0] +\n\t (base === '' ? '' : base + '\\n ') +\n\t ' ' +\n\t output.join(',\\n ') +\n\t ' ' +\n\t braces[1];\n\t }\n\t\n\t return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n\t}\n\t\n\t\n\t// NOTE: These type checking functions intentionally don't use `instanceof`\n\t// because it is fragile and can be easily faked with `Object.create()`.\n\tfunction isArray(ar) {\n\t return Array.isArray(ar);\n\t}\n\texports.isArray = isArray;\n\t\n\tfunction isBoolean(arg) {\n\t return typeof arg === 'boolean';\n\t}\n\texports.isBoolean = isBoolean;\n\t\n\tfunction isNull(arg) {\n\t return arg === null;\n\t}\n\texports.isNull = isNull;\n\t\n\tfunction isNullOrUndefined(arg) {\n\t return arg == null;\n\t}\n\texports.isNullOrUndefined = isNullOrUndefined;\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\texports.isNumber = isNumber;\n\t\n\tfunction isString(arg) {\n\t return typeof arg === 'string';\n\t}\n\texports.isString = isString;\n\t\n\tfunction isSymbol(arg) {\n\t return typeof arg === 'symbol';\n\t}\n\texports.isSymbol = isSymbol;\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\texports.isUndefined = isUndefined;\n\t\n\tfunction isRegExp(re) {\n\t return isObject(re) && objectToString(re) === '[object RegExp]';\n\t}\n\texports.isRegExp = isRegExp;\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\texports.isObject = isObject;\n\t\n\tfunction isDate(d) {\n\t return isObject(d) && objectToString(d) === '[object Date]';\n\t}\n\texports.isDate = isDate;\n\t\n\tfunction isError(e) {\n\t return isObject(e) &&\n\t (objectToString(e) === '[object Error]' || e instanceof Error);\n\t}\n\texports.isError = isError;\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\texports.isFunction = isFunction;\n\t\n\tfunction isPrimitive(arg) {\n\t return arg === null ||\n\t typeof arg === 'boolean' ||\n\t typeof arg === 'number' ||\n\t typeof arg === 'string' ||\n\t typeof arg === 'symbol' || // ES6 symbol\n\t typeof arg === 'undefined';\n\t}\n\texports.isPrimitive = isPrimitive;\n\t\n\texports.isBuffer = __webpack_require__(41);\n\t\n\tfunction objectToString(o) {\n\t return Object.prototype.toString.call(o);\n\t}\n\t\n\t\n\tfunction pad(n) {\n\t return n < 10 ? '0' + n.toString(10) : n.toString(10);\n\t}\n\t\n\t\n\tvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n\t 'Oct', 'Nov', 'Dec'];\n\t\n\t// 26 Feb 16:19:34\n\tfunction timestamp() {\n\t var d = new Date();\n\t var time = [pad(d.getHours()),\n\t pad(d.getMinutes()),\n\t pad(d.getSeconds())].join(':');\n\t return [d.getDate(), months[d.getMonth()], time].join(' ');\n\t}\n\t\n\t\n\t// log is just a thin wrapper to console.log that prepends a timestamp\n\texports.log = function() {\n\t console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n\t};\n\t\n\t\n\t/**\n\t * Inherit the prototype methods from one constructor into another.\n\t *\n\t * The Function.prototype.inherits from lang.js rewritten as a standalone\n\t * function (not on Function.prototype). NOTE: If this file is to be loaded\n\t * during bootstrapping this function needs to be rewritten using some native\n\t * functions as prototype setup using normal JavaScript does not work as\n\t * expected during bootstrapping (see mirror.js in r114903).\n\t *\n\t * @param {function} ctor Constructor function which needs to inherit the\n\t * prototype.\n\t * @param {function} superCtor Constructor function to inherit prototype from.\n\t */\n\texports.inherits = __webpack_require__(42);\n\t\n\texports._extend = function(origin, add) {\n\t // Don't do anything if add isn't an object\n\t if (!add || !isObject(add)) return origin;\n\t\n\t var keys = Object.keys(add);\n\t var i = keys.length;\n\t while (i--) {\n\t origin[keys[i]] = add[keys[i]];\n\t }\n\t return origin;\n\t};\n\t\n\tfunction hasOwnProperty(obj, prop) {\n\t return Object.prototype.hasOwnProperty.call(obj, prop);\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(38)))\n\n/***/ },\n/* 41 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function isBuffer(arg) {\n\t return arg && typeof arg === 'object'\n\t && typeof arg.copy === 'function'\n\t && typeof arg.fill === 'function'\n\t && typeof arg.readUInt8 === 'function';\n\t}\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t // implementation from standard node.js 'util' module\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t ctor.prototype = Object.create(superCtor.prototype, {\n\t constructor: {\n\t value: ctor,\n\t enumerable: false,\n\t writable: true,\n\t configurable: true\n\t }\n\t });\n\t };\n\t} else {\n\t // old school shim for old browsers\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t var TempCtor = function () {}\n\t TempCtor.prototype = superCtor.prototype\n\t ctor.prototype = new TempCtor()\n\t ctor.prototype.constructor = ctor\n\t }\n\t}\n\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\tmodule.exports = Yallist\n\t\n\tYallist.Node = Node\n\tYallist.create = Yallist\n\t\n\tfunction Yallist (list) {\n\t var self = this\n\t if (!(self instanceof Yallist)) {\n\t self = new Yallist()\n\t }\n\t\n\t self.tail = null\n\t self.head = null\n\t self.length = 0\n\t\n\t if (list && typeof list.forEach === 'function') {\n\t list.forEach(function (item) {\n\t self.push(item)\n\t })\n\t } else if (arguments.length > 0) {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t self.push(arguments[i])\n\t }\n\t }\n\t\n\t return self\n\t}\n\t\n\tYallist.prototype.removeNode = function (node) {\n\t if (node.list !== this) {\n\t throw new Error('removing node which does not belong to this list')\n\t }\n\t\n\t var next = node.next\n\t var prev = node.prev\n\t\n\t if (next) {\n\t next.prev = prev\n\t }\n\t\n\t if (prev) {\n\t prev.next = next\n\t }\n\t\n\t if (node === this.head) {\n\t this.head = next\n\t }\n\t if (node === this.tail) {\n\t this.tail = prev\n\t }\n\t\n\t node.list.length --\n\t node.next = null\n\t node.prev = null\n\t node.list = null\n\t}\n\t\n\tYallist.prototype.unshiftNode = function (node) {\n\t if (node === this.head) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var head = this.head\n\t node.list = this\n\t node.next = head\n\t if (head) {\n\t head.prev = node\n\t }\n\t\n\t this.head = node\n\t if (!this.tail) {\n\t this.tail = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.pushNode = function (node) {\n\t if (node === this.tail) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var tail = this.tail\n\t node.list = this\n\t node.prev = tail\n\t if (tail) {\n\t tail.next = node\n\t }\n\t\n\t this.tail = node\n\t if (!this.head) {\n\t this.head = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.push = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t push(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.unshift = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t unshift(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.pop = function () {\n\t if (!this.tail)\n\t return undefined\n\t\n\t var res = this.tail.value\n\t this.tail = this.tail.prev\n\t this.tail.next = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.shift = function () {\n\t if (!this.head)\n\t return undefined\n\t\n\t var res = this.head.value\n\t this.head = this.head.next\n\t this.head.prev = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.head, i = 0; walker !== null; i++) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.next\n\t }\n\t}\n\t\n\tYallist.prototype.forEachReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.prev\n\t }\n\t}\n\t\n\tYallist.prototype.get = function (n) {\n\t for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.next\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.getReverse = function (n) {\n\t for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.prev\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.map = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.head; walker !== null; ) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.next\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.mapReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.tail; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.prev\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.reduce = function (fn, initial) {\n\t var acc\n\t var walker = this.head\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.head) {\n\t walker = this.head.next\n\t acc = this.head.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = 0; walker !== null; i++) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.next\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.reduceReverse = function (fn, initial) {\n\t var acc\n\t var walker = this.tail\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.tail) {\n\t walker = this.tail.prev\n\t acc = this.tail.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = this.length - 1; walker !== null; i--) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.prev\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.toArray = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.head; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.next\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.toArrayReverse = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.tail; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.prev\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.slice = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n\t walker = walker.next\n\t }\n\t for (; walker !== null && i < to; i++, walker = walker.next) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.sliceReverse = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n\t walker = walker.prev\n\t }\n\t for (; walker !== null && i > from; i--, walker = walker.prev) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.reverse = function () {\n\t var head = this.head\n\t var tail = this.tail\n\t for (var walker = head; walker !== null; walker = walker.prev) {\n\t var p = walker.prev\n\t walker.prev = walker.next\n\t walker.next = p\n\t }\n\t this.head = tail\n\t this.tail = head\n\t return this\n\t}\n\t\n\tfunction push (self, item) {\n\t self.tail = new Node(item, self.tail, null, self)\n\t if (!self.head) {\n\t self.head = self.tail\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction unshift (self, item) {\n\t self.head = new Node(item, null, self.head, self)\n\t if (!self.tail) {\n\t self.tail = self.head\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction Node (value, prev, next, list) {\n\t if (!(this instanceof Node)) {\n\t return new Node(value, prev, next, list)\n\t }\n\t\n\t this.list = list\n\t this.value = value\n\t\n\t if (prev) {\n\t prev.next = this\n\t this.prev = prev\n\t } else {\n\t this.prev = null\n\t }\n\t\n\t if (next) {\n\t next.prev = this\n\t this.next = next\n\t } else {\n\t this.next = null\n\t }\n\t}\n\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Tile2 = __webpack_require__(45);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(46);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar ImageTile = (function (_Tile) {\n\t _inherits(ImageTile, _Tile);\n\t\n\t function ImageTile(quadcode, path, layer) {\n\t _classCallCheck(this, ImageTile);\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the tile\n\t\n\t _createClass(ImageTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTile();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear image reference\n\t this._image = null;\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t depthWrite: false\n\t });\n\t\n\t var localMesh = new _three2['default'].Mesh(geom, material);\n\t localMesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t mesh.add(localMesh);\n\t\n\t mesh.renderOrder = 0;\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t // var box = new BoxHelper(localMesh);\n\t // mesh.add(box);\n\t //\n\t // mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t var image = document.createElement('img');\n\t\n\t image.addEventListener('load', function (event) {\n\t var texture = new _three2['default'].Texture();\n\t\n\t texture.image = image;\n\t texture.needsUpdate = true;\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t // Something went wrong and the tile or its material is missing\n\t //\n\t // Possibly removed by the cache before the image loaded\n\t if (!_this2._mesh || !_this2._mesh.children[0] || !_this2._mesh.children[0].material) {\n\t return;\n\t }\n\t\n\t _this2._mesh.children[0].material.map = texture;\n\t _this2._mesh.children[0].material.needsUpdate = true;\n\t\n\t _this2._texture = texture;\n\t _this2._ready = true;\n\t }, false);\n\t\n\t // image.addEventListener('progress', event => {}, false);\n\t // image.addEventListener('error', event => {}, false);\n\t\n\t image.crossOrigin = '';\n\t\n\t // Load image\n\t image.src = url;\n\t\n\t this._image = image;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._image) {\n\t return;\n\t }\n\t\n\t this._image.src = '';\n\t }\n\t }]);\n\t\n\t return ImageTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer) {\n\t return new ImageTile(quadcode, path, layer);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// Manages a single tile and its layers\n\t\n\tvar r2d = 180 / Math.PI;\n\t\n\tvar tileURLRegex = /\\{([szxy])\\}/g;\n\t\n\tvar Tile = (function () {\n\t function Tile(quadcode, path, layer) {\n\t _classCallCheck(this, Tile);\n\t\n\t this._layer = layer;\n\t this._quadcode = quadcode;\n\t this._path = path;\n\t\n\t this._ready = false;\n\t\n\t this._tile = this._quadcodeToTile(quadcode);\n\t\n\t // Bottom-left and top-right bounds in WGS84 coordinates\n\t this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\t\n\t // Bottom-left and top-right bounds in world coordinates\n\t this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\t\n\t // Tile center in world coordinates\n\t this._center = this._boundsToCenter(this._boundsWorld);\n\t\n\t // Length of a tile side in world coorindates\n\t this._side = this._getSide(this._boundsWorld);\n\t }\n\t\n\t // Returns true if the tile mesh and texture are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(Tile, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return this._ready;\n\t }\n\t\n\t // Request data for the tile\n\t }, {\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {}\n\t }, {\n\t key: 'getQuadcode',\n\t value: function getQuadcode() {\n\t return this._quadcode;\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {\n\t return this._boundsWorld;\n\t }\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t }, {\n\t key: 'getSide',\n\t value: function getSide() {\n\t return this._side;\n\t }\n\t }, {\n\t key: 'getMesh',\n\t value: function getMesh() {\n\t return this._mesh;\n\t }\n\t\n\t // Destroys the tile and removes it from the layer and memory\n\t //\n\t // Ensure that this leaves no trace of the tile – no textures, no meshes,\n\t // nothing in memory or the GPU\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Delete reference to layer\n\t this._layer = null;\n\t\n\t // Delete location references\n\t this._boundsLatLon = null;\n\t this._boundsWorld = null;\n\t this._center = null;\n\t\n\t // Done if no mesh\n\t if (!this._mesh) {\n\t return;\n\t }\n\t\n\t if (this._mesh.children) {\n\t // Dispose of mesh and materials\n\t this._mesh.children.forEach(function (child) {\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t });\n\t } else {\n\t this._mesh.geometry.dispose();\n\t this._mesh.geometry = null;\n\t\n\t if (this._mesh.material.map) {\n\t this._mesh.material.map.dispose();\n\t this._mesh.material.map = null;\n\t }\n\t\n\t this._mesh.material.dispose();\n\t this._mesh.material = null;\n\t }\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {}\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {}\n\t }, {\n\t key: '_getTileURL',\n\t value: function _getTileURL(urlParams) {\n\t if (!urlParams.s) {\n\t // Default to a random choice of a, b or c\n\t s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n\t }\n\t\n\t tileURLRegex.lastIndex = 0;\n\t return this._path.replace(tileURLRegex, function (value, key) {\n\t // Replace with paramter, otherwise keep existing value\n\t return urlParams[key];\n\t });\n\t }\n\t\n\t // Convert from quadcode to TMS tile coordinates\n\t }, {\n\t key: '_quadcodeToTile',\n\t value: function _quadcodeToTile(quadcode) {\n\t var x = 0;\n\t var y = 0;\n\t var z = quadcode.length;\n\t\n\t for (var i = z; i > 0; i--) {\n\t var mask = 1 << i - 1;\n\t var q = +quadcode[z - i];\n\t if (q === 1) {\n\t x |= mask;\n\t }\n\t if (q === 2) {\n\t y |= mask;\n\t }\n\t if (q === 3) {\n\t x |= mask;\n\t y |= mask;\n\t }\n\t }\n\t\n\t return [x, y, z];\n\t }\n\t\n\t // Convert WGS84 tile bounds to world coordinates\n\t }, {\n\t key: '_tileBoundsFromWGS84',\n\t value: function _tileBoundsFromWGS84(boundsWGS84) {\n\t var sw = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[1], boundsWGS84[0]));\n\t var ne = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[3], boundsWGS84[2]));\n\t\n\t return [sw.x, sw.y, ne.x, ne.y];\n\t }\n\t\n\t // Get tile bounds in WGS84 coordinates\n\t }, {\n\t key: '_tileBoundsWGS84',\n\t value: function _tileBoundsWGS84(tile) {\n\t var e = this._tile2lon(tile[0] + 1, tile[2]);\n\t var w = this._tile2lon(tile[0], tile[2]);\n\t var s = this._tile2lat(tile[1] + 1, tile[2]);\n\t var n = this._tile2lat(tile[1], tile[2]);\n\t return [w, s, e, n];\n\t }\n\t }, {\n\t key: '_tile2lon',\n\t value: function _tile2lon(x, z) {\n\t return x / Math.pow(2, z) * 360 - 180;\n\t }\n\t }, {\n\t key: '_tile2lat',\n\t value: function _tile2lat(y, z) {\n\t var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n\t return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n\t }\n\t }, {\n\t key: '_boundsToCenter',\n\t value: function _boundsToCenter(bounds) {\n\t var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n\t var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\t\n\t return [x, y];\n\t }\n\t }, {\n\t key: '_getSide',\n\t value: function _getSide(bounds) {\n\t return new _three2['default'].Vector3(bounds[0], 0, bounds[3]).sub(new _three2['default'].Vector3(bounds[0], 0, bounds[1])).length();\n\t }\n\t }]);\n\t\n\t return Tile;\n\t})();\n\t\n\texports['default'] = Tile;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tBoxHelper = function (object) {\n\t\n\t\tvar indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);\n\t\tvar positions = new Float32Array(8 * 3);\n\t\n\t\tvar geometry = new _three2['default'].BufferGeometry();\n\t\tgeometry.setIndex(new _three2['default'].BufferAttribute(indices, 1));\n\t\tgeometry.addAttribute('position', new _three2['default'].BufferAttribute(positions, 3));\n\t\n\t\t_three2['default'].LineSegments.call(this, geometry, new _three2['default'].LineBasicMaterial({ linewidth: 2, color: 0xff0000 }));\n\t\n\t\tif (object !== undefined) {\n\t\n\t\t\tthis.update(object);\n\t\t}\n\t};\n\t\n\tBoxHelper.prototype = Object.create(_three2['default'].LineSegments.prototype);\n\tBoxHelper.prototype.constructor = BoxHelper;\n\t\n\tBoxHelper.prototype.update = (function () {\n\t\n\t\tvar box = new _three2['default'].Box3();\n\t\n\t\treturn function (object) {\n\t\n\t\t\tbox.setFromObject(object);\n\t\n\t\t\tif (box.isEmpty()) return;\n\t\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\t\n\t\t\t/*\n\t 5____4\n\t 1/___0/|\n\t | 6__|_7\n\t 2/___3/\n\t \t0: max.x, max.y, max.z\n\t 1: min.x, max.y, max.z\n\t 2: min.x, min.y, max.z\n\t 3: max.x, min.y, max.z\n\t 4: max.x, max.y, min.z\n\t 5: min.x, max.y, min.z\n\t 6: min.x, min.y, min.z\n\t 7: max.x, min.y, min.z\n\t */\n\t\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\t\n\t\t\tarray[0] = max.x;array[1] = max.y;array[2] = max.z;\n\t\t\tarray[3] = min.x;array[4] = max.y;array[5] = max.z;\n\t\t\tarray[6] = min.x;array[7] = min.y;array[8] = max.z;\n\t\t\tarray[9] = max.x;array[10] = min.y;array[11] = max.z;\n\t\t\tarray[12] = max.x;array[13] = max.y;array[14] = min.z;\n\t\t\tarray[15] = min.x;array[16] = max.y;array[17] = min.z;\n\t\t\tarray[18] = min.x;array[19] = min.y;array[20] = min.z;\n\t\t\tarray[21] = max.x;array[22] = min.y;array[23] = min.z;\n\t\n\t\t\tposition.needsUpdate = true;\n\t\n\t\t\tthis.geometry.computeBoundingSphere();\n\t\t};\n\t})();\n\t\n\texports['default'] = BoxHelper;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\texports['default'] = function (colour) {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 1;\n\t canvas.height = 1;\n\t\n\t var context = canvas.getContext('2d');\n\t context.fillStyle = colour;\n\t context.fillRect(0, 0, canvas.width, canvas.height);\n\t // context.strokeStyle = '#D0D0CF';\n\t // context.strokeRect(0, 0, canvas.width, canvas.height);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // // Silky smooth images when tilted\n\t // texture.magFilter = THREE.LinearFilter;\n\t // texture.minFilter = THREE.LinearMipMapLinearFilter;\n\t // //\n\t // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t // texture.anisotropy = 4;\n\t\n\t // texture.wrapS = THREE.RepeatWrapping;\n\t // texture.wrapT = THREE.RepeatWrapping;\n\t // texture.repeat.set(segments, segments);\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t depthWrite: false\n\t });\n\t\n\t return material;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.0 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar debounce = __webpack_require__(49);\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/**\n\t * Creates a throttled function that only invokes `func` at most once per\n\t * every `wait` milliseconds. The throttled function comes with a `cancel`\n\t * method to cancel delayed `func` invocations and a `flush` method to\n\t * immediately invoke them. Provide an options object to indicate whether\n\t * `func` should be invoked on the leading and/or trailing edge of the `wait`\n\t * timeout. The `func` is invoked with the last arguments provided to the\n\t * throttled function. Subsequent calls to the throttled function return the\n\t * result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the throttled function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.throttle` and `_.debounce`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to throttle.\n\t * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=true] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new throttled function.\n\t * @example\n\t *\n\t * // avoid excessively updating the position while scrolling\n\t * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n\t *\n\t * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n\t * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n\t * jQuery(element).on('click', throttled);\n\t *\n\t * // cancel a trailing throttled invocation\n\t * jQuery(window).on('popstate', throttled.cancel);\n\t */\n\tfunction throttle(func, wait, options) {\n\t var leading = true,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t if (isObject(options)) {\n\t leading = 'leading' in options ? !!options.leading : leading;\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t // Avoid a V8 JIT bug in Chrome 19-20.\n\t // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\tmodule.exports = throttle;\n\n\n/***/ },\n/* 49 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Gets the timestamp of the number of milliseconds that have elapsed since\n\t * the Unix epoch (1 January 1970 00:00:00 UTC).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Date\n\t * @returns {number} Returns the timestamp.\n\t * @example\n\t *\n\t * _.defer(function(stamp) {\n\t * console.log(_.now() - stamp);\n\t * }, _.now());\n\t * // => logs the number of milliseconds it took for the deferred function to be invoked\n\t */\n\tvar now = Date.now;\n\t\n\t/**\n\t * Creates a debounced function that delays invoking `func` until after `wait`\n\t * milliseconds have elapsed since the last time the debounced function was\n\t * invoked. The debounced function comes with a `cancel` method to cancel\n\t * delayed `func` invocations and a `flush` method to immediately invoke them.\n\t * Provide an options object to indicate whether `func` should be invoked on\n\t * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n\t * with the last arguments provided to the debounced function. Subsequent calls\n\t * to the debounced function return the result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the debounced function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.debounce` and `_.throttle`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to debounce.\n\t * @param {number} [wait=0] The number of milliseconds to delay.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=false] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n\t * delayed before it's invoked.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new debounced function.\n\t * @example\n\t *\n\t * // Avoid costly calculations while the window size is in flux.\n\t * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n\t *\n\t * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n\t * jQuery(element).on('click', _.debounce(sendMail, 300, {\n\t * 'leading': true,\n\t * 'trailing': false\n\t * }));\n\t *\n\t * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n\t * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n\t * var source = new EventSource('/stream');\n\t * jQuery(source).on('message', debounced);\n\t *\n\t * // Cancel the trailing debounced invocation.\n\t * jQuery(window).on('popstate', debounced.cancel);\n\t */\n\tfunction debounce(func, wait, options) {\n\t var args,\n\t maxTimeoutId,\n\t result,\n\t stamp,\n\t thisArg,\n\t timeoutId,\n\t trailingCall,\n\t lastCalled = 0,\n\t leading = false,\n\t maxWait = false,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t wait = toNumber(wait) || 0;\n\t if (isObject(options)) {\n\t leading = !!options.leading;\n\t maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t\n\t function cancel() {\n\t if (timeoutId) {\n\t clearTimeout(timeoutId);\n\t }\n\t if (maxTimeoutId) {\n\t clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = 0;\n\t args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n\t }\n\t\n\t function complete(isCalled, id) {\n\t if (id) {\n\t clearTimeout(id);\n\t }\n\t maxTimeoutId = timeoutId = trailingCall = undefined;\n\t if (isCalled) {\n\t lastCalled = now();\n\t result = func.apply(thisArg, args);\n\t if (!timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t }\n\t }\n\t\n\t function delayed() {\n\t var remaining = wait - (now() - stamp);\n\t if (remaining <= 0 || remaining > wait) {\n\t complete(trailingCall, maxTimeoutId);\n\t } else {\n\t timeoutId = setTimeout(delayed, remaining);\n\t }\n\t }\n\t\n\t function flush() {\n\t if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n\t result = func.apply(thisArg, args);\n\t }\n\t cancel();\n\t return result;\n\t }\n\t\n\t function maxDelayed() {\n\t complete(trailing, timeoutId);\n\t }\n\t\n\t function debounced() {\n\t args = arguments;\n\t stamp = now();\n\t thisArg = this;\n\t trailingCall = trailing && (timeoutId || !leading);\n\t\n\t if (maxWait === false) {\n\t var leadingCall = leading && !timeoutId;\n\t } else {\n\t if (!maxTimeoutId && !leading) {\n\t lastCalled = stamp;\n\t }\n\t var remaining = maxWait - (stamp - lastCalled),\n\t isCalled = remaining <= 0 || remaining > maxWait;\n\t\n\t if (isCalled) {\n\t if (maxTimeoutId) {\n\t maxTimeoutId = clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = stamp;\n\t result = func.apply(thisArg, args);\n\t }\n\t else if (!maxTimeoutId) {\n\t maxTimeoutId = setTimeout(maxDelayed, remaining);\n\t }\n\t }\n\t if (isCalled && timeoutId) {\n\t timeoutId = clearTimeout(timeoutId);\n\t }\n\t else if (!timeoutId && wait !== maxWait) {\n\t timeoutId = setTimeout(delayed, wait);\n\t }\n\t if (leadingCall) {\n\t isCalled = true;\n\t result = func.apply(thisArg, args);\n\t }\n\t if (isCalled && !timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t return result;\n\t }\n\t debounced.cancel = cancel;\n\t debounced.flush = flush;\n\t return debounced;\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = debounce;\n\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _TileLayer2 = __webpack_require__(34);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _TopoJSONTile = __webpack_require__(51);\n\t\n\tvar _TopoJSONTile2 = _interopRequireDefault(_TopoJSONTile);\n\t\n\tvar _lodashThrottle = __webpack_require__(48);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar TopoJSONTileLayer = (function (_TileLayer) {\n\t _inherits(TopoJSONTileLayer, _TileLayer);\n\t\n\t function TopoJSONTileLayer(path, options) {\n\t _classCallCheck(this, TopoJSONTileLayer);\n\t\n\t var defaults = {\n\t maxLOD: 13,\n\t distance: 2000\n\t };\n\t\n\t options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(TopoJSONTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t _this._initEvents();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t // this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t var options = {};\n\t\n\t if (this._options.filter) {\n\t options.filter = this._options.filter;\n\t }\n\t\n\t if (this._options.style) {\n\t options.style = this._options.style;\n\t }\n\t\n\t return (0, _TopoJSONTile2['default'])(quadcode, this._path, layer, options);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return TopoJSONTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new TopoJSONTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Tile2 = __webpack_require__(45);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(46);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _reqwest = __webpack_require__(52);\n\t\n\tvar _reqwest2 = _interopRequireDefault(_reqwest);\n\t\n\tvar _topojson = __webpack_require__(54);\n\t\n\tvar _topojson2 = _interopRequireDefault(_topojson);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _earcut = __webpack_require__(55);\n\t\n\tvar _earcut2 = _interopRequireDefault(_earcut);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\t// TODO: Perform tile request and processing in a Web Worker\n\t//\n\t// Use Operative (https://github.com/padolsey/operative)\n\t//\n\t// Would it make sense to have the worker functionality defined in a static\n\t// method so it only gets initialised once and not on every tile instance?\n\t//\n\t// Otherwise, worker processing logic would have to go in the tile layer so not\n\t// to waste loads of time setting up a brand new worker with three.js for each\n\t// tile every single time.\n\t//\n\t// Unsure of the best way to get three.js and VIZI into the worker\n\t//\n\t// Would need to set up a CRS / projection identical to the world instance\n\t//\n\t// Is it possible to bypass requirements on external script by having multiple\n\t// simple worker methods that each take enough inputs to perform a single task\n\t// without requiring VIZI or three.js? So long as the heaviest logic is done in\n\t// the worker and transferrable objects are used then it should be better than\n\t// nothing. Would probably still need things like earcut...\n\t//\n\t// After all, the three.js logic and object creation will still need to be\n\t// done on the main thread regardless so the worker should try to do as much as\n\t// possible with as few dependencies as possible.\n\t//\n\t// Have a look at how this is done in Tangram before implementing anything as\n\t// the approach there is pretty similar and robust.\n\t\n\tvar TopoJSONTile = (function (_Tile) {\n\t _inherits(TopoJSONTile, _Tile);\n\t\n\t function TopoJSONTile(quadcode, path, layer, options) {\n\t _classCallCheck(this, TopoJSONTile);\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t\n\t var defaults = {\n\t filter: null,\n\t style: {\n\t color: '#ff0000'\n\t }\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the tile\n\t\n\t _createClass(TopoJSONTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTile();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear request reference\n\t this._request = null;\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t\n\t mesh.renderOrder = 1;\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\t //\n\t // var material = new THREE.MeshBasicMaterial({\n\t // depthWrite: false\n\t // });\n\t //\n\t // var localMesh = new THREE.Mesh(geom, material);\n\t // localMesh.rotation.x = -90 * Math.PI / 180;\n\t //\n\t // mesh.add(localMesh);\n\t //\n\t // var box = new BoxHelper(localMesh);\n\t // mesh.add(box);\n\t //\n\t // mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t this._request = (0, _reqwest2['default'])({\n\t url: url,\n\t type: 'json',\n\t crossOrigin: true\n\t }).then(function (res) {\n\t // Clear request reference\n\t _this2._request = null;\n\t _this2._processTileData(res);\n\t })['catch'](function (err) {\n\t console.error(err);\n\t\n\t // Clear request reference\n\t _this2._request = null;\n\t });\n\t }\n\t }, {\n\t key: '_processTileData',\n\t value: function _processTileData(data) {\n\t var _this3 = this;\n\t\n\t var geojson = _topojson2['default'].feature(data, data.objects.vectile);\n\t\n\t var offset = (0, _geoPoint2['default'])(0, 0);\n\t offset.x = -1 * this._center[0];\n\t offset.y = -1 * this._center[1];\n\t\n\t var coordinates;\n\t var earcutData;\n\t var faces;\n\t // var geometry;\n\t\n\t var allVertices = [];\n\t var allFaces = [];\n\t var allColours = [];\n\t var facesCount = 0;\n\t\n\t var colour = new _three2['default'].Color();\n\t\n\t var features = geojson.features;\n\t\n\t // Run filter, if provided\n\t if (this._options.filter) {\n\t features = geojson.features.filter(this._options.filter);\n\t }\n\t\n\t var style = this._options.style;\n\t\n\t features.forEach(function (feature) {\n\t // feature.geometry, feature.properties\n\t\n\t // Get style object, if provided\n\t if (typeof _this3._options.style === 'function') {\n\t style = _this3._options.style(feature);\n\t }\n\t\n\t // console.log(style);\n\t\n\t var coordinates = feature.geometry.coordinates;\n\t\n\t // Skip if geometry is a point\n\t //\n\t // This should be a user-defined filter as it would be wrong to assume\n\t // that people won't want to output points\n\t if (!coordinates[0] || !coordinates[0][0] || !Array.isArray(coordinates[0][0])) {\n\t return;\n\t }\n\t\n\t coordinates = coordinates.map(function (ring) {\n\t return ring.map(function (coordinate) {\n\t var latlon = (0, _geoLatLon2['default'])(coordinate[1], coordinate[0]);\n\t var point = _this3._layer._world.latLonToPoint(latlon);\n\t return [point.x, point.y];\n\t });\n\t });\n\t\n\t earcutData = _this3._toEarcut(coordinates);\n\t\n\t faces = _this3._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\t\n\t colour.set(style.color);\n\t\n\t allVertices.push(earcutData.vertices);\n\t allColours.push([colour.r, colour.g, colour.b]);\n\t allFaces.push(faces);\n\t\n\t facesCount += faces.length;\n\t\n\t // console.log(earcutData.vertices);\n\t // console.log(faces);\n\t // return;\n\t\n\t // geometry = new THREE.BufferGeometry();\n\t //\n\t // // Three components per vertex per face (3 x 3 = 9)\n\t // var vertices = new Float32Array(faces.length * 9);\n\t //\n\t // var index;\n\t // for (var i = 0; i < faces.length; i++) {\n\t // // Array of vertex indexes for the face\n\t // index = faces[i][0];\n\t //\n\t // vertices[i * 9 + 0] = earcutData.vertices[index * dim];\n\t // vertices[i * 9 + 1] = 0;\n\t // vertices[i * 9 + 2] = earcutData.vertices[index * dim + 1];\n\t //\n\t // // Array of vertex indexes for the face\n\t // index = faces[i][1];\n\t //\n\t // vertices[i * 9 + 3] = earcutData.vertices[index * dim];\n\t // vertices[i * 9 + 4] = 0;\n\t // vertices[i * 9 + 5] = earcutData.vertices[index * dim + 1];\n\t //\n\t // // Array of vertex indexes for the face\n\t // index = faces[i][2];\n\t //\n\t // vertices[i * 9 + 6] = earcutData.vertices[index * dim];\n\t // vertices[i * 9 + 7] = 0;\n\t // vertices[i * 9 + 8] = earcutData.vertices[index * dim + 1];\n\t // }\n\t\n\t // var shape = new THREE.Shape();\n\t //\n\t // var outer = coordinates.shift();\n\t // var inners = coordinates;\n\t //\n\t // if (!outer || !outer[0] || !Array.isArray(outer[0])) {\n\t // return;\n\t // }\n\t //\n\t // // Create outer shape\n\t // outer.forEach((coord, index) => {\n\t // var latlon = LatLon(coord[1], coord[0]);\n\t // var point = this._layer._world.latLonToPoint(latlon);\n\t //\n\t // // Move if first coordinate\n\t // if (index === 0) {\n\t // shape.moveTo(point.x + offset.x, point.y + offset.y);\n\t // } else {\n\t // shape.lineTo(point.x + offset.x, point.y + offset.y);\n\t // }\n\t // });\n\t //\n\t // var geom = new THREE.ShapeGeometry(shape);\n\t // var mesh = new THREE.Mesh(geom, new THREE.MeshBasicMaterial({\n\t // color: 0x0000ff,\n\t // side: THREE.BackSide,\n\t // depthWrite: false\n\t // }));\n\t //\n\t // // Offset\n\t // // mesh.position.x = -1 * offset.x;\n\t // // mesh.position.z = -1 * offset.y;\n\t //\n\t // mesh.rotation.x = 90 * Math.PI / 180;\n\t //\n\t // this._mesh.add(mesh);\n\t });\n\t\n\t // Skip if no faces\n\t //\n\t // Need to check way before this if there are no faces, before even doing\n\t // earcut triangulation.\n\t if (facesCount === 0) {\n\t this._ready = true;\n\t return;\n\t }\n\t\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t // Three components per vertex per face (3 x 3 = 9)\n\t var vertices = new Float32Array(facesCount * 9);\n\t var normals = new Float32Array(facesCount * 9);\n\t var colours = new Float32Array(facesCount * 9);\n\t\n\t var pA = new _three2['default'].Vector3();\n\t var pB = new _three2['default'].Vector3();\n\t var pC = new _three2['default'].Vector3();\n\t\n\t var cb = new _three2['default'].Vector3();\n\t var ab = new _three2['default'].Vector3();\n\t\n\t var dim = 2;\n\t\n\t var index;\n\t var _faces;\n\t var _vertices;\n\t var _colour;\n\t var lastIndex = 0;\n\t for (var i = 0; i < allFaces.length; i++) {\n\t _faces = allFaces[i];\n\t _vertices = allVertices[i];\n\t _colour = allColours[i];\n\t\n\t for (var j = 0; j < _faces.length; j++) {\n\t // Array of vertex indexes for the face\n\t index = _faces[j][0];\n\t\n\t var ax = _vertices[index * dim] + offset.x;\n\t var ay = 0;\n\t var az = _vertices[index * dim + 1] + offset.y;\n\t\n\t index = _faces[j][1];\n\t\n\t var bx = _vertices[index * dim] + offset.x;\n\t var by = 0;\n\t var bz = _vertices[index * dim + 1] + offset.y;\n\t\n\t index = _faces[j][2];\n\t\n\t var cx = _vertices[index * dim] + offset.x;\n\t var cy = 0;\n\t var cz = _vertices[index * dim + 1] + offset.y;\n\t\n\t // Flat face normals\n\t // From: http://threejs.org/examples/webgl_buffergeometry.html\n\t pA.set(ax, ay, az);\n\t pB.set(bx, by, bz);\n\t pC.set(cx, cy, cz);\n\t\n\t cb.subVectors(pC, pB);\n\t ab.subVectors(pA, pB);\n\t cb.cross(ab);\n\t\n\t cb.normalize();\n\t\n\t var nx = cb.x;\n\t var ny = cb.y;\n\t var nz = cb.z;\n\t\n\t vertices[lastIndex * 9 + 0] = ax;\n\t vertices[lastIndex * 9 + 1] = ay;\n\t vertices[lastIndex * 9 + 2] = az;\n\t\n\t normals[lastIndex * 9 + 0] = nx;\n\t normals[lastIndex * 9 + 1] = ny;\n\t normals[lastIndex * 9 + 2] = nz;\n\t\n\t colours[lastIndex * 9 + 0] = _colour[0];\n\t colours[lastIndex * 9 + 1] = _colour[1];\n\t colours[lastIndex * 9 + 2] = _colour[2];\n\t\n\t vertices[lastIndex * 9 + 3] = bx;\n\t vertices[lastIndex * 9 + 4] = by;\n\t vertices[lastIndex * 9 + 5] = bz;\n\t\n\t normals[lastIndex * 9 + 3] = nx;\n\t normals[lastIndex * 9 + 4] = ny;\n\t normals[lastIndex * 9 + 5] = nz;\n\t\n\t colours[lastIndex * 9 + 3] = _colour[0];\n\t colours[lastIndex * 9 + 4] = _colour[1];\n\t colours[lastIndex * 9 + 5] = _colour[2];\n\t\n\t vertices[lastIndex * 9 + 6] = cx;\n\t vertices[lastIndex * 9 + 7] = cy;\n\t vertices[lastIndex * 9 + 8] = cz;\n\t\n\t normals[lastIndex * 9 + 6] = nx;\n\t normals[lastIndex * 9 + 7] = ny;\n\t normals[lastIndex * 9 + 8] = nz;\n\t\n\t colours[lastIndex * 9 + 6] = _colour[0];\n\t colours[lastIndex * 9 + 7] = _colour[1];\n\t colours[lastIndex * 9 + 8] = _colour[2];\n\t\n\t lastIndex++;\n\t }\n\t }\n\t\n\t // itemSize = 3 because there are 3 values (components) per vertex\n\t geometry.addAttribute('position', new _three2['default'].BufferAttribute(vertices, 3));\n\t geometry.addAttribute('normal', new _three2['default'].BufferAttribute(normals, 3));\n\t geometry.addAttribute('color', new _three2['default'].BufferAttribute(colours, 3));\n\t\n\t geometry.computeBoundingBox();\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t side: _three2['default'].BackSide,\n\t depthWrite: false\n\t });\n\t var mesh = new _three2['default'].Mesh(geometry, material);\n\t mesh.renderOrder = 1;\n\t\n\t this._mesh.add(mesh);\n\t\n\t this._ready = true;\n\t }\n\t }, {\n\t key: '_toEarcut',\n\t value: function _toEarcut(data) {\n\t var dim = data[0][0].length;\n\t var result = { vertices: [], holes: [], dimensions: dim };\n\t var holeIndex = 0;\n\t\n\t for (var i = 0; i < data.length; i++) {\n\t for (var j = 0; j < data[i].length; j++) {\n\t for (var d = 0; d < dim; d++) {\n\t result.vertices.push(data[i][j][d]);\n\t }\n\t }\n\t if (i > 0) {\n\t holeIndex += data[i - 1].length;\n\t result.holes.push(holeIndex);\n\t }\n\t }\n\t\n\t return result;\n\t }\n\t }, {\n\t key: '_triangulate',\n\t value: function _triangulate(contour, holes, dim) {\n\t // console.time('earcut');\n\t\n\t var faces = (0, _earcut2['default'])(contour, holes, dim);\n\t var result = [];\n\t\n\t for (i = 0, il = faces.length; i < il; i += 3) {\n\t result.push(faces.slice(i, i + 3));\n\t }\n\t\n\t // console.timeEnd('earcut');\n\t\n\t return result;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._request) {\n\t return;\n\t }\n\t\n\t this._request.abort();\n\t }\n\t }]);\n\t\n\t return TopoJSONTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer, options) {\n\t return new TopoJSONTile(quadcode, path, layer, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t * Reqwest! A general purpose XHR connection manager\n\t * license MIT (c) Dustin Diaz 2015\n\t * https://github.com/ded/reqwest\n\t */\n\t\n\t!function (name, context, definition) {\n\t if (typeof module != 'undefined' && module.exports) module.exports = definition()\n\t else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\t else context[name] = definition()\n\t}('reqwest', this, function () {\n\t\n\t var context = this\n\t\n\t if ('window' in context) {\n\t var doc = document\n\t , byTag = 'getElementsByTagName'\n\t , head = doc[byTag]('head')[0]\n\t } else {\n\t var XHR2\n\t try {\n\t XHR2 = __webpack_require__(53)\n\t } catch (ex) {\n\t throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n\t }\n\t }\n\t\n\t\n\t var httpsRe = /^http/\n\t , protocolRe = /(^\\w+):\\/\\//\n\t , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n\t , readyState = 'readyState'\n\t , contentType = 'Content-Type'\n\t , requestedWith = 'X-Requested-With'\n\t , uniqid = 0\n\t , callbackPrefix = 'reqwest_' + (+new Date())\n\t , lastValue // data stored by the most recent JSONP callback\n\t , xmlHttpRequest = 'XMLHttpRequest'\n\t , xDomainRequest = 'XDomainRequest'\n\t , noop = function () {}\n\t\n\t , isArray = typeof Array.isArray == 'function'\n\t ? Array.isArray\n\t : function (a) {\n\t return a instanceof Array\n\t }\n\t\n\t , defaultHeaders = {\n\t 'contentType': 'application/x-www-form-urlencoded'\n\t , 'requestedWith': xmlHttpRequest\n\t , 'accept': {\n\t '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n\t , 'xml': 'application/xml, text/xml'\n\t , 'html': 'text/html'\n\t , 'text': 'text/plain'\n\t , 'json': 'application/json, text/javascript'\n\t , 'js': 'application/javascript, text/javascript'\n\t }\n\t }\n\t\n\t , xhr = function(o) {\n\t // is it x-domain\n\t if (o['crossOrigin'] === true) {\n\t var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n\t if (xhr && 'withCredentials' in xhr) {\n\t return xhr\n\t } else if (context[xDomainRequest]) {\n\t return new XDomainRequest()\n\t } else {\n\t throw new Error('Browser does not support cross-origin requests')\n\t }\n\t } else if (context[xmlHttpRequest]) {\n\t return new XMLHttpRequest()\n\t } else if (XHR2) {\n\t return new XHR2()\n\t } else {\n\t return new ActiveXObject('Microsoft.XMLHTTP')\n\t }\n\t }\n\t , globalSetupOptions = {\n\t dataFilter: function (data) {\n\t return data\n\t }\n\t }\n\t\n\t function succeed(r) {\n\t var protocol = protocolRe.exec(r.url)\n\t protocol = (protocol && protocol[1]) || context.location.protocol\n\t return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n\t }\n\t\n\t function handleReadyState(r, success, error) {\n\t return function () {\n\t // use _aborted to mitigate against IE err c00c023f\n\t // (can't read props on aborted request objects)\n\t if (r._aborted) return error(r.request)\n\t if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n\t if (r.request && r.request[readyState] == 4) {\n\t r.request.onreadystatechange = noop\n\t if (succeed(r)) success(r.request)\n\t else\n\t error(r.request)\n\t }\n\t }\n\t }\n\t\n\t function setHeaders(http, o) {\n\t var headers = o['headers'] || {}\n\t , h\n\t\n\t headers['Accept'] = headers['Accept']\n\t || defaultHeaders['accept'][o['type']]\n\t || defaultHeaders['accept']['*']\n\t\n\t var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n\t // breaks cross-origin requests with legacy browsers\n\t if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n\t if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n\t for (h in headers)\n\t headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n\t }\n\t\n\t function setCredentials(http, o) {\n\t if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n\t http.withCredentials = !!o['withCredentials']\n\t }\n\t }\n\t\n\t function generalCallback(data) {\n\t lastValue = data\n\t }\n\t\n\t function urlappend (url, s) {\n\t return url + (/\\?/.test(url) ? '&' : '?') + s\n\t }\n\t\n\t function handleJsonp(o, fn, err, url) {\n\t var reqId = uniqid++\n\t , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n\t , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n\t , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n\t , match = url.match(cbreg)\n\t , script = doc.createElement('script')\n\t , loaded = 0\n\t , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\t\n\t if (match) {\n\t if (match[3] === '?') {\n\t url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n\t } else {\n\t cbval = match[3] // provided callback func name\n\t }\n\t } else {\n\t url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n\t }\n\t\n\t context[cbval] = generalCallback\n\t\n\t script.type = 'text/javascript'\n\t script.src = url\n\t script.async = true\n\t if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n\t // need this for IE due to out-of-order onreadystatechange(), binding script\n\t // execution to an event listener gives us control over when the script\n\t // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n\t script.htmlFor = script.id = '_reqwest_' + reqId\n\t }\n\t\n\t script.onload = script.onreadystatechange = function () {\n\t if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n\t return false\n\t }\n\t script.onload = script.onreadystatechange = null\n\t script.onclick && script.onclick()\n\t // Call the user callback with the last value stored and clean up values and scripts.\n\t fn(lastValue)\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t\n\t // Add the script to the DOM head\n\t head.appendChild(script)\n\t\n\t // Enable JSONP timeout\n\t return {\n\t abort: function () {\n\t script.onload = script.onreadystatechange = null\n\t err({}, 'Request is aborted: timeout', {})\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t }\n\t }\n\t\n\t function getRequest(fn, err) {\n\t var o = this.o\n\t , method = (o['method'] || 'GET').toUpperCase()\n\t , url = typeof o === 'string' ? o : o['url']\n\t // convert non-string objects to query-string form unless o['processData'] is false\n\t , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n\t ? reqwest.toQueryString(o['data'])\n\t : (o['data'] || null)\n\t , http\n\t , sendWait = false\n\t\n\t // if we're working on a GET request and we have data then we should append\n\t // query string to end of URL and not post data\n\t if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n\t url = urlappend(url, data)\n\t data = null\n\t }\n\t\n\t if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\t\n\t // get the xhr from the factory if passed\n\t // if the factory returns null, fall-back to ours\n\t http = (o.xhr && o.xhr(o)) || xhr(o)\n\t\n\t http.open(method, url, o['async'] === false ? false : true)\n\t setHeaders(http, o)\n\t setCredentials(http, o)\n\t if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n\t http.onload = fn\n\t http.onerror = err\n\t // NOTE: see\n\t // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n\t http.onprogress = function() {}\n\t sendWait = true\n\t } else {\n\t http.onreadystatechange = handleReadyState(this, fn, err)\n\t }\n\t o['before'] && o['before'](http)\n\t if (sendWait) {\n\t setTimeout(function () {\n\t http.send(data)\n\t }, 200)\n\t } else {\n\t http.send(data)\n\t }\n\t return http\n\t }\n\t\n\t function Reqwest(o, fn) {\n\t this.o = o\n\t this.fn = fn\n\t\n\t init.apply(this, arguments)\n\t }\n\t\n\t function setType(header) {\n\t // json, javascript, text/plain, text/html, xml\n\t if (header === null) return undefined; //In case of no content-type.\n\t if (header.match('json')) return 'json'\n\t if (header.match('javascript')) return 'js'\n\t if (header.match('text')) return 'html'\n\t if (header.match('xml')) return 'xml'\n\t }\n\t\n\t function init(o, fn) {\n\t\n\t this.url = typeof o == 'string' ? o : o['url']\n\t this.timeout = null\n\t\n\t // whether request has been fulfilled for purpose\n\t // of tracking the Promises\n\t this._fulfilled = false\n\t // success handlers\n\t this._successHandler = function(){}\n\t this._fulfillmentHandlers = []\n\t // error handlers\n\t this._errorHandlers = []\n\t // complete (both success and fail) handlers\n\t this._completeHandlers = []\n\t this._erred = false\n\t this._responseArgs = {}\n\t\n\t var self = this\n\t\n\t fn = fn || function () {}\n\t\n\t if (o['timeout']) {\n\t this.timeout = setTimeout(function () {\n\t timedOut()\n\t }, o['timeout'])\n\t }\n\t\n\t if (o['success']) {\n\t this._successHandler = function () {\n\t o['success'].apply(o, arguments)\n\t }\n\t }\n\t\n\t if (o['error']) {\n\t this._errorHandlers.push(function () {\n\t o['error'].apply(o, arguments)\n\t })\n\t }\n\t\n\t if (o['complete']) {\n\t this._completeHandlers.push(function () {\n\t o['complete'].apply(o, arguments)\n\t })\n\t }\n\t\n\t function complete (resp) {\n\t o['timeout'] && clearTimeout(self.timeout)\n\t self.timeout = null\n\t while (self._completeHandlers.length > 0) {\n\t self._completeHandlers.shift()(resp)\n\t }\n\t }\n\t\n\t function success (resp) {\n\t var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n\t resp = (type !== 'jsonp') ? self.request : resp\n\t // use global data filter on response text\n\t var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n\t , r = filteredResponse\n\t try {\n\t resp.responseText = r\n\t } catch (e) {\n\t // can't assign this in IE<=8, just ignore\n\t }\n\t if (r) {\n\t switch (type) {\n\t case 'json':\n\t try {\n\t resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n\t } catch (err) {\n\t return error(resp, 'Could not parse JSON in response', err)\n\t }\n\t break\n\t case 'js':\n\t resp = eval(r)\n\t break\n\t case 'html':\n\t resp = r\n\t break\n\t case 'xml':\n\t resp = resp.responseXML\n\t && resp.responseXML.parseError // IE trololo\n\t && resp.responseXML.parseError.errorCode\n\t && resp.responseXML.parseError.reason\n\t ? null\n\t : resp.responseXML\n\t break\n\t }\n\t }\n\t\n\t self._responseArgs.resp = resp\n\t self._fulfilled = true\n\t fn(resp)\n\t self._successHandler(resp)\n\t while (self._fulfillmentHandlers.length > 0) {\n\t resp = self._fulfillmentHandlers.shift()(resp)\n\t }\n\t\n\t complete(resp)\n\t }\n\t\n\t function timedOut() {\n\t self._timedOut = true\n\t self.request.abort()\n\t }\n\t\n\t function error(resp, msg, t) {\n\t resp = self.request\n\t self._responseArgs.resp = resp\n\t self._responseArgs.msg = msg\n\t self._responseArgs.t = t\n\t self._erred = true\n\t while (self._errorHandlers.length > 0) {\n\t self._errorHandlers.shift()(resp, msg, t)\n\t }\n\t complete(resp)\n\t }\n\t\n\t this.request = getRequest.call(this, success, error)\n\t }\n\t\n\t Reqwest.prototype = {\n\t abort: function () {\n\t this._aborted = true\n\t this.request.abort()\n\t }\n\t\n\t , retry: function () {\n\t init.call(this, this.o, this.fn)\n\t }\n\t\n\t /**\n\t * Small deviation from the Promises A CommonJs specification\n\t * http://wiki.commonjs.org/wiki/Promises/A\n\t */\n\t\n\t /**\n\t * `then` will execute upon successful requests\n\t */\n\t , then: function (success, fail) {\n\t success = success || function () {}\n\t fail = fail || function () {}\n\t if (this._fulfilled) {\n\t this._responseArgs.resp = success(this._responseArgs.resp)\n\t } else if (this._erred) {\n\t fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._fulfillmentHandlers.push(success)\n\t this._errorHandlers.push(fail)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `always` will execute whether the request succeeds or fails\n\t */\n\t , always: function (fn) {\n\t if (this._fulfilled || this._erred) {\n\t fn(this._responseArgs.resp)\n\t } else {\n\t this._completeHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `fail` will execute when the request fails\n\t */\n\t , fail: function (fn) {\n\t if (this._erred) {\n\t fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._errorHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t , 'catch': function (fn) {\n\t return this.fail(fn)\n\t }\n\t }\n\t\n\t function reqwest(o, fn) {\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t // normalize newline variants according to spec -> CRLF\n\t function normalize(s) {\n\t return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n\t }\n\t\n\t function serial(el, cb) {\n\t var n = el.name\n\t , t = el.tagName.toLowerCase()\n\t , optCb = function (o) {\n\t // IE gives value=\"\" even where there is no value attribute\n\t // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n\t if (o && !o['disabled'])\n\t cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n\t }\n\t , ch, ra, val, i\n\t\n\t // don't serialize elements that are disabled or without a name\n\t if (el.disabled || !n) return\n\t\n\t switch (t) {\n\t case 'input':\n\t if (!/reset|button|image|file/i.test(el.type)) {\n\t ch = /checkbox/i.test(el.type)\n\t ra = /radio/i.test(el.type)\n\t val = el.value\n\t // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n\t ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n\t }\n\t break\n\t case 'textarea':\n\t cb(n, normalize(el.value))\n\t break\n\t case 'select':\n\t if (el.type.toLowerCase() === 'select-one') {\n\t optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n\t } else {\n\t for (i = 0; el.length && i < el.length; i++) {\n\t el.options[i].selected && optCb(el.options[i])\n\t }\n\t }\n\t break\n\t }\n\t }\n\t\n\t // collect up all form elements found from the passed argument elements all\n\t // the way down to child elements; pass a '
' or form fields.\n\t // called with 'this'=callback to use for serial() on each element\n\t function eachFormElement() {\n\t var cb = this\n\t , e, i\n\t , serializeSubtags = function (e, tags) {\n\t var i, j, fa\n\t for (i = 0; i < tags.length; i++) {\n\t fa = e[byTag](tags[i])\n\t for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n\t }\n\t }\n\t\n\t for (i = 0; i < arguments.length; i++) {\n\t e = arguments[i]\n\t if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n\t serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n\t }\n\t }\n\t\n\t // standard query string style serialization\n\t function serializeQueryString() {\n\t return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n\t }\n\t\n\t // { 'name': 'value', ... } style serialization\n\t function serializeHash() {\n\t var hash = {}\n\t eachFormElement.apply(function (name, value) {\n\t if (name in hash) {\n\t hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n\t hash[name].push(value)\n\t } else hash[name] = value\n\t }, arguments)\n\t return hash\n\t }\n\t\n\t // [ { name: 'name', value: 'value' }, ... ] style serialization\n\t reqwest.serializeArray = function () {\n\t var arr = []\n\t eachFormElement.apply(function (name, value) {\n\t arr.push({name: name, value: value})\n\t }, arguments)\n\t return arr\n\t }\n\t\n\t reqwest.serialize = function () {\n\t if (arguments.length === 0) return ''\n\t var opt, fn\n\t , args = Array.prototype.slice.call(arguments, 0)\n\t\n\t opt = args.pop()\n\t opt && opt.nodeType && args.push(opt) && (opt = null)\n\t opt && (opt = opt.type)\n\t\n\t if (opt == 'map') fn = serializeHash\n\t else if (opt == 'array') fn = reqwest.serializeArray\n\t else fn = serializeQueryString\n\t\n\t return fn.apply(null, args)\n\t }\n\t\n\t reqwest.toQueryString = function (o, trad) {\n\t var prefix, i\n\t , traditional = trad || false\n\t , s = []\n\t , enc = encodeURIComponent\n\t , add = function (key, value) {\n\t // If value is a function, invoke it and return its value\n\t value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n\t s[s.length] = enc(key) + '=' + enc(value)\n\t }\n\t // If an array was passed in, assume that it is an array of form elements.\n\t if (isArray(o)) {\n\t for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n\t } else {\n\t // If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t // did it), otherwise encode params recursively.\n\t for (prefix in o) {\n\t if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n\t }\n\t }\n\t\n\t // spaces should be + according to spec\n\t return s.join('&').replace(/%20/g, '+')\n\t }\n\t\n\t function buildParams(prefix, obj, traditional, add) {\n\t var name, i, v\n\t , rbracket = /\\[\\]$/\n\t\n\t if (isArray(obj)) {\n\t // Serialize array item.\n\t for (i = 0; obj && i < obj.length; i++) {\n\t v = obj[i]\n\t if (traditional || rbracket.test(prefix)) {\n\t // Treat each array item as a scalar.\n\t add(prefix, v)\n\t } else {\n\t buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n\t }\n\t }\n\t } else if (obj && obj.toString() === '[object Object]') {\n\t // Serialize object item.\n\t for (name in obj) {\n\t buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n\t }\n\t\n\t } else {\n\t // Serialize scalar item.\n\t add(prefix, obj)\n\t }\n\t }\n\t\n\t reqwest.getcallbackPrefix = function () {\n\t return callbackPrefix\n\t }\n\t\n\t // jQuery and Zepto compatibility, differences can be remapped here so you can call\n\t // .ajax.compat(options, callback)\n\t reqwest.compat = function (o, fn) {\n\t if (o) {\n\t o['type'] && (o['method'] = o['type']) && delete o['type']\n\t o['dataType'] && (o['type'] = o['dataType'])\n\t o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n\t o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n\t }\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t reqwest.ajaxSetup = function (options) {\n\t options = options || {}\n\t for (var k in options) {\n\t globalSetupOptions[k] = options[k]\n\t }\n\t }\n\t\n\t return reqwest\n\t});\n\n\n/***/ },\n/* 53 */\n/***/ function(module, exports) {\n\n\t/* (ignored) */\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function (global, factory) {\n\t true ? factory(exports) :\n\t typeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t (factory((global.topojson = {})));\n\t}(this, function (exports) { 'use strict';\n\t\n\t function noop() {}\n\t\n\t function absolute(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t point[0] = (x0 += point[0]) * kx + dx;\n\t point[1] = (y0 += point[1]) * ky + dy;\n\t };\n\t }\n\t\n\t function relative(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t var x1 = (point[0] - dx) / kx | 0,\n\t y1 = (point[1] - dy) / ky | 0;\n\t point[0] = x1 - x0;\n\t point[1] = y1 - y0;\n\t x0 = x1;\n\t y0 = y1;\n\t };\n\t }\n\t\n\t function reverse(array, n) {\n\t var t, j = array.length, i = j - n;\n\t while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n\t }\n\t\n\t function bisect(a, x) {\n\t var lo = 0, hi = a.length;\n\t while (lo < hi) {\n\t var mid = lo + hi >>> 1;\n\t if (a[mid] < x) lo = mid + 1;\n\t else hi = mid;\n\t }\n\t return lo;\n\t }\n\t\n\t function feature(topology, o) {\n\t return o.type === \"GeometryCollection\" ? {\n\t type: \"FeatureCollection\",\n\t features: o.geometries.map(function(o) { return feature$1(topology, o); })\n\t } : feature$1(topology, o);\n\t }\n\t\n\t function feature$1(topology, o) {\n\t var f = {\n\t type: \"Feature\",\n\t id: o.id,\n\t properties: o.properties || {},\n\t geometry: object(topology, o)\n\t };\n\t if (o.id == null) delete f.id;\n\t return f;\n\t }\n\t\n\t function object(topology, o) {\n\t var absolute$$ = absolute(topology.transform),\n\t arcs = topology.arcs;\n\t\n\t function arc(i, points) {\n\t if (points.length) points.pop();\n\t for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n\t points.push(p = a[k].slice());\n\t absolute$$(p, k);\n\t }\n\t if (i < 0) reverse(points, n);\n\t }\n\t\n\t function point(p) {\n\t p = p.slice();\n\t absolute$$(p, 0);\n\t return p;\n\t }\n\t\n\t function line(arcs) {\n\t var points = [];\n\t for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n\t if (points.length < 2) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function ring(arcs) {\n\t var points = line(arcs);\n\t while (points.length < 4) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function polygon(arcs) {\n\t return arcs.map(ring);\n\t }\n\t\n\t function geometry(o) {\n\t var t = o.type;\n\t return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n\t : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n\t : null;\n\t }\n\t\n\t var geometryType = {\n\t Point: function(o) { return point(o.coordinates); },\n\t MultiPoint: function(o) { return o.coordinates.map(point); },\n\t LineString: function(o) { return line(o.arcs); },\n\t MultiLineString: function(o) { return o.arcs.map(line); },\n\t Polygon: function(o) { return polygon(o.arcs); },\n\t MultiPolygon: function(o) { return o.arcs.map(polygon); }\n\t };\n\t\n\t return geometry(o);\n\t }\n\t\n\t function stitchArcs(topology, arcs) {\n\t var stitchedArcs = {},\n\t fragmentByStart = {},\n\t fragmentByEnd = {},\n\t fragments = [],\n\t emptyIndex = -1;\n\t\n\t // Stitch empty arcs first, since they may be subsumed by other arcs.\n\t arcs.forEach(function(i, j) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], t;\n\t if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n\t t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n\t }\n\t });\n\t\n\t arcs.forEach(function(i) {\n\t var e = ends(i),\n\t start = e[0],\n\t end = e[1],\n\t f, g;\n\t\n\t if (f = fragmentByEnd[start]) {\n\t delete fragmentByEnd[f.end];\n\t f.push(i);\n\t f.end = end;\n\t if (g = fragmentByStart[end]) {\n\t delete fragmentByStart[g.start];\n\t var fg = g === f ? f : f.concat(g);\n\t fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else if (f = fragmentByStart[end]) {\n\t delete fragmentByStart[f.start];\n\t f.unshift(i);\n\t f.start = start;\n\t if (g = fragmentByEnd[start]) {\n\t delete fragmentByEnd[g.end];\n\t var gf = g === f ? f : g.concat(f);\n\t fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else {\n\t f = [i];\n\t fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n\t }\n\t });\n\t\n\t function ends(i) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n\t if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n\t else p1 = arc[arc.length - 1];\n\t return i < 0 ? [p1, p0] : [p0, p1];\n\t }\n\t\n\t function flush(fragmentByEnd, fragmentByStart) {\n\t for (var k in fragmentByEnd) {\n\t var f = fragmentByEnd[k];\n\t delete fragmentByStart[f.start];\n\t delete f.start;\n\t delete f.end;\n\t f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n\t fragments.push(f);\n\t }\n\t }\n\t\n\t flush(fragmentByEnd, fragmentByStart);\n\t flush(fragmentByStart, fragmentByEnd);\n\t arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\t\n\t return fragments;\n\t }\n\t\n\t function mesh(topology) {\n\t return object(topology, meshArcs.apply(this, arguments));\n\t }\n\t\n\t function meshArcs(topology, o, filter) {\n\t var arcs = [];\n\t\n\t function arc(i) {\n\t var j = i < 0 ? ~i : i;\n\t (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n\t }\n\t\n\t function line(arcs) {\n\t arcs.forEach(arc);\n\t }\n\t\n\t function polygon(arcs) {\n\t arcs.forEach(line);\n\t }\n\t\n\t function geometry(o) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n\t else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n\t }\n\t\n\t if (arguments.length > 1) {\n\t var geomsByArc = [],\n\t geom;\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n\t };\n\t\n\t geometry(o);\n\t\n\t geomsByArc.forEach(arguments.length < 3\n\t ? function(geoms) { arcs.push(geoms[0].i); }\n\t : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n\t } else {\n\t for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n\t }\n\t\n\t return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n\t }\n\t\n\t function triangle(triangle) {\n\t var a = triangle[0], b = triangle[1], c = triangle[2];\n\t return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n\t }\n\t\n\t function ring(ring) {\n\t var i = -1,\n\t n = ring.length,\n\t a,\n\t b = ring[n - 1],\n\t area = 0;\n\t\n\t while (++i < n) {\n\t a = b;\n\t b = ring[i];\n\t area += a[0] * b[1] - a[1] * b[0];\n\t }\n\t\n\t return area / 2;\n\t }\n\t\n\t function merge(topology) {\n\t return object(topology, mergeArcs.apply(this, arguments));\n\t }\n\t\n\t function mergeArcs(topology, objects) {\n\t var polygonsByArc = {},\n\t polygons = [],\n\t components = [];\n\t\n\t objects.forEach(function(o) {\n\t if (o.type === \"Polygon\") register(o.arcs);\n\t else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n\t });\n\t\n\t function register(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n\t });\n\t });\n\t polygons.push(polygon);\n\t }\n\t\n\t function exterior(ring$$) {\n\t return ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]) > 0; // TODO allow spherical?\n\t }\n\t\n\t polygons.forEach(function(polygon) {\n\t if (!polygon._) {\n\t var component = [],\n\t neighbors = [polygon];\n\t polygon._ = 1;\n\t components.push(component);\n\t while (polygon = neighbors.pop()) {\n\t component.push(polygon);\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n\t if (!polygon._) {\n\t polygon._ = 1;\n\t neighbors.push(polygon);\n\t }\n\t });\n\t });\n\t });\n\t }\n\t }\n\t });\n\t\n\t polygons.forEach(function(polygon) {\n\t delete polygon._;\n\t });\n\t\n\t return {\n\t type: \"MultiPolygon\",\n\t arcs: components.map(function(polygons) {\n\t var arcs = [], n;\n\t\n\t // Extract the exterior (unique) arcs.\n\t polygons.forEach(function(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n\t arcs.push(arc);\n\t }\n\t });\n\t });\n\t });\n\t\n\t // Stitch the arcs into one or more rings.\n\t arcs = stitchArcs(topology, arcs);\n\t\n\t // If more than one ring is returned,\n\t // at most one of these rings can be the exterior;\n\t // this exterior ring has the same winding order\n\t // as any exterior ring in the original polygons.\n\t if ((n = arcs.length) > 1) {\n\t var sgn = exterior(polygons[0][0]);\n\t for (var i = 0, t; i < n; ++i) {\n\t if (sgn === exterior(arcs[i])) {\n\t t = arcs[0], arcs[0] = arcs[i], arcs[i] = t;\n\t break;\n\t }\n\t }\n\t }\n\t\n\t return arcs;\n\t })\n\t };\n\t }\n\t\n\t function neighbors(objects) {\n\t var indexesByArc = {}, // arc index -> array of object indexes\n\t neighbors = objects.map(function() { return []; });\n\t\n\t function line(arcs, i) {\n\t arcs.forEach(function(a) {\n\t if (a < 0) a = ~a;\n\t var o = indexesByArc[a];\n\t if (o) o.push(i);\n\t else indexesByArc[a] = [i];\n\t });\n\t }\n\t\n\t function polygon(arcs, i) {\n\t arcs.forEach(function(arc) { line(arc, i); });\n\t }\n\t\n\t function geometry(o, i) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n\t else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n\t }\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n\t };\n\t\n\t objects.forEach(geometry);\n\t\n\t for (var i in indexesByArc) {\n\t for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n\t for (var k = j + 1; k < m; ++k) {\n\t var ij = indexes[j], ik = indexes[k], n;\n\t if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n\t if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n\t }\n\t }\n\t }\n\t\n\t return neighbors;\n\t }\n\t\n\t function compareArea(a, b) {\n\t return a[1][2] - b[1][2];\n\t }\n\t\n\t function minAreaHeap() {\n\t var heap = {},\n\t array = [],\n\t size = 0;\n\t\n\t heap.push = function(object) {\n\t up(array[object._ = size] = object, size++);\n\t return size;\n\t };\n\t\n\t heap.pop = function() {\n\t if (size <= 0) return;\n\t var removed = array[0], object;\n\t if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n\t return removed;\n\t };\n\t\n\t heap.remove = function(removed) {\n\t var i = removed._, object;\n\t if (array[i] !== removed) return; // invalid request\n\t if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n\t return i;\n\t };\n\t\n\t function up(object, i) {\n\t while (i > 0) {\n\t var j = ((i + 1) >> 1) - 1,\n\t parent = array[j];\n\t if (compareArea(object, parent) >= 0) break;\n\t array[parent._ = i] = parent;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t function down(object, i) {\n\t while (true) {\n\t var r = (i + 1) << 1,\n\t l = r - 1,\n\t j = i,\n\t child = array[j];\n\t if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n\t if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n\t if (j === i) break;\n\t array[child._ = i] = child;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t return heap;\n\t }\n\t\n\t function presimplify(topology, triangleArea) {\n\t var absolute$$ = absolute(topology.transform),\n\t relative$$ = relative(topology.transform),\n\t heap = minAreaHeap();\n\t\n\t if (!triangleArea) triangleArea = triangle;\n\t\n\t topology.arcs.forEach(function(arc) {\n\t var triangles = [],\n\t maxArea = 0,\n\t triangle,\n\t i,\n\t n,\n\t p;\n\t\n\t // To store each point’s effective area, we create a new array rather than\n\t // extending the passed-in point to workaround a Chrome/V8 bug (getting\n\t // stuck in smi mode). For midpoints, the initial effective area of\n\t // Infinity will be computed in the next step.\n\t for (i = 0, n = arc.length; i < n; ++i) {\n\t p = arc[i];\n\t absolute$$(arc[i] = [p[0], p[1], Infinity], i);\n\t }\n\t\n\t for (i = 1, n = arc.length - 1; i < n; ++i) {\n\t triangle = arc.slice(i - 1, i + 2);\n\t triangle[1][2] = triangleArea(triangle);\n\t triangles.push(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t for (i = 0, n = triangles.length; i < n; ++i) {\n\t triangle = triangles[i];\n\t triangle.previous = triangles[i - 1];\n\t triangle.next = triangles[i + 1];\n\t }\n\t\n\t while (triangle = heap.pop()) {\n\t var previous = triangle.previous,\n\t next = triangle.next;\n\t\n\t // If the area of the current point is less than that of the previous point\n\t // to be eliminated, use the latter's area instead. This ensures that the\n\t // current point cannot be eliminated without eliminating previously-\n\t // eliminated points.\n\t if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n\t else maxArea = triangle[1][2];\n\t\n\t if (previous) {\n\t previous.next = next;\n\t previous[2] = triangle[2];\n\t update(previous);\n\t }\n\t\n\t if (next) {\n\t next.previous = previous;\n\t next[0] = triangle[0];\n\t update(next);\n\t }\n\t }\n\t\n\t arc.forEach(relative$$);\n\t });\n\t\n\t function update(triangle) {\n\t heap.remove(triangle);\n\t triangle[1][2] = triangleArea(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t return topology;\n\t }\n\t\n\t var version = \"1.6.24\";\n\t\n\t exports.version = version;\n\t exports.mesh = mesh;\n\t exports.meshArcs = meshArcs;\n\t exports.merge = merge;\n\t exports.mergeArcs = mergeArcs;\n\t exports.feature = feature;\n\t exports.neighbors = neighbors;\n\t exports.presimplify = presimplify;\n\t\n\t}));\n\n/***/ },\n/* 55 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = earcut;\n\t\n\tfunction earcut(data, holeIndices, dim) {\n\t\n\t dim = dim || 2;\n\t\n\t var hasHoles = holeIndices && holeIndices.length,\n\t outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n\t outerNode = linkedList(data, 0, outerLen, dim, true),\n\t triangles = [];\n\t\n\t if (!outerNode) return triangles;\n\t\n\t var minX, minY, maxX, maxY, x, y, size;\n\t\n\t if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\t\n\t // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t if (data.length > 80 * dim) {\n\t minX = maxX = data[0];\n\t minY = maxY = data[1];\n\t\n\t for (var i = dim; i < outerLen; i += dim) {\n\t x = data[i];\n\t y = data[i + 1];\n\t if (x < minX) minX = x;\n\t if (y < minY) minY = y;\n\t if (x > maxX) maxX = x;\n\t if (y > maxY) maxY = y;\n\t }\n\t\n\t // minX, minY and size are later used to transform coords into integers for z-order calculation\n\t size = Math.max(maxX - minX, maxY - minY);\n\t }\n\t\n\t earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\t\n\t return triangles;\n\t}\n\t\n\t// create a circular doubly linked list from polygon points in the specified winding order\n\tfunction linkedList(data, start, end, dim, clockwise) {\n\t var sum = 0,\n\t i, j, last;\n\t\n\t // calculate original winding order of a polygon ring\n\t for (i = start, j = end - dim; i < end; i += dim) {\n\t sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n\t j = i;\n\t }\n\t\n\t // link points into circular doubly-linked list in the specified winding order\n\t if (clockwise === (sum > 0)) {\n\t for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n\t } else {\n\t for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n\t }\n\t\n\t return last;\n\t}\n\t\n\t// eliminate colinear or duplicate points\n\tfunction filterPoints(start, end) {\n\t if (!start) return start;\n\t if (!end) end = start;\n\t\n\t var p = start,\n\t again;\n\t do {\n\t again = false;\n\t\n\t if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n\t removeNode(p);\n\t p = end = p.prev;\n\t if (p === p.next) return null;\n\t again = true;\n\t\n\t } else {\n\t p = p.next;\n\t }\n\t } while (again || p !== end);\n\t\n\t return end;\n\t}\n\t\n\t// main ear slicing loop which triangulates a polygon (given as a linked list)\n\tfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n\t if (!ear) return;\n\t\n\t // interlink polygon nodes in z-order\n\t if (!pass && size) indexCurve(ear, minX, minY, size);\n\t\n\t var stop = ear,\n\t prev, next;\n\t\n\t // iterate through ears, slicing them one by one\n\t while (ear.prev !== ear.next) {\n\t prev = ear.prev;\n\t next = ear.next;\n\t\n\t if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n\t // cut off the triangle\n\t triangles.push(prev.i / dim);\n\t triangles.push(ear.i / dim);\n\t triangles.push(next.i / dim);\n\t\n\t removeNode(ear);\n\t\n\t // skipping the next vertice leads to less sliver triangles\n\t ear = next.next;\n\t stop = next.next;\n\t\n\t continue;\n\t }\n\t\n\t ear = next;\n\t\n\t // if we looped through the whole remaining polygon and can't find any more ears\n\t if (ear === stop) {\n\t // try filtering points and slicing again\n\t if (!pass) {\n\t earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\t\n\t // if this didn't work, try curing all small self-intersections locally\n\t } else if (pass === 1) {\n\t ear = cureLocalIntersections(ear, triangles, dim);\n\t earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\t\n\t // as a last resort, try splitting the remaining polygon into two\n\t } else if (pass === 2) {\n\t splitEarcut(ear, triangles, dim, minX, minY, size);\n\t }\n\t\n\t break;\n\t }\n\t }\n\t}\n\t\n\t// check whether a polygon node forms a valid ear with adjacent nodes\n\tfunction isEar(ear) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // now make sure we don't have other points inside the potential ear\n\t var p = ear.next.next;\n\t\n\t while (p !== ear.prev) {\n\t if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.next;\n\t }\n\t\n\t return true;\n\t}\n\t\n\tfunction isEarHashed(ear, minX, minY, size) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // triangle bbox; min & max are calculated like this for speed\n\t var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n\t minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n\t maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n\t maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\t\n\t // z-order range for the current triangle bbox;\n\t var minZ = zOrder(minTX, minTY, minX, minY, size),\n\t maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\t\n\t // first look for points inside the triangle in increasing z-order\n\t var p = ear.nextZ;\n\t\n\t while (p && p.z <= maxZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.nextZ;\n\t }\n\t\n\t // then look for points in decreasing z-order\n\t p = ear.prevZ;\n\t\n\t while (p && p.z >= minZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.prevZ;\n\t }\n\t\n\t return true;\n\t}\n\t\n\t// go through all polygon nodes and cure small local self-intersections\n\tfunction cureLocalIntersections(start, triangles, dim) {\n\t var p = start;\n\t do {\n\t var a = p.prev,\n\t b = p.next.next;\n\t\n\t // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])\n\t if (intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\t\n\t triangles.push(a.i / dim);\n\t triangles.push(p.i / dim);\n\t triangles.push(b.i / dim);\n\t\n\t // remove two nodes involved\n\t removeNode(p);\n\t removeNode(p.next);\n\t\n\t p = start = b;\n\t }\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return p;\n\t}\n\t\n\t// try splitting polygon into two and triangulate them independently\n\tfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n\t // look for a valid diagonal that divides the polygon into two\n\t var a = start;\n\t do {\n\t var b = a.next.next;\n\t while (b !== a.prev) {\n\t if (a.i !== b.i && isValidDiagonal(a, b)) {\n\t // split the polygon in two by the diagonal\n\t var c = splitPolygon(a, b);\n\t\n\t // filter colinear points around the cuts\n\t a = filterPoints(a, a.next);\n\t c = filterPoints(c, c.next);\n\t\n\t // run earcut on each half\n\t earcutLinked(a, triangles, dim, minX, minY, size);\n\t earcutLinked(c, triangles, dim, minX, minY, size);\n\t return;\n\t }\n\t b = b.next;\n\t }\n\t a = a.next;\n\t } while (a !== start);\n\t}\n\t\n\t// link every hole into the outer loop, producing a single-ring polygon without holes\n\tfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n\t var queue = [],\n\t i, len, start, end, list;\n\t\n\t for (i = 0, len = holeIndices.length; i < len; i++) {\n\t start = holeIndices[i] * dim;\n\t end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t list = linkedList(data, start, end, dim, false);\n\t if (list === list.next) list.steiner = true;\n\t queue.push(getLeftmost(list));\n\t }\n\t\n\t queue.sort(compareX);\n\t\n\t // process holes from left to right\n\t for (i = 0; i < queue.length; i++) {\n\t eliminateHole(queue[i], outerNode);\n\t outerNode = filterPoints(outerNode, outerNode.next);\n\t }\n\t\n\t return outerNode;\n\t}\n\t\n\tfunction compareX(a, b) {\n\t return a.x - b.x;\n\t}\n\t\n\t// find a bridge between vertices that connects hole with an outer ring and and link it\n\tfunction eliminateHole(hole, outerNode) {\n\t outerNode = findHoleBridge(hole, outerNode);\n\t if (outerNode) {\n\t var b = splitPolygon(outerNode, hole);\n\t filterPoints(b, b.next);\n\t }\n\t}\n\t\n\t// David Eberly's algorithm for finding a bridge between hole and outer polygon\n\tfunction findHoleBridge(hole, outerNode) {\n\t var p = outerNode,\n\t hx = hole.x,\n\t hy = hole.y,\n\t qx = -Infinity,\n\t m;\n\t\n\t // find a segment intersected by a ray from the hole's leftmost point to the left;\n\t // segment's endpoint with lesser x will be potential connection point\n\t do {\n\t if (hy <= p.y && hy >= p.next.y) {\n\t var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n\t if (x <= hx && x > qx) {\n\t qx = x;\n\t m = p.x < p.next.x ? p : p.next;\n\t }\n\t }\n\t p = p.next;\n\t } while (p !== outerNode);\n\t\n\t if (!m) return null;\n\t\n\t if (hole.x === m.x) return m.prev; // hole touches outer segment; pick lower endpoint\n\t\n\t // look for points inside the triangle of hole point, segment intersection and endpoint;\n\t // if there are no points found, we have a valid connection;\n\t // otherwise choose the point of the minimum angle with the ray as connection point\n\t\n\t var stop = m,\n\t tanMin = Infinity,\n\t tan;\n\t\n\t p = m.next;\n\t\n\t while (p !== stop) {\n\t if (hx >= p.x && p.x >= m.x &&\n\t pointInTriangle(hy < m.y ? hx : qx, hy, m.x, m.y, hy < m.y ? qx : hx, hy, p.x, p.y)) {\n\t\n\t tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\t\n\t if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n\t m = p;\n\t tanMin = tan;\n\t }\n\t }\n\t\n\t p = p.next;\n\t }\n\t\n\t return m;\n\t}\n\t\n\t// interlink polygon nodes in z-order\n\tfunction indexCurve(start, minX, minY, size) {\n\t var p = start;\n\t do {\n\t if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n\t p.prevZ = p.prev;\n\t p.nextZ = p.next;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t p.prevZ.nextZ = null;\n\t p.prevZ = null;\n\t\n\t sortLinked(p);\n\t}\n\t\n\t// Simon Tatham's linked list merge sort algorithm\n\t// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\n\tfunction sortLinked(list) {\n\t var i, p, q, e, tail, numMerges, pSize, qSize,\n\t inSize = 1;\n\t\n\t do {\n\t p = list;\n\t list = null;\n\t tail = null;\n\t numMerges = 0;\n\t\n\t while (p) {\n\t numMerges++;\n\t q = p;\n\t pSize = 0;\n\t for (i = 0; i < inSize; i++) {\n\t pSize++;\n\t q = q.nextZ;\n\t if (!q) break;\n\t }\n\t\n\t qSize = inSize;\n\t\n\t while (pSize > 0 || (qSize > 0 && q)) {\n\t\n\t if (pSize === 0) {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t } else if (qSize === 0 || !q) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else if (p.z <= q.z) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t }\n\t\n\t if (tail) tail.nextZ = e;\n\t else list = e;\n\t\n\t e.prevZ = tail;\n\t tail = e;\n\t }\n\t\n\t p = q;\n\t }\n\t\n\t tail.nextZ = null;\n\t inSize *= 2;\n\t\n\t } while (numMerges > 1);\n\t\n\t return list;\n\t}\n\t\n\t// z-order of a point given coords and size of the data bounding box\n\tfunction zOrder(x, y, minX, minY, size) {\n\t // coords are transformed into non-negative 15-bit integer range\n\t x = 32767 * (x - minX) / size;\n\t y = 32767 * (y - minY) / size;\n\t\n\t x = (x | (x << 8)) & 0x00FF00FF;\n\t x = (x | (x << 4)) & 0x0F0F0F0F;\n\t x = (x | (x << 2)) & 0x33333333;\n\t x = (x | (x << 1)) & 0x55555555;\n\t\n\t y = (y | (y << 8)) & 0x00FF00FF;\n\t y = (y | (y << 4)) & 0x0F0F0F0F;\n\t y = (y | (y << 2)) & 0x33333333;\n\t y = (y | (y << 1)) & 0x55555555;\n\t\n\t return x | (y << 1);\n\t}\n\t\n\t// find the leftmost node of a polygon ring\n\tfunction getLeftmost(start) {\n\t var p = start,\n\t leftmost = start;\n\t do {\n\t if (p.x < leftmost.x) leftmost = p;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return leftmost;\n\t}\n\t\n\t// check if a point lies within a convex triangle\n\tfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n\t return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n\t (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n\t (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n\t}\n\t\n\t// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n\tfunction isValidDiagonal(a, b) {\n\t return equals(a, b) || a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n\t locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n\t}\n\t\n\t// signed area of a triangle\n\tfunction area(p, q, r) {\n\t return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n\t}\n\t\n\t// check if two points are equal\n\tfunction equals(p1, p2) {\n\t return p1.x === p2.x && p1.y === p2.y;\n\t}\n\t\n\t// check if two segments intersect\n\tfunction intersects(p1, q1, p2, q2) {\n\t return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n\t area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n\t}\n\t\n\t// check if a polygon diagonal intersects any polygon segments\n\tfunction intersectsPolygon(a, b) {\n\t var p = a;\n\t do {\n\t if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t intersects(p, p.next, a, b)) return true;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return false;\n\t}\n\t\n\t// check if a polygon diagonal is locally inside the polygon\n\tfunction locallyInside(a, b) {\n\t return area(a.prev, a, a.next) < 0 ?\n\t area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n\t area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n\t}\n\t\n\t// check if the middle point of a polygon diagonal is inside the polygon\n\tfunction middleInside(a, b) {\n\t var p = a,\n\t inside = false,\n\t px = (a.x + b.x) / 2,\n\t py = (a.y + b.y) / 2;\n\t do {\n\t if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n\t inside = !inside;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return inside;\n\t}\n\t\n\t// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n\t// if one belongs to the outer ring and another to a hole, it merges it into a single ring\n\tfunction splitPolygon(a, b) {\n\t var a2 = new Node(a.i, a.x, a.y),\n\t b2 = new Node(b.i, b.x, b.y),\n\t an = a.next,\n\t bp = b.prev;\n\t\n\t a.next = b;\n\t b.prev = a;\n\t\n\t a2.next = an;\n\t an.prev = a2;\n\t\n\t b2.next = a2;\n\t a2.prev = b2;\n\t\n\t bp.next = b2;\n\t b2.prev = bp;\n\t\n\t return b2;\n\t}\n\t\n\t// create a node and optionally link it with previous one (in a circular doubly linked list)\n\tfunction insertNode(i, x, y, last) {\n\t var p = new Node(i, x, y);\n\t\n\t if (!last) {\n\t p.prev = p;\n\t p.next = p;\n\t\n\t } else {\n\t p.next = last.next;\n\t p.prev = last;\n\t last.next.prev = p;\n\t last.next = p;\n\t }\n\t return p;\n\t}\n\t\n\tfunction removeNode(p) {\n\t p.next.prev = p.prev;\n\t p.prev.next = p.next;\n\t\n\t if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n\t if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n\t}\n\t\n\tfunction Node(i, x, y) {\n\t // vertice index in coordinates array\n\t this.i = i;\n\t\n\t // vertex coordinates\n\t this.x = x;\n\t this.y = y;\n\t\n\t // previous and next vertice nodes in a polygon ring\n\t this.prev = null;\n\t this.next = null;\n\t\n\t // z-order curve value\n\t this.z = null;\n\t\n\t // previous and next nodes in z-order\n\t this.prevZ = null;\n\t this.nextZ = null;\n\t\n\t // indicates whether this is a steiner point\n\t this.steiner = false;\n\t}\n\n\n/***/ }\n/******/ ])\n});\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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 0911d5d7bb6e1622fcf5\n **/","import World from './World';\nimport Controls from './controls/index';\nimport EnvironmentLayer from './layer/environment/EnvironmentLayer';\nimport ImageTileLayer from './layer/tile/ImageTileLayer';\nimport TopoJSONTileLayer from './layer/tile/TopoJSONTileLayer';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\n\nconst VIZI = {\n version: '0.3',\n\n // Public API\n World: World,\n Controls: Controls,\n EnvironmentLayer: EnvironmentLayer,\n ImageTileLayer: ImageTileLayer,\n TopoJSONTileLayer: TopoJSONTileLayer,\n Point: Point,\n LatLon: LatLon\n};\n\nexport default VIZI;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vizicities.js\n **/","import EventEmitter from 'eventemitter3';\nimport extend from 'lodash.assign';\nimport CRS from './geo/CRS/index';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\nimport Engine from './engine/Engine';\n\n// Pretty much any event someone using ViziCities would need will be emitted or\n// proxied by World (eg. render events, etc)\n\nclass World extends EventEmitter {\n constructor(domId, options) {\n super();\n\n var defaults = {\n crs: CRS.EPSG3857\n };\n\n this.options = extend(defaults, options);\n\n this._layers = [];\n this._controls = [];\n\n this._initContainer(domId);\n this._initEngine();\n this._initEvents();\n\n // Kick off the update and render loop\n this._update();\n }\n\n _initContainer(domId) {\n this._container = document.getElementById(domId);\n }\n\n _initEngine() {\n this._engine = Engine(this._container);\n\n // Engine events\n //\n // Consider proxying these through events on World for public access\n // this._engine.on('preRender', () => {});\n // this._engine.on('postRender', () => {});\n }\n\n _initEvents() {\n this.on('controlsMoveEnd', this._onControlsMoveEnd);\n }\n\n _onControlsMoveEnd(point) {\n var _point = Point(point.x, point.z);\n this._resetView(this.pointToLatLon(_point), _point);\n }\n\n // Reset world view\n _resetView(latlon, point) {\n this.emit('preResetView');\n\n this._moveStart();\n this._move(latlon, point);\n this._moveEnd();\n\n this.emit('postResetView');\n }\n\n _moveStart() {\n this.emit('moveStart');\n }\n\n _move(latlon, point) {\n this._lastPosition = latlon;\n this.emit('move', latlon, point);\n }\n _moveEnd() {\n this.emit('moveEnd');\n }\n\n _update() {\n var delta = this._engine.clock.getDelta();\n\n // Once _update is called it will run forever, for now\n window.requestAnimationFrame(this._update.bind(this));\n\n // Update controls\n this._controls.forEach(controls => {\n controls.update();\n });\n\n this.emit('preUpdate');\n this._engine.update(delta);\n this.emit('postUpdate');\n }\n\n // Set world view\n setView(latlon) {\n // Store initial geographic coordinate for the [0,0,0] world position\n //\n // The origin point doesn't move in three.js / 3D space so only set it once\n // here instead of every time _resetView is called\n //\n // If it was updated every time then coorindates would shift over time and\n // would be out of place / context with previously-placed points (0,0 would\n // refer to a different point each time)\n this._originLatlon = latlon;\n this._originPoint = this.project(latlon);\n\n this._resetView(latlon);\n return this;\n }\n\n // Return world geographic position\n getPosition() {\n return this._lastPosition;\n }\n\n // Transform geographic coordinate to world point\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the origin point of the projection (not the world)\n project(latlon) {\n return this.options.crs.latLonToPoint(LatLon(latlon));\n }\n\n // Transform world point to geographic coordinate\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a point relative to the origin point of the\n // projection (not the world) and returns a geographic coordinate\n unproject(point) {\n return this.options.crs.pointToLatLon(Point(point));\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the three.js / 3D origin (0,0)\n latLonToPoint(latlon) {\n var projectedPoint = this.project(LatLon(latlon));\n return projectedPoint._subtract(this._originPoint);\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a point relative to the three.js / 3D origin (0,0)\n // and returns the exact geographic coordinate at that point\n pointToLatLon(point) {\n var projectedPoint = Point(point).add(this._originPoint);\n return this.unproject(projectedPoint);\n }\n\n // Unsure if it's a good idea to expose this here for components like\n // GridLayer to use (eg. to keep track of a frustum)\n getCamera() {\n return this._engine._camera;\n }\n\n addLayer(layer) {\n layer._addToWorld(this);\n\n this._layers.push(layer);\n\n // Could move this into Layer but it'll do here for now\n this._engine._scene.add(layer._layer);\n\n this.emit('layerAdded', layer);\n return this;\n }\n\n // Remove layer and perform clean up operations\n removeLayer(layer) {\n var layerIndex = this._layers.indexOf(layer);\n\n if (layerIndex > -1) {\n // Remove from this._layers\n this._layers.splice(layerIndex, 1);\n };\n\n this._engine._scene.remove(layer._layer);\n\n layer.destroy();\n\n this.emit('layerRemoved');\n return this;\n }\n\n addControls(controls) {\n controls._addToWorld(this);\n\n this._controls.push(controls);\n\n this.emit('controlsAdded', controls);\n return this;\n }\n\n removeControls(controls) {}\n}\n\n// Initialise without requiring new keyword\nexport default function(domId, options) {\n return new World(domId, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/World.js\n **/","'use strict';\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} once Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Holds the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events && this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if ('function' === typeof listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Functon} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return this;\n\n var listeners = this._events[evt]\n , events = [];\n\n if (fn) {\n if (listeners.fn) {\n if (\n listeners.fn !== fn\n || (once && !listeners.once)\n || (context && listeners.context !== context)\n ) {\n events.push(listeners);\n }\n } else {\n for (var i = 0, length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) {\n this._events[evt] = events.length === 1 ? events[0] : events;\n } else {\n delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n if (!this._events) return this;\n\n if (event) delete this._events[prefix ? prefix + event : event];\n else this._events = prefix ? {} : Object.create(null);\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/eventemitter3/index.js\n ** module id = 2\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar keys = require('lodash.keys'),\n rest = require('lodash.rest');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if ((!eq(objValue, value) ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object) {\n return copyObjectWith(source, props, object);\n}\n\n/**\n * This function is like `copyObject` except that it accepts a function to\n * customize copied values.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObjectWith(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\n assignValue(object, key, newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return rest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Assigns own enumerable properties of source objects to the destination\n * object. Source objects are applied from left to right. Subsequent sources\n * overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.c = 3;\n * }\n *\n * function Bar() {\n * this.e = 5;\n * }\n *\n * Foo.prototype.d = 4;\n * Bar.prototype.f = 6;\n *\n * _.assign({ 'a': 1 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3, 'e': 5 }\n */\nvar assign = createAssigner(function(object, source) {\n copyObject(source, keys(source), object);\n});\n\nmodule.exports = assign;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.assign/index.js\n ** module id = 3\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n stringTag = '[object String]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototypeOf = Object.getPrototypeOf,\n propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = Object.keys;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n // that are composed entirely of index properties, return `false` for\n // `hasOwnProperty` checks of them.\n return hasOwnProperty.call(object, key) ||\n (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @type Function\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n var length = object ? object.length : undefined;\n if (isLength(length) &&\n (isArray(object) || isString(object) || isArguments(object))) {\n return baseTimes(length, String);\n }\n return null;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n var isProto = isPrototype(object);\n if (!(isProto || isArrayLike(object))) {\n return baseKeys(object);\n }\n var indexes = indexKeys(object),\n skipIndexes = !!indexes,\n result = indexes || [],\n length = result.length;\n\n for (var key in object) {\n if (baseHas(object, key) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n !(isProto && key == 'constructor')) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.keys/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n var length = args.length;\n switch (length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3');\n * // => 3\n */\nfunction toInteger(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n var remainder = value % 1;\n return value === value ? (remainder ? value - remainder : value) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = rest;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.rest/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import EPSG3857 from './CRS.EPSG3857';\nimport {EPSG900913} from './CRS.EPSG3857';\nimport EPSG3395 from './CRS.EPSG3395';\nimport EPSG4326 from './CRS.EPSG4326';\nimport Simple from './CRS.Simple';\nimport Proj4 from './CRS.Proj4';\n\nconst CRS = {};\n\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\nCRS.Proj4 = Proj4;\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/index.js\n **/","/*\n * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport SphericalMercator from '../projection/Projection.SphericalMercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3857 = {\n code: 'EPSG:3857',\n projection: SphericalMercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * SphericalMercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * SphericalMercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3857 = extend({}, Earth, _EPSG3857);\n\nconst EPSG900913 = extend({}, EPSG3857, {\n code: 'EPSG:900913'\n});\n\nexport {EPSG900913};\n\nexport default EPSG3857;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3857.js\n **/","/*\n * CRS.Earth is the base class for all CRS representing Earth.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLon from '../LatLon';\n\nconst Earth = {\n wrapLon: [-180, 180],\n\n R: 6378137,\n\n // Distance between two geographical points using spherical law of cosines\n // approximation or Haversine\n //\n // See: http://www.movable-type.co.uk/scripts/latlong.html\n distance: function(latlon1, latlon2, accurate) {\n var rad = Math.PI / 180;\n\n var lat1;\n var lat2;\n\n var a;\n\n if (!accurate) {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\n return this.R * Math.acos(Math.min(a, 1));\n } else {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n var lon1 = latlon1.lon * rad;\n var lon2 = latlon2.lon * rad;\n\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n\n var halfDeltaLat = deltaLat / 2;\n var halfDeltaLon = deltaLon / 2;\n\n a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return this.R * c;\n }\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Defaults to a scale factor of 1 if no calculation method exists\n //\n // Probably need to run this through the CRS transformation or similar so the\n // resulting scale is relative to the dimensions of the world space\n // Eg. 1 metre in projected space is likly scaled up or down to some other\n // number\n pointScale: function(latlon, accurate) {\n return (this.projection.pointScale) ? this.projection.pointScale(latlon, accurate) : [1, 1];\n },\n\n // Convert real metres to projected units\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n metresToProjected: function(metres, pointScale) {\n return metres * pointScale[1];\n },\n\n // Convert projected units to real metres\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n projectedToMetres: function(projectedUnits, pointScale) {\n return projectedUnits / pointScale[1];\n },\n\n // Convert real metres to a value in world (WebGL) units\n metresToWorld: function(metres, pointScale, zoom) {\n // Transform metres to projected metres using the latitude point scale\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n var projectedMetres = this.metresToProjected(metres, pointScale);\n\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n // Scale projected metres\n var scaledMetres = (scale * (this.transformScale * projectedMetres)) / pointScale[1];\n\n return scaledMetres;\n },\n\n // Convert world (WebGL) units to a value in real metres\n worldToMetres: function(worldUnits, pointScale, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var projectedUnits = ((worldUnits / scale) / this.transformScale) * pointScale[1];\n var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\n return realMetres;\n }\n};\n\nexport default extend({}, CRS, Earth);\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Earth.js\n **/","/*\n * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\nimport wrapNum from '../../util/wrapNum';\n\nconst CRS = {\n // Scale factor determines final dimensions of world space\n //\n // Projection transformation in range -1 to 1 is multiplied by scale factor to\n // find final world coordinates\n //\n // Scale factor can be considered as half the amount of the desired dimension\n // for the largest side when transformation is equal to 1 or -1, or as the\n // distance between 0 and 1 on the largest side\n //\n // For example, if you want the world dimensions to be between -1000 and 1000\n // then the scale factor will be 1000\n scaleFactor: 1000000,\n\n // Converts geo coords to pixel / WebGL ones\n latLonToPoint: function(latlon, zoom) {\n var projectedPoint = this.projection.project(latlon);\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n return this.transformation._transform(projectedPoint, scale);\n },\n\n // Converts pixel / WebGL coords to geo coords\n pointToLatLon: function(point, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var untransformedPoint = this.transformation.untransform(point, scale);\n\n return this.projection.unproject(untransformedPoint);\n },\n\n // Converts geo coords to projection-specific coords (e.g. in meters)\n project: function(latlon) {\n return this.projection.project(latlon);\n },\n\n // Converts projected coords to geo coords\n unproject: function(point) {\n return this.projection.unproject(point);\n },\n\n // If zoom is provided, returns the map width in pixels for a given zoom\n // Else, provides fixed scale value\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom >= 0) {\n return 256 * Math.pow(2, zoom);\n // Else, return fixed scale value to expand projected coordinates from\n // their 0 to 1 range into something more practical\n } else {\n return this.scaleFactor;\n }\n },\n\n // Returns zoom level for a given scale value\n // This only works with a scale value that is based on map pixel width\n zoom: function(scale) {\n return Math.log(scale / 256) / Math.LN2;\n },\n\n // Returns the bounds of the world in projected coords if applicable\n getProjectedBounds: function(zoom) {\n if (this.infinite) { return null; }\n\n var b = this.projection.bounds;\n var s = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n s /= 2;\n }\n\n // Bottom left\n var min = this.transformation.transform(Point(b[0]), s);\n\n // Top right\n var max = this.transformation.transform(Point(b[1]), s);\n\n return [min, max];\n },\n\n // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n // wrapLon: [min, max],\n // wrapLat: [min, max],\n\n // If true, the coordinate space will be unbounded (infinite in all directions)\n // infinite: false,\n\n // Wraps geo coords in certain ranges if applicable\n wrapLatLon: function(latlon) {\n var lat = this.wrapLat ? wrapNum(latlon.lat, this.wrapLat, true) : latlon.lat;\n var lon = this.wrapLon ? wrapNum(latlon.lon, this.wrapLon, true) : latlon.lon;\n var alt = latlon.alt;\n\n return LatLon(lat, lon, alt);\n }\n};\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.js\n **/","/*\n * LatLon is a helper class for ensuring consistent geographic coordinates.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n */\n\nclass LatLon {\n constructor(lat, lon, alt) {\n if (isNaN(lat) || isNaN(lon)) {\n throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n }\n\n this.lat = +lat;\n this.lon = +lon;\n\n if (alt !== undefined) {\n this.alt = +alt;\n }\n }\n\n clone() {\n return new LatLon(this.lat, this.lon, this.alt);\n }\n}\n\n// Initialise without requiring new keyword\n//\n// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n// Also converts between lng and lon\nexport default function(a, b, c) {\n if (a instanceof LatLon) {\n return a;\n }\n if (Array.isArray(a) && typeof a[0] !== 'object') {\n if (a.length === 3) {\n return new LatLon(a[0], a[1], a[2]);\n }\n if (a.length === 2) {\n return new LatLon(a[0], a[1]);\n }\n return null;\n }\n if (a === undefined || a === null) {\n return a;\n }\n if (typeof a === 'object' && 'lat' in a) {\n return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n }\n if (b === undefined) {\n return null;\n }\n return new LatLon(a, b, c);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/LatLon.js\n **/","/*\n * Point is a helper class for ensuring consistent world positions.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n */\n\nclass Point {\n constructor(x, y, round) {\n this.x = (round ? Math.round(x) : x);\n this.y = (round ? Math.round(y) : y);\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n // Non-destructive\n add(point) {\n return this.clone()._add(_point(point));\n }\n\n // Destructive\n _add(point) {\n this.x += point.x;\n this.y += point.y;\n return this;\n }\n\n // Non-destructive\n subtract(point) {\n return this.clone()._subtract(_point(point));\n }\n\n // Destructive\n _subtract(point) {\n this.x -= point.x;\n this.y -= point.y;\n return this;\n }\n}\n\n// Accepts (point), ([x, y]) and (x, y, round)\nvar _point = function(x, y, round) {\n if (x instanceof Point) {\n return x;\n }\n if (Array.isArray(x)) {\n return new Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n return new Point(x, y, round);\n};\n\n// Initialise without requiring new keyword\nexport default _point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Point.js\n **/","/*\n * Wrap the given number to lie within a certain range (eg. longitude)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n */\n\nconst wrapNum = function(x, range, includeMax) {\n var max = range[1];\n var min = range[0];\n var d = max - min;\n return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n};\n\nexport default wrapNum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/wrapNum.js\n **/","/*\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n * used by default.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst SphericalMercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n MAX_LATITUDE: 85.0511287798,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var max = this.MAX_LATITUDE;\n var lat = Math.max(Math.min(max, latlon.lat), -max);\n var sin = Math.sin(lat * d);\n\n return Point(\n this.R * latlon.lon * d,\n this.R * Math.log((1 + sin) / (1 - sin)) / 2\n );\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n\n return LatLon(\n (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\n point.x * d / this.R\n );\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Accurate scale factor uses proper Web Mercator scaling\n // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n // See: http://jsfiddle.net/robhawkes/yws924cf/\n pointScale: function(latlon, accurate) {\n var rad = Math.PI / 180;\n\n var k;\n\n if (!accurate) {\n k = 1 / Math.cos(latlon.lat * rad);\n\n // [scaleX, scaleY]\n return [k, k];\n } else {\n var lat = latlon.lat * rad;\n var lon = latlon.lon * rad;\n\n var a = this.R;\n\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n\n var cosLat = Math.cos(lat);\n\n // Radius meridian\n var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\n // Radius prime meridian\n var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\n // Scale N/S\n var h = (a / p) / cosLat;\n\n // Scale E/W\n k = (a / v) / cosLat;\n\n // [scaleX, scaleY]\n return [k, h];\n }\n },\n\n // Not using this.R due to scoping\n bounds: (function() {\n var d = 6378137 * Math.PI;\n return [[-d, -d], [d, d]];\n })()\n};\n\nexport default SphericalMercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.SphericalMercator.js\n **/","/*\n * Transformation is an utility class to perform simple point transformations\n * through a 2d-matrix.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n */\n\nimport Point from '../geo/Point';\n\nclass Transformation {\n constructor(a, b, c, d) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n }\n\n transform(point, scale) {\n // Copy input point as to not destroy the original data\n return this._transform(point.clone(), scale);\n }\n\n // Destructive transform (faster)\n _transform(point, scale) {\n scale = scale || 1;\n\n point.x = scale * (this._a * point.x + this._b);\n point.y = scale * (this._c * point.y + this._d);\n return point;\n }\n\n untransform(point, scale) {\n scale = scale || 1;\n return Point(\n (point.x / scale - this._b) / this._a,\n (point.y / scale - this._d) / this._c\n );\n }\n}\n\nexport default Transformation;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Transformation.js\n **/","/*\n * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Mercator from '../projection/Projection.Mercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3395 = {\n code: 'EPSG:3395',\n projection: Mercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * Mercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * Mercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3395 = extend({}, Earth, _EPSG3395);\n\nexport default EPSG3395;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3395.js\n **/","/*\n * Mercator projection that takes into account that the Earth is not a perfect\n * sphere. Less popular than spherical mercator; used by projections like\n * EPSG:3395.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Mercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n R_MINOR: 6356752.314245179,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var r = this.R;\n var y = latlon.lat * d;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var con = e * Math.sin(y);\n\n var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n y = -r * Math.log(Math.max(ts, 1E-10));\n\n return Point(latlon.lon * d * r, y);\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n var r = this.R;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var ts = Math.exp(-point.y / r);\n var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\n for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n con = e * Math.sin(phi);\n con = Math.pow((1 - con) / (1 + con), e / 2);\n dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n phi += dphi;\n }\n\n return LatLon(phi * d, point.x * d / r);\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n pointScale: function(latlon) {\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n var cosLat = Math.cos(lat);\n\n var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\n // [scaleX, scaleY]\n return [k, k];\n },\n\n bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n};\n\nexport default Mercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Mercator.js\n **/","/*\n * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG4326 = {\n code: 'EPSG:4326',\n projection: LatLonProjection,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / 180,\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n //\n // TODO: Cannot use this.transformScale due to scope\n transformation: new Transformation(1 / 180, 0, -1 / 180, 0)\n};\n\nconst EPSG4326 = extend({}, Earth, _EPSG4326);\n\nexport default EPSG4326;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG4326.js\n **/","/*\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n * and Simple.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst ProjectionLatLon = {\n project: function(latlon) {\n return Point(latlon.lon, latlon.lat);\n },\n\n unproject: function(point) {\n return LatLon(point.y, point.x);\n },\n\n // Scale factor for converting between real metres and degrees\n //\n // degrees = realMetres * pointScale\n // realMetres = degrees / pointScale\n //\n // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n pointScale: function(latlon) {\n var m1 = 111132.92;\n var m2 = -559.82;\n var m3 = 1.175;\n var m4 = -0.0023;\n var p1 = 111412.84;\n var p2 = -93.5;\n var p3 = 0.118;\n\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n\n var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\n return [1 / latlen, 1 / lonlen];\n },\n\n bounds: [[-180, -90], [180, 90]]\n};\n\nexport default ProjectionLatLon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.LatLon.js\n **/","/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n * maps.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _Simple = {\n projection: LatLonProjection,\n\n // Straight 1:1 mapping (-1, -1 would be top-left)\n transformation: new Transformation(1, 0, 1, 0),\n\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom) {\n return Math.pow(2, zoom);\n // Else, make no change to scale – may need to increase this or make it a\n // user-definable variable\n } else {\n return 1;\n }\n },\n\n zoom: function(scale) {\n return Math.log(scale) / Math.LN2;\n },\n\n distance: function(latlon1, latlon2) {\n var dx = latlon2.lon - latlon1.lon;\n var dy = latlon2.lat - latlon1.lat;\n\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n infinite: true\n};\n\nconst Simple = extend({}, CRS, _Simple);\n\nexport default Simple;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Simple.js\n **/","/*\n * CRS.Proj4 for any Proj4-supported CRS.\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Proj4Projection from '../projection/Projection.Proj4';\nimport Transformation from '../../util/Transformation';\n\nvar _Proj4 = function(code, def, bounds) {\n var projection = Proj4Projection(def, bounds);\n\n // Transformation calcuations\n var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\n var halfX = diffX / 2;\n var halfY = diffY / 2;\n\n // This is the raw scale factor\n var scaleX = 1 / halfX;\n var scaleY = 1 / halfY;\n\n // Find the minimum scale factor\n //\n // The minimum scale factor comes from the largest side and is the one\n // you want to use for both axis so they stay relative in dimension\n var scale = Math.min(scaleX, scaleY);\n\n // Find amount to offset each axis by to make the central point lie on\n // the [0,0] origin\n var offsetX = scale * (projection.bounds[0][0] + halfX);\n var offsetY = scale * (projection.bounds[0][1] + halfY);\n\n return {\n code: code,\n projection: projection,\n\n transformScale: scale,\n\n // Map the input to a [-1,1] range with [0,0] in the centre\n transformation: new Transformation(scale, -offsetX, -scale, offsetY)\n };\n};\n\nconst Proj4 = function(code, def, bounds) {\n return extend({}, Earth, _Proj4(code, def, bounds));\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Proj4.js\n **/","/*\n * Proj4 support for any projection.\n */\n\nimport proj4 from 'proj4';\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Proj4 = function(def, bounds) {\n var proj = proj4(def);\n\n var project = function(latlon) {\n return Point(proj.forward([latlon.lon, latlon.lat]));\n };\n\n var unproject = function(point) {\n var inverse = proj.inverse([point.x, point.y]);\n return LatLon(inverse[1], inverse[0]);\n };\n\n return {\n project: project,\n unproject: unproject,\n\n // Scale factor for converting between real metres and projected metres\\\n //\n // Need to work out the best way to provide the pointScale calculations\n // for custom, unknown projections (if wanting to override default)\n //\n // For now, user can manually override crs.pointScale or\n // crs.projection.pointScale\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n pointScale: function(latlon, accurate) {\n return [1, 1];\n },\n\n // Try and calculate bounds if none are provided\n //\n // This will provide incorrect bounds for some projections, so perhaps make\n // bounds a required input instead\n bounds: (function() {\n if (bounds) {\n return bounds;\n } else {\n var bottomLeft = project([-90, -180]);\n var topRight = project([90, 180]);\n\n return [bottomLeft, topRight];\n }\n })()\n };\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Proj4.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"proj4\"\n ** module id = 22\n ** module chunks = 0\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from './Scene';\nimport Renderer from './Renderer';\nimport Camera from './Camera';\n\nclass Engine extends EventEmitter {\n constructor(container) {\n console.log('Init Engine');\n\n super();\n\n this._scene = Scene;\n this._renderer = Renderer(container);\n this._camera = Camera(container);\n this.clock = new THREE.Clock();\n\n this._frustum = new THREE.Frustum();\n }\n\n update(delta) {\n this.emit('preRender');\n this._renderer.render(this._scene, this._camera);\n this.emit('postRender');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(container) {\n return new Engine(container);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Engine.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"THREE\"\n ** module id = 24\n ** module chunks = 0\n **/","import THREE from 'three';\n\n// This can be imported from anywhere and will still reference the same scene,\n// though there is a helper reference in Engine.scene\n\nexport default (function() {\n var scene = new THREE.Scene();\n scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n return scene;\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Scene.js\n **/","import THREE from 'three';\nimport Scene from './Scene';\n\n// This can only be accessed from Engine.renderer if you want to reference the\n// same scene in multiple places\n\nexport default function(container) {\n var renderer = new THREE.WebGLRenderer({\n antialias: true\n });\n\n renderer.setClearColor(Scene.fog.color, 1);\n\n // Gamma settings make things look nicer\n renderer.gammaInput = true;\n renderer.gammaOutput = true;\n\n container.appendChild(renderer.domElement);\n\n var updateSize = function() {\n renderer.setSize(container.clientWidth, container.clientHeight);\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return renderer;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Renderer.js\n **/","import THREE from 'three';\n\n// This can only be accessed from Engine.camera if you want to reference the\n// same scene in multiple places\n\n// TODO: Ensure that FOV looks natural on all aspect ratios\n// http://stackoverflow.com/q/26655930/997339\n\nexport default function(container) {\n var camera = new THREE.PerspectiveCamera(45, 1, 1, 40000);\n camera.position.y = 400;\n camera.position.z = 400;\n\n var updateSize = function() {\n camera.aspect = container.clientWidth / container.clientHeight;\n camera.updateProjectionMatrix();\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return camera;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Camera.js\n **/","import Orbit from './Controls.Orbit';\n\nconst Controls = {\n Orbit: Orbit\n};\n\nexport default Controls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/index.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport OrbitControls from '../vendor/OrbitControls';\n\nclass Orbit extends EventEmitter {\n constructor() {\n super();\n }\n\n // Proxy control events\n //\n // There's currently no distinction between pan, orbit and zoom events\n _initEvents() {\n this._controls.addEventListener('start', (event) => {\n this._world.emit('controlsMoveStart', event.target.target);\n });\n\n this._controls.addEventListener('change', (event) => {\n this._world.emit('controlsMove', event.target.target);\n });\n\n this._controls.addEventListener('end', (event) => {\n this._world.emit('controlsMoveEnd', event.target.target);\n });\n }\n\n // Moving the camera along the [x,y,z] axis based on a target position\n _panTo(point, animate) {}\n _panBy(pointDelta, animate) {}\n\n // Zooming the camera in and out\n _zoomTo(metres, animate) {}\n _zoomBy(metresDelta, animate) {}\n\n // Force camera to look at something other than the target\n _lookAt(point, animate) {}\n\n // Make camera look at the target\n _lookAtTarget() {}\n\n // Tilt (up and down)\n _tiltTo(angle, animate) {}\n _tiltBy(angleDelta, animate) {}\n\n // Rotate (left and right)\n _rotateTo(angle, animate) {}\n _rotateBy(angleDelta, animate) {}\n\n // Fly to the given point, animating pan and tilt/rotation to final position\n // with nice zoom out and in\n //\n // Calling flyTo a second time before the previous animation has completed\n // will immediately start the new animation from wherever the previous one\n // has got to\n _flyTo(point, noZoom) {}\n\n // Proxy to OrbitControls.update()\n update() {\n this._controls.update();\n }\n\n // Add controls to world instance and store world reference\n addTo(world) {\n world.addControls(this);\n return this;\n }\n\n // Internal method called by World.addControls to actually add the controls\n _addToWorld(world) {\n this._world = world;\n\n // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n // See: http://stackoverflow.com/a/26188674/997339\n this._controls = new OrbitControls(world._engine._camera, world._container);\n\n // Disable keys for now as no events are fired for them anyway\n this._controls.keys = false;\n\n // 89 degrees\n this._controls.maxPolarAngle = 1.5533;\n\n // this._controls.enableDamping = true;\n // this._controls.dampingFactor = 0.25;\n\n this._initEvents();\n\n this.emit('added');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new Orbit();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/Controls.Orbit.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nvar OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn theta;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function () {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\n\t\t\ttheta = Math.atan2( offset.x, offset.z );\n\n\t\t\t// angle from y-axis\n\n\t\t\tphi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\ttheta += thetaDelta;\n\t\t\tphi += phiDelta;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\ttheta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tphi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, phi ) );\n\n\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\t\tvar radius = offset.length() * scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tradius = Math.max( scope.minDistance, Math.min( scope.maxDistance, radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\t\toffset.y = radius * Math.cos( phi );\n\t\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tthetaDelta *= ( 1 - scope.dampingFactor );\n\t\t\t\tphiDelta *= ( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tthetaDelta = 0;\n\t\t\t\tphiDelta = 0;\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function() {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\tscope.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar theta;\n\tvar phi;\n\n\tvar phiDelta = 0;\n\tvar thetaDelta = 0;\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tthetaDelta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tphiDelta -= angle;\n\n\t}\n\n\tvar panLeft = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panLeft( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get X column of objectMatrix\n\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n //\n\t\t// \tv.multiplyScalar( - distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n // Fixed panning to x/y plane\n return function panLeft(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t // var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 0 ], 0, te[ 2 ]);\n\t v.multiplyScalar(-distance);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n // Fixed panning to x/y plane\n\tvar panUp = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panUp( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get Y column of objectMatrix\n\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n //\n\t\t// \tv.multiplyScalar( distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n return function panUp(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 4 ], 0, te[ 6 ]);\n\t v.multiplyScalar(adjDist);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t//console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t//console.log( 'handleMouseWheel' );\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) {\n\n\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) {\n\n\t\t\t// Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( delta < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t//console.log( 'handleKeyDown' );\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\t//console.log( 'handleTouchStartPan' );\n\n\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\t//console.log( 'handleTouchMovePan' );\n\n\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseDownRotate( event );\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseDownDolly( event );\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseDownPan( event );\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\tdocument.addEventListener( 'mouseout', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseMoveRotate( event );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseMoveDolly( event );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseMovePan( event );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tscope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nOrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.constraint.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.constraint.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.constraint.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.constraint.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n\nexport default OrbitControls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/OrbitControls.js\n **/","import Layer from '../Layer';\nimport THREE from 'three';\n\nclass EnvironmentLayer extends Layer {\n constructor() {\n super();\n\n this._initLights();\n // this._initGrid();\n }\n\n _onAdd() {}\n\n // Not fleshed out or thought through yet\n //\n // Lights could potentially be put it their own 'layer' to keep this class\n // much simpler and less messy\n _initLights() {\n // Position doesn't really matter (the angle is important), however it's\n // used here so the helpers look more natural.\n\n var directionalLight = new THREE.DirectionalLight(0x999999);\n directionalLight.intesity = 0.1;\n directionalLight.position.x = 100;\n directionalLight.position.y = 100;\n directionalLight.position.z = 100;\n\n var directionalLight2 = new THREE.DirectionalLight(0x999999);\n directionalLight2.intesity = 0.1;\n directionalLight2.position.x = -100;\n directionalLight2.position.y = 100;\n directionalLight2.position.z = -100;\n\n var helper = new THREE.DirectionalLightHelper(directionalLight, 10);\n var helper2 = new THREE.DirectionalLightHelper(directionalLight2, 10);\n\n this._layer.add(directionalLight);\n this._layer.add(directionalLight2);\n\n this._layer.add(helper);\n this._layer.add(helper2);\n }\n\n // Add grid helper for context during initial development\n _initGrid() {\n var size = 4000;\n var step = 100;\n\n var gridHelper = new THREE.GridHelper(size, step);\n this._layer.add(gridHelper);\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new EnvironmentLayer();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/EnvironmentLayer.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from '../engine/Scene';\n\nclass Layer extends EventEmitter {\n constructor() {\n super();\n\n this._layer = new THREE.Object3D();\n }\n\n // Add layer to world instance and store world reference\n addTo(world) {\n world.addLayer(this);\n return this;\n }\n\n // Internal method called by World.addLayer to actually add the layer\n _addToWorld(world) {\n this._world = world;\n this._onAdd(world);\n this.emit('added');\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world = null;\n this._layer = null;\n }\n}\n\nexport default Layer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/Layer.js\n **/","import TileLayer from './TileLayer';\nimport ImageTile from './ImageTile';\nimport ImageTileLayerBaseMaterial from './ImageTileLayerBaseMaterial';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\n// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n// being removed and the new tiles being ready for display\n//\n// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n// of the basemap ground so it blends in a little more, or have a huge ground\n// plane underneath all the tiles that shows through between tile updates.\n//\n// Could keep the old tiles around until the new ones are ready, though they'd\n// probably need to be layered in a way so the old tiles don't overlap new ones,\n// which is similar to how Leaflet approaches this (it has 2 layers)\n//\n// Could keep the tile from the previous quadtree level visible until all 4\n// tiles at the new / current level have finished loading and are displayed.\n// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n// child quadcodes showing whether they are loaded and in view. If all true then\n// remove the parent tile, otherwise keep it on a lower layer.\n\n// TODO: Load and display a base layer separate to the LOD grid that is at a low\n// resolution – used as a backup / background to fill in empty areas / distance\n\n// DONE: Fix the issue where some tiles just don't load, or at least the texture\n// never shows up – tends to happen if you quickly zoom in / out past it while\n// it's still loading, leaving a blank space\n\n// TODO: Optimise the request of many image tiles – look at how Leaflet and\n// OpenWebGlobe approach this (eg. batching, queues, etc)\n\n// TODO: Cancel pending tile requests if they get removed from view before they\n// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n// images are re-requested when the tile is next in scene (even if from cache)\n\n// TODO: Consider not performing an LOD calculation on every frame, instead only\n// on move end so panning, orbiting and zooming stays smooth. Otherwise it's\n// possible for performance to tank if you pan, orbit or zoom rapidly while all\n// the LOD calculations are being made and new tiles requested.\n//\n// Pending tiles should continue to be requested and output to the scene on each\n// frame, but no new LOD calculations should be made.\n\nclass ImageTileLayer extends TileLayer {\n constructor(path, options) {\n super(options);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n // Add base layer\n var geom = new THREE.PlaneBufferGeometry(40000, 40000, 1);\n var mesh = new THREE.Mesh(geom, ImageTileLayerBaseMaterial('#f5f5f3'));\n mesh.rotation.x = -90 * Math.PI / 180;\n\n this._baseLayer = mesh;\n this._layer.add(mesh);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n this._initEvents();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n }\n\n _onWorldMove(latlon, point) {\n this._moveBaseLayer(point);\n }\n\n _moveBaseLayer(point) {\n this._baseLayer.position.x = point.x;\n this._baseLayer.position.z = point.y;\n }\n\n _createTile(quadcode, layer) {\n return ImageTile(quadcode, this._path, layer);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Dispose of mesh and materials\n this._baseLayer.geometry.dispose();\n this._baseLayer.geometry = null;\n\n if (this._baseLayer.material.map) {\n this._baseLayer.material.map.dispose();\n this._baseLayer.material.map = null;\n }\n\n this._baseLayer.material.dispose();\n this._baseLayer.material = null;\n\n this._baseLayer = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new ImageTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayer.js\n **/","import Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport TileCache from './TileCache';\nimport THREE from 'three';\n\n// TODO: Consider keeping a single TileLayer / LOD instance running by default\n// that keeps a standard LOD grid for other layers to utilise, rather than\n// having to create their own, unique LOD grid and duplicate calculations when\n// they're going to use the same grid setup anyway\n//\n// It still makes sense to be able to have a custom LOD grid for some layers as\n// they may want to customise things, maybe not even using a quadtree at all!\n//\n// Perhaps it makes sense to split out the quadtree stuff into a singleton and\n// pass in the necessary parameters each time for the calculation step.\n//\n// Either way, it seems silly to force layers to have to create a new LOD grid\n// each time and create extra, duplicated processing every frame.\n\n// TODO: Allow passing in of options to define min/max LOD and a distance to use\n// for culling tiles beyond that distance.\n\n// DONE: Prevent tiles from being loaded if they are further than a certain\n// distance from the camera and are unlikely to be seen anyway\n\n// TODO: Avoid performing LOD calculation when it isn't required. For example,\n// when nothing has changed since the last frame and there are no tiles to be\n// loaded or in need of rendering\n\n// TODO: Only remove tiles from the layer that aren't to be rendered in the\n// current frame – it seems excessive to remove all tiles and re-add them on\n// every single frame, even if it's just array manipulation\n\n// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n// problems (eg. making min above 5 causes all sorts of issues)\n\n// TODO: Reuse THREE objects where possible instead of creating new instances\n// on every LOD calculation\n\n// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n// to avoid creating unnecessary memory for garbage collection\n\n// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n// closest to the camera) so visual inconsistancies during loading are minimised\n\nclass TileLayer extends Layer {\n constructor(options) {\n super(options);\n\n var defaults = {\n maxCache: 1000,\n maxLOD: 18\n };\n\n this._options = extend(defaults, options);\n\n this._tileCache = TileCache(this._options.maxCache, tile => {\n this._destroyTile(tile);\n });\n\n // TODO: Work out why changing the minLOD causes loads of issues\n this._minLOD = 3;\n this._maxLOD = this._options.maxLOD;\n\n this._frustum = new THREE.Frustum();\n this._tiles = new THREE.Object3D();\n }\n\n _onAdd(world) {\n this._layer.add(this._tiles);\n }\n\n _updateFrustum() {\n var camera = this._world.getCamera();\n var projScreenMatrix = new THREE.Matrix4();\n projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\n this._frustum.setFromMatrix(camera.projectionMatrix);\n this._frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n }\n\n _tileInFrustum(tile) {\n var bounds = tile.getBounds();\n return this._frustum.intersectsBox(new THREE.Box3(new THREE.Vector3(bounds[0], 0, bounds[3]), new THREE.Vector3(bounds[2], 0, bounds[1])));\n }\n\n _calculateLOD() {\n if (this._stop || !this._world) {\n return;\n }\n\n // var start = performance.now();\n\n var camera = this._world.getCamera();\n\n // 1. Update and retrieve camera frustum\n this._updateFrustum(this._frustum, camera);\n\n // 2. Add the four root items of the quadtree to a check list\n var checkList = this._checklist;\n checkList = [];\n checkList.push(this._requestTile('0', this));\n checkList.push(this._requestTile('1', this));\n checkList.push(this._requestTile('2', this));\n checkList.push(this._requestTile('3', this));\n\n // 3. Call Divide, passing in the check list\n this._divide(checkList);\n\n // 4. Remove all tiles from layer\n this._removeTiles();\n\n // 5. Render the tiles remaining in the check list\n checkList.forEach((tile, index) => {\n // Skip tile if it's not in the current view frustum\n if (!this._tileInFrustum(tile)) {\n return;\n }\n\n if (this._options.distance && this._options.distance > 0) {\n // TODO: Can probably speed this up\n var center = tile.getCenter();\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n // Manual distance limit to cut down on tiles so far away\n if (dist > this._options.distance) {\n return;\n }\n }\n\n // Does the tile have a mesh?\n //\n // If yes, continue\n // If no, generate tile mesh, request texture and skip\n if (!tile.getMesh()) {\n tile.requestTileAsync();\n return;\n }\n\n // Are the mesh and texture ready?\n //\n // If yes, continue\n // If no, skip\n if (!tile.isReady()) {\n return;\n }\n\n // Add tile to layer (and to scene)\n this._tiles.add(tile.getMesh());\n });\n\n // console.log(performance.now() - start);\n }\n\n _divide(checkList) {\n var count = 0;\n var currentItem;\n var quadcode;\n\n // 1. Loop until count equals check list length\n while (count != checkList.length) {\n currentItem = checkList[count];\n quadcode = currentItem.getQuadcode();\n\n // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n if (currentItem.length === this._maxLOD) {\n count++;\n continue;\n }\n\n // 3. Else, calculate screen-space error metric for quadcode\n if (this._screenSpaceError(currentItem)) {\n // 4. If error is sufficient...\n\n // 4a. Remove parent item from the check list\n checkList.splice(count, 1);\n\n // 4b. Add 4 child items to the check list\n checkList.push(this._requestTile(quadcode + '0', this));\n checkList.push(this._requestTile(quadcode + '1', this));\n checkList.push(this._requestTile(quadcode + '2', this));\n checkList.push(this._requestTile(quadcode + '3', this));\n\n // 4d. Continue the loop without increasing count\n continue;\n } else {\n // 5. Else, increase count and continue loop\n count++;\n }\n }\n }\n\n _screenSpaceError(tile) {\n var minDepth = this._minLOD;\n var maxDepth = this._maxLOD;\n\n var quadcode = tile.getQuadcode();\n\n var camera = this._world.getCamera();\n\n // Tweak this value to refine specific point that each quad is subdivided\n //\n // It's used to multiple the dimensions of the tile sides before\n // comparing against the tile distance from camera\n var quality = 3.0;\n\n // 1. Return false if quadcode length equals maxDepth (stop dividing)\n if (quadcode.length === maxDepth) {\n return false;\n }\n\n // 2. Return true if quadcode length is less than minDepth\n if (quadcode.length < minDepth) {\n return true;\n }\n\n // 3. Return false if quadcode bounds are not in view frustum\n if (!this._tileInFrustum(tile)) {\n return false;\n }\n\n var center = tile.getCenter();\n\n // 4. Calculate screen-space error metric\n // TODO: Use closest distance to one of the 4 tile corners\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n var error = quality * tile.getSide() / dist;\n\n // 5. Return true if error is greater than 1.0, else return false\n return (error > 1.0);\n }\n\n _removeTiles() {\n for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n }\n\n // Return a new tile instance\n _createTile(quadcode, layer) {}\n\n // Get a cached tile or request a new one if not in cache\n _requestTile(quadcode, layer) {\n var tile = this._tileCache.getTile(quadcode);\n\n if (!tile) {\n // Set up a brand new tile\n tile = this._createTile(quadcode, layer);\n\n // Add tile to cache, though it won't be ready yet as the data is being\n // requested from various places asynchronously\n this._tileCache.setTile(quadcode, tile);\n }\n\n return tile;\n }\n\n _destroyTile(tile) {\n // Remove tile from scene\n this._layer.remove(tile);\n\n // Delete any references to the tile within this component\n\n // Call destory on tile instance\n tile.destroy();\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n var i;\n\n // Remove all tiles\n for (i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n\n // Remove everything else in the layer\n for (i = this._layer.children.length - 1; i >= 0; i--) {\n this._layer.remove(this._layer.children[i]);\n }\n\n this._tileCache.destroy();\n this._tileCache = null;\n\n this._world = null;\n this._tiles = null;\n this._layer = null;\n this._frustum = null;\n }\n}\n\nexport default TileLayer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileLayer.js\n **/","import LRUCache from 'lru-cache';\n\n// This process is based on a similar approach taken by OpenWebGlobe\n// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\nclass TileCache {\n constructor(cacheLimit, onDestroyTile) {\n this._cache = LRUCache({\n max: cacheLimit,\n dispose: (key, tile) => {\n onDestroyTile(tile);\n }\n });\n }\n\n // Returns true if all specified tile providers are ready to be used\n // Otherwise, returns false\n isReady() {\n return false;\n }\n\n // Get a cached tile without requesting a new one\n getTile(quadcode) {\n return this._cache.get(quadcode);\n }\n\n // Add tile to cache\n setTile(quadcode, tile) {\n this._cache.set(quadcode, tile);\n }\n\n // Destroy the cache and remove it from memory\n //\n // TODO: Call destroy method on items in cache\n destroy() {\n this._cache.reset();\n this._cache = null;\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(cacheLimit, onDestroyTile) {\n return new TileCache(cacheLimit, onDestroyTile);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileCache.js\n **/","module.exports = LRUCache\n\n// This will be a proper iterable 'Map' in engines that support it,\n// or a fakey-fake PseudoMap in older versions.\nvar Map = require('pseudomap')\nvar util = require('util')\n\n// A linked list to keep track of recently-used-ness\nvar Yallist = require('yallist')\n\n// use symbols if possible, otherwise just _props\nvar symbols = {}\nvar hasSymbol = typeof Symbol === 'function'\nvar makeSymbol\nif (hasSymbol) {\n makeSymbol = function (key) {\n return Symbol.for(key)\n }\n} else {\n makeSymbol = function (key) {\n return '_' + key\n }\n}\n\nfunction priv (obj, key, val) {\n var sym\n if (symbols[key]) {\n sym = symbols[key]\n } else {\n sym = makeSymbol(key)\n symbols[key] = sym\n }\n if (arguments.length === 2) {\n return obj[sym]\n } else {\n obj[sym] = val\n return val\n }\n}\n\nfunction naiveLength () { return 1 }\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nfunction LRUCache (options) {\n if (!(this instanceof LRUCache)) {\n return new LRUCache(options)\n }\n\n if (typeof options === 'number') {\n options = { max: options }\n }\n\n if (!options) {\n options = {}\n }\n\n var max = priv(this, 'max', options.max)\n // Kind of weird to have a default max of Infinity, but oh well.\n if (!max ||\n !(typeof max === 'number') ||\n max <= 0) {\n priv(this, 'max', Infinity)\n }\n\n var lc = options.length || naiveLength\n if (typeof lc !== 'function') {\n lc = naiveLength\n }\n priv(this, 'lengthCalculator', lc)\n\n priv(this, 'allowStale', options.stale || false)\n priv(this, 'maxAge', options.maxAge || 0)\n priv(this, 'dispose', options.dispose)\n this.reset()\n}\n\n// resize the cache when the max changes.\nObject.defineProperty(LRUCache.prototype, 'max', {\n set: function (mL) {\n if (!mL || !(typeof mL === 'number') || mL <= 0) {\n mL = Infinity\n }\n priv(this, 'max', mL)\n trim(this)\n },\n get: function () {\n return priv(this, 'max')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'allowStale', {\n set: function (allowStale) {\n priv(this, 'allowStale', !!allowStale)\n },\n get: function () {\n return priv(this, 'allowStale')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'maxAge', {\n set: function (mA) {\n if (!mA || !(typeof mA === 'number') || mA < 0) {\n mA = 0\n }\n priv(this, 'maxAge', mA)\n trim(this)\n },\n get: function () {\n return priv(this, 'maxAge')\n },\n enumerable: true\n})\n\n// resize the cache when the lengthCalculator changes.\nObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n set: function (lC) {\n if (typeof lC !== 'function') {\n lC = naiveLength\n }\n if (lC !== priv(this, 'lengthCalculator')) {\n priv(this, 'lengthCalculator', lC)\n priv(this, 'length', 0)\n priv(this, 'lruList').forEach(function (hit) {\n hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n priv(this, 'length', priv(this, 'length') + hit.length)\n }, this)\n }\n trim(this)\n },\n get: function () { return priv(this, 'lengthCalculator') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'length', {\n get: function () { return priv(this, 'length') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'itemCount', {\n get: function () { return priv(this, 'lruList').length },\n enumerable: true\n})\n\nLRUCache.prototype.rforEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n var prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n}\n\nfunction forEachStep (self, fn, node, thisp) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) {\n hit = undefined\n }\n }\n if (hit) {\n fn.call(thisp, hit.value, hit.key, self)\n }\n}\n\nLRUCache.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').head; walker !== null;) {\n var next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n}\n\nLRUCache.prototype.keys = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.key\n }, this)\n}\n\nLRUCache.prototype.values = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.value\n }, this)\n}\n\nLRUCache.prototype.reset = function () {\n if (priv(this, 'dispose') &&\n priv(this, 'lruList') &&\n priv(this, 'lruList').length) {\n priv(this, 'lruList').forEach(function (hit) {\n priv(this, 'dispose').call(this, hit.key, hit.value)\n }, this)\n }\n\n priv(this, 'cache', new Map()) // hash of items by key\n priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n priv(this, 'length', 0) // length of items in the list\n}\n\nLRUCache.prototype.dump = function () {\n return priv(this, 'lruList').map(function (hit) {\n if (!isStale(this, hit)) {\n return {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }\n }\n }, this).toArray().filter(function (h) {\n return h\n })\n}\n\nLRUCache.prototype.dumpLru = function () {\n return priv(this, 'lruList')\n}\n\nLRUCache.prototype.inspect = function (n, opts) {\n var str = 'LRUCache {'\n var extras = false\n\n var as = priv(this, 'allowStale')\n if (as) {\n str += '\\n allowStale: true'\n extras = true\n }\n\n var max = priv(this, 'max')\n if (max && max !== Infinity) {\n if (extras) {\n str += ','\n }\n str += '\\n max: ' + util.inspect(max, opts)\n extras = true\n }\n\n var maxAge = priv(this, 'maxAge')\n if (maxAge) {\n if (extras) {\n str += ','\n }\n str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n extras = true\n }\n\n var lc = priv(this, 'lengthCalculator')\n if (lc && lc !== naiveLength) {\n if (extras) {\n str += ','\n }\n str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n extras = true\n }\n\n var didFirst = false\n priv(this, 'lruList').forEach(function (item) {\n if (didFirst) {\n str += ',\\n '\n } else {\n if (extras) {\n str += ',\\n'\n }\n didFirst = true\n str += '\\n '\n }\n var key = util.inspect(item.key).split('\\n').join('\\n ')\n var val = { value: item.value }\n if (item.maxAge !== maxAge) {\n val.maxAge = item.maxAge\n }\n if (lc !== naiveLength) {\n val.length = item.length\n }\n if (isStale(this, item)) {\n val.stale = true\n }\n\n val = util.inspect(val, opts).split('\\n').join('\\n ')\n str += key + ' => ' + val\n })\n\n if (didFirst || extras) {\n str += '\\n'\n }\n str += '}'\n\n return str\n}\n\nLRUCache.prototype.set = function (key, value, maxAge) {\n maxAge = maxAge || priv(this, 'maxAge')\n\n var now = maxAge ? Date.now() : 0\n var len = priv(this, 'lengthCalculator').call(this, value, key)\n\n if (priv(this, 'cache').has(key)) {\n if (len > priv(this, 'max')) {\n del(this, priv(this, 'cache').get(key))\n return false\n }\n\n var node = priv(this, 'cache').get(key)\n var item = node.value\n\n // dispose of the old one before overwriting\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n priv(this, 'length', priv(this, 'length') + (len - item.length))\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n var hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > priv(this, 'max')) {\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, value)\n }\n return false\n }\n\n priv(this, 'length', priv(this, 'length') + hit.length)\n priv(this, 'lruList').unshift(hit)\n priv(this, 'cache').set(key, priv(this, 'lruList').head)\n trim(this)\n return true\n}\n\nLRUCache.prototype.has = function (key) {\n if (!priv(this, 'cache').has(key)) return false\n var hit = priv(this, 'cache').get(key).value\n if (isStale(this, hit)) {\n return false\n }\n return true\n}\n\nLRUCache.prototype.get = function (key) {\n return get(this, key, true)\n}\n\nLRUCache.prototype.peek = function (key) {\n return get(this, key, false)\n}\n\nLRUCache.prototype.pop = function () {\n var node = priv(this, 'lruList').tail\n if (!node) return null\n del(this, node)\n return node.value\n}\n\nLRUCache.prototype.del = function (key) {\n del(this, priv(this, 'cache').get(key))\n}\n\nLRUCache.prototype.load = function (arr) {\n // reset the cache\n this.reset()\n\n var now = Date.now()\n // A previous serialized cache has the most recent items first\n for (var l = arr.length - 1; l >= 0; l--) {\n var hit = arr[l]\n var expiresAt = hit.e || 0\n if (expiresAt === 0) {\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n } else {\n var maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n}\n\nLRUCache.prototype.prune = function () {\n var self = this\n priv(this, 'cache').forEach(function (value, key) {\n get(self, key, false)\n })\n}\n\nfunction get (self, key, doUse) {\n var node = priv(self, 'cache').get(key)\n if (node) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) hit = undefined\n } else {\n if (doUse) {\n priv(self, 'lruList').unshiftNode(node)\n }\n }\n if (hit) hit = hit.value\n }\n return hit\n}\n\nfunction isStale (self, hit) {\n if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n return false\n }\n var stale = false\n var diff = Date.now() - hit.now\n if (hit.maxAge) {\n stale = diff > hit.maxAge\n } else {\n stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n }\n return stale\n}\n\nfunction trim (self) {\n if (priv(self, 'length') > priv(self, 'max')) {\n for (var walker = priv(self, 'lruList').tail;\n priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n var prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nfunction del (self, node) {\n if (node) {\n var hit = node.value\n if (priv(self, 'dispose')) {\n priv(self, 'dispose').call(this, hit.key, hit.value)\n }\n priv(self, 'length', priv(self, 'length') - hit.length)\n priv(self, 'cache').delete(hit.key)\n priv(self, 'lruList').removeNode(node)\n }\n}\n\n// classy, since V8 prefers predictable objects.\nfunction Entry (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lru-cache/lib/lru-cache.js\n ** module id = 36\n ** module chunks = 0\n **/","if (process.env.npm_package_name === 'pseudomap' &&\n process.env.npm_lifecycle_script === 'test')\n process.env.TEST_PSEUDOMAP = 'true'\n\nif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n module.exports = Map\n} else {\n module.exports = require('./pseudomap')\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/map.js\n ** module id = 37\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\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 = setTimeout(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 clearTimeout(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 setTimeout(drainQueue, 0);\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;\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 = 38\n ** module chunks = 0\n **/","var hasOwnProperty = Object.prototype.hasOwnProperty\n\nmodule.exports = PseudoMap\n\nfunction PseudoMap (set) {\n if (!(this instanceof PseudoMap)) // whyyyyyyy\n throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\n this.clear()\n\n if (set) {\n if ((set instanceof PseudoMap) ||\n (typeof Map === 'function' && set instanceof Map))\n set.forEach(function (value, key) {\n this.set(key, value)\n }, this)\n else if (Array.isArray(set))\n set.forEach(function (kv) {\n this.set(kv[0], kv[1])\n }, this)\n else\n throw new TypeError('invalid argument')\n }\n}\n\nPseudoMap.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n Object.keys(this._data).forEach(function (k) {\n if (k !== 'size')\n fn.call(thisp, this._data[k].value, this._data[k].key)\n }, this)\n}\n\nPseudoMap.prototype.has = function (k) {\n return !!find(this._data, k)\n}\n\nPseudoMap.prototype.get = function (k) {\n var res = find(this._data, k)\n return res && res.value\n}\n\nPseudoMap.prototype.set = function (k, v) {\n set(this._data, k, v)\n}\n\nPseudoMap.prototype.delete = function (k) {\n var res = find(this._data, k)\n if (res) {\n delete this._data[res._index]\n this._data.size--\n }\n}\n\nPseudoMap.prototype.clear = function () {\n var data = Object.create(null)\n data.size = 0\n\n Object.defineProperty(this, '_data', {\n value: data,\n enumerable: false,\n configurable: true,\n writable: false\n })\n}\n\nObject.defineProperty(PseudoMap.prototype, 'size', {\n get: function () {\n return this._data.size\n },\n set: function (n) {},\n enumerable: true,\n configurable: true\n})\n\nPseudoMap.prototype.values =\nPseudoMap.prototype.keys =\nPseudoMap.prototype.entries = function () {\n throw new Error('iterators are not implemented in this version')\n}\n\n// Either identical, or both NaN\nfunction same (a, b) {\n return a === b || a !== a && b !== b\n}\n\nfunction Entry (k, v, i) {\n this.key = k\n this.value = v\n this._index = i\n}\n\nfunction find (data, k) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k))\n return data[key]\n }\n}\n\nfunction set (data, k, v) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k)) {\n data[key].value = v\n return\n }\n }\n data.size++\n data[key] = new Entry(k, v, key)\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/pseudomap.js\n ** module id = 39\n ** module chunks = 0\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/util.js\n ** module id = 40\n ** module chunks = 0\n **/","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/support/isBufferBrowser.js\n ** module id = 41\n ** module chunks = 0\n **/","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/inherits/inherits_browser.js\n ** module id = 42\n ** module chunks = 0\n **/","module.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length --\n node.next = null\n node.prev = null\n node.list = null\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length ++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length ++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail)\n return undefined\n\n var res = this.tail.value\n this.tail = this.tail.prev\n this.tail.next = null\n this.length --\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head)\n return undefined\n\n var res = this.head.value\n this.head = this.head.next\n this.head.prev = null\n this.length --\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length ++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length ++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/yallist/yallist.js\n ** module id = 43\n ** module chunks = 0\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\n\nclass ImageTile extends Tile {\n constructor(quadcode, path, layer) {\n super(quadcode, path, layer);\n }\n\n // Request data for the tile\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTile();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear image reference\n this._image = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\n var material = new THREE.MeshBasicMaterial({\n depthWrite: false\n });\n\n var localMesh = new THREE.Mesh(geom, material);\n localMesh.rotation.x = -90 * Math.PI / 180;\n\n mesh.add(localMesh);\n\n mesh.renderOrder = 0;\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n // var box = new BoxHelper(localMesh);\n // mesh.add(box);\n //\n // mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTile() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n var image = document.createElement('img');\n\n image.addEventListener('load', event => {\n var texture = new THREE.Texture();\n\n texture.image = image;\n texture.needsUpdate = true;\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n // Something went wrong and the tile or its material is missing\n //\n // Possibly removed by the cache before the image loaded\n if (!this._mesh || !this._mesh.children[0] || !this._mesh.children[0].material) {\n return;\n }\n\n this._mesh.children[0].material.map = texture;\n this._mesh.children[0].material.needsUpdate = true;\n\n this._texture = texture;\n this._ready = true;\n }, false);\n\n // image.addEventListener('progress', event => {}, false);\n // image.addEventListener('error', event => {}, false);\n\n image.crossOrigin = '';\n\n // Load image\n image.src = url;\n\n this._image = image;\n }\n\n _abortRequest() {\n if (!this._image) {\n return;\n }\n\n this._image.src = '';\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer) {\n return new ImageTile(quadcode, path, layer);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTile.js\n **/","import LatLon from '../../geo/LatLon';\nimport THREE from 'three';\n\n// Manages a single tile and its layers\n\nvar r2d = 180 / Math.PI;\n\nvar tileURLRegex = /\\{([szxy])\\}/g;\n\nclass Tile {\n constructor(quadcode, path, layer) {\n this._layer = layer;\n this._quadcode = quadcode;\n this._path = path;\n\n this._ready = false;\n\n this._tile = this._quadcodeToTile(quadcode);\n\n // Bottom-left and top-right bounds in WGS84 coordinates\n this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\n // Bottom-left and top-right bounds in world coordinates\n this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\n // Tile center in world coordinates\n this._center = this._boundsToCenter(this._boundsWorld);\n\n // Length of a tile side in world coorindates\n this._side = this._getSide(this._boundsWorld);\n }\n\n // Returns true if the tile mesh and texture are ready to be used\n // Otherwise, returns false\n isReady() {\n return this._ready;\n }\n\n // Request data for the tile\n requestTileAsync() {}\n\n getQuadcode() {\n return this._quadcode;\n }\n\n getBounds() {\n return this._boundsWorld;\n }\n\n getCenter() {\n return this._center;\n }\n\n getSide() {\n return this._side;\n }\n\n getMesh() {\n return this._mesh;\n }\n\n // Destroys the tile and removes it from the layer and memory\n //\n // Ensure that this leaves no trace of the tile – no textures, no meshes,\n // nothing in memory or the GPU\n destroy() {\n // Delete reference to layer\n this._layer = null;\n\n // Delete location references\n this._boundsLatLon = null;\n this._boundsWorld = null;\n this._center = null;\n\n // Done if no mesh\n if (!this._mesh) {\n return;\n }\n\n if (this._mesh.children) {\n // Dispose of mesh and materials\n this._mesh.children.forEach(child => {\n child.geometry.dispose();\n child.geometry = null;\n\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n });\n } else {\n this._mesh.geometry.dispose();\n this._mesh.geometry = null;\n\n if (this._mesh.material.map) {\n this._mesh.material.map.dispose();\n this._mesh.material.map = null;\n }\n\n this._mesh.material.dispose();\n this._mesh.material = null;\n }\n }\n\n _createMesh() {}\n _createDebugMesh() {}\n\n _getTileURL(urlParams) {\n if (!urlParams.s) {\n // Default to a random choice of a, b or c\n s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n }\n\n tileURLRegex.lastIndex = 0;\n return this._path.replace(tileURLRegex, function(value, key) {\n // Replace with paramter, otherwise keep existing value\n return urlParams[key];\n });\n }\n\n // Convert from quadcode to TMS tile coordinates\n _quadcodeToTile(quadcode) {\n var x = 0;\n var y = 0;\n var z = quadcode.length;\n\n for (var i = z; i > 0; i--) {\n var mask = 1 << (i - 1);\n var q = +quadcode[z - i];\n if (q === 1) {\n x |= mask;\n }\n if (q === 2) {\n y |= mask;\n }\n if (q === 3) {\n x |= mask;\n y |= mask;\n }\n }\n\n return [x, y, z];\n }\n\n // Convert WGS84 tile bounds to world coordinates\n _tileBoundsFromWGS84(boundsWGS84) {\n var sw = this._layer._world.latLonToPoint(LatLon(boundsWGS84[1], boundsWGS84[0]));\n var ne = this._layer._world.latLonToPoint(LatLon(boundsWGS84[3], boundsWGS84[2]));\n\n return [sw.x, sw.y, ne.x, ne.y];\n }\n\n // Get tile bounds in WGS84 coordinates\n _tileBoundsWGS84(tile) {\n var e = this._tile2lon(tile[0] + 1, tile[2]);\n var w = this._tile2lon(tile[0], tile[2]);\n var s = this._tile2lat(tile[1] + 1, tile[2]);\n var n = this._tile2lat(tile[1], tile[2]);\n return [w, s, e, n];\n }\n\n _tile2lon(x, z) {\n return x / Math.pow(2, z) * 360 - 180;\n }\n\n _tile2lat(y, z) {\n var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n }\n\n _boundsToCenter(bounds) {\n var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\n return [x, y];\n }\n\n _getSide(bounds) {\n return (new THREE.Vector3(bounds[0], 0, bounds[3])).sub(new THREE.Vector3(bounds[0], 0, bounds[1])).length();\n }\n}\n\nexport default Tile;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/Tile.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nBoxHelper = function ( object ) {\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new THREE.BufferGeometry();\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { linewidth: 2, color: 0xff0000 } ) );\n\n\tif ( object !== undefined ) {\n\n\t\tthis.update( object );\n\n\t}\n\n};\n\nBoxHelper.prototype = Object.create( THREE.LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new THREE.Box3();\n\n\treturn function ( object ) {\n\n\t\tbox.setFromObject( object );\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nexport default BoxHelper;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/BoxHelper.js\n **/","import THREE from 'three';\n\nexport default function(colour) {\n var canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n\n var context = canvas.getContext('2d');\n context.fillStyle = colour;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.strokeStyle = '#D0D0CF';\n // context.strokeRect(0, 0, canvas.width, canvas.height);\n\n var texture = new THREE.Texture(canvas);\n\n // // Silky smooth images when tilted\n // texture.magFilter = THREE.LinearFilter;\n // texture.minFilter = THREE.LinearMipMapLinearFilter;\n // //\n // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n // texture.anisotropy = 4;\n\n // texture.wrapS = THREE.RepeatWrapping;\n // texture.wrapT = THREE.RepeatWrapping;\n // texture.repeat.set(segments, segments);\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n depthWrite: false\n });\n\n return material;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayerBaseMaterial.js\n **/","/**\n * lodash 4.0.0 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar debounce = require('lodash.debounce');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide an options object to indicate whether\n * `func` should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // cancel a trailing throttled invocation\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = throttle;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/index.js\n ** module id = 48\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = Date.now;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide an options object to indicate whether `func` should be invoked on\n * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent calls\n * to the debounced function return the result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n leading = false,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function flush() {\n if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n result = func.apply(thisArg, args);\n }\n cancel();\n return result;\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/~/lodash.debounce/index.js\n ** module id = 49\n ** module chunks = 0\n **/","import TileLayer from './TileLayer';\nimport extend from 'lodash.assign';\nimport TopoJSONTile from './TopoJSONTile';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\nclass TopoJSONTileLayer extends TileLayer {\n constructor(path, options) {\n var defaults = {\n maxLOD: 13,\n distance: 2000\n };\n\n options = extend(defaults, options);\n\n super(options);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n this._initEvents();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n }\n\n _onWorldMove(latlon, point) {\n // this._moveBaseLayer(point);\n }\n\n _createTile(quadcode, layer) {\n var options = {};\n\n if (this._options.filter) {\n options.filter = this._options.filter;\n }\n\n if (this._options.style) {\n options.style = this._options.style;\n }\n\n return TopoJSONTile(quadcode, this._path, layer, options);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new TopoJSONTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TopoJSONTileLayer.js\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\nimport reqwest from 'reqwest';\nimport topojson from 'topojson';\nimport Point from '../../geo/Point';\nimport LatLon from '../../geo/LatLon';\nimport earcut from 'earcut';\nimport extend from 'lodash.assign';\n\n// TODO: Perform tile request and processing in a Web Worker\n//\n// Use Operative (https://github.com/padolsey/operative)\n//\n// Would it make sense to have the worker functionality defined in a static\n// method so it only gets initialised once and not on every tile instance?\n//\n// Otherwise, worker processing logic would have to go in the tile layer so not\n// to waste loads of time setting up a brand new worker with three.js for each\n// tile every single time.\n//\n// Unsure of the best way to get three.js and VIZI into the worker\n//\n// Would need to set up a CRS / projection identical to the world instance\n//\n// Is it possible to bypass requirements on external script by having multiple\n// simple worker methods that each take enough inputs to perform a single task\n// without requiring VIZI or three.js? So long as the heaviest logic is done in\n// the worker and transferrable objects are used then it should be better than\n// nothing. Would probably still need things like earcut...\n//\n// After all, the three.js logic and object creation will still need to be\n// done on the main thread regardless so the worker should try to do as much as\n// possible with as few dependencies as possible.\n//\n// Have a look at how this is done in Tangram before implementing anything as\n// the approach there is pretty similar and robust.\n\nclass TopoJSONTile extends Tile {\n constructor(quadcode, path, layer, options) {\n super(quadcode, path, layer);\n\n var defaults = {\n filter: null,\n style: {\n color: '#ff0000'\n }\n };\n\n this._options = extend(defaults, options);\n }\n\n // Request data for the tile\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTile();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear request reference\n this._request = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n\n mesh.renderOrder = 1;\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n //\n // var material = new THREE.MeshBasicMaterial({\n // depthWrite: false\n // });\n //\n // var localMesh = new THREE.Mesh(geom, material);\n // localMesh.rotation.x = -90 * Math.PI / 180;\n //\n // mesh.add(localMesh);\n //\n // var box = new BoxHelper(localMesh);\n // mesh.add(box);\n //\n // mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTile() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n this._request = reqwest({\n url: url,\n type: 'json',\n crossOrigin: true\n }).then(res => {\n // Clear request reference\n this._request = null;\n this._processTileData(res);\n }).catch(err => {\n console.error(err);\n\n // Clear request reference\n this._request = null;\n });\n }\n\n _processTileData(data) {\n var geojson = topojson.feature(data, data.objects.vectile);\n\n var offset = Point(0, 0);\n offset.x = -1 * this._center[0];\n offset.y = -1 * this._center[1];\n\n var coordinates;\n var earcutData;\n var faces;\n // var geometry;\n\n var allVertices = [];\n var allFaces = [];\n var allColours = [];\n var facesCount = 0;\n\n var colour = new THREE.Color();\n\n var features = geojson.features;\n\n // Run filter, if provided\n if (this._options.filter) {\n features = geojson.features.filter(this._options.filter);\n }\n\n var style = this._options.style;\n\n features.forEach(feature => {\n // feature.geometry, feature.properties\n\n // Get style object, if provided\n if (typeof this._options.style === 'function') {\n style = this._options.style(feature);\n }\n\n // console.log(style);\n\n var coordinates = feature.geometry.coordinates;\n\n // Skip if geometry is a point\n //\n // This should be a user-defined filter as it would be wrong to assume\n // that people won't want to output points\n if (!coordinates[0] || !coordinates[0][0] || !Array.isArray(coordinates[0][0])) {\n return;\n }\n\n coordinates = coordinates.map(ring => {\n return ring.map(coordinate => {\n var latlon = LatLon(coordinate[1], coordinate[0]);\n var point = this._layer._world.latLonToPoint(latlon);\n return [point.x, point.y];\n });\n });\n\n earcutData = this._toEarcut(coordinates);\n\n faces = this._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\n colour.set(style.color);\n\n allVertices.push(earcutData.vertices);\n allColours.push([colour.r, colour.g, colour.b]);\n allFaces.push(faces);\n\n facesCount += faces.length;\n\n // console.log(earcutData.vertices);\n // console.log(faces);\n // return;\n\n // geometry = new THREE.BufferGeometry();\n //\n // // Three components per vertex per face (3 x 3 = 9)\n // var vertices = new Float32Array(faces.length * 9);\n //\n // var index;\n // for (var i = 0; i < faces.length; i++) {\n // // Array of vertex indexes for the face\n // index = faces[i][0];\n //\n // vertices[i * 9 + 0] = earcutData.vertices[index * dim];\n // vertices[i * 9 + 1] = 0;\n // vertices[i * 9 + 2] = earcutData.vertices[index * dim + 1];\n //\n // // Array of vertex indexes for the face\n // index = faces[i][1];\n //\n // vertices[i * 9 + 3] = earcutData.vertices[index * dim];\n // vertices[i * 9 + 4] = 0;\n // vertices[i * 9 + 5] = earcutData.vertices[index * dim + 1];\n //\n // // Array of vertex indexes for the face\n // index = faces[i][2];\n //\n // vertices[i * 9 + 6] = earcutData.vertices[index * dim];\n // vertices[i * 9 + 7] = 0;\n // vertices[i * 9 + 8] = earcutData.vertices[index * dim + 1];\n // }\n\n // var shape = new THREE.Shape();\n //\n // var outer = coordinates.shift();\n // var inners = coordinates;\n //\n // if (!outer || !outer[0] || !Array.isArray(outer[0])) {\n // return;\n // }\n //\n // // Create outer shape\n // outer.forEach((coord, index) => {\n // var latlon = LatLon(coord[1], coord[0]);\n // var point = this._layer._world.latLonToPoint(latlon);\n //\n // // Move if first coordinate\n // if (index === 0) {\n // shape.moveTo(point.x + offset.x, point.y + offset.y);\n // } else {\n // shape.lineTo(point.x + offset.x, point.y + offset.y);\n // }\n // });\n //\n // var geom = new THREE.ShapeGeometry(shape);\n // var mesh = new THREE.Mesh(geom, new THREE.MeshBasicMaterial({\n // color: 0x0000ff,\n // side: THREE.BackSide,\n // depthWrite: false\n // }));\n //\n // // Offset\n // // mesh.position.x = -1 * offset.x;\n // // mesh.position.z = -1 * offset.y;\n //\n // mesh.rotation.x = 90 * Math.PI / 180;\n //\n // this._mesh.add(mesh);\n });\n\n // Skip if no faces\n //\n // Need to check way before this if there are no faces, before even doing\n // earcut triangulation.\n if (facesCount === 0) {\n this._ready = true;\n return;\n }\n\n var geometry = new THREE.BufferGeometry();\n\n // Three components per vertex per face (3 x 3 = 9)\n var vertices = new Float32Array(facesCount * 9);\n var normals = new Float32Array(facesCount * 9);\n var colours = new Float32Array(facesCount * 9);\n\n var pA = new THREE.Vector3();\n var pB = new THREE.Vector3();\n var pC = new THREE.Vector3();\n\n var cb = new THREE.Vector3();\n var ab = new THREE.Vector3();\n\n var dim = 2;\n\n var index;\n var _faces;\n var _vertices;\n var _colour;\n var lastIndex = 0;\n for (var i = 0; i < allFaces.length; i++) {\n _faces = allFaces[i];\n _vertices = allVertices[i];\n _colour = allColours[i];\n\n for (var j = 0; j < _faces.length; j++) {\n // Array of vertex indexes for the face\n index = _faces[j][0];\n\n var ax = _vertices[index * dim] + offset.x;\n var ay = 0;\n var az = _vertices[index * dim + 1] + offset.y;\n\n index = _faces[j][1];\n\n var bx = _vertices[index * dim] + offset.x;\n var by = 0;\n var bz = _vertices[index * dim + 1] + offset.y;\n\n index = _faces[j][2];\n\n var cx = _vertices[index * dim] + offset.x;\n var cy = 0;\n var cz = _vertices[index * dim + 1] + offset.y;\n\n // Flat face normals\n // From: http://threejs.org/examples/webgl_buffergeometry.html\n pA.set(ax, ay, az);\n pB.set(bx, by, bz);\n pC.set(cx, cy, cz);\n\n cb.subVectors(pC, pB);\n ab.subVectors(pA, pB);\n cb.cross(ab);\n\n cb.normalize();\n\n var nx = cb.x;\n var ny = cb.y;\n var nz = cb.z;\n\n vertices[lastIndex * 9 + 0] = ax;\n vertices[lastIndex * 9 + 1] = ay;\n vertices[lastIndex * 9 + 2] = az;\n\n normals[lastIndex * 9 + 0] = nx;\n normals[lastIndex * 9 + 1] = ny;\n normals[lastIndex * 9 + 2] = nz;\n\n colours[lastIndex * 9 + 0] = _colour[0];\n colours[lastIndex * 9 + 1] = _colour[1];\n colours[lastIndex * 9 + 2] = _colour[2];\n\n vertices[lastIndex * 9 + 3] = bx;\n vertices[lastIndex * 9 + 4] = by;\n vertices[lastIndex * 9 + 5] = bz;\n\n normals[lastIndex * 9 + 3] = nx;\n normals[lastIndex * 9 + 4] = ny;\n normals[lastIndex * 9 + 5] = nz;\n\n colours[lastIndex * 9 + 3] = _colour[0];\n colours[lastIndex * 9 + 4] = _colour[1];\n colours[lastIndex * 9 + 5] = _colour[2];\n\n vertices[lastIndex * 9 + 6] = cx;\n vertices[lastIndex * 9 + 7] = cy;\n vertices[lastIndex * 9 + 8] = cz;\n\n normals[lastIndex * 9 + 6] = nx;\n normals[lastIndex * 9 + 7] = ny;\n normals[lastIndex * 9 + 8] = nz;\n\n colours[lastIndex * 9 + 6] = _colour[0];\n colours[lastIndex * 9 + 7] = _colour[1];\n colours[lastIndex * 9 + 8] = _colour[2];\n\n lastIndex++;\n }\n }\n\n // itemSize = 3 because there are 3 values (components) per vertex\n geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));\n geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3));\n geometry.addAttribute('color', new THREE.BufferAttribute(colours, 3));\n\n geometry.computeBoundingBox();\n\n var material = new THREE.MeshBasicMaterial({\n vertexColors: THREE.VertexColors,\n side: THREE.BackSide,\n depthWrite: false\n });\n var mesh = new THREE.Mesh(geometry, material);\n mesh.renderOrder = 1;\n\n this._mesh.add(mesh);\n\n this._ready = true;\n }\n\n _toEarcut(data) {\n var dim = data[0][0].length;\n var result = {vertices: [], holes: [], dimensions: dim};\n var holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) {\n result.vertices.push(data[i][j][d]);\n }\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n\n return result;\n }\n\n _triangulate(contour, holes, dim) {\n // console.time('earcut');\n\n var faces = earcut(contour, holes, dim);\n var result = [];\n\n for (i = 0, il = faces.length; i < il; i += 3) {\n result.push(faces.slice(i, i + 3));\n }\n\n // console.timeEnd('earcut');\n\n return result;\n }\n\n _abortRequest() {\n if (!this._request) {\n return;\n }\n\n this._request.abort();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer, options) {\n return new TopoJSONTile(quadcode, path, layer, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TopoJSONTile.js\n **/","/*!\n * Reqwest! A general purpose XHR connection manager\n * license MIT (c) Dustin Diaz 2015\n * https://github.com/ded/reqwest\n */\n\n!function (name, context, definition) {\n if (typeof module != 'undefined' && module.exports) module.exports = definition()\n else if (typeof define == 'function' && define.amd) define(definition)\n else context[name] = definition()\n}('reqwest', this, function () {\n\n var context = this\n\n if ('window' in context) {\n var doc = document\n , byTag = 'getElementsByTagName'\n , head = doc[byTag]('head')[0]\n } else {\n var XHR2\n try {\n XHR2 = require('xhr2')\n } catch (ex) {\n throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n }\n }\n\n\n var httpsRe = /^http/\n , protocolRe = /(^\\w+):\\/\\//\n , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n , readyState = 'readyState'\n , contentType = 'Content-Type'\n , requestedWith = 'X-Requested-With'\n , uniqid = 0\n , callbackPrefix = 'reqwest_' + (+new Date())\n , lastValue // data stored by the most recent JSONP callback\n , xmlHttpRequest = 'XMLHttpRequest'\n , xDomainRequest = 'XDomainRequest'\n , noop = function () {}\n\n , isArray = typeof Array.isArray == 'function'\n ? Array.isArray\n : function (a) {\n return a instanceof Array\n }\n\n , defaultHeaders = {\n 'contentType': 'application/x-www-form-urlencoded'\n , 'requestedWith': xmlHttpRequest\n , 'accept': {\n '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n , 'xml': 'application/xml, text/xml'\n , 'html': 'text/html'\n , 'text': 'text/plain'\n , 'json': 'application/json, text/javascript'\n , 'js': 'application/javascript, text/javascript'\n }\n }\n\n , xhr = function(o) {\n // is it x-domain\n if (o['crossOrigin'] === true) {\n var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n if (xhr && 'withCredentials' in xhr) {\n return xhr\n } else if (context[xDomainRequest]) {\n return new XDomainRequest()\n } else {\n throw new Error('Browser does not support cross-origin requests')\n }\n } else if (context[xmlHttpRequest]) {\n return new XMLHttpRequest()\n } else if (XHR2) {\n return new XHR2()\n } else {\n return new ActiveXObject('Microsoft.XMLHTTP')\n }\n }\n , globalSetupOptions = {\n dataFilter: function (data) {\n return data\n }\n }\n\n function succeed(r) {\n var protocol = protocolRe.exec(r.url)\n protocol = (protocol && protocol[1]) || context.location.protocol\n return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n }\n\n function handleReadyState(r, success, error) {\n return function () {\n // use _aborted to mitigate against IE err c00c023f\n // (can't read props on aborted request objects)\n if (r._aborted) return error(r.request)\n if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n if (r.request && r.request[readyState] == 4) {\n r.request.onreadystatechange = noop\n if (succeed(r)) success(r.request)\n else\n error(r.request)\n }\n }\n }\n\n function setHeaders(http, o) {\n var headers = o['headers'] || {}\n , h\n\n headers['Accept'] = headers['Accept']\n || defaultHeaders['accept'][o['type']]\n || defaultHeaders['accept']['*']\n\n var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n // breaks cross-origin requests with legacy browsers\n if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n for (h in headers)\n headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n }\n\n function setCredentials(http, o) {\n if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n http.withCredentials = !!o['withCredentials']\n }\n }\n\n function generalCallback(data) {\n lastValue = data\n }\n\n function urlappend (url, s) {\n return url + (/\\?/.test(url) ? '&' : '?') + s\n }\n\n function handleJsonp(o, fn, err, url) {\n var reqId = uniqid++\n , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n , match = url.match(cbreg)\n , script = doc.createElement('script')\n , loaded = 0\n , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\n if (match) {\n if (match[3] === '?') {\n url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n } else {\n cbval = match[3] // provided callback func name\n }\n } else {\n url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n }\n\n context[cbval] = generalCallback\n\n script.type = 'text/javascript'\n script.src = url\n script.async = true\n if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n // need this for IE due to out-of-order onreadystatechange(), binding script\n // execution to an event listener gives us control over when the script\n // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n script.htmlFor = script.id = '_reqwest_' + reqId\n }\n\n script.onload = script.onreadystatechange = function () {\n if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n return false\n }\n script.onload = script.onreadystatechange = null\n script.onclick && script.onclick()\n // Call the user callback with the last value stored and clean up values and scripts.\n fn(lastValue)\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n\n // Add the script to the DOM head\n head.appendChild(script)\n\n // Enable JSONP timeout\n return {\n abort: function () {\n script.onload = script.onreadystatechange = null\n err({}, 'Request is aborted: timeout', {})\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n }\n }\n\n function getRequest(fn, err) {\n var o = this.o\n , method = (o['method'] || 'GET').toUpperCase()\n , url = typeof o === 'string' ? o : o['url']\n // convert non-string objects to query-string form unless o['processData'] is false\n , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n ? reqwest.toQueryString(o['data'])\n : (o['data'] || null)\n , http\n , sendWait = false\n\n // if we're working on a GET request and we have data then we should append\n // query string to end of URL and not post data\n if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n url = urlappend(url, data)\n data = null\n }\n\n if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\n // get the xhr from the factory if passed\n // if the factory returns null, fall-back to ours\n http = (o.xhr && o.xhr(o)) || xhr(o)\n\n http.open(method, url, o['async'] === false ? false : true)\n setHeaders(http, o)\n setCredentials(http, o)\n if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n http.onload = fn\n http.onerror = err\n // NOTE: see\n // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n http.onprogress = function() {}\n sendWait = true\n } else {\n http.onreadystatechange = handleReadyState(this, fn, err)\n }\n o['before'] && o['before'](http)\n if (sendWait) {\n setTimeout(function () {\n http.send(data)\n }, 200)\n } else {\n http.send(data)\n }\n return http\n }\n\n function Reqwest(o, fn) {\n this.o = o\n this.fn = fn\n\n init.apply(this, arguments)\n }\n\n function setType(header) {\n // json, javascript, text/plain, text/html, xml\n if (header === null) return undefined; //In case of no content-type.\n if (header.match('json')) return 'json'\n if (header.match('javascript')) return 'js'\n if (header.match('text')) return 'html'\n if (header.match('xml')) return 'xml'\n }\n\n function init(o, fn) {\n\n this.url = typeof o == 'string' ? o : o['url']\n this.timeout = null\n\n // whether request has been fulfilled for purpose\n // of tracking the Promises\n this._fulfilled = false\n // success handlers\n this._successHandler = function(){}\n this._fulfillmentHandlers = []\n // error handlers\n this._errorHandlers = []\n // complete (both success and fail) handlers\n this._completeHandlers = []\n this._erred = false\n this._responseArgs = {}\n\n var self = this\n\n fn = fn || function () {}\n\n if (o['timeout']) {\n this.timeout = setTimeout(function () {\n timedOut()\n }, o['timeout'])\n }\n\n if (o['success']) {\n this._successHandler = function () {\n o['success'].apply(o, arguments)\n }\n }\n\n if (o['error']) {\n this._errorHandlers.push(function () {\n o['error'].apply(o, arguments)\n })\n }\n\n if (o['complete']) {\n this._completeHandlers.push(function () {\n o['complete'].apply(o, arguments)\n })\n }\n\n function complete (resp) {\n o['timeout'] && clearTimeout(self.timeout)\n self.timeout = null\n while (self._completeHandlers.length > 0) {\n self._completeHandlers.shift()(resp)\n }\n }\n\n function success (resp) {\n var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n resp = (type !== 'jsonp') ? self.request : resp\n // use global data filter on response text\n var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n , r = filteredResponse\n try {\n resp.responseText = r\n } catch (e) {\n // can't assign this in IE<=8, just ignore\n }\n if (r) {\n switch (type) {\n case 'json':\n try {\n resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n } catch (err) {\n return error(resp, 'Could not parse JSON in response', err)\n }\n break\n case 'js':\n resp = eval(r)\n break\n case 'html':\n resp = r\n break\n case 'xml':\n resp = resp.responseXML\n && resp.responseXML.parseError // IE trololo\n && resp.responseXML.parseError.errorCode\n && resp.responseXML.parseError.reason\n ? null\n : resp.responseXML\n break\n }\n }\n\n self._responseArgs.resp = resp\n self._fulfilled = true\n fn(resp)\n self._successHandler(resp)\n while (self._fulfillmentHandlers.length > 0) {\n resp = self._fulfillmentHandlers.shift()(resp)\n }\n\n complete(resp)\n }\n\n function timedOut() {\n self._timedOut = true\n self.request.abort()\n }\n\n function error(resp, msg, t) {\n resp = self.request\n self._responseArgs.resp = resp\n self._responseArgs.msg = msg\n self._responseArgs.t = t\n self._erred = true\n while (self._errorHandlers.length > 0) {\n self._errorHandlers.shift()(resp, msg, t)\n }\n complete(resp)\n }\n\n this.request = getRequest.call(this, success, error)\n }\n\n Reqwest.prototype = {\n abort: function () {\n this._aborted = true\n this.request.abort()\n }\n\n , retry: function () {\n init.call(this, this.o, this.fn)\n }\n\n /**\n * Small deviation from the Promises A CommonJs specification\n * http://wiki.commonjs.org/wiki/Promises/A\n */\n\n /**\n * `then` will execute upon successful requests\n */\n , then: function (success, fail) {\n success = success || function () {}\n fail = fail || function () {}\n if (this._fulfilled) {\n this._responseArgs.resp = success(this._responseArgs.resp)\n } else if (this._erred) {\n fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._fulfillmentHandlers.push(success)\n this._errorHandlers.push(fail)\n }\n return this\n }\n\n /**\n * `always` will execute whether the request succeeds or fails\n */\n , always: function (fn) {\n if (this._fulfilled || this._erred) {\n fn(this._responseArgs.resp)\n } else {\n this._completeHandlers.push(fn)\n }\n return this\n }\n\n /**\n * `fail` will execute when the request fails\n */\n , fail: function (fn) {\n if (this._erred) {\n fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._errorHandlers.push(fn)\n }\n return this\n }\n , 'catch': function (fn) {\n return this.fail(fn)\n }\n }\n\n function reqwest(o, fn) {\n return new Reqwest(o, fn)\n }\n\n // normalize newline variants according to spec -> CRLF\n function normalize(s) {\n return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n }\n\n function serial(el, cb) {\n var n = el.name\n , t = el.tagName.toLowerCase()\n , optCb = function (o) {\n // IE gives value=\"\" even where there is no value attribute\n // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n if (o && !o['disabled'])\n cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n }\n , ch, ra, val, i\n\n // don't serialize elements that are disabled or without a name\n if (el.disabled || !n) return\n\n switch (t) {\n case 'input':\n if (!/reset|button|image|file/i.test(el.type)) {\n ch = /checkbox/i.test(el.type)\n ra = /radio/i.test(el.type)\n val = el.value\n // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n }\n break\n case 'textarea':\n cb(n, normalize(el.value))\n break\n case 'select':\n if (el.type.toLowerCase() === 'select-one') {\n optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n } else {\n for (i = 0; el.length && i < el.length; i++) {\n el.options[i].selected && optCb(el.options[i])\n }\n }\n break\n }\n }\n\n // collect up all form elements found from the passed argument elements all\n // the way down to child elements; pass a '' or form fields.\n // called with 'this'=callback to use for serial() on each element\n function eachFormElement() {\n var cb = this\n , e, i\n , serializeSubtags = function (e, tags) {\n var i, j, fa\n for (i = 0; i < tags.length; i++) {\n fa = e[byTag](tags[i])\n for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n }\n }\n\n for (i = 0; i < arguments.length; i++) {\n e = arguments[i]\n if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n }\n }\n\n // standard query string style serialization\n function serializeQueryString() {\n return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n }\n\n // { 'name': 'value', ... } style serialization\n function serializeHash() {\n var hash = {}\n eachFormElement.apply(function (name, value) {\n if (name in hash) {\n hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n hash[name].push(value)\n } else hash[name] = value\n }, arguments)\n return hash\n }\n\n // [ { name: 'name', value: 'value' }, ... ] style serialization\n reqwest.serializeArray = function () {\n var arr = []\n eachFormElement.apply(function (name, value) {\n arr.push({name: name, value: value})\n }, arguments)\n return arr\n }\n\n reqwest.serialize = function () {\n if (arguments.length === 0) return ''\n var opt, fn\n , args = Array.prototype.slice.call(arguments, 0)\n\n opt = args.pop()\n opt && opt.nodeType && args.push(opt) && (opt = null)\n opt && (opt = opt.type)\n\n if (opt == 'map') fn = serializeHash\n else if (opt == 'array') fn = reqwest.serializeArray\n else fn = serializeQueryString\n\n return fn.apply(null, args)\n }\n\n reqwest.toQueryString = function (o, trad) {\n var prefix, i\n , traditional = trad || false\n , s = []\n , enc = encodeURIComponent\n , add = function (key, value) {\n // If value is a function, invoke it and return its value\n value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n s[s.length] = enc(key) + '=' + enc(value)\n }\n // If an array was passed in, assume that it is an array of form elements.\n if (isArray(o)) {\n for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n } else {\n // If traditional, encode the \"old\" way (the way 1.3.2 or older\n // did it), otherwise encode params recursively.\n for (prefix in o) {\n if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n }\n }\n\n // spaces should be + according to spec\n return s.join('&').replace(/%20/g, '+')\n }\n\n function buildParams(prefix, obj, traditional, add) {\n var name, i, v\n , rbracket = /\\[\\]$/\n\n if (isArray(obj)) {\n // Serialize array item.\n for (i = 0; obj && i < obj.length; i++) {\n v = obj[i]\n if (traditional || rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v)\n } else {\n buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n }\n }\n } else if (obj && obj.toString() === '[object Object]') {\n // Serialize object item.\n for (name in obj) {\n buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n }\n\n } else {\n // Serialize scalar item.\n add(prefix, obj)\n }\n }\n\n reqwest.getcallbackPrefix = function () {\n return callbackPrefix\n }\n\n // jQuery and Zepto compatibility, differences can be remapped here so you can call\n // .ajax.compat(options, callback)\n reqwest.compat = function (o, fn) {\n if (o) {\n o['type'] && (o['method'] = o['type']) && delete o['type']\n o['dataType'] && (o['type'] = o['dataType'])\n o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n }\n return new Reqwest(o, fn)\n }\n\n reqwest.ajaxSetup = function (options) {\n options = options || {}\n for (var k in options) {\n globalSetupOptions[k] = options[k]\n }\n }\n\n return reqwest\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/reqwest/reqwest.js\n ** module id = 52\n ** module chunks = 0\n **/","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.topojson = {})));\n}(this, function (exports) { 'use strict';\n\n function noop() {}\n\n function absolute(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n point[0] = (x0 += point[0]) * kx + dx;\n point[1] = (y0 += point[1]) * ky + dy;\n };\n }\n\n function relative(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n var x1 = (point[0] - dx) / kx | 0,\n y1 = (point[1] - dy) / ky | 0;\n point[0] = x1 - x0;\n point[1] = y1 - y0;\n x0 = x1;\n y0 = y1;\n };\n }\n\n function reverse(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n }\n\n function bisect(a, x) {\n var lo = 0, hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (a[mid] < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n function feature(topology, o) {\n return o.type === \"GeometryCollection\" ? {\n type: \"FeatureCollection\",\n features: o.geometries.map(function(o) { return feature$1(topology, o); })\n } : feature$1(topology, o);\n }\n\n function feature$1(topology, o) {\n var f = {\n type: \"Feature\",\n id: o.id,\n properties: o.properties || {},\n geometry: object(topology, o)\n };\n if (o.id == null) delete f.id;\n return f;\n }\n\n function object(topology, o) {\n var absolute$$ = absolute(topology.transform),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) points.pop();\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n points.push(p = a[k].slice());\n absolute$$(p, k);\n }\n if (i < 0) reverse(points, n);\n }\n\n function point(p) {\n p = p.slice();\n absolute$$(p, 0);\n return p;\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n if (points.length < 2) points.push(points[0].slice());\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) points.push(points[0].slice());\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var t = o.type;\n return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n : null;\n }\n\n var geometryType = {\n Point: function(o) { return point(o.coordinates); },\n MultiPoint: function(o) { return o.coordinates.map(point); },\n LineString: function(o) { return line(o.arcs); },\n MultiLineString: function(o) { return o.arcs.map(line); },\n Polygon: function(o) { return polygon(o.arcs); },\n MultiPolygon: function(o) { return o.arcs.map(polygon); }\n };\n\n return geometry(o);\n }\n\n function stitchArcs(topology, arcs) {\n var stitchedArcs = {},\n fragmentByStart = {},\n fragmentByEnd = {},\n fragments = [],\n emptyIndex = -1;\n\n // Stitch empty arcs first, since they may be subsumed by other arcs.\n arcs.forEach(function(i, j) {\n var arc = topology.arcs[i < 0 ? ~i : i], t;\n if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n }\n });\n\n arcs.forEach(function(i) {\n var e = ends(i),\n start = e[0],\n end = e[1],\n f, g;\n\n if (f = fragmentByEnd[start]) {\n delete fragmentByEnd[f.end];\n f.push(i);\n f.end = end;\n if (g = fragmentByStart[end]) {\n delete fragmentByStart[g.start];\n var fg = g === f ? f : f.concat(g);\n fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else if (f = fragmentByStart[end]) {\n delete fragmentByStart[f.start];\n f.unshift(i);\n f.start = start;\n if (g = fragmentByEnd[start]) {\n delete fragmentByEnd[g.end];\n var gf = g === f ? f : g.concat(f);\n fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else {\n f = [i];\n fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n }\n });\n\n function ends(i) {\n var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n else p1 = arc[arc.length - 1];\n return i < 0 ? [p1, p0] : [p0, p1];\n }\n\n function flush(fragmentByEnd, fragmentByStart) {\n for (var k in fragmentByEnd) {\n var f = fragmentByEnd[k];\n delete fragmentByStart[f.start];\n delete f.start;\n delete f.end;\n f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n fragments.push(f);\n }\n }\n\n flush(fragmentByEnd, fragmentByStart);\n flush(fragmentByStart, fragmentByEnd);\n arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\n return fragments;\n }\n\n function mesh(topology) {\n return object(topology, meshArcs.apply(this, arguments));\n }\n\n function meshArcs(topology, o, filter) {\n var arcs = [];\n\n function arc(i) {\n var j = i < 0 ? ~i : i;\n (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n }\n\n function line(arcs) {\n arcs.forEach(arc);\n }\n\n function polygon(arcs) {\n arcs.forEach(line);\n }\n\n function geometry(o) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n }\n\n if (arguments.length > 1) {\n var geomsByArc = [],\n geom;\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n };\n\n geometry(o);\n\n geomsByArc.forEach(arguments.length < 3\n ? function(geoms) { arcs.push(geoms[0].i); }\n : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n } else {\n for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n }\n\n return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n }\n\n function triangle(triangle) {\n var a = triangle[0], b = triangle[1], c = triangle[2];\n return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n }\n\n function ring(ring) {\n var i = -1,\n n = ring.length,\n a,\n b = ring[n - 1],\n area = 0;\n\n while (++i < n) {\n a = b;\n b = ring[i];\n area += a[0] * b[1] - a[1] * b[0];\n }\n\n return area / 2;\n }\n\n function merge(topology) {\n return object(topology, mergeArcs.apply(this, arguments));\n }\n\n function mergeArcs(topology, objects) {\n var polygonsByArc = {},\n polygons = [],\n components = [];\n\n objects.forEach(function(o) {\n if (o.type === \"Polygon\") register(o.arcs);\n else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n });\n\n function register(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n });\n });\n polygons.push(polygon);\n }\n\n function exterior(ring$$) {\n return ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]) > 0; // TODO allow spherical?\n }\n\n polygons.forEach(function(polygon) {\n if (!polygon._) {\n var component = [],\n neighbors = [polygon];\n polygon._ = 1;\n components.push(component);\n while (polygon = neighbors.pop()) {\n component.push(polygon);\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n if (!polygon._) {\n polygon._ = 1;\n neighbors.push(polygon);\n }\n });\n });\n });\n }\n }\n });\n\n polygons.forEach(function(polygon) {\n delete polygon._;\n });\n\n return {\n type: \"MultiPolygon\",\n arcs: components.map(function(polygons) {\n var arcs = [], n;\n\n // Extract the exterior (unique) arcs.\n polygons.forEach(function(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n arcs.push(arc);\n }\n });\n });\n });\n\n // Stitch the arcs into one or more rings.\n arcs = stitchArcs(topology, arcs);\n\n // If more than one ring is returned,\n // at most one of these rings can be the exterior;\n // this exterior ring has the same winding order\n // as any exterior ring in the original polygons.\n if ((n = arcs.length) > 1) {\n var sgn = exterior(polygons[0][0]);\n for (var i = 0, t; i < n; ++i) {\n if (sgn === exterior(arcs[i])) {\n t = arcs[0], arcs[0] = arcs[i], arcs[i] = t;\n break;\n }\n }\n }\n\n return arcs;\n })\n };\n }\n\n function neighbors(objects) {\n var indexesByArc = {}, // arc index -> array of object indexes\n neighbors = objects.map(function() { return []; });\n\n function line(arcs, i) {\n arcs.forEach(function(a) {\n if (a < 0) a = ~a;\n var o = indexesByArc[a];\n if (o) o.push(i);\n else indexesByArc[a] = [i];\n });\n }\n\n function polygon(arcs, i) {\n arcs.forEach(function(arc) { line(arc, i); });\n }\n\n function geometry(o, i) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n }\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n };\n\n objects.forEach(geometry);\n\n for (var i in indexesByArc) {\n for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n for (var k = j + 1; k < m; ++k) {\n var ij = indexes[j], ik = indexes[k], n;\n if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n }\n }\n }\n\n return neighbors;\n }\n\n function compareArea(a, b) {\n return a[1][2] - b[1][2];\n }\n\n function minAreaHeap() {\n var heap = {},\n array = [],\n size = 0;\n\n heap.push = function(object) {\n up(array[object._ = size] = object, size++);\n return size;\n };\n\n heap.pop = function() {\n if (size <= 0) return;\n var removed = array[0], object;\n if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n return removed;\n };\n\n heap.remove = function(removed) {\n var i = removed._, object;\n if (array[i] !== removed) return; // invalid request\n if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n return i;\n };\n\n function up(object, i) {\n while (i > 0) {\n var j = ((i + 1) >> 1) - 1,\n parent = array[j];\n if (compareArea(object, parent) >= 0) break;\n array[parent._ = i] = parent;\n array[object._ = i = j] = object;\n }\n }\n\n function down(object, i) {\n while (true) {\n var r = (i + 1) << 1,\n l = r - 1,\n j = i,\n child = array[j];\n if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n if (j === i) break;\n array[child._ = i] = child;\n array[object._ = i = j] = object;\n }\n }\n\n return heap;\n }\n\n function presimplify(topology, triangleArea) {\n var absolute$$ = absolute(topology.transform),\n relative$$ = relative(topology.transform),\n heap = minAreaHeap();\n\n if (!triangleArea) triangleArea = triangle;\n\n topology.arcs.forEach(function(arc) {\n var triangles = [],\n maxArea = 0,\n triangle,\n i,\n n,\n p;\n\n // To store each point’s effective area, we create a new array rather than\n // extending the passed-in point to workaround a Chrome/V8 bug (getting\n // stuck in smi mode). For midpoints, the initial effective area of\n // Infinity will be computed in the next step.\n for (i = 0, n = arc.length; i < n; ++i) {\n p = arc[i];\n absolute$$(arc[i] = [p[0], p[1], Infinity], i);\n }\n\n for (i = 1, n = arc.length - 1; i < n; ++i) {\n triangle = arc.slice(i - 1, i + 2);\n triangle[1][2] = triangleArea(triangle);\n triangles.push(triangle);\n heap.push(triangle);\n }\n\n for (i = 0, n = triangles.length; i < n; ++i) {\n triangle = triangles[i];\n triangle.previous = triangles[i - 1];\n triangle.next = triangles[i + 1];\n }\n\n while (triangle = heap.pop()) {\n var previous = triangle.previous,\n next = triangle.next;\n\n // If the area of the current point is less than that of the previous point\n // to be eliminated, use the latter's area instead. This ensures that the\n // current point cannot be eliminated without eliminating previously-\n // eliminated points.\n if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n else maxArea = triangle[1][2];\n\n if (previous) {\n previous.next = next;\n previous[2] = triangle[2];\n update(previous);\n }\n\n if (next) {\n next.previous = previous;\n next[0] = triangle[0];\n update(next);\n }\n }\n\n arc.forEach(relative$$);\n });\n\n function update(triangle) {\n heap.remove(triangle);\n triangle[1][2] = triangleArea(triangle);\n heap.push(triangle);\n }\n\n return topology;\n }\n\n var version = \"1.6.24\";\n\n exports.version = version;\n exports.mesh = mesh;\n exports.meshArcs = meshArcs;\n exports.merge = merge;\n exports.mergeArcs = mergeArcs;\n exports.feature = feature;\n exports.neighbors = neighbors;\n exports.presimplify = presimplify;\n\n}));\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/topojson/build/topojson.js\n ** module id = 54\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode) return triangles;\n\n var minX, minY, maxX, maxY, x, y, size;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and size are later used to transform coords into integers for z-order calculation\n size = Math.max(maxX - minX, maxY - minY);\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var sum = 0,\n i, j, last;\n\n // calculate original winding order of a polygon ring\n for (i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n\n // link points into circular doubly-linked list in the specified winding order\n if (clockwise === (sum > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) return null;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && size) indexCurve(ear, minX, minY, size);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim);\n triangles.push(ear.i / dim);\n triangles.push(next.i / dim);\n\n removeNode(ear);\n\n // skipping the next vertice leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(ear, triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, size);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n\n while (p !== ear.prev) {\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, size) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, size),\n maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\n // first look for points inside the triangle in increasing z-order\n var p = ear.nextZ;\n\n while (p && p.z <= maxZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.nextZ;\n }\n\n // then look for points in decreasing z-order\n p = ear.prevZ;\n\n while (p && p.z >= minZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])\n if (intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim);\n triangles.push(p.i / dim);\n triangles.push(b.i / dim);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return p;\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, size);\n earcutLinked(c, triangles, dim, minX, minY, size);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n filterPoints(b, b.next);\n }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n if (hole.x === m.x) return m.prev; // hole touches outer segment; pick lower endpoint\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n tanMin = Infinity,\n tan;\n\n p = m.next;\n\n while (p !== stop) {\n if (hx >= p.x && p.x >= m.x &&\n pointInTriangle(hy < m.y ? hx : qx, hy, m.x, m.y, hy < m.y ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n }\n\n return m;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, size) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize === 0) {\n e = q;\n q = q.nextZ;\n qSize--;\n } else if (qSize === 0 || !q) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else if (p.z <= q.z) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and size of the data bounding box\nfunction zOrder(x, y, minX, minY, size) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) / size;\n y = 32767 * (y - minY) / size;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return equals(a, b) || a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertice index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertice nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = null;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/earcut/src/earcut.js\n ** module id = 55\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","vizicities.min.js","webpack:/webpack/bootstrap adeb8da861902db1c4c6","webpack:///src/vizicities.js","webpack:///src/World.js","webpack:///~/eventemitter3/index.js","webpack:///~/lodash.assign/index.js","webpack:///~/lodash.keys/index.js","webpack:///~/lodash.rest/index.js","webpack:///src/geo/CRS/index.js","webpack:///src/geo/CRS/CRS.EPSG3857.js","webpack:///src/geo/CRS/CRS.Earth.js","webpack:///src/geo/CRS/CRS.js","webpack:///src/geo/LatLon.js","webpack:///src/geo/Point.js","webpack:///src/util/wrapNum.js","webpack:///src/geo/projection/Projection.SphericalMercator.js","webpack:///src/util/Transformation.js","webpack:///src/geo/CRS/CRS.EPSG3395.js","webpack:///src/geo/projection/Projection.Mercator.js","webpack:///src/geo/CRS/CRS.EPSG4326.js","webpack:///src/geo/projection/Projection.LatLon.js","webpack:///src/geo/CRS/CRS.Simple.js","webpack:///src/geo/CRS/CRS.Proj4.js","webpack:///src/geo/projection/Projection.Proj4.js","webpack:/external \"proj4\"","webpack:///src/engine/Engine.js","webpack:/external \"THREE\"","webpack:///src/engine/Scene.js","webpack:///src/engine/Renderer.js","webpack:///src/engine/Camera.js","webpack:///src/controls/index.js","webpack:///src/controls/Controls.Orbit.js","webpack:///src/vendor/OrbitControls.js","webpack:///src/layer/environment/EnvironmentLayer.js","webpack:///src/layer/Layer.js","webpack:///src/layer/tile/ImageTileLayer.js","webpack:///src/layer/tile/TileLayer.js","webpack:///src/layer/tile/TileCache.js","webpack:///~/lru-cache/lib/lru-cache.js","webpack:///~/pseudomap/map.js","webpack:///~/process/browser.js","webpack:///~/pseudomap/pseudomap.js","webpack:///~/util/util.js","webpack:///~/util/support/isBufferBrowser.js","webpack:///~/inherits/inherits_browser.js","webpack:///~/yallist/yallist.js","webpack:///src/layer/tile/ImageTile.js","webpack:///src/layer/tile/Tile.js","webpack:///src/vendor/BoxHelper.js","webpack:///src/layer/tile/ImageTileLayerBaseMaterial.js","webpack:///~/lodash.throttle/index.js","webpack:///~/lodash.throttle/~/lodash.debounce/index.js","webpack:///src/layer/tile/TopoJSONTileLayer.js","webpack:///src/layer/tile/TopoJSONTile.js","webpack:///~/reqwest/reqwest.js","webpack:///~/topojson/build/topojson.js","webpack:///~/earcut/src/earcut.js","webpack:///src/util/extrudePolygon.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_22__","__WEBPACK_EXTERNAL_MODULE_24__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_World","_World2","_controlsIndex","_controlsIndex2","_layerEnvironmentEnvironmentLayer","_layerEnvironmentEnvironmentLayer2","_layerTileImageTileLayer","_layerTileImageTileLayer2","_layerTileTopoJSONTileLayer","_layerTileTopoJSONTileLayer2","_geoPoint","_geoPoint2","_geoLatLon","_geoLatLon2","VIZI","version","World","Controls","EnvironmentLayer","ImageTileLayer","TopoJSONTileLayer","Point","LatLon","_classCallCheck","instance","Constructor","TypeError","_inherits","subClass","superClass","prototype","create","constructor","enumerable","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","i","length","descriptor","key","protoProps","staticProps","_get","_x","_x2","_x3","_again","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","getter","get","parent","getPrototypeOf","_eventemitter3","_eventemitter32","_lodashAssign","_lodashAssign2","_geoCRSIndex","_geoCRSIndex2","_engineEngine","_engineEngine2","_EventEmitter","domId","options","defaults","crs","EPSG3857","_layers","_controls","_initContainer","_initEngine","_initEvents","_update","_container","document","getElementById","_engine","on","_onControlsMoveEnd","point","_point","x","z","_resetView","pointToLatLon","latlon","emit","_moveStart","_move","_moveEnd","_lastPosition","delta","clock","getDelta","window","requestAnimationFrame","bind","forEach","controls","update","_originLatlon","_originPoint","project","latLonToPoint","projectedPoint","_subtract","add","unproject","_camera","layer","_addToWorld","push","_scene","_layer","layerIndex","indexOf","splice","remove","destroy","EE","fn","context","once","EventEmitter","prefix","_events","listeners","event","exists","evt","available","l","ee","Array","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","listener","events","removeAllListeners","off","addListener","setMaxListeners","prefixed","isIndex","reIsUint","test","MAX_SAFE_INTEGER","assignValue","objValue","eq","objectProto","hasOwnProperty","baseProperty","copyObject","source","copyObjectWith","customizer","index","newValue","createAssigner","assigner","rest","sources","guard","isIterateeCall","isObject","type","isArrayLike","other","isFunction","isLength","getLength","tag","objectToString","funcTag","genTag","keys","toString","assign","baseTimes","n","iteratee","result","baseHas","baseKeys","nativeKeys","indexKeys","isArray","isString","isArguments","String","isPrototype","Ctor","proto","isArrayLikeObject","propertyIsEnumerable","argsTag","isObjectLike","stringTag","isProto","indexes","skipIndexes","func","thisArg","start","FUNC_ERROR_TEXT","nativeMax","toInteger","array","otherArgs","toNumber","INFINITY","sign","MAX_INTEGER","remainder","valueOf","replace","reTrim","isBinary","reIsBinary","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","parseInt","Math","max","_CRSEPSG3857","_CRSEPSG38572","_CRSEPSG3395","_CRSEPSG33952","_CRSEPSG4326","_CRSEPSG43262","_CRSSimple","_CRSSimple2","_CRSProj4","_CRSProj42","CRS","EPSG900913","EPSG3395","EPSG4326","Simple","Proj4","_CRSEarth","_CRSEarth2","_projectionProjectionSphericalMercator","_projectionProjectionSphericalMercator2","_utilTransformation","_utilTransformation2","_EPSG3857","code","projection","transformScale","PI","R","transformation","scale","_CRS","_CRS2","_LatLon","Earth","wrapLon","distance","latlon1","latlon2","accurate","lat1","lat2","a","rad","lat","lon1","lon","lon2","deltaLat","deltaLon","halfDeltaLat","halfDeltaLon","sin","cos","atan2","sqrt","acos","min","pointScale","metresToProjected","metres","projectedToMetres","projectedUnits","metresToWorld","zoom","projectedMetres","scaledMetres","worldToMetres","worldUnits","realMetres","_LatLon2","_Point","_Point2","_utilWrapNum","_utilWrapNum2","scaleFactor","_transform","untransformedPoint","untransform","pow","log","LN2","getProjectedBounds","infinite","b","bounds","s","transform","wrapLatLon","wrapLat","alt","isNaN","Error","lng","y","round","clone","_add","wrapNum","range","includeMax","d","SphericalMercator","MAX_LATITUDE","ECC","ECC2","atan","exp","k","sinLat","sinLat2","cosLat","v","h","Transformation","_a","_b","_c","_d","_projectionProjectionMercator","_projectionProjectionMercator2","_EPSG3395","Mercator","R_MINOR","r","tmp","e","con","ts","tan","phi","dphi","abs","_projectionProjectionLatLon","_projectionProjectionLatLon2","_EPSG4326","ProjectionLatLon","m1","m2","m3","m4","p1","p2","p3","latlen","lonlen","_Simple","dx","dy","_projectionProjectionProj4","_projectionProjectionProj42","_Proj4","def","diffX","diffY","halfX","halfY","scaleX","scaleY","offsetX","offsetY","_proj4","_proj42","proj","forward","inverse","bottomLeft","topRight","_three","_three2","_Scene","_Scene2","_Renderer","_Renderer2","_Camera","_Camera2","Engine","container","console","_renderer","Clock","_frustum","Frustum","render","scene","Scene","fog","Fog","renderer","WebGLRenderer","antialias","setClearColor","color","gammaInput","gammaOutput","appendChild","domElement","updateSize","setSize","clientWidth","clientHeight","addEventListener","camera","PerspectiveCamera","position","aspect","updateProjectionMatrix","_ControlsOrbit","_ControlsOrbit2","Orbit","_vendorOrbitControls","_vendorOrbitControls2","_this","_world","animate","pointDelta","metresDelta","angle","angleDelta","noZoom","world","addControls","maxPolarAngle","OrbitControls","getAutoRotationAngle","scope","autoRotateSpeed","getZoomScale","zoomSpeed","rotateLeft","thetaDelta","rotateUp","phiDelta","dollyIn","dollyScale","OrthographicCamera","minZoom","maxZoom","zoomChanged","warn","enableZoom","dollyOut","handleMouseDownRotate","rotateStart","set","clientX","clientY","handleMouseDownDolly","dollyStart","handleMouseDownPan","panStart","handleMouseMoveRotate","rotateEnd","rotateDelta","subVectors","element","body","rotateSpeed","copy","handleMouseMoveDolly","dollyEnd","dollyDelta","handleMouseMovePan","panEnd","panDelta","pan","handleMouseUp","handleMouseWheel","wheelDelta","detail","handleKeyDown","keyCode","UP","keyPanSpeed","BOTTOM","LEFT","RIGHT","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","handleTouchEnd","onMouseDown","enabled","preventDefault","button","mouseButtons","ORBIT","enableRotate","state","STATE","ROTATE","ZOOM","DOLLY","PAN","enablePan","NONE","onMouseMove","onMouseUp","dispatchEvent","startEvent","removeEventListener","endEvent","onMouseWheel","stopPropagation","onKeyDown","enableKeys","onTouchStart","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","onTouchMove","onTouchEnd","onContextMenu","Vector3","minDistance","maxDistance","Infinity","minPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","autoRotate","MOUSE","MIDDLE","target0","position0","zoom0","getPolarAngle","getAzimuthalAngle","theta","reset","changeEvent","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","sub","applyQuaternion","EPS","radius","panOffset","lookAt","distanceToSquared","dot","quaternion","dispose","Vector2","panLeft","objectMatrix","te","elements","multiplyScalar","panUp","adjDist","deltaX","deltaY","targetDistance","fov","matrix","right","left","top","bottom","EventDispatcher","center","noRotate","noPan","noKeys","staticMoving","constraint","dynamicDampingFactor","_Layer2","_Layer3","_Layer","_initLights","directionalLight","DirectionalLight","intesity","directionalLight2","helper","DirectionalLightHelper","helper2","size","step","gridHelper","GridHelper","_engineScene","Layer","Object3D","addLayer","_onAdd","_TileLayer2","_TileLayer3","_ImageTile","_ImageTile2","_ImageTileLayerBaseMaterial","_ImageTileLayerBaseMaterial2","_lodashThrottle","_lodashThrottle2","_TileLayer","path","_path","geom","PlaneBufferGeometry","mesh","Mesh","rotation","_baseLayer","setTimeout","_calculateLOD","_throttledWorldUpdate","_onWorldUpdate","_onWorldMove","_moveBaseLayer","quadcode","geometry","material","map","_TileCache","_TileCache2","TileLayer","maxCache","maxLOD","_options","_tileCache","tile","_destroyTile","_minLOD","_maxLOD","_tiles","getCamera","projScreenMatrix","Matrix4","multiplyMatrices","projectionMatrix","matrixWorldInverse","setFromMatrix","getBounds","intersectsBox","Box3","_this2","_stop","_updateFrustum","checkList","_checklist","_requestTile","_divide","_removeTiles","_tileInFrustum","getCenter","dist","getMesh","isReady","requestTileAsync","currentItem","count","getQuadcode","_screenSpaceError","minDepth","maxDepth","quality","error","getSide","children","getTile","_createTile","setTile","_lruCache","_lruCache2","TileCache","cacheLimit","onDestroyTile","_cache","priv","val","sym","symbols","makeSymbol","naiveLength","LRUCache","lc","stale","maxAge","forEachStep","self","node","thisp","hit","isStale","del","doUse","unshiftNode","diff","Date","now","trim","walker","tail","prev","removeNode","Entry","Map","util","Yallist","hasSymbol","Symbol","mL","allowStale","mA","lC","rforEach","head","next","toArray","values","dump","filter","dumpLru","inspect","opts","str","extras","as","didFirst","item","split","join","has","unshift","peek","pop","load","arr","expiresAt","prune","process","env","npm_package_name","npm_lifecycle_script","TEST_PSEUDOMAP","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","run","clearTimeout","Item","fun","noop","nextTick","title","browser","argv","versions","binding","name","cwd","chdir","dir","umask","PseudoMap","clear","kv","same","_index","find","data","_data","res","entries","global","ctx","seen","stylize","stylizeNoColor","depth","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","style","styles","arrayToHash","hash","idx","recurseTimes","ret","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","RegExp","isDate","base","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","isNumber","isNull","match","line","substr","numLinesEst","reduce","cur","ar","arg","isNullOrUndefined","isSymbol","re","isPrimitive","o","pad","timestamp","time","getHours","getMinutes","getSeconds","getDate","months","getMonth","prop","formatRegExp","format","f","objects","Number","_","deprecate","msg","deprecated","warned","throwDeprecation","traceDeprecation","trace","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","toUpperCase","pid","bold","italic","underline","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","regexp","isBuffer","inherits","origin","fill","readUInt8","ctor","superCtor","super_","TempCtor","list","Node","pushNode","shift","forEachReverse","getReverse","mapReverse","initial","acc","reduceReverse","toArrayReverse","from","to","sliceReverse","reverse","_Tile2","_Tile3","_vendorBoxHelper","ImageTile","_Tile","_mesh","_createMesh","_abortRequest","_image","_center","_side","MeshBasicMaterial","depthWrite","localMesh","renderOrder","canvas","createElement","width","height","getContext","font","fillStyle","fillText","_quadcode","_tile","texture","Texture","magFilter","LinearFilter","minFilter","LinearMipMapLinearFilter","anisotropy","needsUpdate","transparent","urlParams","url","_getTileURL","image","_texture","_ready","crossOrigin","src","r2d","tileURLRegex","Tile","_quadcodeToTile","_boundsLatLon","_tileBoundsWGS84","_boundsWorld","_tileBoundsFromWGS84","_boundsToCenter","_getSide","child","fromCharCode","floor","random","lastIndex","mask","q","boundsWGS84","sw","ne","_tile2lon","w","_tile2lat","BoxHelper","indices","Uint16Array","positions","Float32Array","BufferGeometry","setIndex","BufferAttribute","addAttribute","LineSegments","LineBasicMaterial","linewidth","box","setFromObject","isEmpty","attributes","computeBoundingSphere","colour","fillRect","throttle","wait","leading","trailing","debounce","maxWait","cancel","timeoutId","maxTimeoutId","lastCalled","trailingCall","complete","isCalled","delayed","remaining","stamp","flush","maxDelayed","debounced","leadingCall","_TopoJSONTile","_TopoJSONTile2","_reqwest","_reqwest2","_topojson","_topojson2","_earcut","_earcut2","_utilExtrudePolygon","_utilExtrudePolygon2","TopoJSONTile","_request","then","_processTileData","err","_this3","geojson","feature","vectile","earcutData","faces","allVertices","allFaces","allColours","facesCount","Color","features","coordinates","ring","coordinate","_toEarcut","_triangulate","vertices","holes","dimensions","groupedVertices","il","extruded","g","_faces","_vertices","_colour","normals","colours","pA","pB","pC","cb","ab","ax","ay","az","bx","by","bz","cx","cy","cz","cross","normalize","nx","ny","nz","computeBoundingBox","MeshPhongMaterial","vertexColors","VertexColors","side","BackSide","timeEnd","dim","holeIndex","contour","abort","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","definition","succeed","protocol","protocolRe","exec","location","httpsRe","twoHundo","request","status","response","handleReadyState","success","_aborted","_timedOut","readyState","onreadystatechange","setHeaders","http","headers","defaultHeaders","isAFormData","FormData","requestedWith","contentType","setRequestHeader","setCredentials","withCredentials","generalCallback","lastValue","urlappend","handleJsonp","reqId","uniqid","cbkey","cbval","reqwest","getcallbackPrefix","cbreg","script","doc","isIE10","navigator","userAgent","async","htmlFor","onload","onclick","removeChild","getRequest","method","toQueryString","sendWait","xhr","open","xDomainRequest","onerror","onprogress","send","Reqwest","init","setType","header","resp","_completeHandlers","getResponseHeader","filteredResponse","globalSetupOptions","dataFilter","responseText","parse","eval","responseXML","parseError","errorCode","reason","_responseArgs","_fulfilled","_successHandler","_fulfillmentHandlers","timedOut","t","_erred","_errorHandlers","serial","el","ch","ra","tagName","toLowerCase","optCb","disabled","checked","selectedIndex","selected","eachFormElement","serializeSubtags","tags","fa","byTag","serializeQueryString","serializeArray","serializeHash","buildParams","traditional","rbracket","XHR2","ex","callbackPrefix","xmlHttpRequest","accept","*","xml","html","text","json","js","XMLHttpRequest","XDomainRequest","ActiveXObject","retry","fail","always","catch","serialize","opt","nodeType","trad","enc","encodeURIComponent","compat","ajaxSetup","absolute","x0","y0","kx","ky","translate","relative","x1","y1","bisect","lo","hi","mid","topology","geometries","feature$1","properties","arc","points","arcs","absolute$$","polygon","geometryType","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","stitchArcs","ends","p0","dp","fragmentByEnd","fragmentByStart","end","stitchedArcs","fragments","emptyIndex","fg","gf","meshArcs","geomsByArc","geoms","triangle","area","merge","mergeArcs","register","ring$$","polygonsByArc","polygons","exterior","components","component","neighbors","sgn","indexesByArc","ij","ik","compareArea","minAreaHeap","down","heap","removed","presimplify","triangleArea","relative$$","triangles","maxArea","previous","earcut","holeIndices","hasHoles","outerLen","outerNode","linkedList","minX","minY","maxX","maxY","eliminateHoles","earcutLinked","clockwise","last","sum","insertNode","filterPoints","again","steiner","equals","ear","pass","indexCurve","stop","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","zOrder","maxZ","nextZ","prevZ","intersects","locallyInside","isValidDiagonal","splitPolygon","getLeftmost","sort","compareX","eliminateHole","hole","findHoleBridge","hx","hy","qx","tanMin","sortLinked","numMerges","pSize","qSize","inSize","leftmost","px","py","intersectsPolygon","middleInside","q1","q2","inside","b2","an","bp","extrudePolygon","flat","cells","full","closed"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,EAAAG,QAAA,SAAAA,QAAA,UACA,kBAAAC,SAAAA,OAAAC,IACAD,QAAA,QAAA,SAAAJ,GACA,gBAAAC,SACAA,QAAA,KAAAD,EAAAG,QAAA,SAAAA,QAAA,UAEAJ,EAAA,KAAAC,EAAAD,EAAA,MAAAA,EAAA,QACCO,KAAA,SAAAC,+BAAAC,gCACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAV,OAGA,IAAAC,GAAAU,EAAAD,IACAV,WACAY,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAb,EAAAD,QAAAC,EAAAA,EAAAD,QAAAS,GAGAR,EAAAY,QAAA,EAGAZ,EAAAD,QAvBA,GAAAW,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAASR,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIC,GAAShB,EE9DI,GFgEbiB,EAAUR,EAAuBO,GAEjCE,EAAiBlB,EEjED,IFmEhBmB,EAAkBV,EAAuBS,GAEzCE,EAAoCpB,EEpEZ,IFsExBqB,EAAqCZ,EAAuBW,GAE5DE,EAA2BtB,EEvEL,IFyEtBuB,EAA4Bd,EAAuBa,GAEnDE,EAA8BxB,EE1EL,IF4EzByB,EAA+BhB,EAAuBe,GAEtDE,EAAY1B,EE7EC,IF+Eb2B,EAAalB,EAAuBiB,GAEpCE,EAAa5B,EEhFC,IFkFd6B,EAAcpB,EAAuBmB,GEhFpCE,GACJC,QAAS,MAGTC,MAAKf,EAAA,WACLgB,SAAQd,EAAA,WACRe,iBAAgBb,EAAA,WAChBc,eAAcZ,EAAA,WACda,kBAAiBX,EAAA,WACjBY,MAAKV,EAAA,WACLW,OAAMT,EAAA,WFqFPtC,GAAQ,WElFMuC,EFmFdtC,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxcK,EAAiBhF,EG5HG,GH8HpBiF,EAAkBxE,EAAuBuE,GAEzCE,EAAgBlF,EG/HF,GHiIdmF,EAAiB1E,EAAuByE,GAExCE,EAAepF,EGlIJ,GHoIXqF,EAAgB5E,EAAuB2E,GAEvC1D,EAAY1B,EGrIC,IHuIb2B,EAAalB,EAAuBiB,GAEpCE,EAAa5B,EGxIC,IH0Id6B,EAAcpB,EAAuBmB,GAErC0D,EAAgBtF,EG3IF,IH6IduF,EAAiB9E,EAAuB6E,GGxIvCtD,EAAK,SAAAwD,GACE,QADPxD,GACQyD,EAAOC,GHgJhBnD,EAAgB3C,KGjJfoC,GAEFgC,EAAAnD,OAAAkE,eAFE/C,EAAKc,WAAA,cAAAlD,MAAAS,KAAAT,KAIP,IAAI+F,IACFC,IAAKP,EAAA,WAAIQ,SAGXjG,MAAK8F,SAAU,EAAAP,EAAA,YAAOQ,EAAUD,GAEhC9F,KAAKkG,WACLlG,KAAKmG,aAELnG,KAAKoG,eAAeP,GACpB7F,KAAKqG,cACLrG,KAAKsG,cAGLtG,KAAKuG,UH8VN,MAlOAxD,GG9IGX,EAAKwD,GHwKRlC,EGxKGtB,IHyKD6B,IAAK,iBACL9C,MGrJW,SAAC0E,GACb7F,KAAKwG,WAAaC,SAASC,eAAeb,MHwJzC5B,IAAK,cACL9C,MGtJQ,WACTnB,KAAK2G,SAAU,EAAAhB,EAAA,YAAO3F,KAAKwG,eH+J1BvC,IAAK,cACL9C,MGvJQ,WACTnB,KAAK4G,GAAG,kBAAmB5G,KAAK6G,uBH0J/B5C,IAAK,qBACL9C,MGxJe,SAAC2F,GACjB,GAAIC,IAAS,EAAAhF,EAAA,YAAM+E,EAAME,EAAGF,EAAMG,EAClCjH,MAAKkH,WAAWlH,KAAKmH,cAAcJ,GAASA,MH6J3C9C,IAAK,aACL9C,MG1JO,SAACiG,EAAQN,GACjB9G,KAAKqH,KAAK,gBAEVrH,KAAKsH,aACLtH,KAAKuH,MAAMH,EAAQN,GACnB9G,KAAKwH,WAELxH,KAAKqH,KAAK,oBH6JTpD,IAAK,aACL9C,MG3JO,WACRnB,KAAKqH,KAAK,gBH8JTpD,IAAK,QACL9C,MG5JE,SAACiG,EAAQN,GACZ9G,KAAKyH,cAAgBL,EACrBpH,KAAKqH,KAAK,OAAQD,EAAQN,MH+JzB7C,IAAK,WACL9C,MG9JK,WACNnB,KAAKqH,KAAK,cHiKTpD,IAAK,UACL9C,MG/JI,WACL,GAAIuG,GAAQ1H,KAAK2G,QAAQgB,MAAMC,UAG/BC,QAAOC,sBAAsB9H,KAAKuG,QAAQwB,KAAK/H,OAG/CA,KAAKmG,UAAU6B,QAAQ,SAAAC,GACrBA,EAASC,WAGXlI,KAAKqH,KAAK,aACVrH,KAAK2G,QAAQuB,OAAOR,GACpB1H,KAAKqH,KAAK,iBHoKTpD,IAAK,UACL9C,MGjKI,SAACiG,GAaN,MAJApH,MAAKmI,cAAgBf,EACrBpH,KAAKoI,aAAepI,KAAKqI,QAAQjB,GAEjCpH,KAAKkH,WAAWE,GACTpH,QHsKNiE,IAAK,cACL9C,MGnKQ,WACT,MAAOnB,MAAKyH,iBH6KXxD,IAAK,UACL9C,MGrKI,SAACiG,GACN,MAAOpH,MAAK8F,QAAQE,IAAIsC,eAAc,EAAArG,EAAA,YAAOmF,OH+K5CnD,IAAK,YACL9C,MGvKM,SAAC2F,GACR,MAAO9G,MAAK8F,QAAQE,IAAImB,eAAc,EAAApF,EAAA,YAAM+E,OH+K3C7C,IAAK,gBACL9C,MGzKU,SAACiG,GACZ,GAAImB,GAAiBvI,KAAKqI,SAAQ,EAAApG,EAAA,YAAOmF,GACzC,OAAOmB,GAAeC,UAAUxI,KAAKoI,iBHiLpCnE,IAAK,gBACL9C,MG3KU,SAAC2F,GACZ,GAAIyB,IAAiB,EAAAxG,EAAA,YAAM+E,GAAO2B,IAAIzI,KAAKoI,aAC3C,OAAOpI,MAAK0I,UAAUH,MHiLrBtE,IAAK,YACL9C,MG7KM,WACP,MAAOnB,MAAK2G,QAAQgC,WHgLnB1E,IAAK,WACL9C,MG9KK,SAACyH,GASP,MARAA,GAAMC,YAAY7I,MAElBA,KAAKkG,QAAQ4C,KAAKF,GAGlB5I,KAAK2G,QAAQoC,OAAON,IAAIG,EAAMI,QAE9BhJ,KAAKqH,KAAK,aAAcuB,GACjB5I,QHmLNiE,IAAK,cACL9C,MGhLQ,SAACyH,GACV,GAAIK,GAAajJ,KAAKkG,QAAQgD,QAAQN,EAYtC,OAVIK,GAAa,IAEfjJ,KAAKkG,QAAQiD,OAAOF,EAAY,GAGlCjJ,KAAK2G,QAAQoC,OAAOK,OAAOR,EAAMI,QAEjCJ,EAAMS,UAENrJ,KAAKqH,KAAK,gBACHrH,QHmLNiE,IAAK,cACL9C,MGjLQ,SAAC8G,GAMV,MALAA,GAASY,YAAY7I,MAErBA,KAAKmG,UAAU2C,KAAKb,GAEpBjI,KAAKqH,KAAK,gBAAiBY,GACpBjI,QHoLNiE,IAAK,iBACL9C,MGlLW,SAAC8G,QA3LX7F,GHiXFiD,EAAgB,WAEnB1F,GAAQ,WGpLM,SAASkG,EAAOC,GAC7B,MAAO,IAAI1D,GAAMyD,EAAOC,IHwLzBlG,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GItYhC,YAoBA,SAAAkJ,GAAAC,EAAAC,EAAAC,GACAzJ,KAAAuJ,GAAAA,EACAvJ,KAAAwJ,QAAAA,EACAxJ,KAAAyJ,KAAAA,IAAA,EAUA,QAAAC,MAvBA,GAAAC,GAAA,kBAAA1I,QAAAkC,OAAA,KAAA,CA+BAuG,GAAAxG,UAAA0G,QAAA7E,OAUA2E,EAAAxG,UAAA2G,UAAA,SAAAC,EAAAC,GACA,GAAAC,GAAAL,EAAAA,EAAAG,EAAAA,EACAG,EAAAjK,KAAA4J,SAAA5J,KAAA4J,QAAAI,EAEA,IAAAD,EAAA,QAAAE,CACA,KAAAA,EAAA,QACA,IAAAA,EAAAV,GAAA,OAAAU,EAAAV,GAEA,KAAA,GAAAzF,GAAA,EAAAoG,EAAAD,EAAAlG,OAAAoG,EAAA,GAAAC,OAAAF,GAA0DA,EAAApG,EAAOA,IACjEqG,EAAArG,GAAAmG,EAAAnG,GAAAyF,EAGA,OAAAY,IAUAT,EAAAxG,UAAAmE,KAAA,SAAAyC,EAAAO,EAAAC,EAAAC,EAAAC,EAAAC,GACA,GAAAT,GAAAL,EAAAA,EAAAG,EAAAA,CAEA,KAAA9J,KAAA4J,UAAA5J,KAAA4J,QAAAI,GAAA,OAAA,CAEA,IAEAU,GACA5G,EAHA+F,EAAA7J,KAAA4J,QAAAI,GACAW,EAAAC,UAAA7G,MAIA,IAAA,kBAAA8F,GAAAN,GAAA,CAGA,OAFAM,EAAAJ,MAAAzJ,KAAA6K,eAAAf,EAAAD,EAAAN,GAAAxE,QAAA,GAEA4F,GACA,IAAA,GAAA,MAAAd,GAAAN,GAAA9I,KAAAoJ,EAAAL,UAAA,CACA,KAAA,GAAA,MAAAK,GAAAN,GAAA9I,KAAAoJ,EAAAL,QAAAa,IAAA,CACA,KAAA,GAAA,MAAAR,GAAAN,GAAA9I,KAAAoJ,EAAAL,QAAAa,EAAAC,IAAA,CACA,KAAA,GAAA,MAAAT,GAAAN,GAAA9I,KAAAoJ,EAAAL,QAAAa,EAAAC,EAAAC,IAAA,CACA,KAAA,GAAA,MAAAV,GAAAN,GAAA9I,KAAAoJ,EAAAL,QAAAa,EAAAC,EAAAC,EAAAC,IAAA,CACA,KAAA,GAAA,MAAAX,GAAAN,GAAA9I,KAAAoJ,EAAAL,QAAAa,EAAAC,EAAAC,EAAAC,EAAAC,IAAA,EAGA,IAAA3G,EAAA,EAAA4G,EAAA,GAAAN,OAAAO,EAAA,GAAyCA,EAAA7G,EAASA,IAClD4G,EAAA5G,EAAA,GAAA8G,UAAA9G,EAGA+F,GAAAN,GAAAuB,MAAAjB,EAAAL,QAAAkB,OACG,CACH,GACAK,GADAhH,EAAA8F,EAAA9F,MAGA,KAAAD,EAAA,EAAeC,EAAAD,EAAYA,IAG3B,OAFA+F,EAAA/F,GAAA2F,MAAAzJ,KAAA6K,eAAAf,EAAAD,EAAA/F,GAAAyF,GAAAxE,QAAA,GAEA4F,GACA,IAAA,GAAAd,EAAA/F,GAAAyF,GAAA9I,KAAAoJ,EAAA/F,GAAA0F,QAA2D,MAC3D,KAAA,GAAAK,EAAA/F,GAAAyF,GAAA9I,KAAAoJ,EAAA/F,GAAA0F,QAAAa,EAA+D,MAC/D,KAAA,GAAAR,EAAA/F,GAAAyF,GAAA9I,KAAAoJ,EAAA/F,GAAA0F,QAAAa,EAAAC,EAAmE,MACnE,SACA,IAAAI,EAAA,IAAAK,EAAA,EAAAL,EAAA,GAAAN,OAAAO,EAAA,GAA0DA,EAAAI,EAASA,IACnEL,EAAAK,EAAA,GAAAH,UAAAG,EAGAlB,GAAA/F,GAAAyF,GAAAuB,MAAAjB,EAAA/F,GAAA0F,QAAAkB,IAKA,OAAA,GAWAhB,EAAAxG,UAAA0D,GAAA,SAAAkD,EAAAP,EAAAC,GACA,GAAAwB,GAAA,GAAA1B,GAAAC,EAAAC,GAAAxJ,MACAgK,EAAAL,EAAAA,EAAAG,EAAAA,CAWA,OATA9J,MAAA4J,UAAA5J,KAAA4J,QAAAD,KAA+C1I,OAAAkC,OAAA,OAC/CnD,KAAA4J,QAAAI,GAEAhK,KAAA4J,QAAAI,GAAAT,GACAvJ,KAAA4J,QAAAI,IACAhK,KAAA4J,QAAAI,GAAAgB,GAFAhL,KAAA4J,QAAAI,GAAAlB,KAAAkC,GAFAhL,KAAA4J,QAAAI,GAAAgB,EAQAhL,MAWA0J,EAAAxG,UAAAuG,KAAA,SAAAK,EAAAP,EAAAC,GACA,GAAAwB,GAAA,GAAA1B,GAAAC,EAAAC,GAAAxJ,MAAA,GACAgK,EAAAL,EAAAA,EAAAG,EAAAA,CAWA,OATA9J,MAAA4J,UAAA5J,KAAA4J,QAAAD,KAA+C1I,OAAAkC,OAAA,OAC/CnD,KAAA4J,QAAAI,GAEAhK,KAAA4J,QAAAI,GAAAT,GACAvJ,KAAA4J,QAAAI,IACAhK,KAAA4J,QAAAI,GAAAgB,GAFAhL,KAAA4J,QAAAI,GAAAlB,KAAAkC,GAFAhL,KAAA4J,QAAAI,GAAAgB,EAQAhL,MAYA0J,EAAAxG,UAAA2H,eAAA,SAAAf,EAAAP,EAAAC,EAAAC,GACA,GAAAO,GAAAL,EAAAA,EAAAG,EAAAA,CAEA,KAAA9J,KAAA4J,UAAA5J,KAAA4J,QAAAI,GAAA,MAAAhK,KAEA,IAAA6J,GAAA7J,KAAA4J,QAAAI,GACAiB,IAEA,IAAA1B,EACA,GAAAM,EAAAN,IAEAM,EAAAN,KAAAA,GACAE,IAAAI,EAAAJ,MACAD,GAAAK,EAAAL,UAAAA,IAEAyB,EAAAnC,KAAAe,OAGA,KAAA,GAAA/F,GAAA,EAAAC,EAAA8F,EAAA9F,OAAgDA,EAAAD,EAAYA,KAE5D+F,EAAA/F,GAAAyF,KAAAA,GACAE,IAAAI,EAAA/F,GAAA2F,MACAD,GAAAK,EAAA/F,GAAA0F,UAAAA,IAEAyB,EAAAnC,KAAAe,EAAA/F,GAeA,OANAmH,GAAAlH,OACA/D,KAAA4J,QAAAI,GAAA,IAAAiB,EAAAlH,OAAAkH,EAAA,GAAAA,QAEAjL,MAAA4J,QAAAI,GAGAhK,MASA0J,EAAAxG,UAAAgI,mBAAA,SAAApB,GACA,MAAA9J,MAAA4J,SAEAE,QAAA9J,MAAA4J,QAAAD,EAAAA,EAAAG,EAAAA,GACA9J,KAAA4J,QAAAD,KAAiC1I,OAAAkC,OAAA,MAEjCnD,MALAA,MAWA0J,EAAAxG,UAAAiI,IAAAzB,EAAAxG,UAAA2H,eACAnB,EAAAxG,UAAAkI,YAAA1B,EAAAxG,UAAA0D,GAKA8C,EAAAxG,UAAAmI,gBAAA,WACA,MAAArL,OAMA0J,EAAA4B,SAAA3B,EAMA/J,EAAAD,QAAA+J,GJ8YM,SAAS9J,EAAQD,EAASS,GKrnBhC,QAAAmL,GAAApK,EAAA4C,GAGA,MAFA5C,GAAA,gBAAAA,IAAAqK,EAAAC,KAAAtK,IAAAA,EAAA,GACA4C,EAAA,MAAAA,EAAA2H,EAAA3H,EACA5C,EAAA,IAAAA,EAAA,GAAA,GAAA4C,EAAA5C,EAyBA,QAAAwK,GAAAlH,EAAAR,EAAA9C,GACA,GAAAyK,GAAAnH,EAAAR,KACA4H,EAAAD,EAAAzK,IACA0K,EAAAD,EAAAE,EAAA7H,MAAA8H,EAAAtL,KAAAgE,EAAAR,IACAc,SAAA5D,KAAA8C,IAAAQ,OACAA,EAAAR,GAAA9C,GAWA,QAAA6K,GAAA/H,GACA,MAAA,UAAAQ,GACA,MAAA,OAAAA,EAAAM,OAAAN,EAAAR,IAaA,QAAAgI,GAAAC,EAAArI,EAAAY,GACA,MAAA0H,GAAAD,EAAArI,EAAAY,GAcA,QAAA0H,GAAAD,EAAArI,EAAAY,EAAA2H,GACA3H,IAAAA,KAKA,KAHA,GAAA4H,GAAA,GACAtI,EAAAF,EAAAE,SAEAsI,EAAAtI,GAAA,CACA,GAAAE,GAAAJ,EAAAwI,GACAC,EAAAF,EAAAA,EAAA3H,EAAAR,GAAAiI,EAAAjI,GAAAA,EAAAQ,EAAAyH,GAAAA,EAAAjI,EAEA0H,GAAAlH,EAAAR,EAAAqI,GAEA,MAAA7H,GAUA,QAAA8H,GAAAC,GACA,MAAAC,GAAA,SAAAhI,EAAAiI,GACA,GAAAL,GAAA,GACAtI,EAAA2I,EAAA3I,OACAqI,EAAArI,EAAA,EAAA2I,EAAA3I,EAAA,GAAAgB,OACA4H,EAAA5I,EAAA,EAAA2I,EAAA,GAAA3H,MAQA,KANAqH,EAAA,kBAAAA,IAAArI,IAAAqI,GAAArH,OACA4H,GAAAC,EAAAF,EAAA,GAAAA,EAAA,GAAAC,KACAP,EAAA,EAAArI,EAAAgB,OAAAqH,EACArI,EAAA,GAEAU,EAAAxD,OAAAwD,KACA4H,EAAAtI,GAAA,CACA,GAAAmI,GAAAQ,EAAAL,EACAH,IACAM,EAAA/H,EAAAyH,EAAAG,EAAAD,GAGA,MAAA3H,KAyBA,QAAAmI,GAAAzL,EAAAkL,EAAA5H,GACA,IAAAoI,EAAApI,GACA,OAAA,CAEA,IAAAqI,SAAAT,EACA,QAAA,UAAAS,EACAC,EAAAtI,IAAA8G,EAAAc,EAAA5H,EAAAV,QACA,UAAA+I,GAAAT,IAAA5H,IACAoH,EAAApH,EAAA4H,GAAAlL,IAEA,EAiCA,QAAA0K,GAAA1K,EAAA6L,GACA,MAAA7L,KAAA6L,GAAA7L,IAAAA,GAAA6L,IAAAA,EA4BA,QAAAD,GAAA5L,GACA,MAAA,OAAAA,KACA,kBAAAA,IAAA8L,EAAA9L,KAAA+L,EAAAC,EAAAhM,IAmBA,QAAA8L,GAAA9L,GAIA,GAAAiM,GAAAP,EAAA1L,GAAAkM,EAAA5M,KAAAU,GAAA,EACA,OAAAiM,IAAAE,GAAAF,GAAAG,EA2BA,QAAAL,GAAA/L,GACA,MAAA,gBAAAA,IAAAA,EAAA,IAAAA,EAAA,GAAA,GAAAuK,GAAAvK,EA0BA,QAAA0L,GAAA1L,GACA,GAAA2L,SAAA3L,EACA,SAAAA,IAAA,UAAA2L,GAAA,YAAAA,GA3TA,GAAAU,GAAApN,EAAA,GACAqM,EAAArM,EAAA,GAGAsL,EAAA,iBAGA4B,EAAA,oBACAC,EAAA,6BAGA/B,EAAA,mBAiBAM,EAAA7K,OAAAiC,UAGA6I,EAAAD,EAAAC,eAMAsB,EAAAvB,EAAA2B,SAiHAN,EAAAnB,EAAA,UAsMA0B,EAAAnB,EAAA,SAAA9H,EAAAyH,GACAD,EAAAC,EAAAsB,EAAAtB,GAAAzH,IAGA7E,GAAAD,QAAA+N,GLypBM,SAAS9N,EAAQD,GMn+BvB,QAAAgO,GAAAC,EAAAC,GAIA,IAHA,GAAAxB,GAAA,GACAyB,EAAA1D,MAAAwD,KAEAvB,EAAAuB,GACAE,EAAAzB,GAAAwB,EAAAxB,EAEA,OAAAyB,GAWA,QAAAvC,GAAApK,EAAA4C,GAGA,MAFA5C,GAAA,gBAAAA,IAAAqK,EAAAC,KAAAtK,IAAAA,EAAA,GACA4C,EAAA,MAAAA,EAAA2H,EAAA3H,EACA5C,EAAA,IAAAA,EAAA,GAAA,GAAA4C,EAAA5C,EA8BA,QAAA4M,GAAAtJ,EAAAR,GAIA,MAAA8H,GAAAtL,KAAAgE,EAAAR,IACA,gBAAAQ,IAAAR,IAAAQ,IAAA,OAAAU,EAAAV,GAYA,QAAAuJ,GAAAvJ,GACA,MAAAwJ,GAAAhN,OAAAwD,IAUA,QAAAuH,GAAA/H,GACA,MAAA,UAAAQ,GACA,MAAA,OAAAA,EAAAM,OAAAN,EAAAR,IAwBA,QAAAiK,GAAAzJ,GACA,GAAAV,GAAAU,EAAAA,EAAAV,OAAAgB,MACA,OAAAmI,GAAAnJ,KACAoK,EAAA1J,IAAA2J,EAAA3J,IAAA4J,EAAA5J,IACAkJ,EAAA5J,EAAAuK,QAEA,KAUA,QAAAC,GAAApN,GACA,GAAAqN,GAAArN,GAAAA,EAAAiC,YACAqL,EAAA,kBAAAD,IAAAA,EAAAtL,WAAA4I,CAEA,OAAA3K,KAAAsN,EAmBA,QAAAJ,GAAAlN,GAEA,MAAAuN,GAAAvN,IAAA4K,EAAAtL,KAAAU,EAAA,aACAwN,EAAAlO,KAAAU,EAAA,WAAAkM,EAAA5M,KAAAU,IAAAyN,GAqDA,QAAA7B,GAAA5L,GACA,MAAA,OAAAA,KACA,kBAAAA,IAAA8L,EAAA9L,KAAA+L,EAAAC,EAAAhM,IA2BA,QAAAuN,GAAAvN,GACA,MAAA0N,GAAA1N,IAAA4L,EAAA5L,GAmBA,QAAA8L,GAAA9L,GAIA,GAAAiM,GAAAP,EAAA1L,GAAAkM,EAAA5M,KAAAU,GAAA,EACA,OAAAiM,IAAAE,GAAAF,GAAAG,EA2BA,QAAAL,GAAA/L,GACA,MAAA,gBAAAA,IAAAA,EAAA,IAAAA,EAAA,GAAA,GAAAuK,GAAAvK,EA0BA,QAAA0L,GAAA1L,GACA,GAAA2L,SAAA3L,EACA,SAAAA,IAAA,UAAA2L,GAAA,YAAAA,GA0BA,QAAA+B,GAAA1N,GACA,QAAAA,GAAA,gBAAAA,GAmBA,QAAAiN,GAAAjN,GACA,MAAA,gBAAAA,KACAgN,EAAAhN,IAAA0N,EAAA1N,IAAAkM,EAAA5M,KAAAU,IAAA2N,EA8BA,QAAAtB,GAAA/I,GACA,GAAAsK,GAAAR,EAAA9J,EACA,KAAAsK,IAAAhC,EAAAtI,GACA,MAAAuJ,GAAAvJ,EAEA,IAAAuK,GAAAd,EAAAzJ,GACAwK,IAAAD,EACAlB,EAAAkB,MACAjL,EAAA+J,EAAA/J,MAEA,KAAA,GAAAE,KAAAQ,IACAsJ,EAAAtJ,EAAAR,IACAgL,IAAA,UAAAhL,GAAAsH,EAAAtH,EAAAF,KACAgL,GAAA,eAAA9K,GACA6J,EAAAhF,KAAA7E,EAGA,OAAA6J,GAzaA,GAAApC,GAAA,iBAGAkD,EAAA,qBACAtB,EAAA,oBACAC,EAAA,6BACAuB,EAAA,kBAGAtD,EAAA,mBAoCAM,EAAA7K,OAAAiC,UAGA6I,EAAAD,EAAAC,eAMAsB,EAAAvB,EAAA2B,SAGAtI,EAAAlE,OAAAkE,eACAwJ,EAAA7C,EAAA6C,qBAGAV,EAAAhN,OAAAuM,KAsDAL,EAAAnB,EAAA,UA8EAmC,EAAA/D,MAAA+D,OA2OAvO,GAAAD,QAAA6N,GNwgCM,SAAS5N,EAAQD,GOh5CvB,QAAAmL,GAAAoE,EAAAC,EAAAzE,GACA,GAAA3G,GAAA2G,EAAA3G,MACA,QAAAA,GACA,IAAA,GAAA,MAAAmL,GAAAzO,KAAA0O,EACA,KAAA,GAAA,MAAAD,GAAAzO,KAAA0O,EAAAzE,EAAA,GACA,KAAA,GAAA,MAAAwE,GAAAzO,KAAA0O,EAAAzE,EAAA,GAAAA,EAAA,GACA,KAAA,GAAA,MAAAwE,GAAAzO,KAAA0O,EAAAzE,EAAA,GAAAA,EAAA,GAAAA,EAAA,IAEA,MAAAwE,GAAApE,MAAAqE,EAAAzE,GAqCA,QAAA+B,GAAAyC,EAAAE,GACA,GAAA,kBAAAF,GACA,KAAA,IAAApM,WAAAuM,EAGA,OADAD,GAAAE,EAAAvK,SAAAqK,EAAAF,EAAAnL,OAAA,EAAAwL,EAAAH,GAAA,GACA,WAMA,IALA,GAAA1E,GAAAE,UACAyB,EAAA,GACAtI,EAAAuL,EAAA5E,EAAA3G,OAAAqL,EAAA,GACAI,EAAApF,MAAArG,KAEAsI,EAAAtI,GACAyL,EAAAnD,GAAA3B,EAAA0E,EAAA/C,EAEA,QAAA+C,GACA,IAAA,GAAA,MAAAF,GAAAzO,KAAAT,KAAAwP,EACA,KAAA,GAAA,MAAAN,GAAAzO,KAAAT,KAAA0K,EAAA,GAAA8E,EACA,KAAA,GAAA,MAAAN,GAAAzO,KAAAT,KAAA0K,EAAA,GAAAA,EAAA,GAAA8E,GAEA,GAAAC,GAAArF,MAAAgF,EAAA,EAEA,KADA/C,EAAA,KACAA,EAAA+C,GACAK,EAAApD,GAAA3B,EAAA2B,EAGA,OADAoD,GAAAL,GAAAI,EACA1E,EAAAoE,EAAAlP,KAAAyP,IAoBA,QAAAxC,GAAA9L,GAIA,GAAAiM,GAAAP,EAAA1L,GAAAkM,EAAA5M,KAAAU,GAAA,EACA,OAAAiM,IAAAE,GAAAF,GAAAG,EA0BA,QAAAV,GAAA1L,GACA,GAAA2L,SAAA3L,EACA,SAAAA,IAAA,UAAA2L,GAAA,YAAAA,GA2BA,QAAAyC,GAAApO,GACA,IAAAA,EACA,MAAA,KAAAA,EAAAA,EAAA,CAGA,IADAA,EAAAuO,EAAAvO,GACAA,IAAAwO,GAAAxO,KAAAwO,EAAA,CACA,GAAAC,GAAA,EAAAzO,EAAA,GAAA,CACA,OAAAyO,GAAAC,EAEA,GAAAC,GAAA3O,EAAA,CACA,OAAAA,KAAAA,EAAA2O,EAAA3O,EAAA2O,EAAA3O,EAAA,EAyBA,QAAAuO,GAAAvO,GACA,GAAA0L,EAAA1L,GAAA,CACA,GAAA6L,GAAAC,EAAA9L,EAAA4O,SAAA5O,EAAA4O,UAAA5O,CACAA,GAAA0L,EAAAG,GAAAA,EAAA,GAAAA,EAEA,GAAA,gBAAA7L,GACA,MAAA,KAAAA,EAAAA,GAAAA,CAEAA,GAAAA,EAAA6O,QAAAC,EAAA,GACA,IAAAC,GAAAC,EAAA1E,KAAAtK,EACA,OAAA+O,IAAAE,EAAA3E,KAAAtK,GACAkP,EAAAlP,EAAAmP,MAAA,GAAAJ,EAAA,EAAA,GACAK,EAAA9E,KAAAtK,GAAAqP,GAAArP,EAzOA,GAAAkO,GAAA,sBAGAM,EAAA,EAAA,EACAE,EAAA,uBACAW,EAAA,IAGAlD,EAAA,oBACAC,EAAA,6BAGA0C,EAAA,aAGAM,EAAA,qBAGAJ,EAAA,aAGAC,EAAA,cAGAC,EAAAI,SAwBA3E,EAAA7K,OAAAiC,UAMAmK,EAAAvB,EAAA2B,SAGA6B,EAAAoB,KAAAC,GAmLA/Q,GAAAD,QAAA8M,GPq8CM,SAAS7M,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIyP,GAAexQ,EQnsDC,GRqsDhByQ,EAAgBhQ,EAAuB+P,GAEvCE,EAAe1Q,EQrsDC,IRusDhB2Q,EAAgBlQ,EAAuBiQ,GAEvCE,EAAe5Q,EQxsDC,IR0sDhB6Q,EAAgBpQ,EAAuBmQ,GAEvCE,EAAa9Q,EQ3sDC,IR6sDd+Q,EAActQ,EAAuBqQ,GAErCE,EAAYhR,EQ9sDC,IRgtDbiR,EAAaxQ,EAAuBuQ,GQ9sDnCE,IAENA,GAAIrL,SAAQ4K,EAAA,WACZS,EAAIC,WAAUX,EAAAW,WACdD,EAAIE,SAAQT,EAAA,WACZO,EAAIG,SAAQR,EAAA,WACZK,EAAII,OAAMP,EAAA,WACVG,EAAIK,MAAKN,EAAA,WRktDR1R,EAAQ,WQhtDM2R,ERitDd1R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAYT,IAAImE,GAAgBlF,ES7uDF,GT+uDdmF,EAAiB1E,EAAuByE,GAExCsM,EAAYxR,EShvDC,GTkvDbyR,EAAahR,EAAuB+Q,GAEpCE,EAAyC1R,ESnvDhB,ITqvDzB2R,EAA0ClR,EAAuBiR,GAEjEE,EAAsB5R,EStvDA,ITwvDtB6R,EAAuBpR,EAAuBmR,GStvD/CE,GACFC,KAAM,YACNC,WAAUL,EAAA,WAGVM,eAAgB,GAAK3B,KAAK4B,GAAKP,EAAA,WAAkBQ,GAIjDC,eAAiB,WAEf,GAAIC,GAAQ,GAAK/B,KAAK4B,GAAKP,EAAA,WAAkBQ,EAE7C,OAAO,IAAAN,GAAA,WAAmBQ,EAAO,GAAIA,EAAO,OAI1CxM,GAAW,EAAAV,EAAA,eAASsM,EAAA,WAASK,GAE7BX,GAAa,EAAAhM,EAAA,eAAWU,GAC5BkM,KAAM,eT2vDPxS,GSxvDO4R,WAAAA,ETyvDP5R,EAAQ,WSvvDMsG,GT2vDT,SAASrG,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAYT,IAAImE,GAAgBlF,EUxyDF,GV0yDdmF,EAAiB1E,EAAuByE,GAExCoN,EAAOtS,EU3yDI,GV6yDXuS,EAAQ9R,EAAuB6R,GAE/BE,EAAUxS,EU9yDI,IAEbyS,GV8yDUhS,EAAuB+R,IU7yDrCE,SAAU,KAAM,KAEhBP,EAAG,QAMHQ,SAAU,SAASC,EAASC,EAASC,GACnC,GAEIC,GACAC,EAEAC,EALAC,EAAM5C,KAAK4B,GAAK,GAOpB,IAAKY,EAOE,CACLC,EAAOH,EAAQO,IAAMD,EACrBF,EAAOH,EAAQM,IAAMD,CAErB,IAAIE,GAAOR,EAAQS,IAAMH,EACrBI,EAAOT,EAAQQ,IAAMH,EAErBK,EAAWP,EAAOD,EAClBS,EAAWF,EAAOF,EAElBK,EAAeF,EAAW,EAC1BG,EAAeF,EAAW,CAE9BP,GAAI3C,KAAKqD,IAAIF,GAAgBnD,KAAKqD,IAAIF,GAAgBnD,KAAKsD,IAAIb,GAAQzC,KAAKsD,IAAIZ,GAAQ1C,KAAKqD,IAAID,GAAgBpD,KAAKqD,IAAID,EAE1H,IAAInT,GAAI,EAAI+P,KAAKuD,MAAMvD,KAAKwD,KAAKb,GAAI3C,KAAKwD,KAAK,EAAIb,GAEnD,OAAOrT,MAAKuS,EAAI5R,EAlBhB,MALAwS,GAAOH,EAAQO,IAAMD,EACrBF,EAAOH,EAAQM,IAAMD,EAErBD,EAAI3C,KAAKqD,IAAIZ,GAAQzC,KAAKqD,IAAIX,GAAQ1C,KAAKsD,IAAIb,GAAQzC,KAAKsD,IAAIZ,GAAQ1C,KAAKsD,KAAKf,EAAQQ,IAAMT,EAAQS,KAAOH,GAExGtT,KAAKuS,EAAI7B,KAAKyD,KAAKzD,KAAK0D,IAAIf,EAAG,KAiC1CgB,WAAY,SAASjN,EAAQ8L,GAC3B,MAAQlT,MAAKoS,WAAWiC,WAAcrU,KAAKoS,WAAWiC,WAAWjN,EAAQ8L,IAAa,EAAG,IAM3FoB,kBAAmB,SAASC,EAAQF,GAClC,MAAOE,GAASF,EAAW,IAM7BG,kBAAmB,SAASC,EAAgBJ,GAC1C,MAAOI,GAAiBJ,EAAW,IAIrCK,cAAe,SAASH,EAAQF,EAAYM,GAI1C,GAAIC,GAAkB5U,KAAKsU,kBAAkBC,EAAQF,GAEjD5B,EAAQzS,KAAKyS,MAAMkC,EAGnBA,KACFlC,GAAS,EAIX,IAAIoC,GAAgBpC,GAASzS,KAAKqS,eAAiBuC,GAAoBP,EAAW,EAElF,OAAOQ,IAITC,cAAe,SAASC,EAAYV,EAAYM,GAC9C,GAAIlC,GAAQzS,KAAKyS,MAAMkC,EAGnBA,KACFlC,GAAS,EAGX,IAAIgC,GAAmBM,EAAatC,EAASzS,KAAKqS,eAAkBgC,EAAW,GAC3EW,EAAahV,KAAKwU,kBAAkBC,EAAgBJ,EAExD,OAAOW,KVozDVrV,GAAQ,YUhzDM,EAAA4F,EAAA,eAASoN,EAAA,WAAOE,GVizD9BjT,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAYT,IAAIyR,GAAUxS,EWt7DI,IXw7Dd6U,EAAWpU,EAAuB+R,GAElCsC,EAAS9U,EWz7DI,IX27Db+U,EAAUtU,EAAuBqU,GAEjCE,EAAehV,EW57DA,IX87DfiV,EAAgBxU,EAAuBuU,GW57DtC9D,GAYJgE,YAAa,IAGbhN,cAAe,SAASlB,EAAQuN,GAC9B,GAAIpM,GAAiBvI,KAAKoS,WAAW/J,QAAQjB,GACzCqL,EAAQzS,KAAKyS,MAAMkC,EAOvB,OAJIA,KACFlC,GAAS,GAGJzS,KAAKwS,eAAe+C,WAAWhN,EAAgBkK,IAIxDtL,cAAe,SAASL,EAAO6N,GAC7B,GAAIlC,GAAQzS,KAAKyS,MAAMkC,EAGnBA,KACFlC,GAAS,EAGX,IAAI+C,GAAqBxV,KAAKwS,eAAeiD,YAAY3O,EAAO2L,EAEhE,OAAOzS,MAAKoS,WAAW1J,UAAU8M,IAInCnN,QAAS,SAASjB,GAChB,MAAOpH,MAAKoS,WAAW/J,QAAQjB,IAIjCsB,UAAW,SAAS5B,GAClB,MAAO9G,MAAKoS,WAAW1J,UAAU5B,IAKnC2L,MAAO,SAASkC,GAEd,MAAIA,IAAQ,EACH,IAAMjE,KAAKgF,IAAI,EAAGf,GAIlB3U,KAAKsV,aAMhBX,KAAM,SAASlC,GACb,MAAO/B,MAAKiF,IAAIlD,EAAQ,KAAO/B,KAAKkF,KAItCC,mBAAoB,SAASlB,GAC3B,GAAI3U,KAAK8V,SAAY,MAAO,KAE5B,IAAIC,GAAI/V,KAAKoS,WAAW4D,OACpBC,EAAIjW,KAAKyS,MAAMkC,EAGfA,KACFsB,GAAK,EAIP,IAAI7B,GAAMpU,KAAKwS,eAAe0D,WAAU,EAAAf,EAAA,YAAMY,EAAE,IAAKE,GAGjDtF,EAAM3Q,KAAKwS,eAAe0D,WAAU,EAAAf,EAAA,YAAMY,EAAE,IAAKE,EAErD,QAAQ7B,EAAKzD,IAWfwF,WAAY,SAAS/O,GACnB,GAAImM,GAAMvT,KAAKoW,SAAU,EAAAf,EAAA,YAAQjO,EAAOmM,IAAKvT,KAAKoW,SAAS,GAAQhP,EAAOmM,IACtEE,EAAMzT,KAAK8S,SAAU,EAAAuC,EAAA,YAAQjO,EAAOqM,IAAKzT,KAAK8S,SAAS,GAAQ1L,EAAOqM,IACtE4C,EAAMjP,EAAOiP,GAEjB,QAAO,EAAApB,EAAA,YAAO1B,EAAKE,EAAK4C,IXo8D3B1W,GAAQ,WWh8DM2R,EXi8Dd1R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,GAQtB,QAASgD,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCANhH7B,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MY3jE5hBH,EAAM,WACC,QADPA,GACQ6Q,EAAKE,EAAK4C,GACpB,GZskEC1T,EAAgB3C,KYxkEf0C,GAEE4T,MAAM/C,IAAQ+C,MAAM7C,GACtB,KAAM,IAAI8C,OAAM,2BAA6BhD,EAAM,KAAOE,EAAM,IAGlEzT,MAAKuT,KAAOA,EACZvT,KAAKyT,KAAOA,EAEA1O,SAARsR,IACFrW,KAAKqW,KAAOA,GZwlEf,MAPA3S,GY3lEGhB,IZ4lEDuB,IAAK,QACL9C,MY/kEE,WACH,MAAO,IAAIuB,GAAO1C,KAAKuT,IAAKvT,KAAKyT,IAAKzT,KAAKqW,SAfzC3T,IZqmEL/C,GAAQ,WY9kEM,SAAS0T,EAAG0C,EAAGpV,GAC5B,MAAI0S,aAAa3Q,GACR2Q,EAELjJ,MAAM+D,QAAQkF,IAAsB,gBAATA,GAAE,GACd,IAAbA,EAAEtP,OACG,GAAIrB,GAAO2Q,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAEjB,IAAbA,EAAEtP,OACG,GAAIrB,GAAO2Q,EAAE,GAAIA,EAAE,IAErB,KAECtO,SAANsO,GAAyB,OAANA,EACdA,EAEQ,gBAANA,IAAkB,OAASA,GAC7B,GAAI3Q,GAAO2Q,EAAEE,IAAK,OAASF,GAAIA,EAAEmD,IAAMnD,EAAEI,IAAKJ,EAAEgD,KAE/CtR,SAANgR,EACK,KAEF,GAAIrT,GAAO2Q,EAAG0C,EAAGpV,IZklEzBf,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,GAQtB,QAASgD,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCANhH7B,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MazoE5hBJ,EAAK,WACE,QADPA,GACQuE,EAAGyP,EAAGC,GbqpEf/T,EAAgB3C,KatpEfyC,GAEFzC,KAAKgH,EAAK0P,EAAQhG,KAAKgG,MAAM1P,GAAKA,EAClChH,KAAKyW,EAAKC,EAAQhG,KAAKgG,MAAMD,GAAKA,EbksEnC,MAvCA/S,Ga9pEGjB,Ib+pEDwB,IAAK,QACL9C,Ma1pEE,WACH,MAAO,IAAIsB,GAAMzC,KAAKgH,EAAGhH,KAAKyW,Mb+pE7BxS,IAAK,MACL9C,Ma5pEA,SAAC2F,GACF,MAAO9G,MAAK2W,QAAQC,KAAK7P,EAAOD,ObiqE/B7C,IAAK,OACL9C,Ma9pEC,SAAC2F,GAGH,MAFA9G,MAAKgH,GAAKF,EAAME,EAChBhH,KAAKyW,GAAK3P,EAAM2P,EACTzW,QbmqENiE,IAAK,WACL9C,MahqEK,SAAC2F,GACP,MAAO9G,MAAK2W,QAAQnO,UAAUzB,EAAOD,ObqqEpC7C,IAAK,YACL9C,MalqEM,SAAC2F,GAGR,MAFA9G,MAAKgH,GAAKF,EAAME,EAChBhH,KAAKyW,GAAK3P,EAAM2P,EACTzW,SA/BLyC,KAoCFsE,EAAS,SAASC,EAAGyP,EAAGC,GAC1B,MAAI1P,aAAavE,GACRuE,EAELoD,MAAM+D,QAAQnH,GACT,GAAIvE,GAAMuE,EAAE,GAAIA,EAAE,IAEjBjC,SAANiC,GAAyB,OAANA,EACdA,EAEF,GAAIvE,GAAMuE,EAAGyP,EAAGC,GbwqExB/W,GAAQ,WapqEMoH,EbqqEdnH,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,GAEtBsB,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,Gc9tEV,IAAI0V,GAAU,SAAS7P,EAAG8P,EAAOC,GAC/B,GAAIpG,GAAMmG,EAAM,GACZ1C,EAAM0C,EAAM,GACZE,EAAIrG,EAAMyD,CACd,OAAOpN,KAAM2J,GAAOoG,EAAa/P,IAAMA,EAAIoN,GAAO4C,EAAIA,GAAKA,EAAI5C,Ed0uEhEzU,GAAQ,WcvuEMkX,EdwuEdjX,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAaT,IAAIyR,GAAUxS,EelwEI,IfowEd6U,EAAWpU,EAAuB+R,GAElCsC,EAAS9U,EerwEI,IfuwEb+U,EAAUtU,EAAuBqU,GerwEhC+B,GAEJ1E,EAAG,QACH2E,aAAc,cAGdC,IAAK,WACLC,KAAM,oBAEN/O,QAAS,SAASjB,GAChB,GAAI4P,GAAItG,KAAK4B,GAAK,IACd3B,EAAM3Q,KAAKkX,aACX3D,EAAM7C,KAAKC,IAAID,KAAK0D,IAAIzD,EAAKvJ,EAAOmM,MAAO5C,GAC3CoD,EAAMrD,KAAKqD,IAAIR,EAAMyD,EAEzB,QAAO,EAAA7B,EAAA,YACLnV,KAAKuS,EAAInL,EAAOqM,IAAMuD,EACtBhX,KAAKuS,EAAI7B,KAAKiF,KAAK,EAAI5B,IAAQ,EAAIA,IAAQ,IAI/CrL,UAAW,SAAS5B,GAClB,GAAIkQ,GAAI,IAAMtG,KAAK4B,EAEnB,QAAO,EAAA2C,EAAA,aACJ,EAAIvE,KAAK2G,KAAK3G,KAAK4G,IAAIxQ,EAAM2P,EAAIzW,KAAKuS,IAAO7B,KAAK4B,GAAK,GAAM0E,EAC9DlQ,EAAME,EAAIgQ,EAAIhX,KAAKuS,IAYvB8B,WAAY,SAASjN,EAAQ8L,GAC3B,GAEIqE,GAFAjE,EAAM5C,KAAK4B,GAAK,GAIpB,IAAKY,EAKE,CACL,GAAIK,GAAMnM,EAAOmM,IAAMD,EAGnBD,GAFMjM,EAAOqM,IAAMH,EAEftT,KAAKuS,GAETiF,EAAS9G,KAAKqD,IAAIR,GAClBkE,EAAUD,EAASA,EAEnBE,EAAShH,KAAKsD,IAAIT,GAGlB3S,EAAIyS,GAAK,EAAIrT,KAAKoX,MAAQ1G,KAAKgF,IAAI,EAAI1V,KAAKoX,KAAOK,EAAS,KAG5DE,EAAItE,EAAI3C,KAAKwD,KAAK,EAAIlU,KAAKoX,KAAOK,GAGlCG,EAAKvE,EAAIzS,EAAK8W,CAMlB,OAHAH,GAAKlE,EAAIsE,EAAKD,GAGNH,EAAGK,GAzBX,MAHAL,GAAI,EAAI7G,KAAKsD,IAAI5M,EAAOmM,IAAMD,IAGtBiE,EAAGA,IA8BfvB,OAAQ,WACN,GAAIgB,GAAI,QAAUtG,KAAK4B,EACvB,UAAU0E,GAAIA,IAAKA,EAAGA,OfqwEzBrX,GAAQ,WejwEMsX,EfkwEdrX,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAQ/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCARhH7B,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAc7hBf,EAAY1B,EgBh3EC,IhBk3Eb2B,EAAalB,EAAuBiB,GgBh3EnC+V,EAAc,WACP,QADPA,GACQxE,EAAG0C,EAAGpV,EAAGqW,GhBm3ElBrU,EAAgB3C,KgBp3Ef6X,GAEF7X,KAAK8X,GAAKzE,EACVrT,KAAK+X,GAAKhC,EACV/V,KAAKgY,GAAKrX,EACVX,KAAKiY,GAAKjB,EhBg5EX,MAzBAtT,GgB53EGmU,IhB63ED5T,IAAK,YACL9C,MgBt3EM,SAAC2F,EAAO2L,GAEf,MAAOzS,MAAKuV,WAAWzO,EAAM6P,QAASlE,MhB23ErCxO,IAAK,aACL9C,MgBx3EO,SAAC2F,EAAO2L,GAKhB,MAJAA,GAAQA,GAAS,EAEjB3L,EAAME,EAAIyL,GAASzS,KAAK8X,GAAKhR,EAAME,EAAIhH,KAAK+X,IAC5CjR,EAAM2P,EAAIhE,GAASzS,KAAKgY,GAAKlR,EAAM2P,EAAIzW,KAAKiY,IACrCnR,KhB23EN7C,IAAK,cACL9C,MgBz3EQ,SAAC2F,EAAO2L,GAEjB,MADAA,GAAQA,GAAS,GACV,EAAA1Q,EAAA,aACJ+E,EAAME,EAAIyL,EAAQzS,KAAK+X,IAAM/X,KAAK8X,IAClChR,EAAM2P,EAAIhE,EAAQzS,KAAKiY,IAAMjY,KAAKgY,QA1BnCH,IhBw5ELlY,GAAQ,WgBz3EMkY,EhB03EdjY,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAYT,IAAImE,GAAgBlF,EiB/6EF,GjBi7EdmF,EAAiB1E,EAAuByE,GAExCsM,EAAYxR,EiBl7EC,GjBo7EbyR,EAAahR,EAAuB+Q,GAEpCsG,EAAgC9X,EiBr7EhB,IjBu7EhB+X,EAAiCtX,EAAuBqX,GAExDlG,EAAsB5R,EiBx7EA,IjB07EtB6R,EAAuBpR,EAAuBmR,GiBx7E/CoG,GACFjG,KAAM,YACNC,WAAU+F,EAAA,WAGV9F,eAAgB,GAAK3B,KAAK4B,GAAK6F,EAAA,WAAS5F,GAIxCC,eAAiB,WAEf,GAAIC,GAAQ,GAAK/B,KAAK4B,GAAK6F,EAAA,WAAS5F,EAEpC,OAAO,IAAAN,GAAA,WAAmBQ,EAAO,GAAIA,EAAO,OAI1CjB,GAAW,EAAAjM,EAAA,eAASsM,EAAA,WAASuG,EjB47ElCzY,GAAQ,WiB17EM6R,EjB27Ed5R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAcT,IAAIyR,GAAUxS,EkBt+EI,IlBw+Ed6U,EAAWpU,EAAuB+R,GAElCsC,EAAS9U,EkBz+EI,IlB2+Eb+U,EAAUtU,EAAuBqU,GkBz+EhCmD,GAEJ9F,EAAG,QACH+F,QAAS,kBAGTnB,IAAK,WACLC,KAAM,oBAEN/O,QAAS,SAASjB,GAChB,GAAI4P,GAAItG,KAAK4B,GAAK,IACdiG,EAAIvY,KAAKuS,EACTkE,EAAIrP,EAAOmM,IAAMyD,EACjBwB,EAAMxY,KAAKsY,QAAUC,EACrBE,EAAI/H,KAAKwD,KAAK,EAAIsE,EAAMA,GACxBE,EAAMD,EAAI/H,KAAKqD,IAAI0C,GAEnBkC,EAAKjI,KAAKkI,IAAIlI,KAAK4B,GAAK,EAAImE,EAAI,GAAK/F,KAAKgF,KAAK,EAAIgD,IAAQ,EAAIA,GAAMD,EAAI,EAG7E,OAFAhC,IAAK8B,EAAI7H,KAAKiF,IAAIjF,KAAKC,IAAIgI,EAAI,SAExB,EAAAxD,EAAA,YAAM/N,EAAOqM,IAAMuD,EAAIuB,EAAG9B,IAGnC/N,UAAW,SAAS5B,GAQlB,IAAK,GAAuB4R,GAPxB1B,EAAI,IAAMtG,KAAK4B,GACfiG,EAAIvY,KAAKuS,EACTiG,EAAMxY,KAAKsY,QAAUC,EACrBE,EAAI/H,KAAKwD,KAAK,EAAIsE,EAAMA,GACxBG,EAAKjI,KAAK4G,KAAKxQ,EAAM2P,EAAI8B,GACzBM,EAAMnI,KAAK4B,GAAK,EAAI,EAAI5B,KAAK2G,KAAKsB,GAE7B7U,EAAI,EAAGgV,EAAO,GAAc,GAAJhV,GAAU4M,KAAKqI,IAAID,GAAQ,KAAMhV,IAChE4U,EAAMD,EAAI/H,KAAKqD,IAAI8E,GACnBH,EAAMhI,KAAKgF,KAAK,EAAIgD,IAAQ,EAAIA,GAAMD,EAAI,GAC1CK,EAAOpI,KAAK4B,GAAK,EAAI,EAAI5B,KAAK2G,KAAKsB,EAAKD,GAAOG,EAC/CA,GAAOC,CAGT,QAAO,EAAA7D,EAAA,YAAO4D,EAAM7B,EAAGlQ,EAAME,EAAIgQ,EAAIuB,IASvClE,WAAY,SAASjN,GACnB,GAAIkM,GAAM5C,KAAK4B,GAAK,IAChBiB,EAAMnM,EAAOmM,IAAMD,EACnBkE,EAAS9G,KAAKqD,IAAIR,GAClBkE,EAAUD,EAASA,EACnBE,EAAShH,KAAKsD,IAAIT,GAElBgE,EAAI7G,KAAKwD,KAAK,EAAIlU,KAAKoX,KAAOK,GAAWC,CAG7C,QAAQH,EAAGA,IAGbvB,SAAU,gBAAiB,kBAAmB,eAAgB,iBlB8+E/DrW,GAAQ,WkB3+EM0Y,ElB4+EdzY,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAYT,IAAImE,GAAgBlF,EmBnkFF,GnBqkFdmF,EAAiB1E,EAAuByE,GAExCsM,EAAYxR,EmBtkFC,GnBwkFbyR,EAAahR,EAAuB+Q,GAEpCoH,EAA8B5Y,EmBzkFN,InB2kFxB6Y,EAA+BpY,EAAuBmY,GAEtDhH,EAAsB5R,EmB5kFA,InB8kFtB6R,EAAuBpR,EAAuBmR,GmB5kF/CkH,GACF/G,KAAM,YACNC,WAAU6G,EAAA,WAGV5G,eAAgB,EAAI,IAMpBG,eAAgB,GAAAP,GAAA,WAAmB,EAAI,IAAK,EAAG,GAAK,IAAK,IAGrDR,GAAW,EAAAlM,EAAA,eAASsM,EAAA,WAASqH,EnBglFlCvZ,GAAQ,WmB9kFM8R,EnB+kFd7R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAaT,IAAIyR,GAAUxS,EoBvnFI,IpBynFd6U,EAAWpU,EAAuB+R,GAElCsC,EAAS9U,EoB1nFI,IpB4nFb+U,EAAUtU,EAAuBqU,GoB1nFhCiE,GACJ9Q,QAAS,SAASjB,GAChB,OAAO,EAAA+N,EAAA,YAAM/N,EAAOqM,IAAKrM,EAAOmM,MAGlC7K,UAAW,SAAS5B,GAClB,OAAO,EAAAmO,EAAA,YAAOnO,EAAM2P,EAAG3P,EAAME,IAU/BqN,WAAY,SAASjN,GACnB,GAAIgS,GAAK,UACLC,EAAK,QACLC,EAAK,MACLC,GAAM,MACNC,EAAK,UACLC,EAAK,MACLC,EAAK,KAELpG,EAAM5C,KAAK4B,GAAK,IAChBiB,EAAMnM,EAAOmM,IAAMD,EAEnBqG,EAASP,EAAKC,EAAK3I,KAAKsD,IAAI,EAAIT,GAAO+F,EAAK5I,KAAKsD,IAAI,EAAIT,GAAOgG,EAAK7I,KAAKsD,IAAI,EAAIT,GAClFqG,EAASJ,EAAK9I,KAAKsD,IAAIT,GAAOkG,EAAK/I,KAAKsD,IAAI,EAAIT,GAAOmG,EAAKhJ,KAAKsD,IAAI,EAAIT,EAE7E,QAAQ,EAAIoG,EAAQ,EAAIC,IAG1B5D,SAAU,KAAM,MAAO,IAAK,KpB+nF7BrW,GAAQ,WoB5nFMwZ,EpB6nFdvZ,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAaT,IAAImE,GAAgBlF,EqBzrFF,GrB2rFdmF,EAAiB1E,EAAuByE,GAExCoN,EAAOtS,EqB5rFI,GrB8rFXuS,EAAQ9R,EAAuB6R,GAE/BsG,EAA8B5Y,EqB/rFN,IrBisFxB6Y,EAA+BpY,EAAuBmY,GAEtDhH,EAAsB5R,EqBlsFA,IrBosFtB6R,EAAuBpR,EAAuBmR,GqBlsF/C6H,GACFzH,WAAU6G,EAAA,WAGVzG,eAAgB,GAAAP,GAAA,WAAmB,EAAG,EAAG,EAAG,GAE5CQ,MAAO,SAASkC,GAEd,MAAIA,GACKjE,KAAKgF,IAAI,EAAGf,GAIZ,GAIXA,KAAM,SAASlC,GACb,MAAO/B,MAAKiF,IAAIlD,GAAS/B,KAAKkF,KAGhC7C,SAAU,SAASC,EAASC,GAC1B,GAAI6G,GAAK7G,EAAQQ,IAAMT,EAAQS,IAC3BsG,EAAK9G,EAAQM,IAAMP,EAAQO,GAE/B,OAAO7C,MAAKwD,KAAK4F,EAAKA,EAAKC,EAAKA,IAGlCjE,UAAU,GAGNpE,GAAS,EAAAnM,EAAA,eAASoN,EAAA,WAAOkH,ErBssF9Bla,GAAQ,WqBpsFM+R,ErBqsFd9R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAST,IAAImE,GAAgBlF,EsB/vFF,GtBiwFdmF,EAAiB1E,EAAuByE,GAExCsM,EAAYxR,EsBlwFC,GtBowFbyR,EAAahR,EAAuB+Q,GAEpCoI,EAA6B5Z,EsBrwFN,ItBuwFvB6Z,EAA8BpZ,EAAuBmZ,GAErDhI,EAAsB5R,EsBxwFA,ItB0wFtB6R,EAAuBpR,EAAuBmR,GsBxwF/CkI,EAAS,SAAS/H,EAAMgI,EAAKnE,GAC/B,GAAI5D,IAAa,EAAA6H,EAAA,YAAgBE,EAAKnE,GAGlCoE,EAAQhI,EAAW4D,OAAO,GAAG,GAAK5D,EAAW4D,OAAO,GAAG,GACvDqE,EAAQjI,EAAW4D,OAAO,GAAG,GAAK5D,EAAW4D,OAAO,GAAG,GAEvDsE,EAAQF,EAAQ,EAChBG,EAAQF,EAAQ,EAGhBG,EAAS,EAAIF,EACbG,EAAS,EAAIF,EAMb9H,EAAQ/B,KAAK0D,IAAIoG,EAAQC,GAIzBC,EAAUjI,GAASL,EAAW4D,OAAO,GAAG,GAAKsE,GAC7CK,EAAUlI,GAASL,EAAW4D,OAAO,GAAG,GAAKuE,EAEjD,QACEpI,KAAMA,EACNC,WAAYA,EAEZC,eAAgBI,EAGhBD,eAAgB,GAAAP,GAAA,WAAmBQ,GAAQiI,GAAUjI,EAAOkI,KAI1DhJ,EAAQ,SAASQ,EAAMgI,EAAKnE,GAChC,OAAO,EAAAzQ,EAAA,eAASsM,EAAA,WAASqI,EAAO/H,EAAMgI,EAAKnE,ItB6wF5CrW,GAAQ,WsB1wFMgS,EtB2wFd/R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAST,IAAIyZ,GAASxa,EuBx0FI,IvB00Fbya,EAAUha,EAAuB+Z,GAEjChI,EAAUxS,EuB30FI,IvB60Fd6U,EAAWpU,EAAuB+R,GAElCsC,EAAS9U,EuB90FI,IvBg1Fb+U,EAAUtU,EAAuBqU,GuB90FhCvD,EAAQ,SAASwI,EAAKnE,GAC1B,GAAI8E,IAAO,EAAAD,EAAA,YAAMV,GAEb9R,EAAU,SAASjB,GACrB,OAAO,EAAA+N,EAAA,YAAM2F,EAAKC,SAAS3T,EAAOqM,IAAKrM,EAAOmM,QAG5C7K,EAAY,SAAS5B,GACvB,GAAIkU,GAAUF,EAAKE,SAASlU,EAAME,EAAGF,EAAM2P,GAC3C,QAAO,EAAAxB,EAAA,YAAO+F,EAAQ,GAAIA,EAAQ,IAGpC,QACE3S,QAASA,EACTK,UAAWA,EAYX2L,WAAY,SAASjN,EAAQ8L,GAC3B,OAAQ,EAAG,IAOb8C,OAAQ,WACN,GAAIA,EACF,MAAOA,EAEP,IAAIiF,GAAa5S,GAAS,IAAK,OAC3B6S,EAAW7S,GAAS,GAAI,KAE5B,QAAQ4S,EAAYC,OvBs1F3Bvb,GAAQ,WuBh1FMgS,EvBi1Fd/R,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,GwB54FvBC,EAAAD,QAAAM,gCxBk5FM,SAASL,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxcK,EAAiBhF,EyBl6FG,GzBo6FpBiF,EAAkBxE,EAAuBuE,GAEzC+V,EAAS/a,EyBr6FI,IzBu6Fbgb,EAAUva,EAAuBsa,GAEjCE,EAASjb,EyBx6FI,IzB06Fbkb,EAAUza,EAAuBwa,GAEjCE,EAAYnb,EyB36FI,IzB66FhBob,EAAa3a,EAAuB0a,GAEpCE,EAAUrb,EyB96FI,IzBg7Fdsb,EAAW7a,EAAuB4a,GyB96FjCE,EAAM,SAAA/V,GACC,QADP+V,GACQC,GzBm7FTjZ,EAAgB3C,KyBp7Ff2b,GAEFE,QAAQlG,IAAI,eAEZvR,EAAAnD,OAAAkE,eAJEwW,EAAMzY,WAAA,cAAAlD,MAAAS,KAAAT,MAMRA,KAAK+I,OAAMuS,EAAA,WACXtb,KAAK8b,WAAY,EAAAN,EAAA,YAASI,GAC1B5b,KAAK2I,SAAU,EAAA+S,EAAA,YAAOE,GACtB5b,KAAK2H,MAAQ,GAAIyT,GAAA,WAAMW,MAEvB/b,KAAKgc,SAAW,GAAIZ,GAAA,WAAMa,QzBk8F3B,MA5BAlZ,GyBj7FG4Y,EAAM/V,GzBo8FTlC,EyBp8FGiY,IzBq8FD1X,IAAK,SACL9C,MyBx7FG,SAACuG,GACL1H,KAAKqH,KAAK,aACVrH,KAAK8b,UAAUI,OAAOlc,KAAK+I,OAAQ/I,KAAK2I,SACxC3I,KAAKqH,KAAK,kBAjBRsU,GzB88FFtW,EAAgB,WAEnB1F,GAAQ,WyB17FM,SAASic,GACtB,MAAO,IAAID,GAAOC,IzB87FnBhc,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,G0B/9FvBC,EAAAD,QAAAO,gC1Bq+FM,SAASN,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIga,GAAS/a,E2B7+FI,I3B++Fbgb,EAAUva,EAAuBsa,EAKrCxb,GAAQ,W2B/+FM,WACb,GAAIwc,GAAQ,GAAIf,GAAA,WAAMgB,KAEtB,OADAD,GAAME,IAAM,GAAIjB,GAAA,WAAMkB,IAAI,SAAU,EAAG,MAChCH,K3Bk/FRvc,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIga,GAAS/a,E4BtgGI,I5BwgGbgb,EAAUva,EAAuBsa,GAEjCE,EAASjb,E4BzgGI,I5B2gGbkb,EAAUza,EAAuBwa,EAKrC1b,GAAQ,W4B3gGM,SAASic,GACtB,GAAIW,GAAW,GAAInB,GAAA,WAAMoB,eACvBC,WAAW,GAGbF,GAASG,cAAcpB,EAAA,WAAMe,IAAIM,MAAO,GAGxCJ,EAASK,YAAa,EACtBL,EAASM,aAAc,EAEvBjB,EAAUkB,YAAYP,EAASQ,WAE/B,IAAIC,GAAa,WACfT,EAASU,QAAQrB,EAAUsB,YAAatB,EAAUuB,cAMpD,OAHAtV,QAAOuV,iBAAiB,SAAUJ,GAAY,GAC9CA,IAEOT,G5B+gGR3c,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIga,GAAS/a,E6BrjGI,I7BujGbgb,EAAUva,EAAuBsa,EAQrCxb,GAAQ,W6BvjGM,SAASic,GACtB,GAAIyB,GAAS,GAAIjC,GAAA,WAAMkC,kBAAkB,GAAI,EAAG,EAAG,IACnDD,GAAOE,SAAS9G,EAAI,IACpB4G,EAAOE,SAAStW,EAAI,GAEpB,IAAI+V,GAAa,WACfK,EAAOG,OAAS5B,EAAUsB,YAActB,EAAUuB,aAClDE,EAAOI,yBAMT,OAHA5V,QAAOuV,iBAAiB,SAAUJ,GAAY,GAC9CA,IAEOK,G7B2jGRzd,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIuc,GAAiBtd,E8B5lGJ,I9B8lGbud,EAAkB9c,EAAuB6c,G8B5lGxCrb,GACJub,MAAKD,EAAA,W9BimGNhe,GAAQ,W8B9lGM0C,E9B+lGdzC,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxcK,EAAiBhF,E+BznGG,G/B2nGpBiF,EAAkBxE,EAAuBuE,GAEzC+V,EAAS/a,E+B5nGI,I/BgoGbyd,GAFUhd,EAAuBsa,GAEV/a,E+B/nGF,K/BioGrB0d,EAAwBjd,EAAuBgd,G+B/nG9CD,EAAK,SAAAhY,GACE,QADPgY,K/BqoGDjb,EAAgB3C,K+BroGf4d,GAEFxZ,EAAAnD,OAAAkE,eAFEyY,EAAK1a,WAAA,cAAAlD,MAAAS,KAAAT,M/B8vGR,MA5HA+C,G+BloGG6a,EAAKhY,G/BgpGRlC,E+BhpGGka,I/BipGD3Z,IAAK,cACL9C,M+B1oGQ,W/B2oGN,GAAI4c,GAAQ/d,I+B1oGfA,MAAKmG,UAAUiX,iBAAiB,QAAS,SAACtT,GACxCiU,EAAKC,OAAO3W,KAAK,oBAAqByC,EAAMlG,OAAOA,UAGrD5D,KAAKmG,UAAUiX,iBAAiB,SAAU,SAACtT,GACzCiU,EAAKC,OAAO3W,KAAK,eAAgByC,EAAMlG,OAAOA,UAGhD5D,KAAKmG,UAAUiX,iBAAiB,MAAO,SAACtT,GACtCiU,EAAKC,OAAO3W,KAAK,kBAAmByC,EAAMlG,OAAOA,a/BkpGlDK,IAAK,SACL9C,M+B9oGG,SAAC2F,EAAOmX,O/BgpGXha,IAAK,SACL9C,M+BhpGG,SAAC+c,EAAYD,O/BopGhBha,IAAK,UACL9C,M+BlpGI,SAACoT,EAAQ0J,O/BopGbha,IAAK,UACL9C,M+BppGI,SAACgd,EAAaF,O/BwpGlBha,IAAK,UACL9C,M+BtpGI,SAAC2F,EAAOmX,O/B0pGZha,IAAK,gBACL9C,M+BxpGU,e/B4pGV8C,IAAK,UACL9C,M+B1pGI,SAACid,EAAOH,O/B4pGZha,IAAK,UACL9C,M+B5pGI,SAACkd,EAAYJ,O/BgqGjBha,IAAK,YACL9C,M+B9pGM,SAACid,EAAOH,O/BgqGdha,IAAK,YACL9C,M+BhqGM,SAACkd,EAAYJ,O/ByqGnBha,IAAK,SACL9C,M+BlqGG,SAAC2F,EAAOwX,O/BsqGXra,IAAK,SACL9C,M+BpqGG,WACJnB,KAAKmG,UAAU+B,Y/ByqGdjE,IAAK,QACL9C,M+BtqGE,SAACod,GAEJ,MADAA,GAAMC,YAAYxe,MACXA,Q/B2qGNiE,IAAK,cACL9C,M+BxqGQ,SAACod,GACVve,KAAKge,OAASO,EAIdve,KAAKmG,UAAY,GAAA2X,GAAA,WAAkBS,EAAM5X,QAAQgC,QAAS4V,EAAM/X,YAGhExG,KAAKmG,UAAUqH,MAAO,EAGtBxN,KAAKmG,UAAUsY,cAAgB,OAK/Bze,KAAKsG,cAELtG,KAAKqH,KAAK,aAlFRuW,G/B+vGFvY,EAAgB,WAEnB1F,GAAQ,W+B1qGM,WACb,MAAO,IAAIie,I/B8qGZhe,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC9BwB,OAAO,GAQR,IAAIga,GAAS/a,EgCtxGI,IhCwxGbgb,EAAUva,EAAuBsa,GgCvwGlCuD,EAAgB,SAAWja,EAAQsY,GAsQtC,QAAS4B,KAER,MAAO,GAAIjO,KAAK4B,GAAK,GAAK,GAAKsM,EAAMC,gBAItC,QAASC,KAER,MAAOpO,MAAKgF,IAAK,IAAMkJ,EAAMG,WAI9B,QAASC,GAAYZ,GAEpBa,GAAcb,EAIf,QAASc,GAAUd,GAElBe,GAAYf,EAyGb,QAASgB,GAASC,GAEZT,EAAMna,iBAAkB2W,GAAA,WAAMkC,kBAElC7K,GAAS4M,EAEET,EAAMna,iBAAkB2W,GAAA,WAAMkE,oBAEzCV,EAAMna,OAAOkQ,KAAOjE,KAAKC,IAAKiO,EAAMW,QAAS7O,KAAK0D,IAAKwK,EAAMY,QAASZ,EAAMna,OAAOkQ,KAAO0K,IAC1FT,EAAMna,OAAOgZ,yBACbgC,GAAc,IAId5D,QAAQ6D,KAAM,uFACdd,EAAMe,YAAa,GAMrB,QAASC,GAAUP,GAEbT,EAAMna,iBAAkB2W,GAAA,WAAMkC,kBAElC7K,GAAS4M,EAEET,EAAMna,iBAAkB2W,GAAA,WAAMkE,oBAEzCV,EAAMna,OAAOkQ,KAAOjE,KAAKC,IAAKiO,EAAMW,QAAS7O,KAAK0D,IAAKwK,EAAMY,QAASZ,EAAMna,OAAOkQ,KAAO0K,IAC1FT,EAAMna,OAAOgZ,yBACbgC,GAAc,IAId5D,QAAQ6D,KAAM,uFACdd,EAAMe,YAAa,GAUrB,QAASE,GAAuB/V,GAI/BgW,EAAYC,IAAKjW,EAAMkW,QAASlW,EAAMmW,SAIvC,QAASC,GAAsBpW,GAI9BqW,GAAWJ,IAAKjW,EAAMkW,QAASlW,EAAMmW,SAItC,QAASG,GAAoBtW,GAI5BuW,EAASN,IAAKjW,EAAMkW,QAASlW,EAAMmW,SAIpC,QAASK,GAAuBxW,GAI/ByW,EAAUR,IAAKjW,EAAMkW,QAASlW,EAAMmW,SACpCO,EAAYC,WAAYF,EAAWT,EAEnC,IAAIY,GAAU9B,EAAM7B,aAAetW,SAAWmY,EAAM7B,WAAW4D,KAAO/B,EAAM7B,UAG5EiC,GAAY,EAAItO,KAAK4B,GAAKkO,EAAYxZ,EAAI0Z,EAAQxD,YAAc0B,EAAMgC,aAGtE1B,EAAU,EAAIxO,KAAK4B,GAAKkO,EAAY/J,EAAIiK,EAAQvD,aAAeyB,EAAMgC,aAErEd,EAAYe,KAAMN,GAElB3B,EAAM1W,SAIP,QAAS4Y,GAAsBhX,GAI9BiX,GAAShB,IAAKjW,EAAMkW,QAASlW,EAAMmW,SAEnCe,GAAWP,WAAYM,GAAUZ,IAE5Ba,GAAWvK,EAAI,EAEnB2I,EAASN,KAEEkC,GAAWvK,EAAI,GAE1BmJ,EAAUd,KAIXqB,GAAWU,KAAME,IAEjBnC,EAAM1W,SAIP,QAAS+Y,GAAoBnX,GAI5BoX,EAAOnB,IAAKjW,EAAMkW,QAASlW,EAAMmW,SAEjCkB,EAASV,WAAYS,EAAQb,GAE7Be,GAAKD,EAASna,EAAGma,EAAS1K,GAE1B4J,EAASQ,KAAMK,GAEftC,EAAM1W,SAIP,QAASmZ,GAAevX,IAMxB,QAASwX,GAAkBxX,GAI1B,GAAIpC,GAAQ,CAEc3C,UAArB+E,EAAMyX,WAIV7Z,EAAQoC,EAAMyX,WAEcxc,SAAjB+E,EAAM0X,SAIjB9Z,GAAUoC,EAAM0X,QAIZ9Z,EAAQ,EAEZkY,EAAUd,KAES,EAARpX,GAEX0X,EAASN,KAIVF,EAAM1W,SAIP,QAASuZ,GAAe3X,GAIvB,OAASA,EAAM4X,SAEd,IAAK9C,GAAMpR,KAAKmU,GACfP,GAAK,EAAGxC,EAAMgD,aACdhD,EAAM1W,QACN,MAED,KAAK0W,GAAMpR,KAAKqU,OACfT,GAAK,GAAKxC,EAAMgD,aAChBhD,EAAM1W,QACN,MAED,KAAK0W,GAAMpR,KAAKsU,KACfV,GAAKxC,EAAMgD,YAAa,GACxBhD,EAAM1W,QACN,MAED,KAAK0W,GAAMpR,KAAKuU,MACfX,IAAOxC,EAAMgD,YAAa,GAC1BhD,EAAM1W,UAOT,QAAS8Z,GAAwBlY,GAIhCgW,EAAYC,IAAKjW,EAAMmY,QAAS,GAAIC,MAAOpY,EAAMmY,QAAS,GAAIE,OAI/D,QAASC,GAAuBtY,GAI/B,GAAIgQ,GAAKhQ,EAAMmY,QAAS,GAAIC,MAAQpY,EAAMmY,QAAS,GAAIC,MACnDnI,EAAKjQ,EAAMmY,QAAS,GAAIE,MAAQrY,EAAMmY,QAAS,GAAIE,MAEnDpP,EAAWrC,KAAKwD,KAAM4F,EAAKA,EAAKC,EAAKA,EAEzCoG,IAAWJ,IAAK,EAAGhN,GAIpB,QAASsP,GAAqBvY,GAI7BuW,EAASN,IAAKjW,EAAMmY,QAAS,GAAIC,MAAOpY,EAAMmY,QAAS,GAAIE,OAI5D,QAASG,GAAuBxY,GAI/ByW,EAAUR,IAAKjW,EAAMmY,QAAS,GAAIC,MAAOpY,EAAMmY,QAAS,GAAIE,OAC5D3B,EAAYC,WAAYF,EAAWT,EAEnC,IAAIY,GAAU9B,EAAM7B,aAAetW,SAAWmY,EAAM7B,WAAW4D,KAAO/B,EAAM7B,UAG5EiC,GAAY,EAAItO,KAAK4B,GAAKkO,EAAYxZ,EAAI0Z,EAAQxD,YAAc0B,EAAMgC,aAGtE1B,EAAU,EAAIxO,KAAK4B,GAAKkO,EAAY/J,EAAIiK,EAAQvD,aAAeyB,EAAMgC,aAErEd,EAAYe,KAAMN,GAElB3B,EAAM1W,SAIP,QAASqa,GAAsBzY,GAI9B,GAAIgQ,GAAKhQ,EAAMmY,QAAS,GAAIC,MAAQpY,EAAMmY,QAAS,GAAIC,MACnDnI,EAAKjQ,EAAMmY,QAAS,GAAIE,MAAQrY,EAAMmY,QAAS,GAAIE,MAEnDpP,EAAWrC,KAAKwD,KAAM4F,EAAKA,EAAKC,EAAKA,EAEzCgH,IAAShB,IAAK,EAAGhN,GAEjBiO,GAAWP,WAAYM,GAAUZ,IAE5Ba,GAAWvK,EAAI,EAEnBmJ,EAAUd,KAECkC,GAAWvK,EAAI,GAE1B2I,EAASN,KAIVqB,GAAWU,KAAME,IAEjBnC,EAAM1W,SAIP,QAASsa,GAAoB1Y,GAI5BoX,EAAOnB,IAAKjW,EAAMmY,QAAS,GAAIC,MAAOpY,EAAMmY,QAAS,GAAIE,OAEzDhB,EAASV,WAAYS,EAAQb,GAE7Be,GAAKD,EAASna,EAAGma,EAAS1K,GAE1B4J,EAASQ,KAAMK,GAEftC,EAAM1W,SAIP,QAASua,GAAgB3Y,IAUzB,QAAS4Y,GAAa5Y,GAErB,GAAK8U,EAAM+D,WAAY,EAAvB,CAIA,GAFA7Y,EAAM8Y,iBAED9Y,EAAM+Y,SAAWjE,EAAMkE,aAAaC,MAAQ,CAEhD,GAAKnE,EAAMoE,gBAAiB,EAAQ,MAEpCnD,GAAuB/V,GAEvBmZ,EAAQC,EAAMC,WAER,IAAKrZ,EAAM+Y,SAAWjE,EAAMkE,aAAaM,KAAO,CAEtD,GAAKxE,EAAMe,cAAe,EAAQ,MAElCO,GAAsBpW,GAEtBmZ,EAAQC,EAAMG,UAER,IAAKvZ,EAAM+Y,SAAWjE,EAAMkE,aAAaQ,IAAM,CAErD,GAAK1E,EAAM2E,aAAc,EAAQ,MAEjCnD,GAAoBtW,GAEpBmZ,EAAQC,EAAMI,IAIVL,IAAUC,EAAMM,OAEpB/c,SAAS2W,iBAAkB,YAAaqG,GAAa,GACrDhd,SAAS2W,iBAAkB,UAAWsG,GAAW,GACjDjd,SAAS2W,iBAAkB,WAAYsG,GAAW,GAElD9E,EAAM+E,cAAeC,KAMvB,QAASH,GAAa3Z,GAErB,GAAK8U,EAAM+D,WAAY,EAIvB,GAFA7Y,EAAM8Y,iBAEDK,IAAUC,EAAMC,OAAS,CAE7B,GAAKvE,EAAMoE,gBAAiB,EAAQ,MAEpC1C,GAAuBxW,OAEjB,IAAKmZ,IAAUC,EAAMG,MAAQ,CAEnC,GAAKzE,EAAMe,cAAe,EAAQ,MAElCmB,GAAsBhX,OAEhB,IAAKmZ,IAAUC,EAAMI,IAAM,CAEjC,GAAK1E,EAAM2E,aAAc,EAAQ,MAEjCtC,GAAoBnX,IAMtB,QAAS4Z,GAAW5Z,GAEd8U,EAAM+D,WAAY,IAEvBtB,EAAevX,GAEfrD,SAASod,oBAAqB,YAAaJ,GAAa,GACxDhd,SAASod,oBAAqB,UAAWH,GAAW,GACpDjd,SAASod,oBAAqB,WAAYH,GAAW,GAErD9E,EAAM+E,cAAeG,GAErBb,EAAQC,EAAMM,MAIf,QAASO,GAAcja,GAEjB8U,EAAM+D,WAAY,GAAS/D,EAAMe,cAAe,GAASsD,IAAUC,EAAMM,OAE9E1Z,EAAM8Y,iBACN9Y,EAAMka,kBAEN1C,EAAkBxX,GAElB8U,EAAM+E,cAAeC,GACrBhF,EAAM+E,cAAeG,IAItB,QAASG,GAAWna,GAEd8U,EAAM+D,WAAY,GAAS/D,EAAMsF,cAAe,GAAStF,EAAM2E,aAAc,GAElF9B,EAAe3X,GAIhB,QAASqa,GAAcra,GAEtB,GAAK8U,EAAM+D,WAAY,EAAvB,CAEA,OAAS7Y,EAAMmY,QAAQle,QAEtB,IAAK,GAEJ,GAAK6a,EAAMoE,gBAAiB,EAAQ,MAEpChB,GAAwBlY,GAExBmZ,EAAQC,EAAMkB,YAEd,MAED,KAAK,GAEJ,GAAKxF,EAAMe,cAAe,EAAQ,MAElCyC,GAAuBtY,GAEvBmZ,EAAQC,EAAMmB,WAEd,MAED,KAAK,GAEJ,GAAKzF,EAAM2E,aAAc,EAAQ;AAEjClB,EAAqBvY,GAErBmZ,EAAQC,EAAMoB,SAEd,MAED,SAECrB,EAAQC,EAAMM,KAIXP,IAAUC,EAAMM,MAEpB5E,EAAM+E,cAAeC,IAMvB,QAASW,GAAaza,GAErB,GAAK8U,EAAM+D,WAAY,EAKvB,OAHA7Y,EAAM8Y,iBACN9Y,EAAMka,kBAEGla,EAAMmY,QAAQle,QAEtB,IAAK,GAEJ,GAAK6a,EAAMoE,gBAAiB,EAAQ,MACpC,IAAKC,IAAUC,EAAMkB,aAAe,MAEpC9B,GAAuBxY,EAEvB,MAED,KAAK,GAEJ,GAAK8U,EAAMe,cAAe,EAAQ,MAClC,IAAKsD,IAAUC,EAAMmB,YAAc,MAEnC9B,GAAsBzY,EAEtB,MAED,KAAK,GAEJ,GAAK8U,EAAM2E,aAAc,EAAQ,MACjC,IAAKN,IAAUC,EAAMoB,UAAY,MAEjC9B,GAAoB1Y,EAEpB,MAED,SAECmZ,EAAQC,EAAMM,MAMjB,QAASgB,GAAY1a,GAEf8U,EAAM+D,WAAY,IAEvBF,EAAgB3Y,GAEhB8U,EAAM+E,cAAeG,GAErBb,EAAQC,EAAMM,MAIf,QAASiB,GAAe3a,GAEvBA,EAAM8Y,iBA74BP5iB,KAAKyE,OAASA,EAEdzE,KAAK+c,WAA8BhY,SAAfgY,EAA6BA,EAAatW,SAG9DzG,KAAK2iB,SAAU,EAGf3iB,KAAK4D,OAAS,GAAIwX,GAAA,WAAMsJ,QAGxB1kB,KAAK2kB,YAAc,EACnB3kB,KAAK4kB,YAAcC,EAAAA,EAGnB7kB,KAAKuf,QAAU,EACfvf,KAAKwf,QAAUqF,EAAAA,EAIf7kB,KAAK8kB,cAAgB,EACrB9kB,KAAKye,cAAgB/N,KAAK4B,GAI1BtS,KAAK+kB,kBAAoBF,EAAAA,GACzB7kB,KAAKglB,gBAAkBH,EAAAA,EAIvB7kB,KAAKilB,eAAgB,EACrBjlB,KAAKklB,cAAgB,IAIrBllB,KAAK2f,YAAa,EAClB3f,KAAK+e,UAAY,EAGjB/e,KAAKgjB,cAAe,EACpBhjB,KAAK4gB,YAAc,EAGnB5gB,KAAKujB,WAAY,EACjBvjB,KAAK4hB,YAAc,EAInB5hB,KAAKmlB,YAAa,EAClBnlB,KAAK6e,gBAAkB,EAGvB7e,KAAKkkB,YAAa,EAGlBlkB,KAAKwN,MAASsU,KAAM,GAAIH,GAAI,GAAII,MAAO,GAAIF,OAAQ,IAGnD7hB,KAAK8iB,cAAiBC,MAAO3H,EAAA,WAAMgK,MAAMtD,KAAMsB,KAAMhI,EAAA,WAAMgK,MAAMC,OAAQ/B,IAAKlI,EAAA,WAAMgK,MAAMrD,OAG1F/hB,KAAKslB,QAAUtlB,KAAK4D,OAAO+S,QAC3B3W,KAAKulB,UAAYvlB,KAAKyE,OAAO8Y,SAAS5G,QACtC3W,KAAKwlB,MAAQxlB,KAAKyE,OAAOkQ,KAMzB3U,KAAKylB,cAAgB,WAEpB,MAAO5M,IAIR7Y,KAAK0lB,kBAAoB,WAExB,MAAOC,IAIR3lB,KAAK4lB,MAAQ,WAEZhH,EAAMhb,OAAOid,KAAMjC,EAAM0G,SACzB1G,EAAMna,OAAO8Y,SAASsD,KAAMjC,EAAM2G,WAClC3G,EAAMna,OAAOkQ,KAAOiK,EAAM4G,MAE1B5G,EAAMna,OAAOgZ,yBACbmB,EAAM+E,cAAekC,GAErBjH,EAAM1W,SAEN+a,EAAQC,EAAMM,MAKfxjB,KAAKkI,OAAS,WAEb,GAAI4d,GAAS,GAAI1K,GAAA,WAAMsJ,QAGnBqB,GAAO,GAAI3K,GAAA,WAAM4K,YAAaC,mBAAoBxhB,EAAOyhB,GAAI,GAAI9K,GAAA,WAAMsJ,QAAS,EAAG,EAAG,IACtFyB,EAAcJ,EAAKpP,QAAQqE,UAE3BoL,EAAe,GAAIhL,GAAA,WAAMsJ,QACzB2B,EAAiB,GAAIjL,GAAA,WAAM4K,UAE/B,OAAO,YAEN,GAAIzI,GAAWqB,EAAMna,OAAO8Y,QAE5BuI,GAAOjF,KAAMtD,GAAW+I,IAAK1H,EAAMhb,QAGnCkiB,EAAOS,gBAAiBR,GAIxBJ,EAAQjV,KAAKuD,MAAO6R,EAAO9e,EAAG8e,EAAO7e,GAIrC4R,EAAMnI,KAAKuD,MAAOvD,KAAKwD,KAAM4R,EAAO9e,EAAI8e,EAAO9e,EAAI8e,EAAO7e,EAAI6e,EAAO7e,GAAK6e,EAAOrP,GAE5EmI,EAAMuG,YAAclC,IAAUC,EAAMM,MAExCxE,EAAYL,KAIbgH,GAAS1G,EACTpG,GAAOsG,EAGPwG,EAAQjV,KAAKC,IAAKiO,EAAMmG,gBAAiBrU,KAAK0D,IAAKwK,EAAMoG,gBAAiBW,IAG1E9M,EAAMnI,KAAKC,IAAKiO,EAAMkG,cAAepU,KAAK0D,IAAKwK,EAAMH,cAAe5F,IAGpEA,EAAMnI,KAAKC,IAAK6V,EAAK9V,KAAK0D,IAAK1D,KAAK4B,GAAKkU,EAAK3N,GAE9C,IAAI4N,GAASX,EAAO/hB,SAAW0O,CAsC/B,OAnCAgU,GAAS/V,KAAKC,IAAKiO,EAAM+F,YAAajU,KAAK0D,IAAKwK,EAAMgG,YAAa6B,IAGnE7H,EAAMhb,OAAO6E,IAAKie,GAElBZ,EAAO9e,EAAIyf,EAAS/V,KAAKqD,IAAK8E,GAAQnI,KAAKqD,IAAK4R,GAChDG,EAAOrP,EAAIgQ,EAAS/V,KAAKsD,IAAK6E,GAC9BiN,EAAO7e,EAAIwf,EAAS/V,KAAKqD,IAAK8E,GAAQnI,KAAKsD,IAAK2R,GAGhDG,EAAOS,gBAAiBJ,GAExB5I,EAASsD,KAAMjC,EAAMhb,QAAS6E,IAAKqd,GAEnClH,EAAMna,OAAOkiB,OAAQ/H,EAAMhb,QAEtBgb,EAAMqG,iBAAkB,GAE5BhG,GAAgB,EAAIL,EAAMsG,cAC1B/F,GAAc,EAAIP,EAAMsG,gBAIxBjG,EAAa,EACbE,EAAW,GAIZ1M,EAAQ,EACRiU,EAAU3G,IAAK,EAAG,EAAG,GAMhBN,GACJ2G,EAAaQ,kBAAmBhI,EAAMna,OAAO8Y,UAAaiJ,GAC1D,GAAM,EAAIH,EAAeQ,IAAKjI,EAAMna,OAAOqiB,aAAiBN,GAE5D5H,EAAM+E,cAAekC,GAErBO,EAAavF,KAAMjC,EAAMna,OAAO8Y,UAChC8I,EAAexF,KAAMjC,EAAMna,OAAOqiB,YAClCrH,GAAc,GAEP,IAID,MAMTzf,KAAK+mB,QAAU,WAEdnI,EAAM7B,WAAW8G,oBAAqB,cAAeY,GAAe,GACpE7F,EAAM7B,WAAW8G,oBAAqB,YAAanB,GAAa,GAChE9D,EAAM7B,WAAW8G,oBAAqB,aAAcE,GAAc,GAClEnF,EAAM7B,WAAW8G,oBAAqB,sBAAuBE,GAAc,GAE3EnF,EAAM7B,WAAW8G,oBAAqB,aAAcM,GAAc,GAClEvF,EAAM7B,WAAW8G,oBAAqB,WAAYW,GAAY,GAC9D5F,EAAM7B,WAAW8G,oBAAqB,YAAaU,GAAa,GAEhE9d,SAASod,oBAAqB,YAAaJ,GAAa,GACxDhd,SAASod,oBAAqB,UAAWH,GAAW,GACpDjd,SAASod,oBAAqB,WAAYH,GAAW,GAErD7b,OAAOgc,oBAAqB,UAAWI,GAAW,GAUnD,IAaI0B,GACA9M,EAdA+F,EAAQ5e,KAER6lB,GAAgB/Y,KAAM,UACtB8W,GAAe9W,KAAM,SACrBgX,GAAahX,KAAM,OAEnBoW,GAAUM,KAAO,GAAKL,OAAS,EAAGE,MAAQ,EAAGC,IAAM,EAAGc,aAAe,EAAGC,YAAc,EAAGC,UAAY,GAErGrB,EAAQC,EAAMM,KAEdgD,EAAM,KAMNrH,EAAW,EACXF,EAAa,EACbxM,EAAQ,EACRiU,EAAY,GAAItL,GAAA,WAAMsJ,QACtBjF,GAAc,EAEdK,EAAc,GAAI1E,GAAA,WAAM4L,QACxBzG,EAAY,GAAInF,GAAA,WAAM4L,QACtBxG,EAAc,GAAIpF,GAAA,WAAM4L,QAExB3G,EAAW,GAAIjF,GAAA,WAAM4L,QACrB9F,EAAS,GAAI9F,GAAA,WAAM4L,QACnB7F,EAAW,GAAI/F,GAAA,WAAM4L,QAErB7G,GAAa,GAAI/E,GAAA,WAAM4L,QACvBjG,GAAW,GAAI3F,GAAA,WAAM4L,QACrBhG,GAAa,GAAI5F,GAAA,WAAM4L,QA0BvBC,GAAU,WAEb,GAAItP,GAAI,GAAIyD,GAAA,WAAMsJ,OAgBhB,OAAO,UAAiB3R,EAAUmU,GACjC,GAAIC,GAAKD,EAAaE,QAGtBzP,GAAEoI,IAAIoH,EAAI,GAAK,EAAGA,EAAI,IACtBxP,EAAE0P,gBAAgBtU,GAElB2T,EAAUje,IAAIkP,OAMd2P,GAAQ,WAEX,GAAI3P,GAAI,GAAIyD,GAAA,WAAMsJ,OAehB,OAAO,UAAe3R,EAAUmU,GAC/B,GAAIC,GAAKD,EAAaE,SAClBG,EAAUxU,EAAWrC,KAAKsD,IAAI6E,EAElClB,GAAEoI,IAAIoH,EAAI,GAAK,EAAGA,EAAI,IACtBxP,EAAE0P,eAAeE,GAEjBb,EAAUje,IAAIkP,OAMdyJ,GAAM,WAET,GAAI0E,GAAS,GAAI1K,GAAA,WAAMsJ,OAEvB,OAAO,UAAU8C,EAAQC,GAExB,GAAI/G,GAAU9B,EAAM7B,aAAetW,SAAWmY,EAAM7B,WAAW4D,KAAO/B,EAAM7B,UAE5E,IAAK6B,EAAMna,iBAAkB2W,GAAA,WAAMkC,kBAAoB,CAGtD,GAAIC,GAAWqB,EAAMna,OAAO8Y,QAC5BuI,GAAOjF,KAAMtD,GAAW+I,IAAK1H,EAAMhb,OACnC,IAAI8jB,GAAiB5B,EAAO/hB,QAG5B2jB,IAAkBhX,KAAKkI,IAAOgG,EAAMna,OAAOkjB,IAAM,EAAMjX,KAAK4B,GAAK,KAGjE2U,GAAS,EAAIO,EAASE,EAAiBhH,EAAQvD,aAAcyB,EAAMna,OAAOmjB,QAC1EN,GAAO,EAAIG,EAASC,EAAiBhH,EAAQvD,aAAcyB,EAAMna,OAAOmjB,YAE7DhJ,GAAMna,iBAAkB2W,GAAA,WAAMkE,oBAGzC2H,GAASO,GAAW5I,EAAMna,OAAOojB,MAAQjJ,EAAMna,OAAOqjB,MAASpH,EAAQxD,YAAa0B,EAAMna,OAAOmjB,QACjGN,GAAOG,GAAW7I,EAAMna,OAAOsjB,IAAMnJ,EAAMna,OAAOujB,QAAWtH,EAAQvD,aAAcyB,EAAMna,OAAOmjB,UAKhG/L,QAAQ6D,KAAM,gFACdd,EAAM2E,WAAY,MA0hBrB3E,GAAM7B,WAAWK,iBAAkB,cAAeqH,GAAe,GAEjE7F,EAAM7B,WAAWK,iBAAkB,YAAasF,GAAa,GAC7D9D,EAAM7B,WAAWK,iBAAkB,aAAc2G,GAAc,GAC/DnF,EAAM7B,WAAWK,iBAAkB,sBAAuB2G,GAAc,GAExEnF,EAAM7B,WAAWK,iBAAkB,aAAc+G,GAAc,GAC/DvF,EAAM7B,WAAWK,iBAAkB,WAAYoH,GAAY,GAC3D5F,EAAM7B,WAAWK,iBAAkB,YAAamH,GAAa,GAE7D1c,OAAOuV,iBAAkB,UAAW6G,GAAW,GAI/CjkB,KAAKkI,SAINwW,GAAcxb,UAAYjC,OAAOkC,OAAQiY,EAAA,WAAM6M,gBAAgB/kB,WAC/Dwb,EAAcxb,UAAUE,YAAcgY,EAAA,WAAMsD,cAE5Czd,OAAO0C,iBAAkB+a,EAAcxb,WAEtCglB,QAECjjB,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,4DACP1f,KAAK4D,SAQd0a,QAECrZ,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,+EACL1f,KAAK2f,YAIfI,IAAK,SAAW5e,GAEf0a,QAAQ6D,KAAM,8EACd1f,KAAK2f,YAAexe,IAMtBgnB,UAECljB,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,mFACL1f,KAAKgjB,cAIfjD,IAAK,SAAW5e,GAEf0a,QAAQ6D,KAAM,kFACd1f,KAAKgjB,cAAiB7hB,IAMxBinB,OAECnjB,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,6EACL1f,KAAKujB,WAIfxD,IAAK,SAAW5e,GAEf0a,QAAQ6D,KAAM,4EACd1f,KAAKujB,WAAcpiB,IAMrBknB,QAECpjB,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,+EACL1f,KAAKkkB,YAIfnE,IAAK,SAAW5e,GAEf0a,QAAQ6D,KAAM,8EACd1f,KAAKkkB,YAAe/iB,IAMtBmnB,cAECrjB,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,wFACL1f,KAAKuoB,WAAWtD,eAI1BlF,IAAK,SAAW5e,GAEf0a,QAAQ6D,KAAM,uFACd1f,KAAKuoB,WAAWtD,eAAkB9jB,IAMpCqnB,sBAECvjB,IAAK,WAGJ,MADA4W,SAAQ6D,KAAM,4FACP1f,KAAKuoB,WAAWrD,eAIxBnF,IAAK,SAAW5e,GAEf0a,QAAQ6D,KAAM,4FACd1f,KAAKuoB,WAAWrD,cAAgB/jB,MhCgtGlCxB,EAAQ,WgCxsGM+e,EhCysGd9e,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxc0jB,EAAUroB,EiCxxIG,IjC0xIbsoB,EAAU7nB,EAAuB4nB,GAEjCtN,EAAS/a,EiC3xII,IjC6xIbgb,EAAUva,EAAuBsa,GiC3xIhC7Y,EAAgB,SAAAqmB,GACT,QADPrmB,KjCiyIDK,EAAgB3C,KiCjyIfsC,GAEF8B,EAAAnD,OAAAkE,eAFE7C,EAAgBY,WAAA,cAAAlD,MAAAS,KAAAT,MAIlBA,KAAK4oB,cjCu1IN,MA7DA7lB,GiC9xIGT,EAAgBqmB,GjC2yInBjlB,EiC3yIGpB,IjC4yID2B,IAAK,SACL9C,MiCryIG,ejC4yIH8C,IAAK,cACL9C,MiCvyIQ,WAIT,GAAI0nB,GAAmB,GAAIzN,GAAA,WAAM0N,iBAAiB,SAClDD,GAAiBE,SAAW,GAC5BF,EAAiBtL,SAASvW,EAAI,IAC9B6hB,EAAiBtL,SAAS9G,EAAI,IAC9BoS,EAAiBtL,SAAStW,EAAI,GAE9B,IAAI+hB,GAAoB,GAAI5N,GAAA,WAAM0N,iBAAiB,SACnDE,GAAkBD,SAAW,GAC7BC,EAAkBzL,SAASvW,EAAI,KAC/BgiB,EAAkBzL,SAAS9G,EAAI,IAC/BuS,EAAkBzL,SAAStW,EAAI,IAE/B,IAAIgiB,GAAS,GAAI7N,GAAA,WAAM8N,uBAAuBL,EAAkB,IAC5DM,EAAU,GAAI/N,GAAA,WAAM8N,uBAAuBF,EAAmB,GAElEhpB,MAAKgJ,OAAOP,IAAIogB,GAChB7oB,KAAKgJ,OAAOP,IAAIugB,GAEhBhpB,KAAKgJ,OAAOP,IAAIwgB,GAChBjpB,KAAKgJ,OAAOP,IAAI0gB,MjC4yIfllB,IAAK,YACL9C,MiCzyIM,WACP,GAAIioB,GAAO,IACPC,EAAO,IAEPC,EAAa,GAAIlO,GAAA,WAAMmO,WAAWH,EAAMC,EAC5CrpB,MAAKgJ,OAAOP,IAAI6gB,OA9CdhnB,GjC41IFomB,EAAQ,WAEX/oB,GAAQ,WiC3yIM,WACb,MAAO,IAAI2C,IjC+yIZ1C,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxcK,EAAiBhF,EkC13IG,GlC43IpBiF,EAAkBxE,EAAuBuE,GAEzC+V,EAAS/a,EkC73II,IlC+3Ibgb,EAAUva,EAAuBsa,GAEjCqO,EAAeppB,EkCh4IF,IAEZqpB,GlCg4Ie5oB,EAAuB2oB,GkCh4IjC,SAAA5jB,GACE,QADP6jB,KlCs4ID9mB,EAAgB3C,KkCt4IfypB,GAEFrlB,EAAAnD,OAAAkE,eAFEskB,EAAKvmB,WAAA,cAAAlD,MAAAS,KAAAT,MAIPA,KAAKgJ,OAAS,GAAIoS,GAAA,WAAMsO,SlCo6IzB,MArCA3mB,GkCn4IG0mB,EAAK7jB,GlC+4IRlC,EkC/4IG+lB,IlCg5IDxlB,IAAK,QACL9C,MkCz4IE,SAACod,GAEJ,MADAA,GAAMoL,SAAS3pB,MACRA,QlC84INiE,IAAK,cACL9C,MkC34IQ,SAACod,GACVve,KAAKge,OAASO,EACdve,KAAK4pB,OAAOrL,GACZve,KAAKqH,KAAK,YlCg5ITpD,IAAK,UACL9C,MkC74II,WACLnB,KAAKge,OAAS,KACdhe,KAAKgJ,OAAS,SAvBZygB,GlCy6IFpkB,EAAgB,YAEnB1F,GAAQ,WkCh5IM8pB,ElCi5Id7pB,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxc8kB,EAAczpB,EmCp8IG,InCs8IjB0pB,EAAcjpB,EAAuBgpB,GAErCE,EAAa3pB,EmCv8II,InCy8IjB4pB,EAAcnpB,EAAuBkpB,GAErCE,EAA8B7pB,EmC18II,InC48IlC8pB,EAA+BrpB,EAAuBopB,GAEtDE,EAAkB/pB,EmC78IF,InC+8IhBgqB,EAAmBvpB,EAAuBspB,GAE1ChP,EAAS/a,EmCh9II,InCk9Ibgb,EAAUva,EAAuBsa,GmCz6IhC5Y,EAAc,SAAA8nB,GACP,QADP9nB,GACQ+nB,EAAMxkB,GnCq9IfnD,EAAgB3C,KmCt9IfuC,GAEF6B,EAAAnD,OAAAkE,eAFE5C,EAAcW,WAAA,cAAAlD,MAAAS,KAAAT,KAEV8F,GAEN9F,KAAKuqB,MAAQD,EnCgjJd,MAjGAvnB,GmCn9IGR,EAAc8nB,GnC+9IjB3mB,EmC/9IGnB,InCg+ID0B,IAAK,SACL9C,MmC19IG,SAACod,GnC29IF,GAAIR,GAAQ/d,ImC19IfoE,GAAAnD,OAAAkE,eARE5C,EAAcW,WAAA,SAAAlD,MAAAS,KAAAT,KAQHue,EAGb,IAAIiM,GAAO,GAAIpP,GAAA,WAAMqP,oBAAoB,IAAO,IAAO,GACnDC,EAAO,GAAItP,GAAA,WAAMuP,KAAKH,GAAM,EAAAN,EAAA,YAA2B,WAC3DQ,GAAKE,SAAS5jB,EAAI,IAAM0J,KAAK4B,GAAK,IAElCtS,KAAK6qB,WAAaH,EAClB1qB,KAAKgJ,OAAOP,IAAIiiB,GAMhBI,WAAW,WACT/M,EAAKgN,gBACLhN,EAAKzX,eACJ,MnC+9IFrC,IAAK,cACL9C,MmC79IQ,WAITnB,KAAKgrB,uBAAwB,EAAAZ,EAAA,YAASpqB,KAAKirB,eAAgB,KAE3DjrB,KAAKge,OAAOpX,GAAG,YAAa5G,KAAKgrB,sBAAuBhrB,MACxDA,KAAKge,OAAOpX,GAAG,OAAQ5G,KAAKkrB,aAAclrB,SnCg+IzCiE,IAAK,iBACL9C,MmC99IW,WACZnB,KAAK+qB,mBnCi+IJ9mB,IAAK,eACL9C,MmC/9IS,SAACiG,EAAQN,GACnB9G,KAAKmrB,eAAerkB,MnCk+InB7C,IAAK,iBACL9C,MmCh+IW,SAAC2F,GACb9G,KAAK6qB,WAAWtN,SAASvW,EAAIF,EAAME,EACnChH,KAAK6qB,WAAWtN,SAAStW,EAAIH,EAAM2P,KnCm+IlCxS,IAAK,cACL9C,MmCj+IQ,SAACiqB,EAAUxiB,GACpB,OAAO,EAAAohB,EAAA,YAAUoB,EAAUprB,KAAKuqB,MAAO3hB,MnCs+ItC3E,IAAK,UACL9C,MmCn+II,WACLnB,KAAKge,OAAO7S,IAAI,YAAanL,KAAKgrB,uBAClChrB,KAAKge,OAAO7S,IAAI,OAAQnL,KAAKkrB,cAE7BlrB,KAAKgrB,sBAAwB,KAG7BhrB,KAAK6qB,WAAWQ,SAAStE,UACzB/mB,KAAK6qB,WAAWQ,SAAW,KAEvBrrB,KAAK6qB,WAAWS,SAASC,MAC3BvrB,KAAK6qB,WAAWS,SAASC,IAAIxE,UAC7B/mB,KAAK6qB,WAAWS,SAASC,IAAM,MAGjCvrB,KAAK6qB,WAAWS,SAASvE,UACzB/mB,KAAK6qB,WAAWS,SAAW,KAE3BtrB,KAAK6qB,WAAa,KAGlBzmB,EAAAnD,OAAAkE,eA7EE5C,EAAcW,WAAA,UAAAlD,MAAAS,KAAAT,UAAduC,GnCqjJFunB,EAAY,WAEfnqB,GAAQ,WmCr+IM,SAAS2qB,EAAMxkB,GAC5B,MAAO,IAAIvD,GAAe+nB,EAAMxkB,InCy+IjClG,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxc0jB,EAAUroB,EoC7nJG,IpC+nJbsoB,EAAU7nB,EAAuB4nB,GAEjCnjB,EAAgBlF,EoChoJF,GpCkoJdmF,EAAiB1E,EAAuByE,GAExCkmB,EAAaprB,EoCnoJI,IpCqoJjBqrB,EAAc5qB,EAAuB2qB,GAErCrQ,EAAS/a,EoCtoJI,IpCwoJbgb,EAAUva,EAAuBsa,GoC9lJhCuQ,EAAS,SAAA/C,GACF,QADP+C,GACQ5lB,GpC2oJT,GAAIiY,GAAQ/d,IAEZ2C,GAAgB3C,KoC9oJf0rB,GAEFtnB,EAAAnD,OAAAkE,eAFEumB,EAASxoB,WAAA,cAAAlD,MAAAS,KAAAT,KAEL8F,EAEN,IAAIC,IACF4lB,SAAU,IACVC,OAAQ,GAGV5rB,MAAK6rB,UAAW,EAAAtmB,EAAA,YAAOQ,EAAUD,GAEjC9F,KAAK8rB,YAAa,EAAAL,EAAA,YAAUzrB,KAAK6rB,SAASF,SAAU,SAAAI,GAClDhO,EAAKiO,aAAaD,KAIpB/rB,KAAKisB,QAAU,EACfjsB,KAAKksB,QAAUlsB,KAAK6rB,SAASD,OAE7B5rB,KAAKgc,SAAW,GAAIZ,GAAA,WAAMa,QAC1Bjc,KAAKmsB,OAAS,GAAI/Q,GAAA,WAAMsO,SpCk4JzB,MA7QA3mB,GoCzoJG2oB,EAAS/C,GpCqqJZjlB,EoCrqJGgoB,IpCsqJDznB,IAAK,SACL9C,MoChpJG,SAACod,GACLve,KAAKgJ,OAAOP,IAAIzI,KAAKmsB,WpCmpJpBloB,IAAK,iBACL9C,MoCjpJW,WACZ,GAAIkc,GAASrd,KAAKge,OAAOoO,YACrBC,EAAmB,GAAIjR,GAAA,WAAMkR,OACjCD,GAAiBE,iBAAiBlP,EAAOmP,iBAAkBnP,EAAOoP,oBAElEzsB,KAAKgc,SAAS0Q,cAAcrP,EAAOmP,kBACnCxsB,KAAKgc,SAAS0Q,eAAc,GAAItR,GAAA,WAAMkR,SAAUC,iBAAiBlP,EAAOmP,iBAAkBnP,EAAOoP,wBpCopJhGxoB,IAAK,iBACL9C,MoClpJW,SAAC4qB,GACb,GAAI/V,GAAS+V,EAAKY,WAClB,OAAO3sB,MAAKgc,SAAS4Q,cAAc,GAAIxR,GAAA,WAAMyR,KAAK,GAAIzR,GAAA,WAAMsJ,QAAQ1O,EAAO,GAAI,EAAGA,EAAO,IAAK,GAAIoF,GAAA,WAAMsJ,QAAQ1O,EAAO,GAAI,EAAGA,EAAO,SpCqpJpI/R,IAAK,gBACL9C,MoCnpJU,WpCopJR,GAAI2rB,GAAS9sB,IoCnpJhB,KAAIA,KAAK+sB,OAAU/sB,KAAKge,OAAxB,CAMA,GAAIX,GAASrd,KAAKge,OAAOoO,WAGzBpsB,MAAKgtB,eAAehtB,KAAKgc,SAAUqB,EAGnC,IAAI4P,GAAYjtB,KAAKktB,UACrBD,MACAA,EAAUnkB,KAAK9I,KAAKmtB,aAAa,IAAKntB,OACtCitB,EAAUnkB,KAAK9I,KAAKmtB,aAAa,IAAKntB,OACtCitB,EAAUnkB,KAAK9I,KAAKmtB,aAAa,IAAKntB,OACtCitB,EAAUnkB,KAAK9I,KAAKmtB,aAAa,IAAKntB,OAGtCA,KAAKotB,QAAQH,GAGbjtB,KAAKqtB,eAGLJ,EAAUjlB,QAAQ,SAAC+jB,EAAM1f,GAEvB,GAAKygB,EAAKQ,eAAevB,GAAzB,CAIA,GAAIe,EAAKjB,SAAS9Y,UAAY+Z,EAAKjB,SAAS9Y,SAAW,EAAG,CAExD,GAAImV,GAAS6D,EAAKwB,YACdC,EAAQ,GAAIpS,GAAA,WAAMsJ,QAAQwD,EAAO,GAAI,EAAGA,EAAO,IAAK5B,IAAIjJ,EAAOE,UAAUxZ,QAG7E,IAAIypB,EAAOV,EAAKjB,SAAS9Y,SACvB,OAQJ,MAAKgZ,GAAK0B,eASL1B,EAAK2B,WAKVZ,EAAKX,OAAO1jB,IAAIsjB,EAAK0B,gBAbnB1B,GAAK4B,0BpCwqJR1pB,IAAK,UACL9C,MoCtpJI,SAAC8rB,GAMN,IALA,GACIW,GACAxC,EAFAyC,EAAQ,EAKLA,GAASZ,EAAUlpB,QACxB6pB,EAAcX,EAAUY,GACxBzC,EAAWwC,EAAYE,cAGnBF,EAAY7pB,SAAW/D,KAAKksB,SAM5BlsB,KAAK+tB,kBAAkBH,IAIzBX,EAAU9jB,OAAO0kB,EAAO,GAGxBZ,EAAUnkB,KAAK9I,KAAKmtB,aAAa/B,EAAW,IAAKprB,OACjDitB,EAAUnkB,KAAK9I,KAAKmtB,aAAa/B,EAAW,IAAKprB,OACjDitB,EAAUnkB,KAAK9I,KAAKmtB,aAAa/B,EAAW,IAAKprB,OACjDitB,EAAUnkB,KAAK9I,KAAKmtB,aAAa/B,EAAW,IAAKprB,QAfjD6tB,OpCgrJH5pB,IAAK,oBACL9C,MoCvpJc,SAAC4qB,GAChB,GAAIiC,GAAWhuB,KAAKisB,QAChBgC,EAAWjuB,KAAKksB,QAEhBd,EAAWW,EAAK+B,cAEhBzQ,EAASrd,KAAKge,OAAOoO,YAMrB8B,EAAU,CAGd,IAAI9C,EAASrnB,SAAWkqB,EACtB,OAAO,CAIT,IAAI7C,EAASrnB,OAASiqB,EACpB,OAAO,CAIT,KAAKhuB,KAAKstB,eAAevB,GACvB,OAAO,CAGT,IAAI7D,GAAS6D,EAAKwB,YAIdC,EAAQ,GAAIpS,GAAA,WAAMsJ,QAAQwD,EAAO,GAAI,EAAGA,EAAO,IAAK5B,IAAIjJ,EAAOE,UAAUxZ,SAEzEoqB,EAAQD,EAAUnC,EAAKqC,UAAYZ,CAGvC,OAAQW,GAAQ,KpC0pJflqB,IAAK,eACL9C,MoCxpJS,WACV,IAAK,GAAI2C,GAAI9D,KAAKmsB,OAAOkC,SAAStqB,OAAS,EAAGD,GAAK,EAAGA,IACpD9D,KAAKmsB,OAAO/iB,OAAOpJ,KAAKmsB,OAAOkC,SAASvqB,OpC8pJzCG,IAAK,cACL9C,MoC1pJQ,SAACiqB,EAAUxiB,OpC8pJnB3E,IAAK,eACL9C,MoC5pJS,SAACiqB,EAAUxiB,GACrB,GAAImjB,GAAO/rB,KAAK8rB,WAAWwC,QAAQlD,EAWnC,OATKW,KAEHA,EAAO/rB,KAAKuuB,YAAYnD,EAAUxiB,GAIlC5I,KAAK8rB,WAAW0C,QAAQpD,EAAUW,IAG7BA,KpC+pJN9nB,IAAK,eACL9C,MoC7pJS,SAAC4qB,GAEX/rB,KAAKgJ,OAAOI,OAAO2iB,GAKnBA,EAAK1iB,apCkqJJpF,IAAK,UACL9C,MoC/pJI,WACL,GAAI2C,EAGJ,KAAKA,EAAI9D,KAAKmsB,OAAOkC,SAAStqB,OAAS,EAAGD,GAAK,EAAGA,IAChD9D,KAAKmsB,OAAO/iB,OAAOpJ,KAAKmsB,OAAOkC,SAASvqB,GAI1C,KAAKA,EAAI9D,KAAKgJ,OAAOqlB,SAAStqB,OAAS,EAAGD,GAAK,EAAGA,IAChD9D,KAAKgJ,OAAOI,OAAOpJ,KAAKgJ,OAAOqlB,SAASvqB,GAG1C9D,MAAK8rB,WAAWziB,UAChBrJ,KAAK8rB,WAAa,KAElB9rB,KAAKge,OAAS,KACdhe,KAAKmsB,OAAS,KACdnsB,KAAKgJ,OAAS,KACdhJ,KAAKgc,SAAW,SAnPd0P,GpCu5JFhD,EAAQ,WAEX/oB,GAAQ,WoClqJM+rB,EpCmqJd9rB,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAQ/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCARhH7B,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAM7hB4rB,EAAYruB,EqCv9JI,IrCy9JhBsuB,EAAa7tB,EAAuB4tB,GqCp9JnCE,EAAS,WACF,QADPA,GACQC,EAAYC,GrC09JrBlsB,EAAgB3C,KqC39Jf2uB,GAEF3uB,KAAK8uB,QAAS,EAAAJ,EAAA,aACZ/d,IAAKie,EACL7H,QAAS,SAAC9iB,EAAK8nB,GACb8C,EAAc9C,MrCogKnB,MA/BAroB,GqC1+JGirB,IrC2+JD1qB,IAAK,UACL9C,MqCh+JI,WACL,OAAO,KrCq+JN8C,IAAK,UACL9C,MqCl+JI,SAACiqB,GACN,MAAOprB,MAAK8uB,OAAO7pB,IAAImmB,MrCu+JtBnnB,IAAK,UACL9C,MqCp+JI,SAACiqB,EAAUW,GAChB/rB,KAAK8uB,OAAO/O,IAAIqL,EAAUW,MrC2+JzB9nB,IAAK,UACL9C,MqCt+JI,WACLnB,KAAK8uB,OAAOlJ,QACZ5lB,KAAK8uB,OAAS,SA/BZH,IrC4gKLhvB,GAAQ,WqCx+JM,SAASivB,EAAYC,GAClC,MAAO,IAAIF,GAAUC,EAAYC,IrC4+JlCjvB,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GsClgKhC,QAAA2uB,GAAAjuB,EAAAmD,EAAA+qB,GACA,GAAAC,EAOA,OANAC,GAAAjrB,GACAgrB,EAAAC,EAAAjrB,IAEAgrB,EAAAE,EAAAlrB,GACAirB,EAAAjrB,GAAAgrB,GAEA,IAAArkB,UAAA7G,OACAjD,EAAAmuB,IAEAnuB,EAAAmuB,GAAAD,EACAA,GAIA,QAAAI,KAAyB,MAAA,GAUzB,QAAAC,GAAAvpB,GACA,KAAA9F,eAAAqvB,IACA,MAAA,IAAAA,GAAAvpB,EAGA,iBAAAA,KACAA,GAAe6K,IAAA7K,IAGfA,IACAA,KAGA,IAAA6K,GAAAoe,EAAA/uB,KAAA,MAAA8F,EAAA6K,OAEAA,GACA,gBAAAA,IACA,GAAAA,IACAoe,EAAA/uB,KAAA,MAAA6kB,EAAAA,EAGA,IAAAyK,GAAAxpB,EAAA/B,QAAAqrB,CACA,mBAAAE,KACAA,EAAAF,GAEAL,EAAA/uB,KAAA,mBAAAsvB,GAEAP,EAAA/uB,KAAA,aAAA8F,EAAAypB,QAAA,GACAR,EAAA/uB,KAAA,SAAA8F,EAAA0pB,QAAA,GACAT,EAAA/uB,KAAA,UAAA8F,EAAAihB,SACA/mB,KAAA4lB,QAiFA,QAAA6J,GAAAC,EAAAnmB,EAAAomB,EAAAC,GACA,GAAAC,GAAAF,EAAAxuB,KACA2uB,GAAAJ,EAAAG,KACAE,EAAAL,EAAAC,GACAZ,EAAAW,EAAA,gBACAG,EAAA9qB,SAGA8qB,GACAtmB,EAAA9I,KAAAmvB,EAAAC,EAAA1uB,MAAA0uB,EAAA5rB,IAAAyrB,GAyOA,QAAAzqB,GAAAyqB,EAAAzrB,EAAA+rB,GACA,GAAAL,GAAAZ,EAAAW,EAAA,SAAAzqB,IAAAhB,EACA,IAAA0rB,EAAA,CACA,GAAAE,GAAAF,EAAAxuB,KACA2uB,GAAAJ,EAAAG,IACAE,EAAAL,EAAAC,GACAZ,EAAAW,EAAA,gBAAAG,EAAA9qB,SAEAirB,GACAjB,EAAAW,EAAA,WAAAO,YAAAN,GAGAE,IAAAA,EAAAA,EAAA1uB,OAEA,MAAA0uB,GAGA,QAAAC,GAAAJ,EAAAG,GACA,IAAAA,IAAAA,EAAAL,SAAAT,EAAAW,EAAA,UACA,OAAA,CAEA,IAAAH,IAAA,EACAW,EAAAC,KAAAC,MAAAP,EAAAO,GAMA,OAJAb,GADAM,EAAAL,OACAU,EAAAL,EAAAL,OAEAT,EAAAW,EAAA,WAAAQ,EAAAnB,EAAAW,EAAA,UAKA,QAAAW,GAAAX,GACA,GAAAX,EAAAW,EAAA,UAAAX,EAAAW,EAAA,OACA,IAAA,GAAAY,GAAAvB,EAAAW,EAAA,WAAAa,KACAxB,EAAAW,EAAA,UAAAX,EAAAW,EAAA,QAAA,OAAAY,GAAqE,CAIrE,GAAAE,GAAAF,EAAAE,IACAT,GAAAL,EAAAY,GACAA,EAAAE,GAKA,QAAAT,GAAAL,EAAAC,GACA,GAAAA,EAAA,CACA,GAAAE,GAAAF,EAAAxuB,KACA4tB,GAAAW,EAAA,YACAX,EAAAW,EAAA,WAAAjvB,KAAAT,KAAA6vB,EAAA5rB,IAAA4rB,EAAA1uB,OAEA4tB,EAAAW,EAAA,SAAAX,EAAAW,EAAA,UAAAG,EAAA9rB,QACAgrB,EAAAW,EAAA,SAAAX,UAAAc,EAAA5rB,KACA8qB,EAAAW,EAAA,WAAAe,WAAAd,IAKA,QAAAe,GAAAzsB,EAAA9C,EAAA4C,EAAAqsB,EAAAZ,GACAxvB,KAAAiE,IAAAA,EACAjE,KAAAmB,MAAAA,EACAnB,KAAA+D,OAAAA,EACA/D,KAAAowB,IAAAA,EACApwB,KAAAwvB,OAAAA,GAAA,EAldA5vB,EAAAD,QAAA0vB,CAIA,IASAF,GATAwB,EAAAvwB,EAAA,IACAwwB,EAAAxwB,EAAA,IAGAywB,EAAAzwB,EAAA,IAGA8uB,KACA4B,EAAA,kBAAAC,OAGA5B,GADA2B,EACA,SAAA7sB,GACA,MAAA8sB,QAAAA,OAAA9sB,IAGA,SAAAA,GACA,MAAA,IAAAA,GAgEAhD,OAAAC,eAAAmuB,EAAAnsB,UAAA,OACA6c,IAAA,SAAAiR,KACAA,GAAA,gBAAAA,IAAA,GAAAA,KACAA,EAAAnM,EAAAA,GAEAkK,EAAA/uB,KAAA,MAAAgxB,GACAX,EAAArwB,OAEAiF,IAAA,WACA,MAAA8pB,GAAA/uB,KAAA,QAEAqD,YAAA,IAGApC,OAAAC,eAAAmuB,EAAAnsB,UAAA,cACA6c,IAAA,SAAAkR,GACAlC,EAAA/uB,KAAA,eAAAixB,IAEAhsB,IAAA,WACA,MAAA8pB,GAAA/uB,KAAA,eAEAqD,YAAA,IAGApC,OAAAC,eAAAmuB,EAAAnsB,UAAA,UACA6c,IAAA,SAAAmR,KACAA,GAAA,gBAAAA,IAAA,EAAAA,KACAA,EAAA,GAEAnC,EAAA/uB,KAAA,SAAAkxB,GACAb,EAAArwB,OAEAiF,IAAA,WACA,MAAA8pB,GAAA/uB,KAAA,WAEAqD,YAAA,IAIApC,OAAAC,eAAAmuB,EAAAnsB,UAAA,oBACA6c,IAAA,SAAAoR,GACA,kBAAAA,KACAA,EAAA/B,GAEA+B,IAAApC,EAAA/uB,KAAA,sBACA+uB,EAAA/uB,KAAA,mBAAAmxB,GACApC,EAAA/uB,KAAA,SAAA,GACA+uB,EAAA/uB,KAAA,WAAAgI,QAAA,SAAA6nB,GACAA,EAAA9rB,OAAAgrB,EAAA/uB,KAAA,oBAAAS,KAAAT,KAAA6vB,EAAA1uB,MAAA0uB,EAAA5rB,KACA8qB,EAAA/uB,KAAA,SAAA+uB,EAAA/uB,KAAA,UAAA6vB,EAAA9rB,SACO/D,OAEPqwB,EAAArwB,OAEAiF,IAAA,WAAoB,MAAA8pB,GAAA/uB,KAAA,qBACpBqD,YAAA,IAGApC,OAAAC,eAAAmuB,EAAAnsB,UAAA,UACA+B,IAAA,WAAoB,MAAA8pB,GAAA/uB,KAAA,WACpBqD,YAAA,IAGApC,OAAAC,eAAAmuB,EAAAnsB,UAAA,aACA+B,IAAA,WAAoB,MAAA8pB,GAAA/uB,KAAA,WAAA+D,QACpBV,YAAA,IAGAgsB,EAAAnsB,UAAAkuB,SAAA,SAAA7nB,EAAAqmB,GACAA,EAAAA,GAAA5vB,IACA,KAAA,GAAAswB,GAAAvB,EAAA/uB,KAAA,WAAAuwB,KAA+C,OAAAD,GAAiB,CAChE,GAAAE,GAAAF,EAAAE,IACAf,GAAAzvB,KAAAuJ,EAAA+mB,EAAAV,GACAU,EAAAE,IAiBAnB,EAAAnsB,UAAA8E,QAAA,SAAAuB,EAAAqmB,GACAA,EAAAA,GAAA5vB,IACA,KAAA,GAAAswB,GAAAvB,EAAA/uB,KAAA,WAAAqxB,KAA+C,OAAAf,GAAiB,CAChE,GAAAgB,GAAAhB,EAAAgB,IACA7B,GAAAzvB,KAAAuJ,EAAA+mB,EAAAV,GACAU,EAAAgB,IAIAjC,EAAAnsB,UAAAsK,KAAA,WACA,MAAAuhB,GAAA/uB,KAAA,WAAAuxB,UAAAhG,IAAA,SAAAhU,GACA,MAAAA,GAAAtT,KACGjE,OAGHqvB,EAAAnsB,UAAAsuB,OAAA,WACA,MAAAzC,GAAA/uB,KAAA,WAAAuxB,UAAAhG,IAAA,SAAAhU,GACA,MAAAA,GAAApW,OACGnB,OAGHqvB,EAAAnsB,UAAA0iB,MAAA,WACAmJ,EAAA/uB,KAAA,YACA+uB,EAAA/uB,KAAA,YACA+uB,EAAA/uB,KAAA,WAAA+D,QACAgrB,EAAA/uB,KAAA,WAAAgI,QAAA,SAAA6nB,GACAd,EAAA/uB,KAAA,WAAAS,KAAAT,KAAA6vB,EAAA5rB,IAAA4rB,EAAA1uB,QACKnB,MAGL+uB,EAAA/uB,KAAA,QAAA,GAAA2wB,IACA5B,EAAA/uB,KAAA,UAAA,GAAA6wB,IACA9B,EAAA/uB,KAAA,SAAA,IAGAqvB,EAAAnsB,UAAAuuB,KAAA,WACA,MAAA1C,GAAA/uB,KAAA,WAAAurB,IAAA,SAAAsE,GACA,MAAAC,GAAA9vB,KAAA6vB,GAAA,QAEAtY,EAAAsY,EAAA5rB,IACA0T,EAAAkY,EAAA1uB,MACAsX,EAAAoX,EAAAO,KAAAP,EAAAL,QAAA,KAGGxvB,MAAAuxB,UAAAG,OAAA,SAAA9Z,GACH,MAAAA,MAIAyX,EAAAnsB,UAAAyuB,QAAA,WACA,MAAA5C,GAAA/uB,KAAA,YAGAqvB,EAAAnsB,UAAA0uB,QAAA,SAAAhkB,EAAAikB,GACA,GAAAC,GAAA,aACAC,GAAA,EAEAC,EAAAjD,EAAA/uB,KAAA,aACAgyB,KACAF,GAAA,uBACAC,GAAA,EAGA,IAAAphB,GAAAoe,EAAA/uB,KAAA,MACA2Q,IAAAA,IAAAkU,EAAAA,IACAkN,IACAD,GAAA,KAEAA,GAAA,YAAAlB,EAAAgB,QAAAjhB,EAAAkhB,GACAE,GAAA,EAGA,IAAAvC,GAAAT,EAAA/uB,KAAA,SACAwvB,KACAuC,IACAD,GAAA,KAEAA,GAAA,eAAAlB,EAAAgB,QAAApC,EAAAqC,GACAE,GAAA,EAGA,IAAAzC,GAAAP,EAAA/uB,KAAA,mBACAsvB,IAAAA,IAAAF,IACA2C,IACAD,GAAA,KAEAA,GAAA,eAAAlB,EAAAgB,QAAA7C,EAAA/uB,KAAA,UAAA6xB,GACAE,GAAA,EAGA,IAAAE,IAAA,CAgCA,OA/BAlD,GAAA/uB,KAAA,WAAAgI,QAAA,SAAAkqB,GACAD,EACAH,GAAA,SAEAC,IACAD,GAAA,OAEAG,GAAA,EACAH,GAAA,OAEA,IAAA7tB,GAAA2sB,EAAAgB,QAAAM,EAAAjuB,KAAAkuB,MAAA,MAAAC,KAAA,QACApD,GAAe7tB,MAAA+wB,EAAA/wB,MACf+wB,GAAA1C,SAAAA,IACAR,EAAAQ,OAAA0C,EAAA1C,QAEAF,IAAAF,IACAJ,EAAAjrB,OAAAmuB,EAAAnuB,QAEA+rB,EAAA9vB,KAAAkyB,KACAlD,EAAAO,OAAA,GAGAP,EAAA4B,EAAAgB,QAAA5C,EAAA6C,GAAAM,MAAA,MAAAC,KAAA,QACAN,GAAA7tB,EAAA,OAAA+qB,KAGAiD,GAAAF,KACAD,GAAA,MAEAA,GAAA,KAKAzC,EAAAnsB,UAAA6c,IAAA,SAAA9b,EAAA9C,EAAAquB,GACAA,EAAAA,GAAAT,EAAA/uB,KAAA,SAEA,IAAAowB,GAAAZ,EAAAW,KAAAC,MAAA,EACAzlB,EAAAokB,EAAA/uB,KAAA,oBAAAS,KAAAT,KAAAmB,EAAA8C,EAEA,IAAA8qB,EAAA/uB,KAAA,SAAAqyB,IAAApuB,GAAA,CACA,GAAA0G,EAAAokB,EAAA/uB,KAAA,OAEA,MADA+vB,GAAA/vB,KAAA+uB,EAAA/uB,KAAA,SAAAiF,IAAAhB,KACA,CAGA,IAAA0rB,GAAAZ,EAAA/uB,KAAA,SAAAiF,IAAAhB,GACAiuB,EAAAvC,EAAAxuB,KAcA,OAXA4tB,GAAA/uB,KAAA,YACA+uB,EAAA/uB,KAAA,WAAAS,KAAAT,KAAAiE,EAAAiuB,EAAA/wB,OAGA+wB,EAAA9B,IAAAA,EACA8B,EAAA1C,OAAAA,EACA0C,EAAA/wB,MAAAA,EACA4tB,EAAA/uB,KAAA,SAAA+uB,EAAA/uB,KAAA,WAAA2K,EAAAunB,EAAAnuB,SACAmuB,EAAAnuB,OAAA4G,EACA3K,KAAAiF,IAAAhB,GACAosB,EAAArwB,OACA,EAGA,GAAA6vB,GAAA,GAAAa,GAAAzsB,EAAA9C,EAAAwJ,EAAAylB,EAAAZ,EAGA,OAAAK,GAAA9rB,OAAAgrB,EAAA/uB,KAAA,QACA+uB,EAAA/uB,KAAA,YACA+uB,EAAA/uB,KAAA,WAAAS,KAAAT,KAAAiE,EAAA9C,IAEA,IAGA4tB,EAAA/uB,KAAA,SAAA+uB,EAAA/uB,KAAA,UAAA6vB,EAAA9rB,QACAgrB,EAAA/uB,KAAA,WAAAsyB,QAAAzC,GACAd,EAAA/uB,KAAA,SAAA+f,IAAA9b,EAAA8qB,EAAA/uB,KAAA,WAAAqxB,MACAhB,EAAArwB,OACA,IAGAqvB,EAAAnsB,UAAAmvB,IAAA,SAAApuB,GACA,IAAA8qB,EAAA/uB,KAAA,SAAAqyB,IAAApuB,GAAA,OAAA,CACA,IAAA4rB,GAAAd,EAAA/uB,KAAA,SAAAiF,IAAAhB,GAAA9C,KACA,OAAA2uB,GAAA9vB,KAAA6vB,IACA,GAEA,GAGAR,EAAAnsB,UAAA+B,IAAA,SAAAhB,GACA,MAAAgB,GAAAjF,KAAAiE,GAAA,IAGAorB,EAAAnsB,UAAAqvB,KAAA,SAAAtuB,GACA,MAAAgB,GAAAjF,KAAAiE,GAAA,IAGAorB,EAAAnsB,UAAAsvB,IAAA,WACA,GAAA7C,GAAAZ,EAAA/uB,KAAA,WAAAuwB,IACA,OAAAZ,IACAI,EAAA/vB,KAAA2vB,GACAA,EAAAxuB,OAFA,MAKAkuB,EAAAnsB,UAAA6sB,IAAA,SAAA9rB,GACA8rB,EAAA/vB,KAAA+uB,EAAA/uB,KAAA,SAAAiF,IAAAhB,KAGAorB,EAAAnsB,UAAAuvB,KAAA,SAAAC,GAEA1yB,KAAA4lB,OAIA,KAAA,GAFAwK,GAAAD,KAAAC,MAEAlmB,EAAAwoB,EAAA3uB,OAAA,EAA8BmG,GAAA,EAAQA,IAAA,CACtC,GAAA2lB,GAAA6C,EAAAxoB,GACAyoB,EAAA9C,EAAApX,GAAA,CACA,IAAA,IAAAka,EAEA3yB,KAAA+f,IAAA8P,EAAAtY,EAAAsY,EAAAlY,OACK,CACL,GAAA6X,GAAAmD,EAAAvC,CAEAZ,GAAA,GACAxvB,KAAA+f,IAAA8P,EAAAtY,EAAAsY,EAAAlY,EAAA6X,MAMAH,EAAAnsB,UAAA0vB,MAAA,WACA,GAAAlD,GAAA1vB,IACA+uB,GAAA/uB,KAAA,SAAAgI,QAAA,SAAA7G,EAAA8C,GACAgB,EAAAyqB,EAAAzrB,GAAA,OtCqmKM,SAASrE,EAAQD,EAASS,IuCp/KhC,SAAAyyB,GAAA,cAAAA,EAAAC,IAAAC,kBACA,SAAAF,EAAAC,IAAAE,uBACAH,EAAAC,IAAAG,eAAA,QAEA,kBAAAtC,MAAAkC,EAAAC,IAAAG,eAGArzB,EAAAD,QAAAS,EAAA,IAFAR,EAAAD,QAAAgxB,MvC2/K8BlwB,KAAKd,EAASS,EAAoB,MAI1D,SAASR,EAAQD,GwC5/KvB,QAAAuzB,KACAC,GAAA,EACAC,EAAArvB,OACAsvB,EAAAD,EAAAE,OAAAD,GAEAE,EAAA,GAEAF,EAAAtvB,QACAyvB,IAIA,QAAAA,KACA,IAAAL,EAAA,CAGA,GAAAM,GAAA3I,WAAAoI,EACAC,IAAA,CAGA,KADA,GAAAxoB,GAAA0oB,EAAAtvB,OACA4G,GAAA,CAGA,IAFAyoB,EAAAC,EACAA,OACAE,EAAA5oB,GACAyoB,GACAA,EAAAG,GAAAG,KAGAH,GAAA,GACA5oB,EAAA0oB,EAAAtvB,OAEAqvB,EAAA,KACAD,GAAA,EACAQ,aAAAF,IAiBA,QAAAG,GAAAC,EAAArkB,GACAxP,KAAA6zB,IAAAA,EACA7zB,KAAAwP,MAAAA,EAYA,QAAAskB,MAtEA,GAGAV,GAHAP,EAAAjzB,EAAAD,WACA0zB,KACAF,GAAA,EAEAI,EAAA,EAsCAV,GAAAkB,SAAA,SAAAF,GACA,GAAAnpB,GAAA,GAAAN,OAAAQ,UAAA7G,OAAA,EACA,IAAA6G,UAAA7G,OAAA,EACA,IAAA,GAAAD,GAAA,EAAuBA,EAAA8G,UAAA7G,OAAsBD,IAC7C4G,EAAA5G,EAAA,GAAA8G,UAAA9G,EAGAuvB,GAAAvqB,KAAA,GAAA8qB,GAAAC,EAAAnpB,IACA,IAAA2oB,EAAAtvB,QAAAovB,GACArI,WAAA0I,EAAA,IASAI,EAAA1wB,UAAAwwB,IAAA,WACA1zB,KAAA6zB,IAAA/oB,MAAA,KAAA9K,KAAAwP,QAEAqjB,EAAAmB,MAAA,UACAnB,EAAAoB,SAAA,EACApB,EAAAC,OACAD,EAAAqB,QACArB,EAAA1wB,QAAA,GACA0wB,EAAAsB,YAIAtB,EAAAjsB,GAAAktB,EACAjB,EAAAznB,YAAA0oB,EACAjB,EAAAppB,KAAAqqB,EACAjB,EAAA1nB,IAAA2oB,EACAjB,EAAAhoB,eAAAipB,EACAjB,EAAA3nB,mBAAA4oB,EACAjB,EAAAxrB,KAAAysB,EAEAjB,EAAAuB,QAAA,SAAAC,GACA,KAAA,IAAA9d,OAAA,qCAGAsc,EAAAyB,IAAA,WAA2B,MAAA,KAC3BzB,EAAA0B,MAAA,SAAAC,GACA,KAAA,IAAAje,OAAA,mCAEAsc,EAAA4B,MAAA,WAA4B,MAAA,KxC2gLtB,SAAS70B,EAAQD,GyCjmLvB,QAAA+0B,GAAA3U,GACA,KAAA/f,eAAA00B,IACA,KAAA,IAAA5xB,WAAA,uCAIA,IAFA9C,KAAA20B,QAEA5U,EACA,GAAAA,YAAA2U,IACA,kBAAA/D,MAAA5Q,YAAA4Q,KACA5Q,EAAA/X,QAAA,SAAA7G,EAAA8C,GACAjE,KAAA+f,IAAA9b,EAAA9C,IACOnB,UACP,CAAA,IAAAoK,MAAA+D,QAAA4R,GAKA,KAAA,IAAAjd,WAAA,mBAJAid,GAAA/X,QAAA,SAAA4sB,GACA50B,KAAA+f,IAAA6U,EAAA,GAAAA,EAAA,KACO50B,OA+DP,QAAA60B,GAAAxhB,EAAA0C,GACA,MAAA1C,KAAA0C,GAAA1C,IAAAA,GAAA0C,IAAAA,EAGA,QAAA2a,GAAAnZ,EAAAI,EAAA7T,GACA9D,KAAAiE,IAAAsT,EACAvX,KAAAmB,MAAAwW,EACA3X,KAAA80B,OAAAhxB,EAGA,QAAAixB,GAAAC,EAAAzd,GACA,IAAA,GAAAzT,GAAA,EAAAmS,EAAA,IAAAsB,EAAAtT,EAAAgS,EACAlK,EAAAtL,KAAAu0B,EAAA/wB,GACAA,EAAAgS,EAAAnS,IACA,GAAA+wB,EAAAG,EAAA/wB,GAAAA,IAAAsT,GACA,MAAAyd,GAAA/wB,GAIA,QAAA8b,GAAAiV,EAAAzd,EAAAI,GACA,IAAA,GAAA7T,GAAA,EAAAmS,EAAA,IAAAsB,EAAAtT,EAAAgS,EACAlK,EAAAtL,KAAAu0B,EAAA/wB,GACAA,EAAAgS,EAAAnS,IACA,GAAA+wB,EAAAG,EAAA/wB,GAAAA,IAAAsT,GAEA,YADAyd,EAAA/wB,GAAA9C,MAAAwW,EAIAqd,GAAA5L,OACA4L,EAAA/wB,GAAA,GAAAysB,GAAAnZ,EAAAI,EAAA1T,GA/GA,GAAA8H,GAAA9K,OAAAiC,UAAA6I,cAEAnM,GAAAD,QAAA+0B,EAuBAA,EAAAxxB,UAAA8E,QAAA,SAAAuB,EAAAqmB,GACAA,EAAAA,GAAA5vB,KACAiB,OAAAuM,KAAAxN,KAAAi1B,OAAAjtB,QAAA,SAAAuP,GACA,SAAAA,GACAhO,EAAA9I,KAAAmvB,EAAA5vB,KAAAi1B,MAAA1d,GAAApW,MAAAnB,KAAAi1B,MAAA1d,GAAAtT,MACGjE,OAGH00B,EAAAxxB,UAAAmvB,IAAA,SAAA9a,GACA,QAAAwd,EAAA/0B,KAAAi1B,MAAA1d,IAGAmd,EAAAxxB,UAAA+B,IAAA,SAAAsS,GACA,GAAA2d,GAAAH,EAAA/0B,KAAAi1B,MAAA1d,EACA,OAAA2d,IAAAA,EAAA/zB,OAGAuzB,EAAAxxB,UAAA6c,IAAA,SAAAxI,EAAAI,GACAoI,EAAA/f,KAAAi1B,MAAA1d,EAAAI,IAGA+c,EAAAxxB,UAAAwxB,UAAA,SAAAnd,GACA,GAAA2d,GAAAH,EAAA/0B,KAAAi1B,MAAA1d,EACA2d,WACAl1B,MAAAi1B,MAAAC,EAAAJ,QACA90B,KAAAi1B,MAAA7L,SAIAsL,EAAAxxB,UAAAyxB,MAAA,WACA,GAAAK,GAAA/zB,OAAAkC,OAAA,KACA6xB,GAAA5L,KAAA,EAEAnoB,OAAAC,eAAAlB,KAAA,SACAmB,MAAA6zB,EACA3xB,YAAA,EACAE,cAAA,EACAD,UAAA,KAIArC,OAAAC,eAAAwzB,EAAAxxB,UAAA,QACA+B,IAAA,WACA,MAAAjF,MAAAi1B,MAAA7L,MAEArJ,IAAA,SAAAnS,KACAvK,YAAA,EACAE,cAAA,IAGAmxB,EAAAxxB,UAAAsuB,OACAkD,EAAAxxB,UAAAsK,KACAknB,EAAAxxB,UAAAiyB,QAAA,WACA,KAAA,IAAA5e,OAAA,mDzC8oLM,SAAS3W,EAAQD,EAASS,I0C5tLhC,SAAAg1B,EAAAvC,GA4HA,QAAAjB,GAAA9wB,EAAA+wB,GAEA,GAAAwD,IACAC,QACAC,QAAAC,EAkBA,OAfA5qB,WAAA7G,QAAA,IAAAsxB,EAAAI,MAAA7qB,UAAA,IACAA,UAAA7G,QAAA,IAAAsxB,EAAAK,OAAA9qB,UAAA,IACA+qB,EAAA9D,GAEAwD,EAAAO,WAAA/D,EACGA,GAEHlyB,EAAAk2B,QAAAR,EAAAxD,GAGAiE,EAAAT,EAAAO,cAAAP,EAAAO,YAAA,GACAE,EAAAT,EAAAI,SAAAJ,EAAAI,MAAA,GACAK,EAAAT,EAAAK,UAAAL,EAAAK,QAAA,GACAI,EAAAT,EAAAU,iBAAAV,EAAAU,eAAA,GACAV,EAAAK,SAAAL,EAAAE,QAAAS,GACAC,EAAAZ,EAAAv0B,EAAAu0B,EAAAI,OAoCA,QAAAO,GAAAlE,EAAAoE,GACA,GAAAC,GAAAvE,EAAAwE,OAAAF,EAEA,OAAAC,GACA,KAAAvE,EAAA8D,OAAAS,GAAA,GAAA,IAAArE,EACA,KAAAF,EAAA8D,OAAAS,GAAA,GAAA,IAEArE,EAKA,QAAA0D,GAAA1D,EAAAoE,GACA,MAAApE,GAIA,QAAAuE,GAAA7mB,GACA,GAAA8mB,KAMA,OAJA9mB,GAAAxH,QAAA,SAAAgnB,EAAAuH,GACAD,EAAAtH,IAAA,IAGAsH,EAIA,QAAAL,GAAAZ,EAAAl0B,EAAAq1B,GAGA,GAAAnB,EAAAU,eACA50B,GACA8L,EAAA9L,EAAAywB,UAEAzwB,EAAAywB,UAAAjyB,EAAAiyB,WAEAzwB,EAAAiC,aAAAjC,EAAAiC,YAAAF,YAAA/B,GAAA,CACA,GAAAs1B,GAAAt1B,EAAAywB,QAAA4E,EAAAnB,EAIA,OAHAjnB,GAAAqoB,KACAA,EAAAR,EAAAZ,EAAAoB,EAAAD,IAEAC,EAIA,GAAAC,GAAAC,EAAAtB,EAAAl0B,EACA,IAAAu1B,EACA,MAAAA,EAIA,IAAAlpB,GAAAvM,OAAAuM,KAAArM,GACAy1B,EAAAP,EAAA7oB,EAQA,IANA6nB,EAAAO,aACApoB,EAAAvM,OAAA41B,oBAAA11B,IAKA21B,EAAA31B,KACAqM,EAAAtE,QAAA,YAAA,GAAAsE,EAAAtE,QAAA,gBAAA,GACA,MAAA6tB,GAAA51B,EAIA,IAAA,IAAAqM,EAAAzJ,OAAA,CACA,GAAAkJ,EAAA9L,GAAA,CACA,GAAAkzB,GAAAlzB,EAAAkzB,KAAA,KAAAlzB,EAAAkzB,KAAA,EACA,OAAAgB,GAAAE,QAAA,YAAAlB,EAAA,IAAA,WAEA,GAAA2C,EAAA71B,GACA,MAAAk0B,GAAAE,QAAA0B,OAAA/zB,UAAAuK,SAAAhN,KAAAU,GAAA,SAEA,IAAA+1B,EAAA/1B,GACA,MAAAk0B,GAAAE,QAAApF,KAAAjtB,UAAAuK,SAAAhN,KAAAU,GAAA,OAEA,IAAA21B,EAAA31B,GACA,MAAA41B,GAAA51B,GAIA,GAAAg2B,GAAA,GAAA3nB,GAAA,EAAA4nB,GAAA,IAA4C,IAS5C,IANAjpB,EAAAhN,KACAqO,GAAA,EACA4nB,GAAA,IAAA,MAIAnqB,EAAA9L,GAAA,CACA,GAAAyM,GAAAzM,EAAAkzB,KAAA,KAAAlzB,EAAAkzB,KAAA,EACA8C,GAAA,aAAAvpB,EAAA,IAkBA,GAdAopB,EAAA71B,KACAg2B,EAAA,IAAAF,OAAA/zB,UAAAuK,SAAAhN,KAAAU,IAIA+1B,EAAA/1B,KACAg2B,EAAA,IAAAhH,KAAAjtB,UAAAm0B,YAAA52B,KAAAU,IAIA21B,EAAA31B,KACAg2B,EAAA,IAAAJ,EAAA51B,IAGA,IAAAqM,EAAAzJ,UAAAyL,GAAA,GAAArO,EAAA4C,QACA,MAAAqzB,GAAA,GAAAD,EAAAC,EAAA,EAGA,IAAA,EAAAZ,EACA,MAAAQ,GAAA71B,GACAk0B,EAAAE,QAAA0B,OAAA/zB,UAAAuK,SAAAhN,KAAAU,GAAA,UAEAk0B,EAAAE,QAAA,WAAA,UAIAF,GAAAC,KAAAxsB,KAAA3H,EAEA,IAAAm2B,EAWA,OATAA,GADA9nB,EACA+nB,EAAAlC,EAAAl0B,EAAAq1B,EAAAI,EAAAppB,GAEAA,EAAA+d,IAAA,SAAAtnB,GACA,MAAAuzB,GAAAnC,EAAAl0B,EAAAq1B,EAAAI,EAAA3yB,EAAAuL,KAIA6lB,EAAAC,KAAA9C,MAEAiF,EAAAH,EAAAH,EAAAC,GAIA,QAAAT,GAAAtB,EAAAl0B,GACA,GAAA20B,EAAA30B,GACA,MAAAk0B,GAAAE,QAAA,YAAA,YACA,IAAAnnB,EAAAjN,GAAA,CACA,GAAAu2B,GAAA,IAAAC,KAAAC,UAAAz2B,GAAA6O,QAAA,SAAA,IACAA,QAAA,KAAA,OACAA,QAAA,OAAA,KAAA,GACA,OAAAqlB,GAAAE,QAAAmC,EAAA,UAEA,MAAAG,GAAA12B,GACAk0B,EAAAE,QAAA,GAAAp0B,EAAA,UACAw0B,EAAAx0B,GACAk0B,EAAAE,QAAA,GAAAp0B,EAAA,WAEA22B,EAAA32B,GACAk0B,EAAAE,QAAA,OAAA,QADA,OAKA,QAAAwB,GAAA51B,GACA,MAAA,IAAAoV,MAAArT,UAAAuK,SAAAhN,KAAAU,GAAA,IAIA,QAAAo2B,GAAAlC,EAAAl0B,EAAAq1B,EAAAI,EAAAppB,GAEA,IAAA,GADA8pB,MACAxzB,EAAA,EAAAoG,EAAA/I,EAAA4C,OAAmCmG,EAAApG,IAAOA,EAC1CiI,EAAA5K,EAAAmN,OAAAxK,IACAwzB,EAAAxuB,KAAA0uB,EAAAnC,EAAAl0B,EAAAq1B,EAAAI,EACAtoB,OAAAxK,IAAA,IAEAwzB,EAAAxuB,KAAA,GASA,OANA0E,GAAAxF,QAAA,SAAA/D,GACAA,EAAA8zB,MAAA,UACAT,EAAAxuB,KAAA0uB,EAAAnC,EAAAl0B,EAAAq1B,EAAAI,EACA3yB,GAAA,MAGAqzB,EAIA,QAAAE,GAAAnC,EAAAl0B,EAAAq1B,EAAAI,EAAA3yB,EAAAuL,GACA,GAAA6kB,GAAAvC,EAAAjtB,CAsCA,IArCAA,EAAA5D,OAAA6D,yBAAA3D,EAAA8C,KAAyD9C,MAAAA,EAAA8C,IACzDY,EAAAI,IAEA6sB,EADAjtB,EAAAkb,IACAsV,EAAAE,QAAA,kBAAA,WAEAF,EAAAE,QAAA,WAAA,WAGA1wB,EAAAkb,MACA+R,EAAAuD,EAAAE,QAAA,WAAA,YAGAxpB,EAAA6qB,EAAA3yB,KACAowB,EAAA,IAAApwB,EAAA,KAEA6tB,IACAuD,EAAAC,KAAApsB,QAAArE,EAAA1D,OAAA,GAEA2wB,EADAgG,EAAAtB,GACAP,EAAAZ,EAAAxwB,EAAA1D,MAAA,MAEA80B,EAAAZ,EAAAxwB,EAAA1D,MAAAq1B,EAAA,GAEA1E,EAAA5oB,QAAA,MAAA,KAEA4oB,EADAtiB,EACAsiB,EAAAK,MAAA,MAAA5G,IAAA,SAAAyM,GACA,MAAA,KAAAA,IACW5F,KAAA,MAAA6F,OAAA,GAEX,KAAAnG,EAAAK,MAAA,MAAA5G,IAAA,SAAAyM,GACA,MAAA,MAAAA,IACW5F,KAAA,QAIXN,EAAAuD,EAAAE,QAAA,aAAA,YAGAO,EAAAzB,GAAA,CACA,GAAA7kB,GAAAvL,EAAA8zB,MAAA,SACA,MAAAjG,EAEAuC,GAAAsD,KAAAC,UAAA,GAAA3zB,GACAowB,EAAA0D,MAAA,iCACA1D,EAAAA,EAAA4D,OAAA,EAAA5D,EAAAtwB,OAAA,GACAswB,EAAAgB,EAAAE,QAAAlB,EAAA,UAEAA,EAAAA,EAAArkB,QAAA,KAAA,OACAA,QAAA,OAAA,KACAA,QAAA,WAAA,KACAqkB,EAAAgB,EAAAE,QAAAlB,EAAA,WAIA,MAAAA,GAAA,KAAAvC,EAIA,QAAA2F,GAAAH,EAAAH,EAAAC,GACA,GAAAc,GAAA,EACAn0B,EAAAuzB,EAAAa,OAAA,SAAA3H,EAAA4H,GAGA,MAFAF,KACAE,EAAAlvB,QAAA,OAAA,GAAAgvB,IACA1H,EAAA4H,EAAApoB,QAAA,kBAAA,IAAAjM,OAAA,GACG,EAEH,OAAAA,GAAA,GACAqzB,EAAA,IACA,KAAAD,EAAA,GAAAA,EAAA,OACA,IACAG,EAAAlF,KAAA,SACA,IACAgF,EAAA,GAGAA,EAAA,GAAAD,EAAA,IAAAG,EAAAlF,KAAA,MAAA,IAAAgF,EAAA,GAMA,QAAAjpB,GAAAkqB,GACA,MAAAjuB,OAAA+D,QAAAkqB,GAIA,QAAA1C,GAAA2C,GACA,MAAA,iBAAAA,GAIA,QAAAR,GAAAQ,GACA,MAAA,QAAAA,EAIA,QAAAC,GAAAD,GACA,MAAA,OAAAA,EAIA,QAAAT,GAAAS,GACA,MAAA,gBAAAA,GAIA,QAAAlqB,GAAAkqB,GACA,MAAA,gBAAAA,GAIA,QAAAE,GAAAF,GACA,MAAA,gBAAAA,GAIA,QAAAxC,GAAAwC,GACA,MAAA,UAAAA,EAIA,QAAAtB,GAAAyB,GACA,MAAA5rB,GAAA4rB,IAAA,oBAAAprB,EAAAorB,GAIA,QAAA5rB,GAAAyrB,GACA,MAAA,gBAAAA,IAAA,OAAAA,EAIA,QAAApB,GAAAlgB,GACA,MAAAnK,GAAAmK,IAAA,kBAAA3J,EAAA2J,GAIA,QAAA8f,GAAAre,GACA,MAAA5L,GAAA4L,KACA,mBAAApL,EAAAoL,IAAAA,YAAAlC,QAIA,QAAAtJ,GAAAqrB,GACA,MAAA,kBAAAA,GAIA,QAAAI,GAAAJ,GACA,MAAA,QAAAA,GACA,iBAAAA,IACA,gBAAAA,IACA,gBAAAA,IACA,gBAAAA,IACA,mBAAAA,GAMA,QAAAjrB,GAAAsrB,GACA,MAAA13B,QAAAiC,UAAAuK,SAAAhN,KAAAk4B,GAIA,QAAAC,GAAAhrB,GACA,MAAA,IAAAA,EAAA,IAAAA,EAAAH,SAAA,IAAAG,EAAAH,SAAA,IAQA,QAAAorB,KACA,GAAA7hB,GAAA,GAAAmZ,MACA2I,GAAAF,EAAA5hB,EAAA+hB,YACAH,EAAA5hB,EAAAgiB,cACAJ,EAAA5hB,EAAAiiB,eAAA7G,KAAA,IACA,QAAApb,EAAAkiB,UAAAC,EAAAniB,EAAAoiB,YAAAN,GAAA1G,KAAA,KAqCA,QAAArmB,GAAAjL,EAAAu4B,GACA,MAAAp4B,QAAAiC,UAAA6I,eAAAtL,KAAAK,EAAAu4B,GAnjBA,GAAAC,GAAA,UACA35B,GAAA45B,OAAA,SAAAC,GACA,IAAAprB,EAAAorB,GAAA,CAEA,IAAA,GADAC,MACA31B,EAAA,EAAmBA,EAAA8G,UAAA7G,OAAsBD,IACzC21B,EAAA3wB,KAAA8oB,EAAAhnB,UAAA9G,IAEA,OAAA21B,GAAArH,KAAA,KAsBA,IAAA,GAnBAtuB,GAAA,EACA4G,EAAAE,UACAD,EAAAD,EAAA3G,OACA+tB,EAAAxjB,OAAAkrB,GAAAxpB,QAAAspB,EAAA,SAAAtyB,GACA,GAAA,OAAAA,EAAA,MAAA,GACA,IAAAlD,GAAA6G,EAAA,MAAA3D,EACA,QAAAA,GACA,IAAA,KAAA,MAAAsH,QAAA5D,EAAA5G,KACA,KAAA,KAAA,MAAA41B,QAAAhvB,EAAA5G,KACA,KAAA,KACA,IACA,MAAA6zB,MAAAC,UAAAltB,EAAA5G,MACS,MAAA61B,GACT,MAAA,aAEA,QACA,MAAA3yB,MAGAA,EAAA0D,EAAA5G,GAAuB6G,EAAA7G,EAASkD,EAAA0D,IAAA5G,GAEhCguB,GADAgG,EAAA9wB,KAAA6F,EAAA7F,GACA,IAAAA,EAEA,IAAA4qB,EAAA5qB,EAGA,OAAA8qB,IAOAnyB,EAAAi6B,UAAA,SAAArwB,EAAAswB,GAaA,QAAAC,KACA,IAAAC,EAAA,CACA,GAAAlH,EAAAmH,iBACA,KAAA,IAAAzjB,OAAAsjB,EACOhH,GAAAoH,iBACPpe,QAAAqe,MAAAL,GAEAhe,QAAAsS,MAAA0L,GAEAE,GAAA,EAEA,MAAAxwB,GAAAuB,MAAA9K,KAAA4K,WAtBA,GAAAkrB,EAAAV,EAAAvC,SACA,MAAA,YACA,MAAAlzB,GAAAi6B,UAAArwB,EAAAswB,GAAA/uB,MAAA9K,KAAA4K,WAIA,IAAAioB,EAAAsH,iBAAA,EACA,MAAA5wB,EAGA,IAAAwwB,IAAA,CAeA,OAAAD,GAIA,IACAM,GADAC,IAEA16B,GAAA26B,SAAA,SAAAva,GAIA,GAHA+V,EAAAsE,KACAA,EAAAvH,EAAAC,IAAAyH,YAAA,IACAxa,EAAAA,EAAAya,eACAH,EAAAta,GACA,GAAA,GAAAkX,QAAA,MAAAlX,EAAA,MAAA,KAAAtU,KAAA2uB,GAAA,CACA,GAAAK,GAAA5H,EAAA4H,GACAJ,GAAAta,GAAA,WACA,GAAA8Z,GAAAl6B,EAAA45B,OAAAzuB,MAAAnL,EAAAiL,UACAiR,SAAAsS,MAAA,YAAApO,EAAA0a,EAAAZ,QAGAQ,GAAAta,GAAA,YAGA,OAAAsa,GAAAta,IAoCApgB,EAAAiyB,QAAAA,EAIAA,EAAA8D,QACAgF,MAAA,EAAA,IACAC,QAAA,EAAA,IACAC,WAAA,EAAA,IACA5f,SAAA,EAAA,IACA6f,OAAA,GAAA;AACAC,MAAA,GAAA,IACAC,OAAA,GAAA,IACAC,MAAA,GAAA,IACAC,MAAA,GAAA,IACAC,OAAA,GAAA,IACAC,SAAA,GAAA,IACAC,KAAA,GAAA,IACAC,QAAA,GAAA,KAIAzJ,EAAAwE,QACAkF,QAAA,OACAC,OAAA,SACAC,UAAA,SACAz2B,UAAA,OACA02B,OAAA,OACAC,OAAA,QACAC,KAAA,UAEAC,OAAA,OAkRAj8B,EAAAwO,QAAAA,EAKAxO,EAAAg2B,UAAAA,EAKAh2B,EAAAm4B,OAAAA,EAKAn4B,EAAA44B,kBAAAA,EAKA54B,EAAAk4B,SAAAA,EAKAl4B,EAAAyO,SAAAA,EAKAzO,EAAA64B,SAAAA,EAKA74B,EAAAm2B,YAAAA,EAKAn2B,EAAAq3B,SAAAA,EAKAr3B,EAAAkN,SAAAA,EAKAlN,EAAAu3B,OAAAA,EAMAv3B,EAAAm3B,QAAAA,EAKAn3B,EAAAsN,WAAAA,EAUAtN,EAAA+4B,YAAAA,EAEA/4B,EAAAk8B,SAAAz7B,EAAA,GAYA,IAAA+4B,IAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MACA,MAAA,MAAA,MAaAx5B,GAAAgW,IAAA,WACAkG,QAAAlG,IAAA,UAAAkjB,IAAAl5B,EAAA45B,OAAAzuB,MAAAnL,EAAAiL,aAiBAjL,EAAAm8B,SAAA17B,EAAA,IAEAT,EAAAk2B,QAAA,SAAAkG,EAAAtzB,GAEA,IAAAA,IAAAoE,EAAApE,GAAA,MAAAszB,EAIA,KAFA,GAAAvuB,GAAAvM,OAAAuM,KAAA/E,GACA3E,EAAA0J,EAAAzJ,OACAD,KACAi4B,EAAAvuB,EAAA1J,IAAA2E,EAAA+E,EAAA1J,GAEA,OAAAi4B,M1CquL8Bt7B,KAAKd,EAAU,WAAa,MAAOK,SAAYI,EAAoB,MAI3F,SAASR,EAAQD,G2C7yMvBC,EAAAD,QAAA,SAAA24B,GACA,MAAAA,IAAA,gBAAAA,IACA,kBAAAA,GAAAzX,MACA,kBAAAyX,GAAA0D,MACA,kBAAA1D,GAAA2D,Y3CozMM,SAASr8B,EAAQD,G4CxzMvB,kBAAAsB,QAAAkC,OAEAvD,EAAAD,QAAA,SAAAu8B,EAAAC,GACAD,EAAAE,OAAAD,EACAD,EAAAh5B,UAAAjC,OAAAkC,OAAAg5B,EAAAj5B,WACAE,aACAjC,MAAA+6B,EACA74B,YAAA,EACAC,UAAA,EACAC,cAAA,MAMA3D,EAAAD,QAAA,SAAAu8B,EAAAC,GACAD,EAAAE,OAAAD,CACA,IAAAE,GAAA,YACAA,GAAAn5B,UAAAi5B,EAAAj5B,UACAg5B,EAAAh5B,UAAA,GAAAm5B,GACAH,EAAAh5B,UAAAE,YAAA84B,I5Ci0MM,SAASt8B,EAAQD,G6Ch1MvB,QAAAkxB,GAAAyL,GACA,GAAA5M,GAAA1vB,IASA,IARA0vB,YAAAmB,KACAnB,EAAA,GAAAmB,IAGAnB,EAAAa,KAAA,KACAb,EAAA2B,KAAA,KACA3B,EAAA3rB,OAAA,EAEAu4B,GAAA,kBAAAA,GAAAt0B,QACAs0B,EAAAt0B,QAAA,SAAAkqB,GACAxC,EAAA5mB,KAAAopB,SAEG,IAAAtnB,UAAA7G,OAAA,EACH,IAAA,GAAAD,GAAA,EAAAoG,EAAAU,UAAA7G,OAAyCmG,EAAApG,EAAOA,IAChD4rB,EAAA5mB,KAAA8B,UAAA9G,GAIA,OAAA4rB,GAySA,QAAA5mB,GAAA4mB,EAAAwC,GACAxC,EAAAa,KAAA,GAAAgM,GAAArK,EAAAxC,EAAAa,KAAA,KAAAb,GACAA,EAAA2B,OACA3B,EAAA2B,KAAA3B,EAAAa,MAEAb,EAAA3rB,SAGA,QAAAuuB,GAAA5C,EAAAwC,GACAxC,EAAA2B,KAAA,GAAAkL,GAAArK,EAAA,KAAAxC,EAAA2B,KAAA3B,GACAA,EAAAa,OACAb,EAAAa,KAAAb,EAAA2B,MAEA3B,EAAA3rB,SAGA,QAAAw4B,GAAAp7B,EAAAqvB,EAAAc,EAAAgL,GACA,MAAAt8B,gBAAAu8B,IAIAv8B,KAAAs8B,KAAAA,EACAt8B,KAAAmB,MAAAA,EAEAqvB,GACAA,EAAAc,KAAAtxB,KACAA,KAAAwwB,KAAAA,GAEAxwB,KAAAwwB,KAAA,UAGAc,GACAA,EAAAd,KAAAxwB,KACAA,KAAAsxB,KAAAA,GAEAtxB,KAAAsxB,KAAA,OAjBA,GAAAiL,GAAAp7B,EAAAqvB,EAAAc,EAAAgL,GApVA18B,EAAAD,QAAAkxB,EAEAA,EAAA0L,KAAAA,EACA1L,EAAA1tB,OAAA0tB,EAyBAA,EAAA3tB,UAAAutB,WAAA,SAAAd,GACA,GAAAA,EAAA2M,OAAAt8B,KACA,KAAA,IAAAuW,OAAA,mDAGA,IAAA+a,GAAA3B,EAAA2B,KACAd,EAAAb,EAAAa,IAEAc,KACAA,EAAAd,KAAAA,GAGAA,IACAA,EAAAc,KAAAA,GAGA3B,IAAA3vB,KAAAqxB,OACArxB,KAAAqxB,KAAAC,GAEA3B,IAAA3vB,KAAAuwB,OACAvwB,KAAAuwB,KAAAC,GAGAb,EAAA2M,KAAAv4B,SACA4rB,EAAA2B,KAAA,KACA3B,EAAAa,KAAA,KACAb,EAAA2M,KAAA,MAGAzL,EAAA3tB,UAAA+sB,YAAA,SAAAN,GACA,GAAAA,IAAA3vB,KAAAqxB,KAAA,CAIA1B,EAAA2M,MACA3M,EAAA2M,KAAA7L,WAAAd,EAGA,IAAA0B,GAAArxB,KAAAqxB,IACA1B,GAAA2M,KAAAt8B,KACA2vB,EAAA2B,KAAAD,EACAA,IACAA,EAAAb,KAAAb,GAGA3vB,KAAAqxB,KAAA1B,EACA3vB,KAAAuwB,OACAvwB,KAAAuwB,KAAAZ,GAEA3vB,KAAA+D,WAGA8sB,EAAA3tB,UAAAs5B,SAAA,SAAA7M,GACA,GAAAA,IAAA3vB,KAAAuwB,KAAA,CAIAZ,EAAA2M,MACA3M,EAAA2M,KAAA7L,WAAAd,EAGA,IAAAY,GAAAvwB,KAAAuwB,IACAZ,GAAA2M,KAAAt8B,KACA2vB,EAAAa,KAAAD,EACAA,IACAA,EAAAe,KAAA3B,GAGA3vB,KAAAuwB,KAAAZ,EACA3vB,KAAAqxB,OACArxB,KAAAqxB,KAAA1B,GAEA3vB,KAAA+D,WAGA8sB,EAAA3tB,UAAA4F,KAAA,WACA,IAAA,GAAAhF,GAAA,EAAAoG,EAAAU,UAAA7G,OAAuCmG,EAAApG,EAAOA,IAC9CgF,EAAA9I,KAAA4K,UAAA9G,GAEA,OAAA9D,MAAA+D,QAGA8sB,EAAA3tB,UAAAovB,QAAA,WACA,IAAA,GAAAxuB,GAAA,EAAAoG,EAAAU,UAAA7G,OAAuCmG,EAAApG,EAAOA,IAC9CwuB,EAAAtyB,KAAA4K,UAAA9G,GAEA,OAAA9D,MAAA+D,QAGA8sB,EAAA3tB,UAAAsvB,IAAA,WACA,GAAAxyB,KAAAuwB,KAAA,CAGA,GAAA2E,GAAAl1B,KAAAuwB,KAAApvB,KAIA,OAHAnB,MAAAuwB,KAAAvwB,KAAAuwB,KAAAC,KACAxwB,KAAAuwB,KAAAe,KAAA,KACAtxB,KAAA+D,SACAmxB,IAGArE,EAAA3tB,UAAAu5B,MAAA,WACA,GAAAz8B,KAAAqxB,KAAA,CAGA,GAAA6D,GAAAl1B,KAAAqxB,KAAAlwB,KAIA,OAHAnB,MAAAqxB,KAAArxB,KAAAqxB,KAAAC,KACAtxB,KAAAqxB,KAAAb,KAAA,KACAxwB,KAAA+D,SACAmxB,IAGArE,EAAA3tB,UAAA8E,QAAA,SAAAuB,EAAAqmB,GACAA,EAAAA,GAAA5vB,IACA,KAAA,GAAAswB,GAAAtwB,KAAAqxB,KAAAvtB,EAAA,EAAqC,OAAAwsB,EAAiBxsB,IACtDyF,EAAA9I,KAAAmvB,EAAAU,EAAAnvB,MAAA2C,EAAA9D,MACAswB,EAAAA,EAAAgB,MAIAT,EAAA3tB,UAAAw5B,eAAA,SAAAnzB,EAAAqmB,GACAA,EAAAA,GAAA5vB,IACA,KAAA,GAAAswB,GAAAtwB,KAAAuwB,KAAAzsB,EAAA9D,KAAA+D,OAAA,EAAmD,OAAAusB,EAAiBxsB,IACpEyF,EAAA9I,KAAAmvB,EAAAU,EAAAnvB,MAAA2C,EAAA9D,MACAswB,EAAAA,EAAAE,MAIAK,EAAA3tB,UAAA+B,IAAA,SAAA2I,GACA,IAAA,GAAA9J,GAAA,EAAAwsB,EAAAtwB,KAAAqxB,KAAqC,OAAAf,GAAA1iB,EAAA9J,EAA0BA,IAE/DwsB,EAAAA,EAAAgB,IAEA,OAAAxtB,KAAA8J,GAAA,OAAA0iB,EACAA,EAAAnvB,MADA,QAKA0vB,EAAA3tB,UAAAy5B,WAAA,SAAA/uB,GACA,IAAA,GAAA9J,GAAA,EAAAwsB,EAAAtwB,KAAAuwB,KAAqC,OAAAD,GAAA1iB,EAAA9J,EAA0BA,IAE/DwsB,EAAAA,EAAAE,IAEA,OAAA1sB,KAAA8J,GAAA,OAAA0iB,EACAA,EAAAnvB,MADA,QAKA0vB,EAAA3tB,UAAAqoB,IAAA,SAAAhiB,EAAAqmB,GACAA,EAAAA,GAAA5vB,IAEA,KAAA,GADAk1B,GAAA,GAAArE,GACAP,EAAAtwB,KAAAqxB,KAA8B,OAAAf,GAC9B4E,EAAApsB,KAAAS,EAAA9I,KAAAmvB,EAAAU,EAAAnvB,MAAAnB,OACAswB,EAAAA,EAAAgB,IAEA,OAAA4D,IAGArE,EAAA3tB,UAAA05B,WAAA,SAAArzB,EAAAqmB,GACAA,EAAAA,GAAA5vB,IAEA,KAAA,GADAk1B,GAAA,GAAArE,GACAP,EAAAtwB,KAAAuwB,KAA8B,OAAAD,GAC9B4E,EAAApsB,KAAAS,EAAA9I,KAAAmvB,EAAAU,EAAAnvB,MAAAnB,OACAswB,EAAAA,EAAAE,IAEA,OAAA0E,IAGArE,EAAA3tB,UAAAi1B,OAAA,SAAA5uB,EAAAszB,GACA,GAAAC,GACAxM,EAAAtwB,KAAAqxB,IACA,IAAAzmB,UAAA7G,OAAA,EACA+4B,EAAAD,MACG,CAAA,IAAA78B,KAAAqxB,KAIH,KAAA,IAAAvuB,WAAA,6CAHAwtB,GAAAtwB,KAAAqxB,KAAAC,KACAwL,EAAA98B,KAAAqxB,KAAAlwB,MAKA,IAAA,GAAA2C,GAAA,EAAiB,OAAAwsB,EAAiBxsB,IAClCg5B,EAAAvzB,EAAAuzB,EAAAxM,EAAAnvB,MAAA2C,GACAwsB,EAAAA,EAAAgB,IAGA,OAAAwL,IAGAjM,EAAA3tB,UAAA65B,cAAA,SAAAxzB,EAAAszB,GACA,GAAAC,GACAxM,EAAAtwB,KAAAuwB,IACA,IAAA3lB,UAAA7G,OAAA,EACA+4B,EAAAD,MACG,CAAA,IAAA78B,KAAAuwB,KAIH,KAAA,IAAAztB,WAAA,6CAHAwtB,GAAAtwB,KAAAuwB,KAAAC,KACAsM,EAAA98B,KAAAuwB,KAAApvB,MAKA,IAAA,GAAA2C,GAAA9D,KAAA+D,OAAA,EAA+B,OAAAusB,EAAiBxsB,IAChDg5B,EAAAvzB,EAAAuzB,EAAAxM,EAAAnvB,MAAA2C,GACAwsB,EAAAA,EAAAE,IAGA,OAAAsM,IAGAjM,EAAA3tB,UAAAquB,QAAA,WAEA,IAAA,GADAmB,GAAA,GAAAtoB,OAAApK,KAAA+D,QACAD,EAAA,EAAAwsB,EAAAtwB,KAAAqxB,KAAqC,OAAAf,EAAiBxsB,IACtD4uB,EAAA5uB,GAAAwsB,EAAAnvB,MACAmvB,EAAAA,EAAAgB,IAEA,OAAAoB,IAGA7B,EAAA3tB,UAAA85B,eAAA,WAEA,IAAA,GADAtK,GAAA,GAAAtoB,OAAApK,KAAA+D,QACAD,EAAA,EAAAwsB,EAAAtwB,KAAAuwB,KAAqC,OAAAD,EAAiBxsB,IACtD4uB,EAAA5uB,GAAAwsB,EAAAnvB,MACAmvB,EAAAA,EAAAE,IAEA,OAAAkC,IAGA7B,EAAA3tB,UAAAoN,MAAA,SAAA2sB,EAAAC,GACAA,EAAAA,GAAAl9B,KAAA+D,OACA,EAAAm5B,IACAA,GAAAl9B,KAAA+D,QAEAk5B,EAAAA,GAAA,EACA,EAAAA,IACAA,GAAAj9B,KAAA+D,OAEA,IAAA0yB,GAAA,GAAA5F,EACA,IAAAoM,EAAAC,GAAA,EAAAA,EACA,MAAAzG,EAEA,GAAAwG,IACAA,EAAA,GAEAC,EAAAl9B,KAAA+D,SACAm5B,EAAAl9B,KAAA+D,OAEA,KAAA,GAAAD,GAAA,EAAAwsB,EAAAtwB,KAAAqxB,KAAqC,OAAAf,GAAA2M,EAAAn5B,EAA6BA,IAClEwsB,EAAAA,EAAAgB,IAEA,MAAQ,OAAAhB,GAAA4M,EAAAp5B,EAA2BA,IAAAwsB,EAAAA,EAAAgB,KACnCmF,EAAA3tB,KAAAwnB,EAAAnvB,MAEA,OAAAs1B,IAGA5F,EAAA3tB,UAAAi6B,aAAA,SAAAF,EAAAC,GACAA,EAAAA,GAAAl9B,KAAA+D,OACA,EAAAm5B,IACAA,GAAAl9B,KAAA+D,QAEAk5B,EAAAA,GAAA,EACA,EAAAA,IACAA,GAAAj9B,KAAA+D,OAEA,IAAA0yB,GAAA,GAAA5F,EACA,IAAAoM,EAAAC,GAAA,EAAAA,EACA,MAAAzG,EAEA,GAAAwG,IACAA,EAAA,GAEAC,EAAAl9B,KAAA+D,SACAm5B,EAAAl9B,KAAA+D,OAEA,KAAA,GAAAD,GAAA9D,KAAA+D,OAAAusB,EAAAtwB,KAAAuwB,KAA+C,OAAAD,GAAAxsB,EAAAo5B,EAA2Bp5B,IAC1EwsB,EAAAA,EAAAE,IAEA,MAAQ,OAAAF,GAAAxsB,EAAAm5B,EAA6Bn5B,IAAAwsB,EAAAA,EAAAE,KACrCiG,EAAA3tB,KAAAwnB,EAAAnvB,MAEA,OAAAs1B,IAGA5F,EAAA3tB,UAAAk6B,QAAA,WAGA,IAAA,GAFA/L,GAAArxB,KAAAqxB,KACAd,EAAAvwB,KAAAuwB,KACAD,EAAAe,EAAyB,OAAAf,EAAiBA,EAAAA,EAAAE,KAAA,CAC1C,GAAA5vB,GAAA0vB,EAAAE,IACAF,GAAAE,KAAAF,EAAAgB,KACAhB,EAAAgB,KAAA1wB,EAIA,MAFAZ,MAAAqxB,KAAAd,EACAvwB,KAAAuwB,KAAAc,EACArxB,O7Co4MM,SAASJ,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxcs4B,EAASj9B,E8CntNG,I9CqtNZk9B,EAASz8B,EAAuBw8B,GAEhCE,EAAmBn9B,E8CttNF,I9C0tNjB+a,GAFoBta,EAAuB08B,GAElCn9B,E8CztNI,K9C2tNbgb,EAAUva,EAAuBsa,G8CztNhCqiB,EAAS,SAAAC,GACF,QADPD,GACQpS,EAAUd,EAAM1hB,G9C8tNzBjG,EAAgB3C,K8C/tNfw9B,GAEFp5B,EAAAnD,OAAAkE,eAFEq4B,EAASt6B,WAAA,cAAAlD,MAAAS,KAAAT,KAELorB,EAAUd,EAAM1hB,G9Cu4NvB,MA7KA7F,G8C5tNGy6B,EAASC,G9CwuNZ/5B,E8CxuNG85B,I9CyuNDv5B,IAAK,mBACL9C,M8CpuNa,W9CquNX,GAAI4c,GAAQ/d,I8CnuNf8qB,YAAW,WACJ/M,EAAK2f,QACR3f,EAAK2f,MAAQ3f,EAAK4f,cAClB5f,EAAKoP,iBAEN,M9CyuNFlpB,IAAK,UACL9C,M8CvuNI,WAELnB,KAAK49B,gBAGL59B,KAAK69B,OAAS,KAEdz5B,EAAAnD,OAAAkE,eAvBEq4B,EAASt6B,WAAA,UAAAlD,MAAAS,KAAAT,S9CiwNViE,IAAK,cACL9C,M8CxuNQ,WAIT,GAAKnB,KAAK89B,QAAV,CAIA,GAAIpT,GAAO,GAAItP,GAAA,WAAMsO,SACjBc,EAAO,GAAIpP,GAAA,WAAMqP,oBAAoBzqB,KAAK+9B,MAAO/9B,KAAK+9B,MAAO,GAE7DzS,EAAW,GAAIlQ,GAAA,WAAM4iB,mBACvBC,YAAY,IAGVC,EAAY,GAAI9iB,GAAA,WAAMuP,KAAKH,EAAMc,EAerC,OAdA4S,GAAUtT,SAAS5jB,EAAI,IAAM0J,KAAK4B,GAAK,IAEvCoY,EAAKjiB,IAAIy1B,GAETxT,EAAKyT,YAAc,EAEnBzT,EAAKnN,SAASvW,EAAIhH,KAAK89B,QAAQ,GAC/BpT,EAAKnN,SAAStW,EAAIjH,KAAK89B,QAAQ,GAOxBpT,M9C2uNNzmB,IAAK,mBACL9C,M8CzuNa,WACd,GAAIi9B,GAAS33B,SAAS43B,cAAc,SACpCD,GAAOE,MAAQ,IACfF,EAAOG,OAAS,GAEhB,IAAI/0B,GAAU40B,EAAOI,WAAW,KAChCh1B,GAAQi1B,KAAO,2CACfj1B,EAAQk1B,UAAY,UACpBl1B,EAAQm1B,SAAS3+B,KAAK4+B,UAAW,GAAIR,EAAOE,MAAQ,EAAI,GACxD90B,EAAQm1B,SAAS3+B,KAAK6+B,MAAMpxB,WAAY,GAAI2wB,EAAOE,MAAQ,EAAI,GAE/D,IAAIQ,GAAU,GAAI1jB,GAAA,WAAM2jB,QAAQX,EAGhCU,GAAQE,UAAY5jB,EAAA,WAAM6jB,aAC1BH,EAAQI,UAAY9jB,EAAA,WAAM+jB,yBAG1BL,EAAQM,WAAa,EAErBN,EAAQO,aAAc,CAEtB,IAAI/T,GAAW,GAAIlQ,GAAA,WAAM4iB,mBACvBzS,IAAKuT,EACLQ,aAAa,EACbrB,YAAY,IAGVzT,EAAO,GAAIpP,GAAA,WAAMqP,oBAAoBzqB,KAAK+9B,MAAO/9B,KAAK+9B,MAAO,GAC7DrT,EAAO,GAAItP,GAAA,WAAMuP,KAAKH,EAAMc,EAKhC,OAHAZ,GAAKE,SAAS5jB,EAAI,IAAM0J,KAAK4B,GAAK,IAClCoY,EAAKnN,SAAS9G,EAAI,GAEXiU,K9C4uNNzmB,IAAK,eACL9C,M8C1uNS,W9C2uNP,GAAI2rB,GAAS9sB,K8C1uNZu/B,GACFv4B,EAAGhH,KAAK6+B,MAAM,GACdpoB,EAAGzW,KAAK6+B,MAAM,GACd53B,EAAGjH,KAAK6+B,MAAM,IAGZW,EAAMx/B,KAAKy/B,YAAYF,GAEvBG,EAAQj5B,SAAS43B,cAAc,MAEnCqB,GAAMtiB,iBAAiB,OAAQ,SAAAtT,GAC7B,GAAIg1B,GAAU,GAAI1jB,GAAA,WAAM2jB,OAExBD,GAAQY,MAAQA,EAChBZ,EAAQO,aAAc,EAGtBP,EAAQE,UAAY5jB,EAAA,WAAM6jB,aAC1BH,EAAQI,UAAY9jB,EAAA,WAAM+jB,yBAG1BL,EAAQM,WAAa,EAErBN,EAAQO,aAAc,EAKjBvS,EAAK4Q,OAAU5Q,EAAK4Q,MAAMrP,SAAS,IAAOvB,EAAK4Q,MAAMrP,SAAS,GAAG/C,WAItEwB,EAAK4Q,MAAMrP,SAAS,GAAG/C,SAASC,IAAMuT,EACtChS,EAAK4Q,MAAMrP,SAAS,GAAG/C,SAAS+T,aAAc,EAE9CvS,EAAK6S,SAAWb,EAChBhS,EAAK8S,QAAS,KACb,GAKHF,EAAMG,YAAc,GAGpBH,EAAMI,IAAMN,EAEZx/B,KAAK69B,OAAS6B,K9C+uNbz7B,IAAK,gBACL9C,M8C7uNU,WACNnB,KAAK69B,SAIV79B,KAAK69B,OAAOiC,IAAM,QAxJhBtC,G9C04NFF,EAAO,WAEV39B,GAAQ,W8C/uNM,SAASyrB,EAAUd,EAAM1hB,GACtC,MAAO,IAAI40B,GAAUpS,EAAUd,EAAM1hB,I9CmvNtChJ,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAQ/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCARhH7B,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAM7hBb,EAAa5B,E+Cr6NC,I/Cu6Nd6B,EAAcpB,EAAuBmB,GAErCmZ,EAAS/a,E+Cx6NI,I/C06Nbgb,EAAUva,EAAuBsa,G+Ct6NlC4kB,EAAM,IAAMrvB,KAAK4B,GAEjB0tB,EAAe,gBAEbC,EAAI,WACG,QADPA,GACQ7U,EAAUd,EAAM1hB,G/C26NzBjG,EAAgB3C,K+C56NfigC,GAEFjgC,KAAKgJ,OAASJ,EACd5I,KAAK4+B,UAAYxT,EACjBprB,KAAKuqB,MAAQD,EAEbtqB,KAAK4/B,QAAS,EAEd5/B,KAAK6+B,MAAQ7+B,KAAKkgC,gBAAgB9U,GAGlCprB,KAAKmgC,cAAgBngC,KAAKogC,iBAAiBpgC,KAAK6+B,OAGhD7+B,KAAKqgC,aAAergC,KAAKsgC,qBAAqBtgC,KAAKmgC,eAGnDngC,KAAK89B,QAAU99B,KAAKugC,gBAAgBvgC,KAAKqgC,cAGzCrgC,KAAK+9B,MAAQ/9B,KAAKwgC,SAASxgC,KAAKqgC,c/CkmOjC,MAhLA38B,G+Ct8NGu8B,I/Cu8NDh8B,IAAK,UACL9C,M+C/6NI,WACL,MAAOnB,MAAK4/B,U/Co7NX37B,IAAK,mBACL9C,M+Cj7Na,e/Cm7Nb8C,IAAK,cACL9C,M+Cl7NQ,WACT,MAAOnB,MAAK4+B,a/Cq7NX36B,IAAK,YACL9C,M+Cn7NM,WACP,MAAOnB,MAAKqgC,gB/Cs7NXp8B,IAAK,YACL9C,M+Cp7NM,WACP,MAAOnB,MAAK89B,W/Cu7NX75B,IAAK,UACL9C,M+Cr7NI,WACL,MAAOnB,MAAK+9B,S/Cw7NX95B,IAAK,UACL9C,M+Ct7NI,WACL,MAAOnB,MAAK09B,S/C87NXz5B,IAAK,UACL9C,M+Cx7NI,WAELnB,KAAKgJ,OAAS,KAGdhJ,KAAKmgC,cAAgB,KACrBngC,KAAKqgC,aAAe,KACpBrgC,KAAK89B,QAAU,KAGV99B,KAAK09B,QAIN19B,KAAK09B,MAAMrP,SAEbruB,KAAK09B,MAAMrP,SAASrmB,QAAQ,SAAAy4B,GAC1BA,EAAMpV,SAAStE,UACf0Z,EAAMpV,SAAW,KAEboV,EAAMnV,SAASC,MACjBkV,EAAMnV,SAASC,IAAIxE,UACnB0Z,EAAMnV,SAASC,IAAM,MAGvBkV,EAAMnV,SAASvE,UACf0Z,EAAMnV,SAAW,QAGnBtrB,KAAK09B,MAAMrS,SAAStE,UACpB/mB,KAAK09B,MAAMrS,SAAW,KAElBrrB,KAAK09B,MAAMpS,SAASC,MACtBvrB,KAAK09B,MAAMpS,SAASC,IAAIxE,UACxB/mB,KAAK09B,MAAMpS,SAASC,IAAM,MAG5BvrB,KAAK09B,MAAMpS,SAASvE,UACpB/mB,KAAK09B,MAAMpS,SAAW,U/C47NvBrnB,IAAK,cACL9C,M+Cz7NQ,e/C27NR8C,IAAK,mBACL9C,M+C37Na,e/C67Nb8C,IAAK,cACL9C,M+C57NQ,SAACo+B,GAOV,MANKA,GAAUtpB,IAEbA,EAAI3H,OAAOoyB,aAAa,GAAKhwB,KAAKiwB,MAAsB,EAAhBjwB,KAAKkwB,YAG/CZ,EAAaa,UAAY,EAClB7gC,KAAKuqB,MAAMva,QAAQgwB,EAAc,SAAS7+B,EAAO8C,GAEtD,MAAOs7B,GAAUt7B,Q/Ck8NlBA,IAAK,kBACL9C,M+C97NY,SAACiqB,GAKd,IAAK,GAJDpkB,GAAI,EACJyP,EAAI,EACJxP,EAAImkB,EAASrnB,OAERD,EAAImD,EAAGnD,EAAI,EAAGA,IAAK,CAC1B,GAAIg9B,GAAO,GAAMh9B,EAAI,EACjBi9B,GAAK3V,EAASnkB,EAAInD,EACZ,KAANi9B,IACF/5B,GAAK85B,GAEG,IAANC,IACFtqB,GAAKqqB,GAEG,IAANC,IACF/5B,GAAK85B,EACLrqB,GAAKqqB,GAIT,OAAQ95B,EAAGyP,EAAGxP,M/Cm8NbhD,IAAK,uBACL9C,M+Ch8NiB,SAAC6/B,GACnB,GAAIC,GAAKjhC,KAAKgJ,OAAOgV,OAAO1V,eAAc,EAAArG,EAAA,YAAO++B,EAAY,GAAIA,EAAY,KACzEE,EAAKlhC,KAAKgJ,OAAOgV,OAAO1V,eAAc,EAAArG,EAAA,YAAO++B,EAAY,GAAIA,EAAY,IAE7E,QAAQC,EAAGj6B,EAAGi6B,EAAGxqB,EAAGyqB,EAAGl6B,EAAGk6B,EAAGzqB,M/Cq8N5BxS,IAAK,mBACL9C,M+Cl8Na,SAAC4qB,GACf,GAAItT,GAAIzY,KAAKmhC,UAAUpV,EAAK,GAAK,EAAGA,EAAK,IACrCqV,EAAIphC,KAAKmhC,UAAUpV,EAAK,GAAIA,EAAK,IACjC9V,EAAIjW,KAAKqhC,UAAUtV,EAAK,GAAK,EAAGA,EAAK,IACrCne,EAAI5N,KAAKqhC,UAAUtV,EAAK,GAAIA,EAAK,GACrC,QAAQqV,EAAGnrB,EAAGwC,EAAG7K,M/Cq8NhB3J,IAAK,YACL9C,M+Cn8NM,SAAC6F,EAAGC,GACX,MAAOD,GAAI0J,KAAKgF,IAAI,EAAGzO,GAAK,IAAM,O/Cs8NjChD,IAAK,YACL9C,M+Cp8NM,SAACsV,EAAGxP,GACX,GAAI2G,GAAI8C,KAAK4B,GAAK,EAAI5B,KAAK4B,GAAKmE,EAAI/F,KAAKgF,IAAI,EAAGzO,EAChD,OAAO84B,GAAMrvB,KAAK2G,KAAK,IAAO3G,KAAK4G,IAAI1J,GAAK8C,KAAK4G,KAAK1J,Q/Cu8NrD3J,IAAK,kBACL9C,M+Cr8NY,SAAC6U,GACd,GAAIhP,GAAIgP,EAAO,IAAMA,EAAO,GAAKA,EAAO,IAAM,EAC1CS,EAAIT,EAAO,IAAMA,EAAO,GAAKA,EAAO,IAAM,CAE9C,QAAQhP,EAAGyP,M/Cw8NVxS,IAAK,WACL9C,M+Ct8NK,SAAC6U,GACP,MAAQ,IAAIoF,GAAA,WAAMsJ,QAAQ1O,EAAO,GAAI,EAAGA,EAAO,IAAKsQ,IAAI,GAAIlL,GAAA,WAAMsJ,QAAQ1O,EAAO,GAAI,EAAGA,EAAO,KAAKjS,aA5KlGk8B,I/CynOLtgC,GAAQ,W+Cz8NMsgC,E/C08NdrgC,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC9BwB,OAAO,GAQR,IAAIga,GAAS/a,EgD/oOI,IhDipObgb,EAAUva,EAAuBsa,EgD3oOtCmmB,WAAY,SAAW78B,GAEtB,GAAI88B,GAAU,GAAIC,cAAe,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAClGC,EAAY,GAAIC,cAAc,IAE9BrW,EAAW,GAAIjQ,GAAA,WAAMumB,cACzBtW,GAASuW,SAAU,GAAIxmB,GAAA,WAAMymB,gBAAiBN,EAAS,IACvDlW,EAASyW,aAAc,WAAY,GAAI1mB,GAAA,WAAMymB,gBAAiBJ,EAAW,IAEzErmB,EAAA,WAAM2mB,aAAathC,KAAMT,KAAMqrB,EAAU,GAAIjQ,GAAA,WAAM4mB,mBAAqBC,UAAW,EAAGtlB,MAAO,YAE7E5X,SAAXN,GAEJzE,KAAKkI,OAAQzD,IAMf68B,UAAUp+B,UAAYjC,OAAOkC,OAAQiY,EAAA,WAAM2mB,aAAa7+B,WACxDo+B,UAAUp+B,UAAUE,YAAck+B,UAElCA,UAAUp+B,UAAUgF,OAAS,WAE5B,GAAIg6B,GAAM,GAAI9mB,GAAA,WAAMyR,IAEpB,OAAO,UAAWpoB,GAIjB,GAFAy9B,EAAIC,cAAe19B,IAEdy9B,EAAIE,UAAT,CAEA,GAAIhuB,GAAM8tB,EAAI9tB,IACVzD,EAAMuxB,EAAIvxB,IAkBV4M,EAAWvd,KAAKqrB,SAASgX,WAAW9kB,SACpC/N,EAAQ+N,EAAS/N,KAErBA,GAAQ,GAAMmB,EAAI3J,EAAGwI,EAAQ,GAAMmB,EAAI8F,EAAGjH,EAAQ,GAAMmB,EAAI1J,EAC5DuI,EAAQ,GAAM4E,EAAIpN,EAAGwI,EAAQ,GAAMmB,EAAI8F,EAAGjH,EAAQ,GAAMmB,EAAI1J,EAC5DuI,EAAQ,GAAM4E,EAAIpN,EAAGwI,EAAQ,GAAM4E,EAAIqC,EAAGjH,EAAQ,GAAMmB,EAAI1J,EAC5DuI,EAAQ,GAAMmB,EAAI3J,EAAGwI,EAAO,IAAO4E,EAAIqC,EAAGjH,EAAO,IAAOmB,EAAI1J,EAC5DuI,EAAO,IAAOmB,EAAI3J,EAAGwI,EAAO,IAAOmB,EAAI8F,EAAGjH,EAAO,IAAO4E,EAAInN,EAC5DuI,EAAO,IAAO4E,EAAIpN,EAAGwI,EAAO,IAAOmB,EAAI8F,EAAGjH,EAAO,IAAO4E,EAAInN,EAC5DuI,EAAO,IAAO4E,EAAIpN,EAAGwI,EAAO,IAAO4E,EAAIqC,EAAGjH,EAAO,IAAO4E,EAAInN,EAC5DuI,EAAO,IAAOmB,EAAI3J,EAAGwI,EAAO,IAAO4E,EAAIqC,EAAGjH,EAAO,IAAO4E,EAAInN,EAE5DsW,EAAS8hB,aAAc,EAEvBr/B,KAAKqrB,SAASiX,6BhDkpOf3iC,EAAQ,WgD5oOM2hC,UhD6oOd1hC,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAKT,IAAIga,GAAS/a,EiDzuOI,IjD2uObgb,EAAUva,EAAuBsa,EAErCxb,GAAQ,WiD3uOM,SAAS4iC,GACtB,GAAInE,GAAS33B,SAAS43B,cAAc,SACpCD,GAAOE,MAAQ,EACfF,EAAOG,OAAS,CAEhB,IAAI/0B,GAAU40B,EAAOI,WAAW,KAChCh1B,GAAQk1B,UAAY6D,EACpB/4B,EAAQg5B,SAAS,EAAG,EAAGpE,EAAOE,MAAOF,EAAOG,OAI5C,IAAIO,GAAU,GAAI1jB,GAAA,WAAM2jB,QAAQX,EAahCU,GAAQO,aAAc,CAEtB,IAAI/T,GAAW,GAAIlQ,GAAA,WAAM4iB,mBACvBzS,IAAKuT,EACLb,YAAY,GAGd,OAAO3S,IjD+uOR1rB,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GkD/tOhC,QAAAqiC,GAAAvzB,EAAAwzB,EAAA58B,GACA,GAAA68B,IAAA,EACAC,GAAA,CAEA,IAAA,kBAAA1zB,GACA,KAAA,IAAApM,WAAAuM,EAMA,OAJAxC,GAAA/G,KACA68B,EAAA,WAAA78B,KAAAA,EAAA68B,QAAAA,EACAC,EAAA,YAAA98B,KAAAA,EAAA88B,SAAAA,GAEAC,EAAA3zB,EAAAwzB,GAA+BC,QAAAA,EAAAG,QAAAJ,EAAAE,SAAAA,IA0B/B,QAAA/1B,GAAA1L,GAGA,GAAA2L,SAAA3L,EACA,SAAAA,IAAA,UAAA2L,GAAA,YAAAA,GAtFA,GAAA+1B,GAAAziC,EAAA,IAGAiP,EAAA,qBAsFAzP,GAAAD,QAAA8iC,GlD2xOM,SAAS7iC,EAAQD,GmD3wOvB,QAAAkjC,GAAA3zB,EAAAwzB,EAAA58B,GAuBA,QAAAi9B,KACAC,GACArP,aAAAqP,GAEAC,GACAtP,aAAAsP,GAEAC,EAAA,EACAx4B,EAAAu4B,EAAA9zB,EAAA6zB,EAAAG,EAAAp+B,OAGA,QAAAq+B,GAAAC,EAAA9iC,GACAA,GACAozB,aAAApzB,GAEA0iC,EAAAD,EAAAG,EAAAp+B,OACAs+B,IACAH,EAAA9S,IACAtiB,EAAAoB,EAAApE,MAAAqE,EAAAzE,GACAs4B,GAAAC,IACAv4B,EAAAyE,EAAApK,SAKA,QAAAu+B,KACA,GAAAC,GAAAb,GAAAtS,IAAAoT,EACA,IAAAD,GAAAA,EAAAb,EACAU,EAAAD,EAAAF,GAEAD,EAAAlY,WAAAwY,EAAAC,GAIA,QAAAE,KAKA,OAJAT,GAAAG,GAAAF,GAAAL,KACA90B,EAAAoB,EAAApE,MAAAqE,EAAAzE,IAEAq4B,IACAj1B,EAGA,QAAA41B,KACAN,EAAAR,EAAAI,GAGA,QAAAW,KAMA,GALAj5B,EAAAE,UACA44B,EAAApT,IACAjhB,EAAAnP,KACAmjC,EAAAP,IAAAI,IAAAL,GAEAG,KAAA,EACA,GAAAc,GAAAjB,IAAAK,MACK,CACLC,GAAAN,IACAO,EAAAM,EAEA,IAAAD,GAAAT,GAAAU,EAAAN,GACAG,EAAA,GAAAE,GAAAA,EAAAT,CAEAO,IACAJ,IACAA,EAAAtP,aAAAsP,IAEAC,EAAAM,EACA11B,EAAAoB,EAAApE,MAAAqE,EAAAzE,IAEAu4B,IACAA,EAAAnY,WAAA4Y,EAAAH,IAgBA,MAbAF,IAAAL,EACAA,EAAArP,aAAAqP,GAEAA,GAAAN,IAAAI,IACAE,EAAAlY,WAAAwY,EAAAZ,IAEAkB,IACAP,GAAA,EACAv1B,EAAAoB,EAAApE,MAAAqE,EAAAzE,KAEA24B,GAAAL,GAAAC,IACAv4B,EAAAyE,EAAApK,QAEA+I,EA3GA,GAAApD,GACAu4B,EACAn1B,EACA01B,EACAr0B,EACA6zB,EACAG,EACAD,EAAA,EACAP,GAAA,EACAG,GAAA,EACAF,GAAA,CAEA,IAAA,kBAAA1zB,GACA,KAAA,IAAApM,WAAAuM,EAkGA,OAhGAqzB,GAAAhzB,EAAAgzB,IAAA,EACA71B,EAAA/G,KACA68B,IAAA78B,EAAA68B,QACAG,EAAA,WAAAh9B,IAAAwJ,EAAAI,EAAA5J,EAAAg9B,UAAA,EAAAJ,GACAE,EAAA,YAAA98B,KAAAA,EAAA88B,SAAAA,GA0FAe,EAAAZ,OAAAA,EACAY,EAAAF,MAAAA,EACAE,EAmBA,QAAA12B,GAAA9L,GAIA,GAAAiM,GAAAP,EAAA1L,GAAAkM,EAAA5M,KAAAU,GAAA,EACA,OAAAiM,IAAAE,GAAAF,GAAAG,EA0BA,QAAAV,GAAA1L,GACA,GAAA2L,SAAA3L,EACA,SAAAA,IAAA,UAAA2L,GAAA,YAAAA,GAyBA,QAAA4C,GAAAvO,GACA,GAAA0L,EAAA1L,GAAA,CACA,GAAA6L,GAAAC,EAAA9L,EAAA4O,SAAA5O,EAAA4O,UAAA5O,CACAA,GAAA0L,EAAAG,GAAAA,EAAA,GAAAA,EAEA,GAAA,gBAAA7L,GACA,MAAA,KAAAA,EAAAA,GAAAA,CAEAA,GAAAA,EAAA6O,QAAAC,EAAA,GACA,IAAAC,GAAAC,EAAA1E,KAAAtK,EACA,OAAA+O,IAAAE,EAAA3E,KAAAtK,GACAkP,EAAAlP,EAAAmP,MAAA,GAAAJ,EAAA,EAAA,GACAK,EAAA9E,KAAAtK,GAAAqP,GAAArP,EAhTA,GAAAkO,GAAA,sBAGAmB,EAAA,IAGAlD,EAAA,oBACAC,EAAA,6BAGA0C,EAAA,aAGAM,EAAA,qBAGAJ,EAAA,aAGAC,EAAA,cAGAC,EAAAI,SAGA3E,EAAA7K,OAAAiC,UAMAmK,EAAAvB,EAAA2B,SAGA6B,EAAAoB,KAAAC,IAkBAyf,EAAAD,KAAAC,GA+PAxwB,GAAAD,QAAAkjC,GnDm4OM,SAASjjC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxc8kB,EAAczpB,EoDhtPG,IpDktPjB0pB,EAAcjpB,EAAuBgpB,GAErCvkB,EAAgBlF,EoDntPF,GpDqtPdmF,EAAiB1E,EAAuByE,GAExCu+B,EAAgBzjC,EoDttPI,IpDwtPpB0jC,EAAiBjjC,EAAuBgjC,GAExC1Z,EAAkB/pB,EoDztPF,IpD2tPhBgqB,EAAmBvpB,EAAuBspB,GAE1ChP,EAAS/a,EoD5tPI,IAEZoC,GpD4tPS3B,EAAuBsa,GoD5tPf,SAAAkP,GACV,QADP7nB,GACQ8nB,EAAMxkB,GpDiuPfnD,EAAgB3C,KoDluPfwC,EAEF,IAAIuD,IACF6lB,OAAQ,GACR7Y,SAAU,IAGZjN,IAAU,EAAAP,EAAA,YAAOQ,EAAUD,GAE3B1B,EAAAnD,OAAAkE,eATE3C,EAAiBU,WAAA,cAAAlD,MAAAS,KAAAT,KASb8F,GAEN9F,KAAKuqB,MAAQD,EpD0yPd,MAtFAvnB,GoD/tPGP,EAAiB6nB,GpDkvPpB3mB,EoDlvPGlB,IpDmvPDyB,IAAK,SACL9C,MoDtuPG,SAACod,GpDuuPF,GAAIR,GAAQ/d,IoDtuPfoE,GAAAnD,OAAAkE,eAfE3C,EAAiBU,WAAA,SAAAlD,MAAAS,KAAAT,KAeNue,GAMbuM,WAAW,WACT/M,EAAKgN,gBACLhN,EAAKzX,eACJ,MpD2uPFrC,IAAK,cACL9C,MoDzuPQ,WAITnB,KAAKgrB,uBAAwB,EAAAZ,EAAA,YAASpqB,KAAKirB,eAAgB,KAE3DjrB,KAAKge,OAAOpX,GAAG,YAAa5G,KAAKgrB,sBAAuBhrB,MACxDA,KAAKge,OAAOpX,GAAG,OAAQ5G,KAAKkrB,aAAclrB,SpD4uPzCiE,IAAK,iBACL9C,MoD1uPW,WACZnB,KAAK+qB,mBpD6uPJ9mB,IAAK,eACL9C,MoD3uPS,SAACiG,EAAQN,OpD+uPlB7C,IAAK,cACL9C,MoD5uPQ,SAACiqB,EAAUxiB,GACpB,GAAI9C,KAUJ,OARI9F,MAAK6rB,SAAS6F,SAChB5rB,EAAQ4rB,OAAS1xB,KAAK6rB,SAAS6F,QAG7B1xB,KAAK6rB,SAASsK,QAChBrwB,EAAQqwB,MAAQn2B,KAAK6rB,SAASsK,QAGzB,EAAA2N,EAAA,YAAa1Y,EAAUprB,KAAKuqB,MAAO3hB,EAAO9C,MpDivPhD7B,IAAK,UACL9C,MoD9uPI,WACLnB,KAAKge,OAAO7S,IAAI,YAAanL,KAAKgrB,uBAClChrB,KAAKge,OAAO7S,IAAI,OAAQnL,KAAKkrB,cAE7BlrB,KAAKgrB,sBAAwB,KAG7B5mB,EAAAnD,OAAAkE,eAnEE3C,EAAiBU,WAAA,UAAAlD,MAAAS,KAAAT,UAAjBwC,GpDszPFsnB,EAAY,YAEfnqB,GAAQ,WoDhvPM,SAAS2qB,EAAMxkB,GAC5B,MAAO,IAAItD,GAAkB8nB,EAAMxkB,IpDovPpClG,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,EAAQD,EAASS,GAU/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAEzF,QAAS6B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAASC,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIH,WAAU,iEAAoEG,GAAeD,GAASE,UAAYjC,OAAOkC,OAAOF,GAAcA,EAAWC,WAAaE,aAAejC,MAAO6B,EAAUK,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeN,IAAYhC,OAAOuC,eAAiBvC,OAAOuC,eAAeR,EAAUC,GAAcD,EAASS,UAAYR,GAZjehC,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAGT,IAAIuC,GAAe,WAAe,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CAAE,GAAIE,GAAaH,EAAMC,EAAIE,GAAWX,WAAaW,EAAWX,aAAc,EAAOW,EAAWT,cAAe,EAAU,SAAWS,KAAYA,EAAWV,UAAW,GAAMrC,OAAOC,eAAe0C,EAAQI,EAAWC,IAAKD,IAAiB,MAAO,UAAUnB,EAAaqB,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBd,EAAYK,UAAWgB,GAAiBC,GAAaR,EAAiBd,EAAasB,GAAqBtB,MAE7hBuB,EAAO,SAAaC,EAAIC,EAAKC,GAAqC,IAA9B,GAAIC,IAAS,EAAwBA,GAAQ,CAAE,GAAIC,GAASJ,EAAIK,EAAWJ,EAAKK,EAAWJ,CAAKC,IAAS,EAAsB,OAAXC,IAAiBA,EAASG,SAAS1B,UAAW,IAAI2B,GAAO5D,OAAO6D,yBAAyBL,EAAQC,EAAW,IAAaK,SAATF,EAAJ,CAA4O,GAAI,SAAWA,GAAQ,MAAOA,GAAK1D,KAAgB,IAAI6D,GAASH,EAAKI,GAAK,IAAeF,SAAXC,EAAwB,MAAoB,OAAOA,GAAOvE,KAAKkE,GAA/V,GAAIO,GAASjE,OAAOkE,eAAeV,EAAS,IAAe,OAAXS,EAAmB,MAA2Bb,GAAKa,EAAQZ,EAAMI,EAAUH,EAAMI,EAAUH,GAAS,EAAMK,EAAOK,EAASH,SAQxcs4B,EAASj9B,EqDv1PG,IrDy1PZk9B,EAASz8B,EAAuBw8B,GAEhCE,EAAmBn9B,EqD11PF,IrD81PjB+a,GAFoBta,EAAuB08B,GAElCn9B,EqD71PI,KrD+1Pbgb,EAAUva,EAAuBsa,GAEjC4oB,EAAW3jC,EqDh2PI,IrDk2Pf4jC,EAAYnjC,EAAuBkjC,GAEnCE,EAAY7jC,EqDn2PI,IrDq2PhB8jC,EAAarjC,EAAuBojC,GAEpCniC,EAAY1B,EqDt2PC,IrDw2Pb2B,EAAalB,EAAuBiB,GAEpCE,EAAa5B,EqDz2PC,IrD22Pd6B,EAAcpB,EAAuBmB,GAErCmiC,EAAU/jC,EqD52PI,IrD82PdgkC,EAAWvjC,EAAuBsjC,GAElC7+B,EAAgBlF,EqD/2PF,GrDi3PdmF,EAAiB1E,EAAuByE,GAExC++B,EAAsBjkC,EqDl3PA,IrDo3PtBkkC,EAAuBzjC,EAAuBwjC,GqDt1P7CE,EAAY,SAAA9G,GACL,QADP8G,GACQnZ,EAAUd,EAAM1hB,EAAO9C,GrDu3PhCnD,EAAgB3C,KqDx3PfukC,GAEFngC,EAAAnD,OAAAkE,eAFEo/B,EAAYrhC,WAAA,cAAAlD,MAAAS,KAAAT,KAERorB,EAAUd,EAAM1hB,EAEtB,IAAI7C,IACF2rB,OAAQ,KACRyE,OACExZ,MAAO,WAIX3c,MAAK6rB,UAAW,EAAAtmB,EAAA,YAAOQ,EAAUD,GrDwxQlC,MA9aA/C,GqDr3PGwhC,EAAY9G,GrD04Pf/5B,EqD14PG6gC,IrD24PDtgC,IAAK,mBACL9C,MqD73Pa,WrD83PX,GAAI4c,GAAQ/d,IqD53Pf8qB,YAAW,WACJ/M,EAAK2f,QACR3f,EAAK2f,MAAQ3f,EAAK4f,cAClB5f,EAAKoP,iBAEN,MrDk4PFlpB,IAAK,UACL9C,MqDh4PI,WAELnB,KAAK49B,gBAGL59B,KAAKwkC,SAAW,KAEhBpgC,EAAAnD,OAAAkE,eAhCEo/B,EAAYrhC,WAAA,UAAAlD,MAAAS,KAAAT,SrDm6PbiE,IAAK,cACL9C,MqDj4PQ,WAIT,GAAKnB,KAAK89B,QAAV,CAIA,GAAIpT,GAAO,GAAItP,GAAA,WAAMsO,QAuBrB,OArBAgB,GAAKyT,YAAc,EAEnBzT,EAAKnN,SAASvW,EAAIhH,KAAK89B,QAAQ,GAC/BpT,EAAKnN,SAAStW,EAAIjH,KAAK89B,QAAQ,GAkBxBpT,MrDo4PNzmB,IAAK,mBACL9C,MqDl4Pa,WACd,GAAIi9B,GAAS33B,SAAS43B,cAAc,SACpCD,GAAOE,MAAQ,IACfF,EAAOG,OAAS,GAEhB,IAAI/0B,GAAU40B,EAAOI,WAAW,KAChCh1B,GAAQi1B,KAAO,2CACfj1B,EAAQk1B,UAAY,UACpBl1B,EAAQm1B,SAAS3+B,KAAK4+B,UAAW,GAAIR,EAAOE,MAAQ,EAAI,GACxD90B,EAAQm1B,SAAS3+B,KAAK6+B,MAAMpxB,WAAY,GAAI2wB,EAAOE,MAAQ,EAAI,GAE/D,IAAIQ,GAAU,GAAI1jB,GAAA,WAAM2jB,QAAQX,EAGhCU,GAAQE,UAAY5jB,EAAA,WAAM6jB,aAC1BH,EAAQI,UAAY9jB,EAAA,WAAM+jB,yBAG1BL,EAAQM,WAAa,EAErBN,EAAQO,aAAc,CAEtB,IAAI/T,GAAW,GAAIlQ,GAAA,WAAM4iB,mBACvBzS,IAAKuT,EACLQ,aAAa,EACbrB,YAAY,IAGVzT,EAAO,GAAIpP,GAAA,WAAMqP,oBAAoBzqB,KAAK+9B,MAAO/9B,KAAK+9B,MAAO,GAC7DrT,EAAO,GAAItP,GAAA,WAAMuP,KAAKH,EAAMc,EAKhC,OAHAZ,GAAKE,SAAS5jB,EAAI,IAAM0J,KAAK4B,GAAK,IAClCoY,EAAKnN,SAAS9G,EAAI,GAEXiU,KrDq4PNzmB,IAAK,eACL9C,MqDn4PS,WrDo4PP,GAAI2rB,GAAS9sB,KqDn4PZu/B,GACFv4B,EAAGhH,KAAK6+B,MAAM,GACdpoB,EAAGzW,KAAK6+B,MAAM,GACd53B,EAAGjH,KAAK6+B,MAAM,IAGZW,EAAMx/B,KAAKy/B,YAAYF,EAE3Bv/B,MAAKwkC,UAAW,EAAAR,EAAA,aACdxE,IAAKA,EACL1yB,KAAM,OACN+yB,aAAa,IACZ4E,KAAK,SAAAvP,GAENpI,EAAK0X,SAAW,KAChB1X,EAAK4X,iBAAiBxP,KACtB,SAAO,SAAAyP,GACP9oB,QAAQsS,MAAMwW,GAGd7X,EAAK0X,SAAW,UrDy4PjBvgC,IAAK,mBACL9C,MqDt4Pa,SAAC6zB,GrDu4PZ,GAAI4P,GAAS5kC,IqDt4PhB6b,SAAQid,KAAK94B,KAAK6+B,MAElB,IAAIgG,GAAUX,EAAA,WAASY,QAAQ9P,EAAMA,EAAKyE,QAAQsL,SAE9Cjf,GAAS,EAAA/jB,EAAA,YAAM,EAAG,EACtB+jB,GAAO9e,EAAI,GAAKhH,KAAK89B,QAAQ,GAC7BhY,EAAOrP,EAAI,GAAKzW,KAAK89B,QAAQ,EAE7B,IACIkH,GACAC,EAEAC,KACAC,KACAC,KACAC,EAAa,EAEb9C,EAAS,GAAInnB,GAAA,WAAMkqB,MAEnBC,EAAWV,EAAQU,QAGnBvlC,MAAK6rB,SAAS6F,SAChB6T,EAAWV,EAAQU,SAAS7T,OAAO1xB,KAAK6rB,SAAS6F,QAGnD,IAAIyE,GAAQn2B,KAAK6rB,SAASsK,KA6D1B,IA3DAoP,EAASv9B,QAAQ,SAAA88B,GAIoB,kBAAxBF,GAAK/Y,SAASsK,QACvBA,EAAQyO,EAAK/Y,SAASsK,MAAM2O,GAK9B,IAAIU,GAAcV,EAAQzZ,SAASma,WAMnC,IAAKA,EAAY,IAAOA,EAAY,GAAG,IAAOp7B,MAAM+D,QAAQq3B,EAAY,GAAG,IAA3E,CAIAA,EAAcA,EAAYja,IAAI,SAAAka,GAC5B,MAAOA,GAAKla,IAAI,SAAAma,GACd,GAAIt+B,IAAS,EAAAnF,EAAA,YAAOyjC,EAAW,GAAIA,EAAW,IAC1C5+B,EAAQ89B,EAAK57B,OAAOgV,OAAO1V,cAAclB,EAC7C,QAAQN,EAAME,EAAGF,EAAM2P,OAI3BuuB,EAAaJ,EAAKe,UAAUH,GAE5BP,EAAQL,EAAKgB,aAAaZ,EAAWa,SAAUb,EAAWc,MAAOd,EAAWe,WAE5E,IAAIC,KACJ,KAAKliC,EAAI,EAAGmiC,GAAKjB,EAAWa,SAAS9hC,OAAQD,EAAImiC,GAAIniC,GAAKkhC,EAAWe,WACnEC,EAAgBl9B,KAAKk8B,EAAWa,SAASv1B,MAAMxM,EAAGA,EAAIkhC,EAAWe,YAGnE,IAAIG,IAAW,EAAA5B,EAAA,YAAe0B,EAAiBf,EAE/C1C,GAAOxiB,IAAIoW,EAAMxZ,OAMjBuoB,EAAYp8B,KAAKo9B,EAASzE,WAC1B2D,EAAWt8B,MAAMy5B,EAAOhqB,EAAGgqB,EAAO4D,EAAG5D,EAAOxsB,IAC5CovB,EAASr8B,KAAKo9B,EAASjB,OAEvBI,GAAca,EAASjB,MAAMlhC,UAUZ,IAAfshC,EAEF,YADArlC,KAAK4/B,QAAS,EAyBhB,KAAK,GALDvzB,GACA+5B,EACAC,EACAC,EAnBAjb,EAAW,GAAIjQ,GAAA,WAAMumB,eAGrBkE,EAAW,GAAInE,cAA0B,EAAb2D,GAC5BkB,EAAU,GAAI7E,cAA0B,EAAb2D,GAC3BmB,EAAU,GAAI9E,cAA0B,EAAb2D,GAE3BoB,EAAK,GAAIrrB,GAAA,WAAMsJ,QACfgiB,EAAK,GAAItrB,GAAA,WAAMsJ,QACfiiB,EAAK,GAAIvrB,GAAA,WAAMsJ,QAEfkiB,EAAK,GAAIxrB,GAAA,WAAMsJ,QACfmiB,EAAK,GAAIzrB,GAAA,WAAMsJ,QAQfmc,EAAY,EACP/8B,EAAI,EAAGA,EAAIqhC,EAASphC,OAAQD,IAAK,CACxCsiC,EAASjB,EAASrhC,GAClBuiC,EAAYnB,EAAYphC,GACxBwiC,EAAUlB,EAAWthC,EAErB,KAAK,GAAIiH,GAAI,EAAGA,EAAIq7B,EAAOriC,OAAQgH,IAAK,CAEtCsB,EAAQ+5B,EAAOr7B,GAAG,EAkBlB,IAAI+7B,GAAKT,EAAUh6B,GAAO,GAAKyZ,EAAO9e,EAClC+/B,EAAKV,EAAUh6B,GAAO,GACtB26B,EAAKX,EAAUh6B,GAAO,GAAKyZ,EAAOrP,CAEtCpK,GAAQ+5B,EAAOr7B,GAAG,EAElB,IAAIk8B,GAAKZ,EAAUh6B,GAAO,GAAKyZ,EAAO9e,EAClCkgC,EAAKb,EAAUh6B,GAAO,GACtB86B,EAAKd,EAAUh6B,GAAO,GAAKyZ,EAAOrP,CAEtCpK,GAAQ+5B,EAAOr7B,GAAG,EAElB,IAAIq8B,GAAKf,EAAUh6B,GAAO,GAAKyZ,EAAO9e,EAClCqgC,EAAKhB,EAAUh6B,GAAO,GACtBi7B,EAAKjB,EAAUh6B,GAAO,GAAKyZ,EAAOrP,CAItCgwB,GAAG1mB,IAAI+mB,EAAIC,EAAIC,GACfN,EAAG3mB,IAAIknB,EAAIC,EAAIC,GACfR,EAAG5mB,IAAIqnB,EAAIC,EAAIC,GAEfV,EAAGnmB,WAAWkmB,EAAID,GAClBG,EAAGpmB,WAAWgmB,EAAIC,GAClBE,EAAGW,MAAMV,GAETD,EAAGY,WAEH,IAAIC,GAAKb,EAAG5/B,EACR0gC,EAAKd,EAAGnwB,EACRkxB,EAAKf,EAAG3/B,CAEZ4+B,GAAqB,EAAZhF,EAAgB,GAAKiG,EAC9BjB,EAAqB,EAAZhF,EAAgB,GAAKkG,EAC9BlB,EAAqB,EAAZhF,EAAgB,GAAKmG,EAE9BT,EAAoB,EAAZ1F,EAAgB,GAAK4G,EAC7BlB,EAAoB,EAAZ1F,EAAgB,GAAK6G,EAC7BnB,EAAoB,EAAZ1F,EAAgB,GAAK8G,EAE7BnB,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GACrCE,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GACrCE,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GAErCT,EAAqB,EAAZhF,EAAgB,GAAKoG,EAC9BpB,EAAqB,EAAZhF,EAAgB,GAAKqG,EAC9BrB,EAAqB,EAAZhF,EAAgB,GAAKsG,EAE9BZ,EAAoB,EAAZ1F,EAAgB,GAAK4G,EAC7BlB,EAAoB,EAAZ1F,EAAgB,GAAK6G,EAC7BnB,EAAoB,EAAZ1F,EAAgB,GAAK8G,EAE7BnB,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GACrCE,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GACrCE,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GAErCT,EAAqB,EAAZhF,EAAgB,GAAKuG,EAC9BvB,EAAqB,EAAZhF,EAAgB,GAAKwG,EAC9BxB,EAAqB,EAAZhF,EAAgB,GAAKyG,EAE9Bf,EAAoB,EAAZ1F,EAAgB,GAAK4G,EAC7BlB,EAAoB,EAAZ1F,EAAgB,GAAK6G,EAC7BnB,EAAoB,EAAZ1F,EAAgB,GAAK8G,EAE7BnB,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GACrCE,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GACrCE,EAAoB,EAAZ3F,EAAgB,GAAKyF,EAAQ,GAErCzF,KAKJxV,EAASyW,aAAa,WAAY,GAAI1mB,GAAA,WAAMymB,gBAAgBgE,EAAU,IACtExa,EAASyW,aAAa,SAAU,GAAI1mB,GAAA,WAAMymB,gBAAgB0E,EAAS,IACnElb,EAASyW,aAAa,QAAS,GAAI1mB,GAAA,WAAMymB,gBAAgB2E,EAAS,IAElEnb,EAASuc,oBAET,IAAItc,GAAW,GAAIlQ,GAAA,WAAMysB,mBACvBC,aAAc1sB,EAAA,WAAM2sB,aACpBC,KAAM5sB,EAAA,WAAM6sB,WAGVvd,EAAO,GAAItP,GAAA,WAAMuP,KAAKU,EAAUC,EAGpCtrB,MAAK09B,MAAMj1B,IAAIiiB,GAEf1qB,KAAK4/B,QAAS,EACd/jB,QAAQqsB,QAAQloC,KAAK6+B,OACrBhjB,QAAQlG,IAAO3V,KAAK6+B,MAAK,KAAK0G,EAASxhC,OAAM,gBrD24P5CE,IAAK,YACL9C,MqDz4PM,SAAC6zB,GAKR,IAAK,GAJDmT,GAAMnT,EAAK,GAAG,GAAGjxB,OACjB+J,GAAU+3B,YAAcC,SAAWC,WAAYoC,GAC/CC,EAAY,EAEPtkC,EAAI,EAAGA,EAAIkxB,EAAKjxB,OAAQD,IAAK,CACpC,IAAK,GAAIiH,GAAI,EAAGA,EAAIiqB,EAAKlxB,GAAGC,OAAQgH,IAClC,IAAK,GAAIiM,GAAI,EAAOmxB,EAAJnxB,EAASA,IACvBlJ,EAAO+3B,SAAS/8B,KAAKksB,EAAKlxB,GAAGiH,GAAGiM,GAGhClT,GAAI,IACNskC,GAAapT,EAAKlxB,EAAI,GAAGC,OACzB+J,EAAOg4B,MAAMh9B,KAAKs/B,IAItB,MAAOt6B,MrD44PN7J,IAAK,eACL9C,MqD14PS,SAACknC,EAASvC,EAAOqC,GAG3B,GAAIlD,IAAQ,EAAAb,EAAA,YAAOiE,EAASvC,EAAOqC,GAC/Br6B,IAEJ,KAAKhK,EAAI,EAAGmiC,GAAKhB,EAAMlhC,OAAQD,EAAImiC,GAAIniC,GAAK,EAC1CgK,EAAOhF,KAAKm8B,EAAM30B,MAAMxM,EAAGA,EAAI,GAKjC,OAAOgK,MrD64PN7J,IAAK,gBACL9C,MqD34PU,WACNnB,KAAKwkC,UAIVxkC,KAAKwkC,SAAS8D,YApZZ/D,GrDoyQFjH,EAAO,WAEV39B,GAAQ,WqD74PM,SAASyrB,EAAUd,EAAM1hB,EAAO9C,GAC7C,MAAO,IAAIy+B,GAAanZ,EAAUd,EAAM1hB,EAAO9C,IrDi5PhDlG,EAAOD,QAAUA,EAAQ,YAIpB,SAASC,OAAQD,QAASS,qBsDt1QhC,GAAAmoC,gCAAAC,+BAMA,SAAAnU,EAAA7qB,EAAAi/B,GACA,mBAAA7oC,SAAAA,OAAAD,QAAAC,OAAAD,QAAA8oC,KACAF,+BAAA,EAAAC,8BAAA,kBAAAD,gCAAAA,+BAAA9nC,KAAAd,QAAAS,oBAAAT,QAAAC,QAAA2oC,iCAAAxjC,SAAAyjC,gCAAA5oC,OAAAD,QAAA6oC,kCAEC,UAAAxoC,KAAA,WA2ED,QAAA0oC,SAAAnwB,GACA,GAAAowB,GAAAC,WAAAC,KAAAtwB,EAAAinB,IAEA,OADAmJ,GAAAA,GAAAA,EAAA,IAAAn/B,QAAAs/B,SAAAH,SACAI,QAAAt9B,KAAAk9B,GAAAK,SAAAv9B,KAAA8M,EAAA0wB,QAAAC,UAAA3wB,EAAA0wB,QAAAE,SAGA,QAAAC,kBAAA7wB,EAAA8wB,EAAAlb,GACA,MAAA,YAGA,MAAA5V,GAAA+wB,SAAAnb,EAAA5V,EAAA0wB,SACA1wB,EAAAgxB,UAAApb,EAAA5V,EAAA0wB,QAAA,oCACA1wB,EAAA0wB,SAAA,GAAA1wB,EAAA0wB,QAAAO,cACAjxB,EAAA0wB,QAAAQ,mBAAA3V,KACA4U,QAAAnwB,GAAA8wB,EAAA9wB,EAAA0wB,SAEA9a,EAAA5V,EAAA0wB,YAKA,QAAAS,YAAAC,EAAAhR,GACA,GACA/gB,GADAgyB,EAAAjR,EAAA,WAGAiR,GAAA,OAAAA,EAAA,QACAC,eAAA,OAAAlR,EAAA,OACAkR,eAAA,OAAA,IAEA,IAAAC,GAAA,mBAAAC,WAAApR,EAAA,eAAAoR,SAEApR,GAAA,aAAAiR,EAAAI,iBAAAJ,EAAAI,eAAAH,eAAA,eACAD,EAAAK,cAAAH,IAAAF,EAAAK,aAAAtR,EAAA,aAAAkR,eAAA,YACA,KAAAjyB,IAAAgyB,GACAA,EAAA79B,eAAA6L,IAAA,oBAAA+xB,IAAAA,EAAAO,iBAAAtyB,EAAAgyB,EAAAhyB,IAGA,QAAAuyB,gBAAAR,EAAAhR,GACA,mBAAAA,GAAA,iBAAA,mBAAAgR,GAAAS,kBACAT,EAAAS,kBAAAzR,EAAA,iBAIA,QAAA0R,iBAAArV,GACAsV,UAAAtV,EAGA,QAAAuV,WAAA/K,EAAAvpB,GACA,MAAAupB,IAAA,KAAA/zB,KAAA+zB,GAAA,IAAA,KAAAvpB,EAGA,QAAAu0B,aAAA7R,EAAApvB,EAAAo7B,EAAAnF,GACA,GAAAiL,GAAAC,SACAC,EAAAhS,EAAA,eAAA,WACAiS,EAAAjS,EAAA,mBAAAkS,QAAAC,kBAAAL,GACAM,EAAA,GAAA9T,QAAA,aAAA0T,EAAA,aACA5S,EAAAyH,EAAAzH,MAAAgT,GACAC,EAAAC,IAAA5M,cAAA,UACA79B,EAAA,EACA0qC,EAAA,KAAAC,UAAAC,UAAAliC,QAAA,YAyCA,OAvCA6uB,GACA,MAAAA,EAAA,GACAyH,EAAAA,EAAAxvB,QAAA+6B,EAAA,MAAAH,GAEAA,EAAA7S,EAAA,GAGAyH,EAAA+K,UAAA/K,EAAAmL,EAAA,IAAAC,GAGAphC,QAAAohC,GAAAP,gBAEAW,EAAAl+B,KAAA,kBACAk+B,EAAAlL,IAAAN,EACAwL,EAAAK,OAAA,EACA,mBAAAL,GAAAvB,oBAAAyB,IAIAF,EAAAM,QAAAN,EAAAzqC,GAAA,YAAAkqC,GAGAO,EAAAO,OAAAP,EAAAvB,mBAAA,WACA,MAAAuB,GAAAxB,aAAA,aAAAwB,EAAAxB,aAAA,WAAAwB,EAAAxB,aAAAhpC,GACA,GAEAwqC,EAAAO,OAAAP,EAAAvB,mBAAA,KACAuB,EAAAQ,SAAAR,EAAAQ,UAEAjiC,EAAA+gC,WACAA,UAAAvlC,OACAssB,KAAAoa,YAAAT,QACAxqC,EAAA,KAIA6wB,KAAAvU,YAAAkuB,IAIA1C,MAAA,WACA0C,EAAAO,OAAAP,EAAAvB,mBAAA,KACA9E,KAAc,kCACd2F,UAAAvlC,OACAssB,KAAAoa,YAAAT,GACAxqC,EAAA,IAKA,QAAAkrC,YAAAniC,EAAAo7B,GACA,GAOAgF,GAPAhR,EAAA34B,KAAA24B,EACAgT,GAAAhT,EAAA,QAAA,OAAA6B,cACAgF,EAAA,gBAAA7G,GAAAA,EAAAA,EAAA,IAEA3D,EAAA2D,EAAA,eAAA,GAAAA,EAAA,MAAA,gBAAAA,GAAA,KACAkS,QAAAe,cAAAjT,EAAA,MACAA,EAAA,MAAA,KAEAkT,GAAA,CASA,OALA,SAAAlT,EAAA,MAAA,OAAAgT,IAAA3W,IACAwK,EAAA+K,UAAA/K,EAAAxK,GACAA,EAAA,MAGA,SAAA2D,EAAA,KAAA6R,YAAA7R,EAAApvB,EAAAo7B,EAAAnF,IAIAmK,EAAAhR,EAAAmT,KAAAnT,EAAAmT,IAAAnT,IAAAmT,IAAAnT,GAEAgR,EAAAoC,KAAAJ,EAAAnM,EAAA7G,EAAA,SAAA,GAAA,GAAA,GACA+Q,WAAAC,EAAAhR,GACAwR,eAAAR,EAAAhR,GACAnvB,QAAAwiC,iBAAArC,YAAAngC,SAAAwiC,iBACArC,EAAA4B,OAAAhiC,EACAogC,EAAAsC,QAAAtH,EAGAgF,EAAAuC,WAAA,aACAL,GAAA,GAEAlC,EAAAF,mBAAAL,iBAAAppC,KAAAuJ,EAAAo7B,GAEAhM,EAAA,QAAAA,EAAA,OAAAgR,GACAkC,EACA/gB,WAAA,WACA6e,EAAAwC,KAAAnX,IACO,KAEP2U,EAAAwC,KAAAnX,GAEA2U,GAGA,QAAAyC,SAAAzT,EAAApvB,GACAvJ,KAAA24B,EAAAA,EACA34B,KAAAuJ,GAAAA,EAEA8iC,KAAAvhC,MAAA9K,KAAA4K,WAGA,QAAA0hC,SAAAC,GAEA,MAAA,QAAAA,EACAA,EAAAxU,MAAA,QAAA,OACAwU,EAAAxU,MAAA,cAAA,KACAwU,EAAAxU,MAAA,QAAA,OACAwU,EAAAxU,MAAA,OAAA,MAAA,OAJA,OAOA,QAAAsU,MAAA1T,EAAApvB,IA8CA,QAAA65B,UAAAoJ,GAGA,IAFA7T,EAAA,SAAAhF,aAAAjE,KAAA+D,SACA/D,KAAA+D,QAAA,KACA/D,KAAA+c,kBAAA1oC,OAAA,GACA2rB,KAAA+c,kBAAAhQ,QAAA+P,GAIA,QAAAnD,SAAAmD,MACA,GAAA1/B,MAAA6rB,EAAA,MAAA6T,MAAAF,QAAAE,KAAAE,kBAAA,gBACAF,MAAA,UAAA1/B,KAAA4iB,KAAAuZ,QAAAuD,IAEA,IAAAG,kBAAAC,mBAAAC,WAAAL,KAAAM,aAAAhgC,MACAyL,EAAAo0B,gBACA,KACAH,KAAAM,aAAAv0B,EACO,MAAAE,IAGP,GAAAF,EACA,OAAAzL,MACA,IAAA,OACA,IACA0/B,KAAAhjC,QAAAmuB,KAAAnuB,QAAAmuB,KAAAoV,MAAAx0B,GAAAy0B,KAAA,IAAAz0B,EAAA,KACW,MAAAosB,KACX,MAAAxW,OAAAqe,KAAA,mCAAA7H,KAEA,KACA,KAAA,KACA6H,KAAAQ,KAAAz0B,EACA,MACA,KAAA,OACAi0B,KAAAj0B,CACA,MACA,KAAA,MACAi0B,KAAAA,KAAAS,aACAT,KAAAS,YAAAC,YACAV,KAAAS,YAAAC,WAAAC,WACAX,KAAAS,YAAAC,WAAAE,OACA,KACAZ,KAAAS,YASA,IAJAvd,KAAA2d,cAAAb,KAAAA,KACA9c,KAAA4d,YAAA,EACA/jC,GAAAijC,MACA9c,KAAA6d,gBAAAf,MACA9c,KAAA8d,qBAAAzpC,OAAA,GACAyoC,KAAA9c,KAAA8d,qBAAA/Q,QAAA+P,KAGApJ,UAAAoJ,MAGA,QAAAiB,YACA/d,KAAA6Z,WAAA,EACA7Z,KAAAuZ,QAAAX,QAGA,QAAAna,OAAAqe,EAAA3S,EAAA6T,GAMA,IALAlB,EAAA9c,KAAAuZ,QACAvZ,KAAA2d,cAAAb,KAAAA,EACA9c,KAAA2d,cAAAxT,IAAAA,EACAnK,KAAA2d,cAAAK,EAAAA,EACAhe,KAAAie,QAAA,EACAje,KAAAke,eAAA7pC,OAAA,GACA2rB,KAAAke,eAAAnR,QAAA+P,EAAA3S,EAAA6T,EAEAtK,UAAAoJ,GAlHAxsC,KAAAw/B,IAAA,gBAAA7G,GAAAA,EAAAA,EAAA,IACA34B,KAAAyzB,QAAA,KAIAzzB,KAAAstC,YAAA,EAEAttC,KAAAutC,gBAAA,aACAvtC,KAAAwtC,wBAEAxtC,KAAA4tC,kBAEA5tC,KAAAysC,qBACAzsC,KAAA2tC,QAAA,EACA3tC,KAAAqtC,gBAEA,IAAA3d,MAAA1vB,IAEAuJ,IAAAA,IAAA,aAEAovB,EAAA,UACA34B,KAAAyzB,QAAA3I,WAAA,WACA2iB,YACO9U,EAAA,UAGPA,EAAA,UACA34B,KAAAutC,gBAAA,WACA5U,EAAA,QAAA7tB,MAAA6tB,EAAA/tB,aAIA+tB,EAAA,OACA34B,KAAA4tC,eAAA9kC,KAAA,WACA6vB,EAAA,MAAA7tB,MAAA6tB,EAAA/tB,aAIA+tB,EAAA,UACA34B,KAAAysC,kBAAA3jC,KAAA,WACA6vB,EAAA,SAAA7tB,MAAA6tB,EAAA/tB,aA6EA5K,KAAAipC,QAAAyC,WAAAjrC,KAAAT,KAAAqpC,QAAAlb,OA+DA,QAAA0c,SAAAlS,EAAApvB,GACA,MAAA,IAAA6iC,SAAAzT,EAAApvB,GAIA,QAAAi+B,WAAAvxB,GACA,MAAAA,GAAAA,EAAAjG,QAAA,SAAA,QAAA,GAGA,QAAA69B,QAAAC,EAAAlH,GACA,GAQAmH,GAAAC,EAAAhf,EAAAlrB,EARA8J,EAAAkgC,EAAAzZ,KACAqZ,EAAAI,EAAAG,QAAAC,cACAC,EAAA,SAAAxV,GAGAA,IAAAA,EAAA,UACAiO,EAAAh5B,EAAA45B,UAAA7O,EAAA,WAAA,OAAAA,EAAA,WAAA,MAAA,UAAAA,EAAA,MAAAA,EAAA,OAKA,KAAAmV,EAAAM,UAAAxgC,EAEA,OAAA8/B,GACA,IAAA,QACA,2BAAAjiC,KAAAqiC,EAAAhhC,QACAihC,EAAA,YAAAtiC,KAAAqiC,EAAAhhC,MACAkhC,EAAA,SAAAviC,KAAAqiC,EAAAhhC,MACAkiB,EAAA8e,EAAA3sC,SAES4sC,GAAAC,IAAAF,EAAAO,UAAAzH,EAAAh5B,EAAA45B,UAAAuG,GAAA,KAAA/e,EAAA,KAAAA,IAET,MACA,KAAA,WACA4X,EAAAh5B,EAAA45B,UAAAsG,EAAA3sC,OACA,MACA,KAAA,SACA,GAAA,eAAA2sC,EAAAhhC,KAAAohC,cACAC,EAAAL,EAAAQ,eAAA,EAAAR,EAAAhoC,QAAAgoC,EAAAQ,eAAA,UAEA,KAAAxqC,EAAA,EAAmBgqC,EAAA/pC,QAAAD,EAAAgqC,EAAA/pC,OAA4BD,IAC/CgqC,EAAAhoC,QAAAhC,GAAAyqC,UAAAJ,EAAAL,EAAAhoC,QAAAhC,KAUA,QAAA0qC,mBACA,GACA/1B,GAAA3U,EADA8iC,EAAA5mC,KAEAyuC,EAAA,SAAAh2B,EAAAi2B,GACA,GAAA5qC,GAAAiH,EAAA4jC,CACA,KAAA7qC,EAAA,EAAqBA,EAAA4qC,EAAA3qC,OAAiBD,IAEtC,IADA6qC,EAAAl2B,EAAAm2B,OAAAF,EAAA5qC,IACAiH,EAAA,EAAuBA,EAAA4jC,EAAA5qC,OAAegH,IAAA8iC,OAAAc,EAAA5jC,GAAA67B,GAItC,KAAA9iC,EAAA,EAAeA,EAAA8G,UAAA7G,OAAsBD,IACrC2U,EAAA7N,UAAA9G,GACA,yBAAA2H,KAAAgN,EAAAw1B,UAAAJ,OAAAp1B,EAAAmuB,GACA6H,EAAAh2B,GAAA,QAAA,SAAA,aAKA,QAAAo2B,wBACA,MAAAhE,SAAAe,cAAAf,QAAAiE,eAAAhkC,MAAA,KAAAF,YAIA,QAAAmkC,iBACA,GAAAzY,KAOA,OANAkY,iBAAA1jC,MAAA,SAAAupB,EAAAlzB,GACAkzB,IAAAiC,IACAA,EAAAjC,KAAAlmB,QAAAmoB,EAAAjC,MAAAiC,EAAAjC,IAAAiC,EAAAjC,KACAiC,EAAAjC,GAAAvrB,KAAA3H,IACOm1B,EAAAjC,GAAAlzB,GACFyJ,WACL0rB,EAqDA,QAAA0Y,aAAArlC,EAAA7I,EAAAmuC,EAAAxmC,GACA,GAAA4rB,GAAAvwB,EAAA6T,EACAu3B,EAAA,OAEA,IAAA/gC,QAAArN,GAEA,IAAAgD,EAAA,EAAiBhD,GAAAgD,EAAAhD,EAAAiD,OAAuBD,IACxC6T,EAAA7W,EAAAgD,GACAmrC,GAAAC,EAAAzjC,KAAA9B,GAEAlB,EAAAkB,EAAAgO,GAEAq3B,YAAArlC,EAAA,KAAA,gBAAAgO,GAAA7T,EAAA,IAAA,IAAA6T,EAAAs3B,EAAAxmC,OAGK,IAAA3H,GAAA,oBAAAA,EAAA2M,WAEL,IAAA4mB,IAAAvzB,GACAkuC,YAAArlC,EAAA,IAAA0qB,EAAA,IAAAvzB,EAAAuzB,GAAA4a,EAAAxmC,OAKAA,GAAAkB,EAAA7I,GA7kBA,GAAA0I,SAAAxJ,IAEA,IAAA,UAAAwJ,SACA,GAAAyhC,KAAAxkC,SACAmoC,MAAA,uBACAvd,KAAA4Z,IAAA2D,OAAA,QAAA,OACG,CACH,GAAAO,KACA,KACAA,KAAA/uC,oBAAA,IACK,MAAAgvC,IACL,KAAA,IAAA74B,OAAA,6DAKA,GAAAwyB,SAAA,QACAH,WAAA,cACAI,SAAA,gBACAQ,WAAA,aACAS,YAAA,eACAD,cAAA,mBACAU,OAAA,EACA2E,eAAA,aAAA,GAAAlf,MACAma,UACAgF,eAAA,iBACAtD,eAAA,iBACAlY,KAAA,aAEA3lB,QAAA,kBAAA/D,OAAA+D,QACA/D,MAAA+D,QACA,SAAAkF,GACA,MAAAA,aAAAjJ,QAGAy/B,gBACAI,YAAA,oCACAD,cAAAsF,eACAC,QACAC,IAAA,6DACAC,IAAA,4BACAC,KAAA,YACAC,KAAA,aACAC,KAAA,oCACAC,GAAA,4CAIA/D,IAAA,SAAAnT,GAEA,GAAAA,EAAA,eAAA,EAAA,CACA,GAAAmT,GAAAtiC,QAAA8lC,gBAAA,GAAAQ,gBAAA,IACA,IAAAhE,GAAA,mBAAAA,GACA,MAAAA,EACW,IAAAtiC,QAAAwiC,gBACX,MAAA,IAAA+D,eAEA,MAAA,IAAAx5B,OAAA,kDAES,MAAA/M,SAAA8lC,gBACT,GAAAQ,gBACSX,KACT,GAAAA,MAEA,GAAAa,eAAA,sBAGApD,oBACAC,WAAA,SAAA7X,GACA,MAAAA,IAmiBA,OAtPAoX,SAAAlpC,WACAolC,MAAA,WACAtoC,KAAAspC,UAAA,EACAtpC,KAAAipC,QAAAX,SAGA2H,MAAA,WACA5D,KAAA5rC,KAAAT,KAAAA,KAAA24B,EAAA34B,KAAAuJ,KAWAk7B,KAAA,SAAA4E,EAAA6G,GAWA,MAVA7G,GAAAA,GAAA,aACA6G,EAAAA,GAAA,aACAlwC,KAAAstC,WACAttC,KAAAqtC,cAAAb,KAAAnD,EAAArpC,KAAAqtC,cAAAb,MACOxsC,KAAA2tC,OACPuC,EAAAlwC,KAAAqtC,cAAAb,KAAAxsC,KAAAqtC,cAAAxT,IAAA75B,KAAAqtC,cAAAK,IAEA1tC,KAAAwtC,qBAAA1kC,KAAAugC,GACArpC,KAAA4tC,eAAA9kC,KAAAonC,IAEAlwC,MAMAmwC,OAAA,SAAA5mC,GAMA,MALAvJ,MAAAstC,YAAAttC,KAAA2tC,OACApkC,EAAAvJ,KAAAqtC,cAAAb,MAEAxsC,KAAAysC,kBAAA3jC,KAAAS,GAEAvJ,MAMAkwC,KAAA,SAAA3mC,GAMA,MALAvJ,MAAA2tC,OACApkC,EAAAvJ,KAAAqtC,cAAAb,KAAAxsC,KAAAqtC,cAAAxT,IAAA75B,KAAAqtC,cAAAK,GAEA1tC,KAAA4tC,eAAA9kC,KAAAS;AAEAvJ,MAEAowC,QAAA,SAAA7mC,GACA,MAAAvJ,MAAAkwC,KAAA3mC,KA2FAshC,QAAAiE,eAAA,WACA,GAAApc,KAIA,OAHA8b,iBAAA1jC,MAAA,SAAAupB,EAAAlzB,GACAuxB,EAAA5pB,MAAgBurB,KAAAA,EAAAlzB,MAAAA,KACXyJ,WACL8nB,GAGAmY,QAAAwF,UAAA,WACA,GAAA,IAAAzlC,UAAA7G,OAAA,MAAA,EACA,IAAAusC,GAAA/mC,EACAmB,EAAAN,MAAAlH,UAAAoN,MAAA7P,KAAAmK,UAAA,EAUA,OARA0lC,GAAA5lC,EAAA8nB,MACA8d,GAAAA,EAAAC,UAAA7lC,EAAA5B,KAAAwnC,KAAAA,EAAA,MACAA,IAAAA,EAAAA,EAAAxjC,MAEAvD,EAAA,OAAA+mC,EAAAvB,cACA,SAAAuB,EAAAzF,QAAAiE,eACAD,qBAEAtlC,EAAAuB,MAAA,KAAAJ,IAGAmgC,QAAAe,cAAA,SAAAjT,EAAA6X,GACA,GAAA7mC,GAAA7F,EACAmrC,EAAAuB,IAAA,EACAv6B,KACAw6B,EAAAC,mBACAjoC,EAAA,SAAAxE,EAAA9C,GAEAA,EAAA,kBAAAA,GAAAA,IAAA,MAAAA,EAAA,GAAAA,EACA8U,EAAAA,EAAAlS,QAAA0sC,EAAAxsC,GAAA,IAAAwsC,EAAAtvC,GAGA,IAAAgN,QAAAwqB,GACA,IAAA70B,EAAA,EAAiB60B,GAAA70B,EAAA60B,EAAA50B,OAAmBD,IAAA2E,EAAAkwB,EAAA70B,GAAA,KAAA60B,EAAA70B,GAAA,WAIpC,KAAA6F,IAAAgvB,GACAA,EAAA5sB,eAAApC,IAAAqlC,YAAArlC,EAAAgvB,EAAAhvB,GAAAslC,EAAAxmC,EAKA,OAAAwN,GAAAmc,KAAA,KAAApiB,QAAA,OAAA,MA8BA66B,QAAAC,kBAAA,WACA,MAAAuE,iBAKAxE,QAAA8F,OAAA,SAAAhY,EAAApvB,GAOA,MANAovB,KACAA,EAAA,OAAAA,EAAA,OAAAA,EAAA,aAAAA,GAAA,KACAA,EAAA,WAAAA,EAAA,KAAAA,EAAA,UACAA,EAAA,gBAAAA,EAAA,kBAAAA,EAAA,sBAAAA,GAAA,cACAA,EAAA,QAAAA,EAAA,cAAAA,EAAA,QAEA,GAAAyT,SAAAzT,EAAApvB,IAGAshC,QAAA+F,UAAA,SAAA9qC,GACAA,EAAAA,KACA,KAAA,GAAAyR,KAAAzR,GACA8mC,mBAAAr1B,GAAAzR,EAAAyR,IAIAszB,WtD81QM,SAASjrC,EAAQD,KAMjB,SAASC,EAAQD,EAASS,IuDx9RhC,SAAAg1B,EAAA11B,GACAA,EAAAC,IAGCK,KAAA,SAAAL,GAA2B,YAE5B,SAAAm0B,MAEA,QAAA+c,GAAA36B,GACA,IAAAA,EAAA,MAAA4d,EACA,IAAAgd,GACAC,EACAC,EAAA96B,EAAAzD,MAAA,GACAw+B,EAAA/6B,EAAAzD,MAAA,GACAqH,EAAA5D,EAAAg7B,UAAA,GACAn3B,EAAA7D,EAAAg7B,UAAA,EACA,OAAA,UAAApqC,EAAAhD,GACAA,IAAAgtC,EAAAC,EAAA,GACAjqC,EAAA,IAAAgqC,GAAAhqC,EAAA,IAAAkqC,EAAAl3B,EACAhT,EAAA,IAAAiqC,GAAAjqC,EAAA,IAAAmqC,EAAAl3B,GAIA,QAAAo3B,GAAAj7B,GACA,IAAAA,EAAA,MAAA4d,EACA,IAAAgd,GACAC,EACAC,EAAA96B,EAAAzD,MAAA,GACAw+B,EAAA/6B,EAAAzD,MAAA,GACAqH,EAAA5D,EAAAg7B,UAAA,GACAn3B,EAAA7D,EAAAg7B,UAAA,EACA,OAAA,UAAApqC,EAAAhD,GACAA,IAAAgtC,EAAAC,EAAA,EACA,IAAAK,IAAAtqC,EAAA,GAAAgT,GAAAk3B,EAAA,EACAK,GAAAvqC,EAAA,GAAAiT,GAAAk3B,EAAA,CACAnqC,GAAA,GAAAsqC,EAAAN,EACAhqC,EAAA,GAAAuqC,EAAAN,EACAD,EAAAM,EACAL,EAAAM,GAIA,QAAAjU,GAAA5tB,EAAA5B,GAEA,IADA,GAAA8/B,GAAA3iC,EAAAyE,EAAAzL,OAAAD,EAAAiH,EAAA6C,EACA9J,IAAAiH,GAAA2iC,EAAAl+B,EAAA1L,GAAA0L,EAAA1L,KAAA0L,EAAAzE,GAAAyE,EAAAzE,GAAA2iC,EAGA,QAAA4D,GAAAj+B,EAAArM,GAEA,IADA,GAAAuqC,GAAA,EAAAC,EAAAn+B,EAAAtP,OACAytC,EAAAD,GAAA,CACA,GAAAE,GAAAF,EAAAC,IAAA,CACAn+B,GAAAo+B,GAAAzqC,EAAAuqC,EAAAE,EAAA,EACAD,EAAAC,EAEA,MAAAF,GAGA,QAAAzM,GAAA4M,EAAA/Y,GACA,MAAA,uBAAAA,EAAA7rB,MACAA,KAAA,oBACAy4B,SAAA5M,EAAAgZ,WAAApmB,IAAA,SAAAoN,GAA8C,MAAAiZ,GAAAF,EAAA/Y,MACzCiZ,EAAAF,EAAA/Y,GAGL,QAAAiZ,GAAAF,EAAA/Y,GACA,GAAAa,IACA1sB,KAAA,UACAvM,GAAAo4B,EAAAp4B,GACAsxC,WAAAlZ,EAAAkZ,eACAxmB,SAAA5mB,EAAAitC,EAAA/Y,GAGA,OADA,OAAAA,EAAAp4B,UAAAi5B,GAAAj5B,GACAi5B,EAGA,QAAA/0B,GAAAitC,EAAA/Y,GAIA,QAAAmZ,GAAAhuC,EAAAiuC,GACAA,EAAAhuC,QAAAguC,EAAAvf,KACA,KAAA,GAAA5xB,GAAAyS,EAAA2+B,EAAA,EAAAluC,GAAAA,EAAAA,GAAAyT,EAAA,EAAA3J,EAAAyF,EAAAtP,OAAgE6J,EAAA2J,IAAOA,EACvEw6B,EAAAjpC,KAAAlI,EAAAyS,EAAAkE,GAAAjH,SACA2hC,EAAArxC,EAAA2W,EAEA,GAAAzT,GAAAs5B,EAAA2U,EAAAnkC,GAGA,QAAA9G,GAAAlG,GAGA,MAFAA,GAAAA,EAAA0P,QACA2hC,EAAArxC,EAAA,GACAA,EAGA,QAAAo3B,GAAAga,GAEA,IAAA,GADAD,MACAjuC,EAAA,EAAA8J,EAAAokC,EAAAjuC,OAAsC6J,EAAA9J,IAAOA,EAAAguC,EAAAE,EAAAluC,GAAAiuC,EAE7C,OADAA,GAAAhuC,OAAA,GAAAguC,EAAAjpC,KAAAipC,EAAA,GAAAzhC,SACAyhC,EAGA,QAAAtM,GAAAuM,GAEA,IADA,GAAAD,GAAA/Z,EAAAga,GACAD,EAAAhuC,OAAA,GAAAguC,EAAAjpC,KAAAipC,EAAA,GAAAzhC,QACA,OAAAyhC,GAGA,QAAAG,GAAAF,GACA,MAAAA,GAAAzmB,IAAAka,GAGA,QAAApa,GAAAsN,GACA,GAAA+U,GAAA/U,EAAA7rB,IACA,OAAA,uBAAA4gC,GAA2C5gC,KAAA4gC,EAAAiE,WAAAhZ,EAAAgZ,WAAApmB,IAAAF,IAC3CqiB,IAAAyE,IAAiCrlC,KAAA4gC,EAAAlI,YAAA2M,EAAAzE,GAAA/U,IACjC,KAvCA,GAAAsZ,GAAApB,EAAAa,EAAAx7B,WACA87B,EAAAN,EAAAM,KAyCAG,GACA1vC,MAAA,SAAAk2B,GAA0B,MAAA7xB,GAAA6xB,EAAA6M,cAC1B4M,WAAA,SAAAzZ,GAA+B,MAAAA,GAAA6M,YAAAja,IAAAzkB,IAC/BurC,WAAA,SAAA1Z,GAA+B,MAAAX,GAAAW,EAAAqZ,OAC/BM,gBAAA,SAAA3Z,GAAoC,MAAAA,GAAAqZ,KAAAzmB,IAAAyM,IACpCua,QAAA,SAAA5Z,GAA4B,MAAAuZ,GAAAvZ,EAAAqZ,OAC5BQ,aAAA,SAAA7Z,GAAiC,MAAAA,GAAAqZ,KAAAzmB,IAAA2mB,IAGjC,OAAA7mB,GAAAsN,GAGA,QAAA8Z,GAAAf,EAAAM,GAiDA,QAAAU,GAAA5uC,GACA,GAAA0V,GAAAs4B,EAAAJ,EAAAM,KAAA,EAAAluC,GAAAA,EAAAA,GAAA6uC,EAAAb,EAAA,EAGA,OAFAJ,GAAAx7B,WAAAsD,GAAA,EAAA,GAAAs4B,EAAA9pC,QAAA,SAAA4qC,GAAqEp5B,EAAA,IAAAo5B,EAAA,GAAAp5B,EAAA,IAAAo5B,EAAA,MACrEp5B,EAAAs4B,EAAAA,EAAA/tC,OAAA,GACA,EAAAD,GAAA0V,EAAAm5B,IAAAA,EAAAn5B,GAGA,QAAAiqB,GAAAoP,EAAAC,GACA,IAAA,GAAAv7B,KAAAs7B,GAAA,CACA,GAAArZ,GAAAqZ,EAAAt7B,SACAu7B,GAAAtZ,EAAApqB,aACAoqB,GAAApqB,YACAoqB,GAAAuZ,IACAvZ,EAAAxxB,QAAA,SAAAlE,GAA+BkvC,EAAA,EAAAlvC,GAAAA,EAAAA,GAAA,IAC/BmvC,EAAAnqC,KAAA0wB,IA9DA,GAAAwZ,MACAF,KACAD,KACAI,KACAC,EAAA,EAkEA,OA/DAlB,GAAAhqC,QAAA,SAAAlE,EAAAiH,GACA,GAAA2iC,GAAAoE,EAAAJ,EAAAM,KAAA,EAAAluC,GAAAA,EAAAA,EACAguC,GAAA/tC,OAAA,IAAA+tC,EAAA,GAAA,KAAAA,EAAA,GAAA,KACApE,EAAAsE,IAAAkB,GAAAlB,EAAAkB,GAAApvC,EAAAkuC,EAAAjnC,GAAA2iC,KAIAsE,EAAAhqC,QAAA,SAAAlE,GACA,GAGA01B,GAAA2M,EAHA1tB,EAAAi6B,EAAA5uC,GACAsL,EAAAqJ,EAAA,GACAs6B,EAAAt6B,EAAA,EAGA,IAAA+gB,EAAAqZ,EAAAzjC,GAIA,SAHAyjC,GAAArZ,EAAAuZ,KACAvZ,EAAA1wB,KAAAhF,GACA01B,EAAAuZ,IAAAA,EACA5M,EAAA2M,EAAAC,GAAA,OACAD,GAAA3M,EAAA/2B,MACA,IAAA+jC,GAAAhN,IAAA3M,EAAAA,EAAAA,EAAAlG,OAAA6S,EACA2M,GAAAK,EAAA/jC,MAAAoqB,EAAApqB,OAAAyjC,EAAAM,EAAAJ,IAAA5M,EAAA4M,KAAAI,MAEAL,GAAAtZ,EAAApqB,OAAAyjC,EAAArZ,EAAAuZ,KAAAvZ,MAEO,IAAAA,EAAAsZ,EAAAC,GAIP,SAHAD,GAAAtZ,EAAApqB,OACAoqB,EAAAlH,QAAAxuB,GACA01B,EAAApqB,MAAAA,EACA+2B,EAAA0M,EAAAzjC,GAAA,OACAyjC,GAAA1M,EAAA4M,IACA,IAAAK,GAAAjN,IAAA3M,EAAAA,EAAA2M,EAAA7S,OAAAkG,EACAsZ,GAAAM,EAAAhkC,MAAA+2B,EAAA/2B,OAAAyjC,EAAAO,EAAAL,IAAAvZ,EAAAuZ,KAAAK,MAEAN,GAAAtZ,EAAApqB,OAAAyjC,EAAArZ,EAAAuZ,KAAAvZ,MAGAA,IAAA11B,GACAgvC,EAAAtZ,EAAApqB,MAAAA,GAAAyjC,EAAArZ,EAAAuZ,IAAAA,GAAAvZ,IAsBAiK,EAAAoP,EAAAC,GACArP,EAAAqP,EAAAD,GACAb,EAAAhqC,QAAA,SAAAlE,GAA8BkvC,EAAA,EAAAlvC,GAAAA,EAAAA,IAAAmvC,EAAAnqC,MAAAhF,MAE9BmvC,EAGA,QAAAvoB,GAAAgnB,GACA,MAAAjtC,GAAAitC,EAAA2B,EAAAvoC,MAAA9K,KAAA4K,YAGA,QAAAyoC,GAAA3B,EAAA/Y,EAAAjH,GAGA,QAAAogB,GAAAhuC,GACA,GAAAiH,GAAA,EAAAjH,GAAAA,EAAAA,GACAwvC,EAAAvoC,KAAAuoC,EAAAvoC,QAAAjC,MAAoDhF,EAAAA,EAAAqiC,EAAA3b,IAGpD,QAAAwN,GAAAga,GACAA,EAAAhqC,QAAA8pC,GAGA,QAAAI,GAAAF,GACAA,EAAAhqC,QAAAgwB,GAGA,QAAA3M,GAAAsN,GACA,uBAAAA,EAAA7rB,KAAA6rB,EAAAgZ,WAAA3pC,QAAAqjB,GACAsN,EAAA7rB,OAAAqlC,KAAA3nB,EAAAmO,EAAAwZ,EAAAxZ,EAAA7rB,MAAA6rB,EAAAqZ,OAjBA,GAAAA,KAoBA,IAAApnC,UAAA7G,OAAA,EAAA,CACA,GACAymB,GADA8oB,KAGAnB,GACAE,WAAAra,EACAsa,gBAAAJ,EACAK,QAAAL,EACAM,aAAA,SAAAR,GAAsCA,EAAAhqC,QAAAkqC,IAGtC7mB,GAAAsN,GAEA2a,EAAAtrC,QAAA4C,UAAA7G,OAAA,EACA,SAAAwvC,GAA6BvB,EAAAlpC,KAAAyqC,EAAA,GAAAzvC,IAC7B,SAAAyvC,GAA6B7hB,EAAA6hB,EAAA,GAAApN,EAAAoN,EAAAA,EAAAxvC,OAAA,GAAAoiC,IAAA6L,EAAAlpC,KAAAyqC,EAAA,GAAAzvC,SAE7B,KAAA,GAAAA,GAAA,EAAA8J,EAAA8jC,EAAAM,KAAAjuC,OAA+C6J,EAAA9J,IAAOA,EAAAkuC,EAAAlpC,KAAAhF,EAGtD,QAAYgJ,KAAA,kBAAAklC,KAAAS,EAAAf,EAAAM,IAGZ,QAAAwB,GAAAA,GACA,GAAAngC,GAAAmgC,EAAA,GAAAz9B,EAAAy9B,EAAA,GAAA7yC,EAAA6yC,EAAA,EACA,OAAA9iC,MAAAqI,KAAA1F,EAAA,GAAA1S,EAAA,KAAAoV,EAAA,GAAA1C,EAAA,KAAAA,EAAA,GAAA0C,EAAA,KAAApV,EAAA,GAAA0S,EAAA,KAGA,QAAAoyB,GAAAA,GAOA,IANA,GAEApyB,GAFAvP,EAAA,GACA8J,EAAA63B,EAAA1hC,OAEAgS,EAAA0vB,EAAA73B,EAAA,GACA6lC,EAAA,IAEA3vC,EAAA8J,GACAyF,EAAA0C,EACAA,EAAA0vB,EAAA3hC,GACA2vC,GAAApgC,EAAA,GAAA0C,EAAA,GAAA1C,EAAA,GAAA0C,EAAA,EAGA,OAAA09B,GAAA,EAGA,QAAAC,GAAAhC,GACA,MAAAjtC,GAAAitC,EAAAiC,EAAA7oC,MAAA9K,KAAA4K,YAGA,QAAA+oC,GAAAjC,EAAAjY,GAUA,QAAAma,GAAA1B,GACAA,EAAAlqC,QAAA,SAAA6rC,GACAA,EAAA7rC,QAAA,SAAA8pC,IACAgC,EAAAhC,EAAA,EAAAA,GAAAA,EAAAA,KAAAgC,EAAAhC,QAAAhpC,KAAAopC,OAGA6B,EAAAjrC,KAAAopC,GAGA,QAAA8B,GAAAH,GACA,MAAApO,GAAAhhC,EAAAitC,GAAoC5kC,KAAA,UAAAklC,MAAA6B,KAAgCrO,YAAA,IAAA,EAnBpE,GAAAsO,MACAC,KACAE,IA8CA,OA5CAxa,GAAAzxB,QAAA,SAAA2wB,GACA,YAAAA,EAAA7rB,KAAA8mC,EAAAjb,EAAAqZ,MACA,iBAAArZ,EAAA7rB,MAAA6rB,EAAAqZ,KAAAhqC,QAAA4rC,KAgBAG,EAAA/rC,QAAA,SAAAkqC,GACA,IAAAA,EAAAvY,EAAA,CACA,GAAAua,MACAC,GAAAjC,EAGA,KAFAA,EAAAvY,EAAA,EACAsa,EAAAnrC,KAAAorC,GACAhC,EAAAiC,EAAA3hB,OACA0hB,EAAAprC,KAAAopC,GACAA,EAAAlqC,QAAA,SAAA6rC,GACAA,EAAA7rC,QAAA,SAAA8pC,GACAgC,EAAA,EAAAhC,GAAAA,EAAAA,GAAA9pC,QAAA,SAAAkqC,GACAA,EAAAvY,IACAuY,EAAAvY,EAAA,EACAwa,EAAArrC,KAAAopC,aASA6B,EAAA/rC,QAAA,SAAAkqC,SACAA,GAAAvY,KAIA7sB,KAAA,eACAklC,KAAAiC,EAAA1oB,IAAA,SAAAwoB,GACA,GAAAnmC,GAAAokC,IAoBA,IAjBA+B,EAAA/rC,QAAA,SAAAkqC,GACAA,EAAAlqC,QAAA,SAAA6rC,GACAA,EAAA7rC,QAAA,SAAA8pC,GACAgC,EAAA,EAAAhC,GAAAA,EAAAA,GAAA/tC,OAAA,GACAiuC,EAAAlpC,KAAAgpC,SAOAE,EAAAS,EAAAf,EAAAM,IAMApkC,EAAAokC,EAAAjuC,QAAA,EAEA,IAAA,GAAA2pC,GADA0G,EAAAJ,EAAAD,EAAA,GAAA,IACAjwC,EAAA,EAA4B8J,EAAA9J,IAAOA,EACnC,GAAAswC,IAAAJ,EAAAhC,EAAAluC,IAAA,CACA4pC,EAAAsE,EAAA,GAAAA,EAAA,GAAAA,EAAAluC,GAAAkuC,EAAAluC,GAAA4pC,CACA,OAKA,MAAAsE,MAKA,QAAAmC,GAAA1a,GAIA,QAAAzB,GAAAga,EAAAluC,GACAkuC,EAAAhqC,QAAA,SAAAqL,GACA,EAAAA,IAAAA,GAAAA,EACA,IAAAslB,GAAA0b,EAAAhhC,EACAslB,GAAAA,EAAA7vB,KAAAhF,GACAuwC,EAAAhhC,IAAAvP,KAIA,QAAAouC,GAAAF,EAAAluC,GACAkuC,EAAAhqC,QAAA,SAAA8pC,GAAkC9Z,EAAA8Z,EAAAhuC,KAGlC,QAAAunB,GAAAsN,EAAA70B,GACA,uBAAA60B,EAAA7rB,KAAA6rB,EAAAgZ,WAAA3pC,QAAA,SAAA2wB,GAA6EtN,EAAAsN,EAAA70B,KAC7E60B,EAAA7rB,OAAAqlC,IAAAA,EAAAxZ,EAAA7rB,MAAA6rB,EAAAqZ,KAAAluC,GAlBA,GAAAuwC,MACAF,EAAA1a,EAAAlO,IAAA,WAA4C,WAoB5C4mB,GACAE,WAAAra,EACAsa,gBAAAJ,EACAK,QAAAL,EACAM,aAAA,SAAAR,EAAAluC,GAAuCkuC,EAAAhqC,QAAA,SAAA8pC,GAA6BI,EAAAJ,EAAAhuC,MAGpE21B,GAAAzxB,QAAAqjB,EAEA,KAAA,GAAAvnB,KAAAuwC,GACA,IAAA,GAAArlC,GAAAqlC,EAAAvwC,GAAApD,EAAAsO,EAAAjL,OAAAgH,EAAA,EAAoErK,EAAAqK,IAAOA,EAC3E,IAAA,GAAAwM,GAAAxM,EAAA,EAA2BrK,EAAA6W,IAAOA,EAAA,CAClC,GAAA3J,GAAA0mC,EAAAtlC,EAAAjE,GAAAwpC,EAAAvlC,EAAAuI,IACA3J,EAAAumC,EAAAG,IAAAxwC,EAAAwtC,EAAA1jC,EAAA2mC,MAAAA,GAAA3mC,EAAAzE,OAAArF,EAAA,EAAAywC,IACA3mC,EAAAumC,EAAAI,IAAAzwC,EAAAwtC,EAAA1jC,EAAA0mC,MAAAA,GAAA1mC,EAAAzE,OAAArF,EAAA,EAAAwwC,GAKA,MAAAH,GAGA,QAAAK,GAAAnhC,EAAA0C,GACA,MAAA1C,GAAA,GAAA,GAAA0C,EAAA,GAAA,GAGA,QAAA0+B,KAwBA,QAAAvuB,GAAAzhB,EAAAX,GACA,KAAAA,EAAA,GAAA,CACA,GAAAiH,IAAAjH,EAAA,GAAA,GAAA,EACAoB,EAAAsK,EAAAzE,EACA,IAAAypC,EAAA/vC,EAAAS,IAAA,EAAA,KACAsK,GAAAtK,EAAAy0B,EAAA71B,GAAAoB,EACAsK,EAAA/K,EAAAk1B,EAAA71B,EAAAiH,GAAAtG,GAIA,QAAAiwC,GAAAjwC,EAAAX,GACA,OAAA,CACA,GAAAyU,GAAAzU,EAAA,GAAA,EACAoG,EAAAqO,EAAA,EACAxN,EAAAjH,EACA28B,EAAAjxB,EAAAzE,EAGA,IAFAqe,EAAAlf,GAAAsqC,EAAAhlC,EAAAtF,GAAAu2B,GAAA,IAAAA,EAAAjxB,EAAAzE,EAAAb,IACAkf,EAAA7Q,GAAAi8B,EAAAhlC,EAAA+I,GAAAkoB,GAAA,IAAAA,EAAAjxB,EAAAzE,EAAAwN,IACAxN,IAAAjH,EAAA,KACA0L,GAAAixB,EAAA9G,EAAA71B,GAAA28B,EACAjxB,EAAA/K,EAAAk1B,EAAA71B,EAAAiH,GAAAtG,GA3CA,GAAAkwC,MACAnlC,KACA4Z,EAAA,CA6CA,OA3CAurB,GAAA7rC,KAAA,SAAArE,GAEA,MADAyhB,GAAA1W,EAAA/K,EAAAk1B,EAAAvQ,GAAA3kB,EAAA2kB,KACAA,GAGAurB,EAAAniB,IAAA,WACA,KAAA,GAAApJ,GAAA,CACA,GAAA3kB,GAAAmwC,EAAAplC,EAAA,EAEA,SADA4Z,EAAA,IAAA3kB,EAAA+K,EAAA4Z,GAAAsrB,EAAAllC,EAAA/K,EAAAk1B,EAAA,GAAAl1B,EAAA,IACAmwC,IAGAD,EAAAvrC,OAAA,SAAAwrC,GACA,GAAAnwC,GAAAX,EAAA8wC,EAAAjb,CACA,IAAAnqB,EAAA1L,KAAA8wC,EAEA,MADA9wC,OAAAslB,IAAA3kB,EAAA+K,EAAA4Z,IAAAorB,EAAA/vC,EAAAmwC,GAAA,EAAA1uB,EAAAwuB,GAAAllC,EAAA/K,EAAAk1B,EAAA71B,GAAAW,EAAAX,IACAA,GA2BA6wC,EAGA,QAAAE,GAAAnD,EAAAoD,GAgEA,QAAA5sC,GAAAsrC,GACAmB,EAAAvrC,OAAAoqC,GACAA,EAAA,GAAA,GAAAsB,EAAAtB,GACAmB,EAAA7rC,KAAA0qC,GAlEA,GAAAvB,GAAApB,EAAAa,EAAAx7B,WACA6+B,EAAA5D,EAAAO,EAAAx7B,WACAy+B,EAAAF,GAmEA,OAjEAK,KAAAA,EAAAtB,GAEA9B,EAAAM,KAAAhqC,QAAA,SAAA8pC,GACA,GAEA0B,GACA1vC,EACA8J,EACAhN,EALAo0C,KACAC,EAAA,CAUA,KAAAnxC,EAAA,EAAA8J,EAAAkkC,EAAA/tC,OAAiC6J,EAAA9J,IAAOA,EACxClD,EAAAkxC,EAAAhuC,GACAmuC,EAAAH,EAAAhuC,IAAAlD,EAAA,GAAAA,EAAA,GAAAikB,EAAAA,GAAA/gB,EAGA,KAAAA,EAAA,EAAA8J,EAAAkkC,EAAA/tC,OAAA,EAAqC6J,EAAA9J,IAAOA,EAC5C0vC,EAAA1B,EAAAxhC,MAAAxM,EAAA,EAAAA,EAAA,GACA0vC,EAAA,GAAA,GAAAsB,EAAAtB,GACAwB,EAAAlsC,KAAA0qC,GACAmB,EAAA7rC,KAAA0qC,EAGA,KAAA1vC,EAAA,EAAA8J,EAAAonC,EAAAjxC,OAAuC6J,EAAA9J,IAAOA,EAC9C0vC,EAAAwB,EAAAlxC,GACA0vC,EAAA0B,SAAAF,EAAAlxC,EAAA,GACA0vC,EAAAliB,KAAA0jB,EAAAlxC,EAAA,EAGA,MAAA0vC,EAAAmB,EAAAniB,OAAA,CACA,GAAA0iB,GAAA1B,EAAA0B,SACA5jB,EAAAkiB,EAAAliB,IAMAkiB,GAAA,GAAA,GAAAyB,EAAAzB,EAAA,GAAA,GAAAyB,EACAA,EAAAzB,EAAA,GAAA,GAEA0B,IACAA,EAAA5jB,KAAAA,EACA4jB,EAAA,GAAA1B,EAAA,GACAtrC,EAAAgtC,IAGA5jB,IACAA,EAAA4jB,SAAAA,EACA5jB,EAAA,GAAAkiB,EAAA,GACAtrC,EAAAopB,IAIAwgB,EAAA9pC,QAAA+sC,KASArD,EAGA,GAAAvvC,GAAA,QAEAxC,GAAAwC,QAAAA,EACAxC,EAAA+qB,KAAAA,EACA/qB,EAAA0zC,SAAAA,EACA1zC,EAAA+zC,MAAAA,EACA/zC,EAAAg0C,UAAAA,EACAh0C,EAAAmlC,QAAAA,EACAnlC,EAAAw0C,UAAAA,EACAx0C,EAAAk1C,YAAAA,KvDg+RM,SAASj1C,EAAQD,GwDjgTvB,YAIA,SAAAw1C,GAAAngB,EAAAogB,EAAAjN,GAEAA,EAAAA,GAAA,CAEA,IAAAkN,GAAAD,GAAAA,EAAArxC,OACAuxC,EAAAD,EAAAD,EAAA,GAAAjN,EAAAnT,EAAAjxB,OACAwxC,EAAAC,EAAAxgB,EAAA,EAAAsgB,EAAAnN,GAAA,GACA6M,IAEA,KAAAO,EAAA,MAAAP,EAEA,IAAAS,GAAAC,EAAAC,EAAAC,EAAA5uC,EAAAyP,EAAA2S,CAKA,IAHAisB,IAAAE,EAAAM,EAAA7gB,EAAAogB,EAAAG,EAAApN,IAGAnT,EAAAjxB,OAAA,GAAAokC,EAAA,CACAsN,EAAAE,EAAA3gB,EAAA,GACA0gB,EAAAE,EAAA5gB,EAAA,EAEA,KAAA,GAAAlxB,GAAAqkC,EAAyBmN,EAAAxxC,EAAcA,GAAAqkC,EACvCnhC,EAAAguB,EAAAlxB,GACA2S,EAAAue,EAAAlxB,EAAA,GACA2xC,EAAAzuC,IAAAyuC,EAAAzuC,GACA0uC,EAAAj/B,IAAAi/B,EAAAj/B,GACAzP,EAAA2uC,IAAAA,EAAA3uC,GACAyP,EAAAm/B,IAAAA,EAAAn/B,EAIA2S,GAAA1Y,KAAAC,IAAAglC,EAAAF,EAAAG,EAAAF,GAKA,MAFAI,GAAAP,EAAAP,EAAA7M,EAAAsN,EAAAC,EAAAtsB,GAEA4rB,EAIA,QAAAQ,GAAAxgB,EAAA5lB,EAAA2jC,EAAA5K,EAAA4N,GACA,GACAjyC,GAAAiH,EAAAirC,EADAC,EAAA,CAIA,KAAAnyC,EAAAsL,EAAArE,EAAAgoC,EAAA5K,EAAkC4K,EAAAjvC,EAASA,GAAAqkC,EAC3C8N,IAAAjhB,EAAAjqB,GAAAiqB,EAAAlxB,KAAAkxB,EAAAlxB,EAAA,GAAAkxB,EAAAjqB,EAAA,IACAA,EAAAjH,CAIA,IAAAiyC,IAAAE,EAAA,EACA,IAAAnyC,EAAAsL,EAAuB2jC,EAAAjvC,EAASA,GAAAqkC,EAAA6N,EAAAE,EAAApyC,EAAAkxB,EAAAlxB,GAAAkxB,EAAAlxB,EAAA,GAAAkyC,OAEhC,KAAAlyC,EAAAivC,EAAA5K,EAA2BrkC,GAAAsL,EAAYtL,GAAAqkC,EAAA6N,EAAAE,EAAApyC,EAAAkxB,EAAAlxB,GAAAkxB,EAAAlxB,EAAA,GAAAkyC,EAGvC,OAAAA,GAIA,QAAAG,GAAA/mC,EAAA2jC,GACA,IAAA3jC,EAAA,MAAAA,EACA2jC,KAAAA,EAAA3jC,EAEA,IACAgnC,GADAx1C,EAAAwO,CAEA,GAGA,IAFAgnC,GAAA,EAEAx1C,EAAAy1C,UAAAC,EAAA11C,EAAAA,EAAA0wB,OAAA,IAAAmiB,EAAA7yC,EAAA4vB,KAAA5vB,EAAAA,EAAA0wB,MAOA1wB,EAAAA,EAAA0wB,SAPA,CAGA,GAFAb,EAAA7vB,GACAA,EAAAmyC,EAAAnyC,EAAA4vB,KACA5vB,IAAAA,EAAA0wB,KAAA,MAAA,KACA8kB,IAAA,QAKKA,GAAAx1C,IAAAmyC,EAEL,OAAAA,GAIA,QAAA+C,GAAAS,EAAAvB,EAAA7M,EAAAsN,EAAAC,EAAAtsB,EAAAotB,GACA,GAAAD,EAAA,EAGAC,GAAAptB,GAAAqtB,EAAAF,EAAAd,EAAAC,EAAAtsB,EAMA,KAJA,GACAoH,GAAAc,EADAolB,EAAAH,EAIAA,EAAA/lB,OAAA+lB,EAAAjlB,MAIA,GAHAd,EAAA+lB,EAAA/lB,KACAc,EAAAilB,EAAAjlB,KAEAlI,EAAAutB,EAAAJ,EAAAd,EAAAC,EAAAtsB,GAAAwtB,EAAAL,GAEAvB,EAAAlsC,KAAA0nB,EAAA1sB,EAAAqkC,GACA6M,EAAAlsC,KAAAytC,EAAAzyC,EAAAqkC,GACA6M,EAAAlsC,KAAAwoB,EAAAxtB,EAAAqkC,GAEA1X,EAAA8lB,GAGAA,EAAAjlB,EAAAA,KACAolB,EAAAplB,EAAAA,SAQA,IAHAilB,EAAAjlB,EAGAilB,IAAAG,EAAA,CAEAF,EAIa,IAAAA,GACbD,EAAAM,EAAAN,EAAAvB,EAAA7M,GACA2N,EAAAS,EAAAvB,EAAA7M,EAAAsN,EAAAC,EAAAtsB,EAAA,IAGa,IAAAotB,GACbM,EAAAP,EAAAvB,EAAA7M,EAAAsN,EAAAC,EAAAtsB,GATA0sB,EAAAK,EAAAI,GAAAvB,EAAA7M,EAAAsN,EAAAC,EAAAtsB,EAAA,EAYA,SAMA,QAAAwtB,GAAAL,GACA,GAAAljC,GAAAkjC,EAAA/lB,KACAza,EAAAwgC,EACA51C,EAAA41C,EAAAjlB,IAEA,IAAAmiB,EAAApgC,EAAA0C,EAAApV,IAAA,EAAA,OAAA,CAKA,KAFA,GAAAC,GAAA21C,EAAAjlB,KAAAA,KAEA1wB,IAAA21C,EAAA/lB,MAAA,CACA,GAAAumB,EAAA1jC,EAAArM,EAAAqM,EAAAoD,EAAAV,EAAA/O,EAAA+O,EAAAU,EAAA9V,EAAAqG,EAAArG,EAAA8V,EAAA7V,EAAAoG,EAAApG,EAAA6V,IACAg9B,EAAA7yC,EAAA4vB,KAAA5vB,EAAAA,EAAA0wB,OAAA,EAAA,OAAA,CACA1wB,GAAAA,EAAA0wB,KAGA,OAAA,EAGA,QAAAqlB,GAAAJ,EAAAd,EAAAC,EAAAtsB,GACA,GAAA/V,GAAAkjC,EAAA/lB,KACAza,EAAAwgC,EACA51C,EAAA41C,EAAAjlB,IAEA,IAAAmiB,EAAApgC,EAAA0C,EAAApV,IAAA,EAAA,OAAA,CAeA,KAZA,GAAAq2C,GAAA3jC,EAAArM,EAAA+O,EAAA/O,EAAAqM,EAAArM,EAAArG,EAAAqG,EAAAqM,EAAArM,EAAArG,EAAAqG,EAAA+O,EAAA/O,EAAArG,EAAAqG,EAAA+O,EAAA/O,EAAArG,EAAAqG,EACAiwC,EAAA5jC,EAAAoD,EAAAV,EAAAU,EAAApD,EAAAoD,EAAA9V,EAAA8V,EAAApD,EAAAoD,EAAA9V,EAAA8V,EAAAV,EAAAU,EAAA9V,EAAA8V,EAAAV,EAAAU,EAAA9V,EAAA8V,EACAygC,EAAA7jC,EAAArM,EAAA+O,EAAA/O,EAAAqM,EAAArM,EAAArG,EAAAqG,EAAAqM,EAAArM,EAAArG,EAAAqG,EAAA+O,EAAA/O,EAAArG,EAAAqG,EAAA+O,EAAA/O,EAAArG,EAAAqG,EACAmwC,EAAA9jC,EAAAoD,EAAAV,EAAAU,EAAApD,EAAAoD,EAAA9V,EAAA8V,EAAApD,EAAAoD,EAAA9V,EAAA8V,EAAAV,EAAAU,EAAA9V,EAAA8V,EAAAV,EAAAU,EAAA9V,EAAA8V,EAGA2gC,EAAAC,EAAAL,EAAAC,EAAAxB,EAAAC,EAAAtsB,GACAkuB,EAAAD,EAAAH,EAAAC,EAAA1B,EAAAC,EAAAtsB,GAGAxoB,EAAA21C,EAAAgB,MAEA32C,GAAAA,EAAAqG,GAAAqwC,GAAA,CACA,GAAA12C,IAAA21C,EAAA/lB,MAAA5vB,IAAA21C,EAAAjlB,MACAylB,EAAA1jC,EAAArM,EAAAqM,EAAAoD,EAAAV,EAAA/O,EAAA+O,EAAAU,EAAA9V,EAAAqG,EAAArG,EAAA8V,EAAA7V,EAAAoG,EAAApG,EAAA6V,IACAg9B,EAAA7yC,EAAA4vB,KAAA5vB,EAAAA,EAAA0wB,OAAA,EAAA,OAAA,CACA1wB,GAAAA,EAAA22C,MAMA,IAFA32C,EAAA21C,EAAAiB,MAEA52C,GAAAA,EAAAqG,GAAAmwC,GAAA,CACA,GAAAx2C,IAAA21C,EAAA/lB,MAAA5vB,IAAA21C,EAAAjlB,MACAylB,EAAA1jC,EAAArM,EAAAqM,EAAAoD,EAAAV,EAAA/O,EAAA+O,EAAAU,EAAA9V,EAAAqG,EAAArG,EAAA8V,EAAA7V,EAAAoG,EAAApG,EAAA6V,IACAg9B,EAAA7yC,EAAA4vB,KAAA5vB,EAAAA,EAAA0wB,OAAA,EAAA,OAAA,CACA1wB,GAAAA,EAAA42C,MAGA,OAAA,EAIA,QAAAX,GAAAznC,EAAA4lC,EAAA7M,GACA,GAAAvnC,GAAAwO,CACA,GAAA,CACA,GAAAiE,GAAAzS,EAAA4vB,KACAza,EAAAnV,EAAA0wB,KAAAA,IAGAmmB,GAAApkC,EAAAzS,EAAAA,EAAA0wB,KAAAvb,IAAA2hC,EAAArkC,EAAA0C,IAAA2hC,EAAA3hC,EAAA1C,KAEA2hC,EAAAlsC,KAAAuK,EAAAvP,EAAAqkC,GACA6M,EAAAlsC,KAAAlI,EAAAkD,EAAAqkC,GACA6M,EAAAlsC,KAAAiN,EAAAjS,EAAAqkC,GAGA1X,EAAA7vB,GACA6vB,EAAA7vB,EAAA0wB,MAEA1wB,EAAAwO,EAAA2G,GAEAnV,EAAAA,EAAA0wB,WACK1wB,IAAAwO,EAEL,OAAAxO,GAIA,QAAAk2C,GAAA1nC,EAAA4lC,EAAA7M,EAAAsN,EAAAC,EAAAtsB,GAEA,GAAA/V,GAAAjE,CACA,GAAA,CAEA,IADA,GAAA2G,GAAA1C,EAAAie,KAAAA,KACAvb,IAAA1C,EAAAmd,MAAA,CACA,GAAAnd,EAAAvP,IAAAiS,EAAAjS,GAAA6zC,EAAAtkC,EAAA0C,GAAA,CAEA,GAAApV,GAAAi3C,EAAAvkC,EAAA0C,EASA,OANA1C,GAAA8iC,EAAA9iC,EAAAA,EAAAie,MACA3wB,EAAAw1C,EAAAx1C,EAAAA,EAAA2wB,MAGAwkB,EAAAziC,EAAA2hC,EAAA7M,EAAAsN,EAAAC,EAAAtsB,OACA0sB,GAAAn1C,EAAAq0C,EAAA7M,EAAAsN,EAAAC,EAAAtsB,GAGArT,EAAAA,EAAAub,KAEAje,EAAAA,EAAAie,WACKje,IAAAjE,GAIL,QAAAymC,GAAA7gB,EAAAogB,EAAAG,EAAApN,GACA,GACArkC,GAAA6G,EAAAyE,EAAA2jC,EAAAzW,EADAjJ,IAGA,KAAAvvB,EAAA,EAAA6G,EAAAyqC,EAAArxC,OAAyC4G,EAAA7G,EAASA,IAClDsL,EAAAgmC,EAAAtxC,GAAAqkC,EACA4K,EAAApoC,EAAA,EAAA7G,EAAAsxC,EAAAtxC,EAAA,GAAAqkC,EAAAnT,EAAAjxB,OACAu4B,EAAAkZ,EAAAxgB,EAAA5lB,EAAA2jC,EAAA5K,GAAA,GACA7L,IAAAA,EAAAhL,OAAAgL,EAAA+Z,SAAA,GACAhjB,EAAAvqB,KAAA+uC,EAAAvb,GAMA,KAHAjJ,EAAAykB,KAAAC,GAGAj0C,EAAA,EAAeA,EAAAuvB,EAAAtvB,OAAkBD,IACjCk0C,EAAA3kB,EAAAvvB,GAAAyxC,GACAA,EAAAY,EAAAZ,EAAAA,EAAAjkB,KAGA,OAAAikB,GAGA,QAAAwC,GAAA1kC,EAAA0C,GACA,MAAA1C,GAAArM,EAAA+O,EAAA/O,EAIA,QAAAgxC,GAAAC,EAAA1C,GAEA,GADAA,EAAA2C,EAAAD,EAAA1C,GACA,CACA,GAAAx/B,GAAA6hC,EAAArC,EAAA0C,EACA9B,GAAApgC,EAAAA,EAAAub,OAKA,QAAA4mB,GAAAD,EAAA1C,GACA,GAIA70C,GAJAE,EAAA20C,EACA4C,EAAAF,EAAAjxC,EACAoxC,EAAAH,EAAAxhC,EACA4hC,IAAAxzB,EAAAA,EAKA,GAAA,CACA,GAAAuzB,GAAAx3C,EAAA6V,GAAA2hC,GAAAx3C,EAAA0wB,KAAA7a,EAAA,CACA,GAAAzP,GAAApG,EAAAoG,GAAAoxC,EAAAx3C,EAAA6V,IAAA7V,EAAA0wB,KAAAtqB,EAAApG,EAAAoG,IAAApG,EAAA0wB,KAAA7a,EAAA7V,EAAA6V,EACA0hC,IAAAnxC,GAAAA,EAAAqxC,IACAA,EAAArxC,EACAtG,EAAAE,EAAAoG,EAAApG,EAAA0wB,KAAAtqB,EAAApG,EAAAA,EAAA0wB,MAGA1wB,EAAAA,EAAA0wB,WACK1wB,IAAA20C,EAEL,KAAA70C,EAAA,MAAA,KAEA,IAAAu3C,EAAAjxC,IAAAtG,EAAAsG,EAAA,MAAAtG,GAAA8vB,IAMA,IAEA5X,GAFA89B,EAAAh2C,EACA43C,EAAAzzB,EAAAA,CAKA,KAFAjkB,EAAAF,EAAA4wB,KAEA1wB,IAAA81C,GACAyB,GAAAv3C,EAAAoG,GAAApG,EAAAoG,GAAAtG,EAAAsG,GACA+vC,EAAAqB,EAAA13C,EAAA+V,EAAA0hC,EAAAE,EAAAD,EAAA13C,EAAAsG,EAAAtG,EAAA+V,EAAA2hC,EAAA13C,EAAA+V,EAAA4hC,EAAAF,EAAAC,EAAAx3C,EAAAoG,EAAApG,EAAA6V,KAEAmC,EAAAlI,KAAAqI,IAAAq/B,EAAAx3C,EAAA6V,IAAA0hC,EAAAv3C,EAAAoG,IAEAsxC,EAAA1/B,GAAAA,IAAA0/B,GAAA13C,EAAAoG,EAAAtG,EAAAsG,IAAA0wC,EAAA92C,EAAAq3C,KACAv3C,EAAAE,EACA03C,EAAA1/B,IAIAhY,EAAAA,EAAA0wB,IAGA,OAAA5wB,GAIA,QAAA+1C,GAAArnC,EAAAqmC,EAAAC,EAAAtsB,GACA,GAAAxoB,GAAAwO,CACA,GACA,QAAAxO,EAAAqG,IAAArG,EAAAqG,EAAAowC,EAAAz2C,EAAAoG,EAAApG,EAAA6V,EAAAg/B,EAAAC,EAAAtsB,IACAxoB,EAAA42C,MAAA52C,EAAA4vB,KACA5vB,EAAA22C,MAAA32C,EAAA0wB,KACA1wB,EAAAA,EAAA0wB,WACK1wB,IAAAwO,EAELxO,GAAA42C,MAAAD,MAAA,KACA32C,EAAA42C,MAAA,KAEAe,EAAA33C,GAKA,QAAA23C,GAAAjc,GACA,GAAAx4B,GAAAlD,EAAAmgC,EAAAtoB,EAAA8X,EAAAioB,EAAAC,EAAAC,EACAC,EAAA,CAEA,GAAA,CAMA,IALA/3C,EAAA07B,EACAA,EAAA,KACA/L,EAAA,KACAioB,EAAA,EAEA53C,GAAA,CAIA,IAHA43C,IACAzX,EAAAngC,EACA63C,EAAA,EACA30C,EAAA,EAAuB60C,EAAA70C,IACvB20C,IACA1X,EAAAA,EAAAwW,MACAxW,GAHmCj9B,KAQnC,IAFA40C,EAAAC,EAEAF,EAAA,GAAAC,EAAA,GAAA3X,GAEA,IAAA0X,GACAhgC,EAAAsoB,EACAA,EAAAA,EAAAwW,MACAmB,KACiB,IAAAA,GAAA3X,EAIAngC,EAAAqG,GAAA85B,EAAA95B,GACjBwR,EAAA7X,EACAA,EAAAA,EAAA22C,MACAkB,MAEAhgC,EAAAsoB,EACAA,EAAAA,EAAAwW,MACAmB,MAVAjgC,EAAA7X,EACAA,EAAAA,EAAA22C,MACAkB,KAWAloB,EAAAA,EAAAgnB,MAAA9+B,EACA6jB,EAAA7jB,EAEAA,EAAA++B,MAAAjnB,EACAA,EAAA9X,CAGA7X,GAAAmgC,EAGAxQ,EAAAgnB,MAAA,KACAoB,GAAA,QAEKH,EAAA,EAEL,OAAAlc,GAIA,QAAA+a,GAAArwC,EAAAyP,EAAAg/B,EAAAC,EAAAtsB,GAeA,MAbApiB,GAAA,OAAAA,EAAAyuC,GAAArsB,EACA3S,EAAA,OAAAA,EAAAi/B,GAAAtsB,EAEApiB,EAAA,UAAAA,EAAAA,GAAA,GACAA,EAAA,WAAAA,EAAAA,GAAA,GACAA,EAAA,WAAAA,EAAAA,GAAA,GACAA,EAAA,YAAAA,EAAAA,GAAA,GAEAyP,EAAA,UAAAA,EAAAA,GAAA,GACAA,EAAA,WAAAA,EAAAA,GAAA,GACAA,EAAA,WAAAA,EAAAA,GAAA,GACAA,EAAA,YAAAA,EAAAA,GAAA,GAEAzP,EAAAyP,GAAA,EAIA,QAAAohC,GAAAzoC,GACA,GAAAxO,GAAAwO,EACAwpC,EAAAxpC,CACA,GACAxO,GAAAoG,EAAA4xC,EAAA5xC,IAAA4xC,EAAAh4C,GACAA,EAAAA,EAAA0wB,WACK1wB,IAAAwO,EAEL,OAAAwpC,GAIA,QAAA7B,GAAAjQ,EAAAC,EAAAE,EAAAC,EAAAE,EAAAC,EAAAwR,EAAAC,GACA,OAAA1R,EAAAyR,IAAA9R,EAAA+R,IAAAhS,EAAA+R,IAAAxR,EAAAyR,IAAA,IACAhS,EAAA+R,IAAA3R,EAAA4R,IAAA7R,EAAA4R,IAAA9R,EAAA+R,IAAA,IACA7R,EAAA4R,IAAAxR,EAAAyR,IAAA1R,EAAAyR,IAAA3R,EAAA4R,IAAA,EAIA,QAAAnB,GAAAtkC,EAAA0C,GACA,MAAAugC,GAAAjjC,EAAA0C,IAAA1C,EAAAie,KAAAxtB,IAAAiS,EAAAjS,GAAAuP,EAAAmd,KAAA1sB,IAAAiS,EAAAjS,IAAAi1C,EAAA1lC,EAAA0C,IACA2hC,EAAArkC,EAAA0C,IAAA2hC,EAAA3hC,EAAA1C,IAAA2lC,EAAA3lC,EAAA0C,GAIA,QAAA09B,GAAA7yC,EAAAmgC,EAAAxoB,GACA,OAAAwoB,EAAAtqB,EAAA7V,EAAA6V,IAAA8B,EAAAvR,EAAA+5B,EAAA/5B,IAAA+5B,EAAA/5B,EAAApG,EAAAoG,IAAAuR,EAAA9B,EAAAsqB,EAAAtqB,GAIA,QAAA6/B,GAAA98B,EAAAC,GACA,MAAAD,GAAAxS,IAAAyS,EAAAzS,GAAAwS,EAAA/C,IAAAgD,EAAAhD,EAIA,QAAAghC,GAAAj+B,EAAAy/B,EAAAx/B,EAAAy/B,GACA,MAAAzF,GAAAj6B,EAAAy/B,EAAAx/B,GAAA,GAAAg6B,EAAAj6B,EAAAy/B,EAAAC,GAAA,GACAzF,EAAAh6B,EAAAy/B,EAAA1/B,GAAA,GAAAi6B,EAAAh6B,EAAAy/B,EAAAD,GAAA,EAIA,QAAAF,GAAA1lC,EAAA0C,GACA,GAAAnV,GAAAyS,CACA,GAAA,CACA,GAAAzS,EAAAkD,IAAAuP,EAAAvP,GAAAlD,EAAA0wB,KAAAxtB,IAAAuP,EAAAvP,GAAAlD,EAAAkD,IAAAiS,EAAAjS,GAAAlD,EAAA0wB,KAAAxtB,IAAAiS,EAAAjS,GACA2zC,EAAA72C,EAAAA,EAAA0wB,KAAAje,EAAA0C,GAAA,OAAA,CACAnV,GAAAA,EAAA0wB,WACK1wB,IAAAyS,EAEL,QAAA,EAIA,QAAAqkC,GAAArkC,EAAA0C,GACA,MAAA09B,GAAApgC,EAAAmd,KAAAnd,EAAAA,EAAAie,MAAA,EACAmiB,EAAApgC,EAAA0C,EAAA1C,EAAAie,OAAA,GAAAmiB,EAAApgC,EAAAA,EAAAmd,KAAAza,IAAA,EACA09B,EAAApgC,EAAA0C,EAAA1C,EAAAmd,MAAA,GAAAijB,EAAApgC,EAAAA,EAAAie,KAAAvb,GAAA,EAIA,QAAAijC,GAAA3lC,EAAA0C,GACA,GAAAnV,GAAAyS,EACA8lC,GAAA,EACAN,GAAAxlC,EAAArM,EAAA+O,EAAA/O,GAAA,EACA8xC,GAAAzlC,EAAAoD,EAAAV,EAAAU,GAAA,CACA,GACA7V,GAAA6V,EAAAqiC,GAAAl4C,EAAA0wB,KAAA7a,EAAAqiC,GAAAD,GAAAj4C,EAAA0wB,KAAAtqB,EAAApG,EAAAoG,IAAA8xC,EAAAl4C,EAAA6V,IAAA7V,EAAA0wB,KAAA7a,EAAA7V,EAAA6V,GAAA7V,EAAAoG,IACAmyC,GAAAA,GACAv4C,EAAAA,EAAA0wB,WACK1wB,IAAAyS,EAEL,OAAA8lC,GAKA,QAAAvB,GAAAvkC,EAAA0C,GACA,GAAAzL,GAAA,GAAAiyB,GAAAlpB,EAAAvP,EAAAuP,EAAArM,EAAAqM,EAAAoD,GACA2iC,EAAA,GAAA7c,GAAAxmB,EAAAjS,EAAAiS,EAAA/O,EAAA+O,EAAAU,GACA4iC,EAAAhmC,EAAAie,KACAgoB,EAAAvjC,EAAAya,IAcA,OAZAnd,GAAAie,KAAAvb,EACAA,EAAAya,KAAAnd,EAEA/I,EAAAgnB,KAAA+nB,EACAA,EAAA7oB,KAAAlmB,EAEA8uC,EAAA9nB,KAAAhnB,EACAA,EAAAkmB,KAAA4oB,EAEAE,EAAAhoB,KAAA8nB,EACAA,EAAA5oB,KAAA8oB,EAEAF,EAIA,QAAAlD,GAAApyC,EAAAkD,EAAAyP,EAAAu/B,GACA,GAAAp1C,GAAA,GAAA27B,GAAAz4B,EAAAkD,EAAAyP,EAYA,OAVAu/B,IAKAp1C,EAAA0wB,KAAA0kB,EAAA1kB,KACA1wB,EAAA4vB,KAAAwlB,EACAA,EAAA1kB,KAAAd,KAAA5vB,EACAo1C,EAAA1kB,KAAA1wB,IAPAA,EAAA4vB,KAAA5vB,EACAA,EAAA0wB,KAAA1wB,GAQAA,EAGA,QAAA6vB,GAAA7vB,GACAA,EAAA0wB,KAAAd,KAAA5vB,EAAA4vB,KACA5vB,EAAA4vB,KAAAc,KAAA1wB,EAAA0wB,KAEA1wB,EAAA42C,QAAA52C,EAAA42C,MAAAD,MAAA32C,EAAA22C,OACA32C,EAAA22C,QAAA32C,EAAA22C,MAAAC,MAAA52C,EAAA42C,OAGA,QAAAjb,GAAAz4B,EAAAkD,EAAAyP,GAEAzW,KAAA8D,EAAAA,EAGA9D,KAAAgH,EAAAA,EACAhH,KAAAyW,EAAAA,EAGAzW,KAAAwwB,KAAA,KACAxwB,KAAAsxB,KAAA,KAGAtxB,KAAAiH,EAAA,KAGAjH,KAAAw3C,MAAA,KACAx3C,KAAAu3C,MAAA,KAGAv3C,KAAAq2C,SAAA,EApkBAz2C,EAAAD,QAAAw1C,GxD6kUM,SAASv1C,EAAQD,EAASS,GAM/B,QAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAAWF,GAJzFG,OAAOC,eAAevB,EAAS,cAC7BwB,OAAO,GAYT,IAAImE,GAAgBlF,EyDvlUF,GzDylUdmF,EAAiB1E,EAAuByE,GyDvlUzCi0C,EAAiB,SAASxH,EAAQ9M,EAAOpZ,GAgB3C,QAAS2tB,KACP/X,EAAYsQ,EAAOxmB,IAAI,SAAS3qB,GAAK,OAAQA,EAAE,GAAIkF,EAAQiiB,IAAKnnB,EAAE,MAClE64C,EAAQxU,EAGV,QAASyU,KACPjY,KACAsQ,EAAO/pC,QAAQ,SAASpH,GAAK6gC,EAAU34B,MAAMlI,EAAE,GAAIkF,EAAQiiB,IAAKnnB,EAAE,OAClEmxC,EAAO/pC,QAAQ,SAASpH,GAAK6gC,EAAU34B,MAAMlI,EAAE,GAAIkF,EAAQkiB,OAAQpnB,EAAE,OAErE64C,IACA,KAAK,GAAI31C,GAAI,EAAO8J,EAAJ9J,EAAOA,IACjBA,IAAO8J,EAAI,GACb6rC,EAAM3wC,MAAMhF,EAAI8J,EAAGA,EAAG9J,IACtB21C,EAAM3wC,MAAM,EAAGhF,EAAG8J,MAElB6rC,EAAM3wC,MAAMhF,EAAI8J,EAAG9J,EAAI8J,EAAI,EAAG9J,IAC9B21C,EAAM3wC,MAAMhF,EAAI,EAAGA,EAAGA,EAAI8J,EAAI,IAIlC,IAAI9H,EAAQ6zC,OAAQ,CAClB,GAAI5xB,GAAMkd,EACNjd,EAASD,EAAIwD,IAAI,SAAS3qB,GAAK,MAAOA,GAAE2qB,IAAI,SAAS5T,GAAK,MAAOA,GAAI/J,KACzEoa,GAASA,EAAOuD,IAAI,SAAS3qB,GAAK,OAAQA,EAAE,GAAIA,EAAE,GAAIA,EAAE,MACxD64C,EAAQA,EAAMnmB,OAAOvL,GAAKuL,OAAOtL,IAxCrC,GASIyZ,GACAgY,EAVA1zC,GACFgiB,IAAK,EACLC,OAAQ,EACR2xB,QAAQ,GAGN7zC,GAAU,EAAAP,EAAA,YAAOQ,EAAU8lB,GAE3Bje,EAAImkC,EAAOhuC,MAoCf,OA/BC+B,GAAQiiB,MAAQjiB,EAAQkiB,OAAUwxB,IAASE,KAgC1CjY,UAAWA,EACXwD,MAAOwU,GzDymUV95C,GAAQ,WyDrmUM45C,EzDsmUd35C,EAAOD,QAAUA,EAAQ","file":"vizicities.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _World = __webpack_require__(1);\n\t\n\tvar _World2 = _interopRequireDefault(_World);\n\t\n\tvar _controlsIndex = __webpack_require__(28);\n\t\n\tvar _controlsIndex2 = _interopRequireDefault(_controlsIndex);\n\t\n\tvar _layerEnvironmentEnvironmentLayer = __webpack_require__(31);\n\t\n\tvar _layerEnvironmentEnvironmentLayer2 = _interopRequireDefault(_layerEnvironmentEnvironmentLayer);\n\t\n\tvar _layerTileImageTileLayer = __webpack_require__(33);\n\t\n\tvar _layerTileImageTileLayer2 = _interopRequireDefault(_layerTileImageTileLayer);\n\t\n\tvar _layerTileTopoJSONTileLayer = __webpack_require__(50);\n\t\n\tvar _layerTileTopoJSONTileLayer2 = _interopRequireDefault(_layerTileTopoJSONTileLayer);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar VIZI = {\n\t version: '0.3',\n\t\n\t // Public API\n\t World: _World2['default'],\n\t Controls: _controlsIndex2['default'],\n\t EnvironmentLayer: _layerEnvironmentEnvironmentLayer2['default'],\n\t ImageTileLayer: _layerTileImageTileLayer2['default'],\n\t TopoJSONTileLayer: _layerTileTopoJSONTileLayer2['default'],\n\t Point: _geoPoint2['default'],\n\t LatLon: _geoLatLon2['default']\n\t};\n\t\n\texports['default'] = VIZI;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _geoCRSIndex = __webpack_require__(6);\n\t\n\tvar _geoCRSIndex2 = _interopRequireDefault(_geoCRSIndex);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _engineEngine = __webpack_require__(23);\n\t\n\tvar _engineEngine2 = _interopRequireDefault(_engineEngine);\n\t\n\t// Pretty much any event someone using ViziCities would need will be emitted or\n\t// proxied by World (eg. render events, etc)\n\t\n\tvar World = (function (_EventEmitter) {\n\t _inherits(World, _EventEmitter);\n\t\n\t function World(domId, options) {\n\t _classCallCheck(this, World);\n\t\n\t _get(Object.getPrototypeOf(World.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t crs: _geoCRSIndex2['default'].EPSG3857\n\t };\n\t\n\t this.options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._layers = [];\n\t this._controls = [];\n\t\n\t this._initContainer(domId);\n\t this._initEngine();\n\t this._initEvents();\n\t\n\t // Kick off the update and render loop\n\t this._update();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(World, [{\n\t key: '_initContainer',\n\t value: function _initContainer(domId) {\n\t this._container = document.getElementById(domId);\n\t }\n\t }, {\n\t key: '_initEngine',\n\t value: function _initEngine() {\n\t this._engine = (0, _engineEngine2['default'])(this._container);\n\t\n\t // Engine events\n\t //\n\t // Consider proxying these through events on World for public access\n\t // this._engine.on('preRender', () => {});\n\t // this._engine.on('postRender', () => {});\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t this.on('controlsMoveEnd', this._onControlsMoveEnd);\n\t }\n\t }, {\n\t key: '_onControlsMoveEnd',\n\t value: function _onControlsMoveEnd(point) {\n\t var _point = (0, _geoPoint2['default'])(point.x, point.z);\n\t this._resetView(this.pointToLatLon(_point), _point);\n\t }\n\t\n\t // Reset world view\n\t }, {\n\t key: '_resetView',\n\t value: function _resetView(latlon, point) {\n\t this.emit('preResetView');\n\t\n\t this._moveStart();\n\t this._move(latlon, point);\n\t this._moveEnd();\n\t\n\t this.emit('postResetView');\n\t }\n\t }, {\n\t key: '_moveStart',\n\t value: function _moveStart() {\n\t this.emit('moveStart');\n\t }\n\t }, {\n\t key: '_move',\n\t value: function _move(latlon, point) {\n\t this._lastPosition = latlon;\n\t this.emit('move', latlon, point);\n\t }\n\t }, {\n\t key: '_moveEnd',\n\t value: function _moveEnd() {\n\t this.emit('moveEnd');\n\t }\n\t }, {\n\t key: '_update',\n\t value: function _update() {\n\t var delta = this._engine.clock.getDelta();\n\t\n\t // Once _update is called it will run forever, for now\n\t window.requestAnimationFrame(this._update.bind(this));\n\t\n\t // Update controls\n\t this._controls.forEach(function (controls) {\n\t controls.update();\n\t });\n\t\n\t this.emit('preUpdate');\n\t this._engine.update(delta);\n\t this.emit('postUpdate');\n\t }\n\t\n\t // Set world view\n\t }, {\n\t key: 'setView',\n\t value: function setView(latlon) {\n\t // Store initial geographic coordinate for the [0,0,0] world position\n\t //\n\t // The origin point doesn't move in three.js / 3D space so only set it once\n\t // here instead of every time _resetView is called\n\t //\n\t // If it was updated every time then coorindates would shift over time and\n\t // would be out of place / context with previously-placed points (0,0 would\n\t // refer to a different point each time)\n\t this._originLatlon = latlon;\n\t this._originPoint = this.project(latlon);\n\t\n\t this._resetView(latlon);\n\t return this;\n\t }\n\t\n\t // Return world geographic position\n\t }, {\n\t key: 'getPosition',\n\t value: function getPosition() {\n\t return this._lastPosition;\n\t }\n\t\n\t // Transform geographic coordinate to world point\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the origin point of the projection (not the world)\n\t }, {\n\t key: 'project',\n\t value: function project(latlon) {\n\t return this.options.crs.latLonToPoint((0, _geoLatLon2['default'])(latlon));\n\t }\n\t\n\t // Transform world point to geographic coordinate\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a point relative to the origin point of the\n\t // projection (not the world) and returns a geographic coordinate\n\t }, {\n\t key: 'unproject',\n\t value: function unproject(point) {\n\t return this.options.crs.pointToLatLon((0, _geoPoint2['default'])(point));\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the three.js / 3D origin (0,0)\n\t }, {\n\t key: 'latLonToPoint',\n\t value: function latLonToPoint(latlon) {\n\t var projectedPoint = this.project((0, _geoLatLon2['default'])(latlon));\n\t return projectedPoint._subtract(this._originPoint);\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a point relative to the three.js / 3D origin (0,0)\n\t // and returns the exact geographic coordinate at that point\n\t }, {\n\t key: 'pointToLatLon',\n\t value: function pointToLatLon(point) {\n\t var projectedPoint = (0, _geoPoint2['default'])(point).add(this._originPoint);\n\t return this.unproject(projectedPoint);\n\t }\n\t\n\t // Unsure if it's a good idea to expose this here for components like\n\t // GridLayer to use (eg. to keep track of a frustum)\n\t }, {\n\t key: 'getCamera',\n\t value: function getCamera() {\n\t return this._engine._camera;\n\t }\n\t }, {\n\t key: 'addLayer',\n\t value: function addLayer(layer) {\n\t layer._addToWorld(this);\n\t\n\t this._layers.push(layer);\n\t\n\t // Could move this into Layer but it'll do here for now\n\t this._engine._scene.add(layer._layer);\n\t\n\t this.emit('layerAdded', layer);\n\t return this;\n\t }\n\t\n\t // Remove layer and perform clean up operations\n\t }, {\n\t key: 'removeLayer',\n\t value: function removeLayer(layer) {\n\t var layerIndex = this._layers.indexOf(layer);\n\t\n\t if (layerIndex > -1) {\n\t // Remove from this._layers\n\t this._layers.splice(layerIndex, 1);\n\t };\n\t\n\t this._engine._scene.remove(layer._layer);\n\t\n\t layer.destroy();\n\t\n\t this.emit('layerRemoved');\n\t return this;\n\t }\n\t }, {\n\t key: 'addControls',\n\t value: function addControls(controls) {\n\t controls._addToWorld(this);\n\t\n\t this._controls.push(controls);\n\t\n\t this.emit('controlsAdded', controls);\n\t return this;\n\t }\n\t }, {\n\t key: 'removeControls',\n\t value: function removeControls(controls) {}\n\t }]);\n\t\n\t return World;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (domId, options) {\n\t return new World(domId, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t//\n\t// We store our EE objects in a plain object whose properties are event names.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// `~` to make sure that the built-in object properties are not overridden or\n\t// used as an attack vector.\n\t// We also assume that `Object.create(null)` is available when the event name\n\t// is an ES6 Symbol.\n\t//\n\tvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\t\n\t/**\n\t * Representation of a single EventEmitter function.\n\t *\n\t * @param {Function} fn Event handler to be called.\n\t * @param {Mixed} context Context for function execution.\n\t * @param {Boolean} once Only emit once\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\t\n\t/**\n\t * Minimal EventEmitter interface that is molded against the Node.js\n\t * EventEmitter interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() { /* Nothing to set */ }\n\t\n\t/**\n\t * Holds the assigned EventEmitters by name.\n\t *\n\t * @type {Object}\n\t * @private\n\t */\n\tEventEmitter.prototype._events = undefined;\n\t\n\t/**\n\t * Return a list of assigned event listeners.\n\t *\n\t * @param {String} event The events that should be listed.\n\t * @param {Boolean} exists We only need to know if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events && this._events[evt];\n\t\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\t\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\t\n\t return ee;\n\t};\n\t\n\t/**\n\t * Emit an event to all registered event listeners.\n\t *\n\t * @param {String} event The name of the event.\n\t * @returns {Boolean} Indication if we've emitted an event.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return false;\n\t\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\t\n\t if ('function' === typeof listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\t\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\t\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\t\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\t\n\t return true;\n\t};\n\t\n\t/**\n\t * Register a new EventListener for the given event.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Functon} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Add an EventListener that's only called once.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove event listeners.\n\t *\n\t * @param {String} event The event we want to remove.\n\t * @param {Function} fn The listener that we need to find.\n\t * @param {Mixed} context Only remove listeners matching this context.\n\t * @param {Boolean} once Only remove once listeners.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return this;\n\t\n\t var listeners = this._events[evt]\n\t , events = [];\n\t\n\t if (fn) {\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn !== fn\n\t || (once && !listeners.once)\n\t || (context && listeners.context !== context)\n\t ) {\n\t events.push(listeners);\n\t }\n\t } else {\n\t for (var i = 0, length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) {\n\t this._events[evt] = events.length === 1 ? events[0] : events;\n\t } else {\n\t delete this._events[evt];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove all listeners or only the listeners for the specified event.\n\t *\n\t * @param {String} event The event want to remove all listeners for.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t if (!this._events) return this;\n\t\n\t if (event) delete this._events[prefix ? prefix + event : event];\n\t else this._events = prefix ? {} : Object.create(null);\n\t\n\t return this;\n\t};\n\t\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\t\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\t\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\t\n\t//\n\t// Expose the module.\n\t//\n\tif (true) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar keys = __webpack_require__(4),\n\t rest = __webpack_require__(5);\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if ((!eq(objValue, value) ||\n\t (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object) {\n\t return copyObjectWith(source, props, object);\n\t}\n\t\n\t/**\n\t * This function is like `copyObject` except that it accepts a function to\n\t * customize copied values.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObjectWith(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index],\n\t newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\t\n\t assignValue(object, key, newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return rest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Checks if the provided arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Assigns own enumerable properties of source objects to the destination\n\t * object. Source objects are applied from left to right. Subsequent sources\n\t * overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.e = 5;\n\t * }\n\t *\n\t * Foo.prototype.d = 4;\n\t * Bar.prototype.f = 6;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3, 'e': 5 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t copyObject(source, keys(source), object);\n\t});\n\t\n\tmodule.exports = assign;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t stringTag = '[object String]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar getPrototypeOf = Object.getPrototypeOf,\n\t propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeKeys = Object.keys;\n\t\n\t/**\n\t * The base implementation of `_.has` without support for deep paths.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} key The key to check.\n\t * @returns {boolean} Returns `true` if `key` exists, else `false`.\n\t */\n\tfunction baseHas(object, key) {\n\t // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n\t // that are composed entirely of index properties, return `false` for\n\t // `hasOwnProperty` checks of them.\n\t return hasOwnProperty.call(object, key) ||\n\t (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't skip the constructor\n\t * property of prototypes or treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @type Function\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t return nativeKeys(Object(object));\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Creates an array of index keys for `object` values of arrays,\n\t * `arguments` objects, and strings, otherwise `null` is returned.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array|null} Returns index keys, else `null`.\n\t */\n\tfunction indexKeys(object) {\n\t var length = object ? object.length : undefined;\n\t if (isLength(length) &&\n\t (isArray(object) || isString(object) || isArguments(object))) {\n\t return baseTimes(length, String);\n\t }\n\t return null;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\tfunction isString(value) {\n\t return typeof value == 'string' ||\n\t (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n\t}\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t var isProto = isPrototype(object);\n\t if (!(isProto || isArrayLike(object))) {\n\t return baseKeys(object);\n\t }\n\t var indexes = indexKeys(object),\n\t skipIndexes = !!indexes,\n\t result = indexes || [],\n\t length = result.length;\n\t\n\t for (var key in object) {\n\t if (baseHas(object, key) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n\t !(isProto && key == 'constructor')) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\tmodule.exports = keys;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar INFINITY = 1 / 0,\n\t MAX_INTEGER = 1.7976931348623157e+308,\n\t NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {...*} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t var length = args.length;\n\t switch (length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Creates a function that invokes `func` with the `this` binding of the\n\t * created function and arguments from `start` and beyond provided as an array.\n\t *\n\t * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t * @example\n\t *\n\t * var say = _.rest(function(what, names) {\n\t * return what + ' ' + _.initial(names).join(', ') +\n\t * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n\t * });\n\t *\n\t * say('hello', 'fred', 'barney', 'pebbles');\n\t * // => 'hello fred, barney, & pebbles'\n\t */\n\tfunction rest(func, start) {\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t switch (start) {\n\t case 0: return func.call(this, array);\n\t case 1: return func.call(this, args[0], array);\n\t case 2: return func.call(this, args[0], args[1], array);\n\t }\n\t var otherArgs = Array(start + 1);\n\t index = -1;\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to an integer.\n\t *\n\t * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.toInteger(3);\n\t * // => 3\n\t *\n\t * _.toInteger(Number.MIN_VALUE);\n\t * // => 0\n\t *\n\t * _.toInteger(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toInteger('3');\n\t * // => 3\n\t */\n\tfunction toInteger(value) {\n\t if (!value) {\n\t return value === 0 ? value : 0;\n\t }\n\t value = toNumber(value);\n\t if (value === INFINITY || value === -INFINITY) {\n\t var sign = (value < 0 ? -1 : 1);\n\t return sign * MAX_INTEGER;\n\t }\n\t var remainder = value % 1;\n\t return value === value ? (remainder ? value - remainder : value) : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = rest;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _CRSEPSG3857 = __webpack_require__(7);\n\t\n\tvar _CRSEPSG38572 = _interopRequireDefault(_CRSEPSG3857);\n\t\n\tvar _CRSEPSG3395 = __webpack_require__(15);\n\t\n\tvar _CRSEPSG33952 = _interopRequireDefault(_CRSEPSG3395);\n\t\n\tvar _CRSEPSG4326 = __webpack_require__(17);\n\t\n\tvar _CRSEPSG43262 = _interopRequireDefault(_CRSEPSG4326);\n\t\n\tvar _CRSSimple = __webpack_require__(19);\n\t\n\tvar _CRSSimple2 = _interopRequireDefault(_CRSSimple);\n\t\n\tvar _CRSProj4 = __webpack_require__(20);\n\t\n\tvar _CRSProj42 = _interopRequireDefault(_CRSProj4);\n\t\n\tvar CRS = {};\n\t\n\tCRS.EPSG3857 = _CRSEPSG38572['default'];\n\tCRS.EPSG900913 = _CRSEPSG3857.EPSG900913;\n\tCRS.EPSG3395 = _CRSEPSG33952['default'];\n\tCRS.EPSG4326 = _CRSEPSG43262['default'];\n\tCRS.Simple = _CRSSimple2['default'];\n\tCRS.Proj4 = _CRSProj42['default'];\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionSphericalMercator = __webpack_require__(13);\n\t\n\tvar _projectionProjectionSphericalMercator2 = _interopRequireDefault(_projectionProjectionSphericalMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3857 = {\n\t code: 'EPSG:3857',\n\t projection: _projectionProjectionSphericalMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3857 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3857);\n\t\n\tvar EPSG900913 = (0, _lodashAssign2['default'])({}, EPSG3857, {\n\t code: 'EPSG:900913'\n\t});\n\t\n\texports.EPSG900913 = EPSG900913;\n\texports['default'] = EPSG3857;\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Earth is the base class for all CRS representing Earth.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar Earth = {\n\t wrapLon: [-180, 180],\n\t\n\t R: 6378137,\n\t\n\t // Distance between two geographical points using spherical law of cosines\n\t // approximation or Haversine\n\t //\n\t // See: http://www.movable-type.co.uk/scripts/latlong.html\n\t distance: function distance(latlon1, latlon2, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var lat1;\n\t var lat2;\n\t\n\t var a;\n\t\n\t if (!accurate) {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\t\n\t return this.R * Math.acos(Math.min(a, 1));\n\t } else {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t var lon1 = latlon1.lon * rad;\n\t var lon2 = latlon2.lon * rad;\n\t\n\t var deltaLat = lat2 - lat1;\n\t var deltaLon = lon2 - lon1;\n\t\n\t var halfDeltaLat = deltaLat / 2;\n\t var halfDeltaLon = deltaLon / 2;\n\t\n\t a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\t\n\t var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\n\t return this.R * c;\n\t }\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Defaults to a scale factor of 1 if no calculation method exists\n\t //\n\t // Probably need to run this through the CRS transformation or similar so the\n\t // resulting scale is relative to the dimensions of the world space\n\t // Eg. 1 metre in projected space is likly scaled up or down to some other\n\t // number\n\t pointScale: function pointScale(latlon, accurate) {\n\t return this.projection.pointScale ? this.projection.pointScale(latlon, accurate) : [1, 1];\n\t },\n\t\n\t // Convert real metres to projected units\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t metresToProjected: function metresToProjected(metres, pointScale) {\n\t return metres * pointScale[1];\n\t },\n\t\n\t // Convert projected units to real metres\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t projectedToMetres: function projectedToMetres(projectedUnits, pointScale) {\n\t return projectedUnits / pointScale[1];\n\t },\n\t\n\t // Convert real metres to a value in world (WebGL) units\n\t metresToWorld: function metresToWorld(metres, pointScale, zoom) {\n\t // Transform metres to projected metres using the latitude point scale\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t var projectedMetres = this.metresToProjected(metres, pointScale);\n\t\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t // Scale projected metres\n\t var scaledMetres = scale * (this.transformScale * projectedMetres) / pointScale[1];\n\t\n\t return scaledMetres;\n\t },\n\t\n\t // Convert world (WebGL) units to a value in real metres\n\t worldToMetres: function worldToMetres(worldUnits, pointScale, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var projectedUnits = worldUnits / scale / this.transformScale * pointScale[1];\n\t var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\t\n\t return realMetres;\n\t }\n\t};\n\t\n\texports['default'] = (0, _lodashAssign2['default'])({}, _CRS2['default'], Earth);\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar _utilWrapNum = __webpack_require__(12);\n\t\n\tvar _utilWrapNum2 = _interopRequireDefault(_utilWrapNum);\n\t\n\tvar CRS = {\n\t // Scale factor determines final dimensions of world space\n\t //\n\t // Projection transformation in range -1 to 1 is multiplied by scale factor to\n\t // find final world coordinates\n\t //\n\t // Scale factor can be considered as half the amount of the desired dimension\n\t // for the largest side when transformation is equal to 1 or -1, or as the\n\t // distance between 0 and 1 on the largest side\n\t //\n\t // For example, if you want the world dimensions to be between -1000 and 1000\n\t // then the scale factor will be 1000\n\t scaleFactor: 1000000,\n\t\n\t // Converts geo coords to pixel / WebGL ones\n\t latLonToPoint: function latLonToPoint(latlon, zoom) {\n\t var projectedPoint = this.projection.project(latlon);\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t return this.transformation._transform(projectedPoint, scale);\n\t },\n\t\n\t // Converts pixel / WebGL coords to geo coords\n\t pointToLatLon: function pointToLatLon(point, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var untransformedPoint = this.transformation.untransform(point, scale);\n\t\n\t return this.projection.unproject(untransformedPoint);\n\t },\n\t\n\t // Converts geo coords to projection-specific coords (e.g. in meters)\n\t project: function project(latlon) {\n\t return this.projection.project(latlon);\n\t },\n\t\n\t // Converts projected coords to geo coords\n\t unproject: function unproject(point) {\n\t return this.projection.unproject(point);\n\t },\n\t\n\t // If zoom is provided, returns the map width in pixels for a given zoom\n\t // Else, provides fixed scale value\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom >= 0) {\n\t return 256 * Math.pow(2, zoom);\n\t // Else, return fixed scale value to expand projected coordinates from\n\t // their 0 to 1 range into something more practical\n\t } else {\n\t return this.scaleFactor;\n\t }\n\t },\n\t\n\t // Returns zoom level for a given scale value\n\t // This only works with a scale value that is based on map pixel width\n\t zoom: function zoom(scale) {\n\t return Math.log(scale / 256) / Math.LN2;\n\t },\n\t\n\t // Returns the bounds of the world in projected coords if applicable\n\t getProjectedBounds: function getProjectedBounds(zoom) {\n\t if (this.infinite) {\n\t return null;\n\t }\n\t\n\t var b = this.projection.bounds;\n\t var s = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t s /= 2;\n\t }\n\t\n\t // Bottom left\n\t var min = this.transformation.transform((0, _Point2['default'])(b[0]), s);\n\t\n\t // Top right\n\t var max = this.transformation.transform((0, _Point2['default'])(b[1]), s);\n\t\n\t return [min, max];\n\t },\n\t\n\t // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n\t // wrapLon: [min, max],\n\t // wrapLat: [min, max],\n\t\n\t // If true, the coordinate space will be unbounded (infinite in all directions)\n\t // infinite: false,\n\t\n\t // Wraps geo coords in certain ranges if applicable\n\t wrapLatLon: function wrapLatLon(latlon) {\n\t var lat = this.wrapLat ? (0, _utilWrapNum2['default'])(latlon.lat, this.wrapLat, true) : latlon.lat;\n\t var lon = this.wrapLon ? (0, _utilWrapNum2['default'])(latlon.lon, this.wrapLon, true) : latlon.lon;\n\t var alt = latlon.alt;\n\t\n\t return (0, _LatLon2['default'])(lat, lon, alt);\n\t }\n\t};\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * LatLon is a helper class for ensuring consistent geographic coordinates.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n\t */\n\t\n\tvar LatLon = (function () {\n\t function LatLon(lat, lon, alt) {\n\t _classCallCheck(this, LatLon);\n\t\n\t if (isNaN(lat) || isNaN(lon)) {\n\t throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n\t }\n\t\n\t this.lat = +lat;\n\t this.lon = +lon;\n\t\n\t if (alt !== undefined) {\n\t this.alt = +alt;\n\t }\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t //\n\t // Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n\t // Also converts between lng and lon\n\t\n\t _createClass(LatLon, [{\n\t key: 'clone',\n\t value: function clone() {\n\t return new LatLon(this.lat, this.lon, this.alt);\n\t }\n\t }]);\n\t\n\t return LatLon;\n\t})();\n\t\n\texports['default'] = function (a, b, c) {\n\t if (a instanceof LatLon) {\n\t return a;\n\t }\n\t if (Array.isArray(a) && typeof a[0] !== 'object') {\n\t if (a.length === 3) {\n\t return new LatLon(a[0], a[1], a[2]);\n\t }\n\t if (a.length === 2) {\n\t return new LatLon(a[0], a[1]);\n\t }\n\t return null;\n\t }\n\t if (a === undefined || a === null) {\n\t return a;\n\t }\n\t if (typeof a === 'object' && 'lat' in a) {\n\t return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n\t }\n\t if (b === undefined) {\n\t return null;\n\t }\n\t return new LatLon(a, b, c);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * Point is a helper class for ensuring consistent world positions.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n\t */\n\t\n\tvar Point = (function () {\n\t function Point(x, y, round) {\n\t _classCallCheck(this, Point);\n\t\n\t this.x = round ? Math.round(x) : x;\n\t this.y = round ? Math.round(y) : y;\n\t }\n\t\n\t // Accepts (point), ([x, y]) and (x, y, round)\n\t\n\t _createClass(Point, [{\n\t key: \"clone\",\n\t value: function clone() {\n\t return new Point(this.x, this.y);\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"add\",\n\t value: function add(point) {\n\t return this.clone()._add(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_add\",\n\t value: function _add(point) {\n\t this.x += point.x;\n\t this.y += point.y;\n\t return this;\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"subtract\",\n\t value: function subtract(point) {\n\t return this.clone()._subtract(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_subtract\",\n\t value: function _subtract(point) {\n\t this.x -= point.x;\n\t this.y -= point.y;\n\t return this;\n\t }\n\t }]);\n\t\n\t return Point;\n\t})();\n\t\n\tvar _point = function _point(x, y, round) {\n\t if (x instanceof Point) {\n\t return x;\n\t }\n\t if (Array.isArray(x)) {\n\t return new Point(x[0], x[1]);\n\t }\n\t if (x === undefined || x === null) {\n\t return x;\n\t }\n\t return new Point(x, y, round);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports[\"default\"] = _point;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/*\n\t * Wrap the given number to lie within a certain range (eg. longitude)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n\t */\n\t\n\tvar wrapNum = function wrapNum(x, range, includeMax) {\n\t var max = range[1];\n\t var min = range[0];\n\t var d = max - min;\n\t return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n\t};\n\t\n\texports[\"default\"] = wrapNum;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n\t * used by default.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar SphericalMercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t MAX_LATITUDE: 85.0511287798,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var max = this.MAX_LATITUDE;\n\t var lat = Math.max(Math.min(max, latlon.lat), -max);\n\t var sin = Math.sin(lat * d);\n\t\n\t return (0, _Point2['default'])(this.R * latlon.lon * d, this.R * Math.log((1 + sin) / (1 - sin)) / 2);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t\n\t return (0, _LatLon2['default'])((2 * Math.atan(Math.exp(point.y / this.R)) - Math.PI / 2) * d, point.x * d / this.R);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Accurate scale factor uses proper Web Mercator scaling\n\t // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t // See: http://jsfiddle.net/robhawkes/yws924cf/\n\t pointScale: function pointScale(latlon, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var k;\n\t\n\t if (!accurate) {\n\t k = 1 / Math.cos(latlon.lat * rad);\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t } else {\n\t var lat = latlon.lat * rad;\n\t var lon = latlon.lon * rad;\n\t\n\t var a = this.R;\n\t\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t\n\t var cosLat = Math.cos(lat);\n\t\n\t // Radius meridian\n\t var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\t\n\t // Radius prime meridian\n\t var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\t\n\t // Scale N/S\n\t var h = a / p / cosLat;\n\t\n\t // Scale E/W\n\t k = a / v / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, h];\n\t }\n\t },\n\t\n\t // Not using this.R due to scoping\n\t bounds: (function () {\n\t var d = 6378137 * Math.PI;\n\t return [[-d, -d], [d, d]];\n\t })()\n\t};\n\t\n\texports['default'] = SphericalMercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * Transformation is an utility class to perform simple point transformations\n\t * through a 2d-matrix.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n\t */\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar Transformation = (function () {\n\t function Transformation(a, b, c, d) {\n\t _classCallCheck(this, Transformation);\n\t\n\t this._a = a;\n\t this._b = b;\n\t this._c = c;\n\t this._d = d;\n\t }\n\t\n\t _createClass(Transformation, [{\n\t key: 'transform',\n\t value: function transform(point, scale) {\n\t // Copy input point as to not destroy the original data\n\t return this._transform(point.clone(), scale);\n\t }\n\t\n\t // Destructive transform (faster)\n\t }, {\n\t key: '_transform',\n\t value: function _transform(point, scale) {\n\t scale = scale || 1;\n\t\n\t point.x = scale * (this._a * point.x + this._b);\n\t point.y = scale * (this._c * point.y + this._d);\n\t return point;\n\t }\n\t }, {\n\t key: 'untransform',\n\t value: function untransform(point, scale) {\n\t scale = scale || 1;\n\t return (0, _geoPoint2['default'])((point.x / scale - this._b) / this._a, (point.y / scale - this._d) / this._c);\n\t }\n\t }]);\n\t\n\t return Transformation;\n\t})();\n\t\n\texports['default'] = Transformation;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionMercator = __webpack_require__(16);\n\t\n\tvar _projectionProjectionMercator2 = _interopRequireDefault(_projectionProjectionMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3395 = {\n\t code: 'EPSG:3395',\n\t projection: _projectionProjectionMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3395 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3395);\n\t\n\texports['default'] = EPSG3395;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Mercator projection that takes into account that the Earth is not a perfect\n\t * sphere. Less popular than spherical mercator; used by projections like\n\t * EPSG:3395.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Mercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t R_MINOR: 6356752.314245179,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var r = this.R;\n\t var y = latlon.lat * d;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var con = e * Math.sin(y);\n\t\n\t var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n\t y = -r * Math.log(Math.max(ts, 1E-10));\n\t\n\t return (0, _Point2['default'])(latlon.lon * d * r, y);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t var r = this.R;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var ts = Math.exp(-point.y / r);\n\t var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\t\n\t for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n\t con = e * Math.sin(phi);\n\t con = Math.pow((1 - con) / (1 + con), e / 2);\n\t dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n\t phi += dphi;\n\t }\n\t\n\t return (0, _LatLon2['default'])(phi * d, point.x * d / r);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t pointScale: function pointScale(latlon) {\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t var cosLat = Math.cos(lat);\n\t\n\t var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t },\n\t\n\t bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n\t};\n\t\n\texports['default'] = Mercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG4326 = {\n\t code: 'EPSG:4326',\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / 180,\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t //\n\t // TODO: Cannot use this.transformScale due to scope\n\t transformation: new _utilTransformation2['default'](1 / 180, 0, -1 / 180, 0)\n\t};\n\t\n\tvar EPSG4326 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG4326);\n\t\n\texports['default'] = EPSG4326;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n\t * and Simple.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar ProjectionLatLon = {\n\t project: function project(latlon) {\n\t return (0, _Point2['default'])(latlon.lon, latlon.lat);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t return (0, _LatLon2['default'])(point.y, point.x);\n\t },\n\t\n\t // Scale factor for converting between real metres and degrees\n\t //\n\t // degrees = realMetres * pointScale\n\t // realMetres = degrees / pointScale\n\t //\n\t // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n\t // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n\t pointScale: function pointScale(latlon) {\n\t var m1 = 111132.92;\n\t var m2 = -559.82;\n\t var m3 = 1.175;\n\t var m4 = -0.0023;\n\t var p1 = 111412.84;\n\t var p2 = -93.5;\n\t var p3 = 0.118;\n\t\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t\n\t var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n\t var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\t\n\t return [1 / latlen, 1 / lonlen];\n\t },\n\t\n\t bounds: [[-180, -90], [180, 90]]\n\t};\n\t\n\texports['default'] = ProjectionLatLon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n\t * maps.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Simple = {\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Straight 1:1 mapping (-1, -1 would be top-left)\n\t transformation: new _utilTransformation2['default'](1, 0, 1, 0),\n\t\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom) {\n\t return Math.pow(2, zoom);\n\t // Else, make no change to scale – may need to increase this or make it a\n\t // user-definable variable\n\t } else {\n\t return 1;\n\t }\n\t },\n\t\n\t zoom: function zoom(scale) {\n\t return Math.log(scale) / Math.LN2;\n\t },\n\t\n\t distance: function distance(latlon1, latlon2) {\n\t var dx = latlon2.lon - latlon1.lon;\n\t var dy = latlon2.lat - latlon1.lat;\n\t\n\t return Math.sqrt(dx * dx + dy * dy);\n\t },\n\t\n\t infinite: true\n\t};\n\t\n\tvar Simple = (0, _lodashAssign2['default'])({}, _CRS2['default'], _Simple);\n\t\n\texports['default'] = Simple;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Proj4 for any Proj4-supported CRS.\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionProj4 = __webpack_require__(21);\n\t\n\tvar _projectionProjectionProj42 = _interopRequireDefault(_projectionProjectionProj4);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Proj4 = function _Proj4(code, def, bounds) {\n\t var projection = (0, _projectionProjectionProj42['default'])(def, bounds);\n\t\n\t // Transformation calcuations\n\t var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n\t var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\t\n\t var halfX = diffX / 2;\n\t var halfY = diffY / 2;\n\t\n\t // This is the raw scale factor\n\t var scaleX = 1 / halfX;\n\t var scaleY = 1 / halfY;\n\t\n\t // Find the minimum scale factor\n\t //\n\t // The minimum scale factor comes from the largest side and is the one\n\t // you want to use for both axis so they stay relative in dimension\n\t var scale = Math.min(scaleX, scaleY);\n\t\n\t // Find amount to offset each axis by to make the central point lie on\n\t // the [0,0] origin\n\t var offsetX = scale * (projection.bounds[0][0] + halfX);\n\t var offsetY = scale * (projection.bounds[0][1] + halfY);\n\t\n\t return {\n\t code: code,\n\t projection: projection,\n\t\n\t transformScale: scale,\n\t\n\t // Map the input to a [-1,1] range with [0,0] in the centre\n\t transformation: new _utilTransformation2['default'](scale, -offsetX, -scale, offsetY)\n\t };\n\t};\n\t\n\tvar Proj4 = function Proj4(code, def, bounds) {\n\t return (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _Proj4(code, def, bounds));\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Proj4 support for any projection.\n\t */\n\t\n\tvar _proj4 = __webpack_require__(22);\n\t\n\tvar _proj42 = _interopRequireDefault(_proj4);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Proj4 = function Proj4(def, bounds) {\n\t var proj = (0, _proj42['default'])(def);\n\t\n\t var project = function project(latlon) {\n\t return (0, _Point2['default'])(proj.forward([latlon.lon, latlon.lat]));\n\t };\n\t\n\t var unproject = function unproject(point) {\n\t var inverse = proj.inverse([point.x, point.y]);\n\t return (0, _LatLon2['default'])(inverse[1], inverse[0]);\n\t };\n\t\n\t return {\n\t project: project,\n\t unproject: unproject,\n\t\n\t // Scale factor for converting between real metres and projected metres\\\n\t //\n\t // Need to work out the best way to provide the pointScale calculations\n\t // for custom, unknown projections (if wanting to override default)\n\t //\n\t // For now, user can manually override crs.pointScale or\n\t // crs.projection.pointScale\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t pointScale: function pointScale(latlon, accurate) {\n\t return [1, 1];\n\t },\n\t\n\t // Try and calculate bounds if none are provided\n\t //\n\t // This will provide incorrect bounds for some projections, so perhaps make\n\t // bounds a required input instead\n\t bounds: (function () {\n\t if (bounds) {\n\t return bounds;\n\t } else {\n\t var bottomLeft = project([-90, -180]);\n\t var topRight = project([90, 180]);\n\t\n\t return [bottomLeft, topRight];\n\t }\n\t })()\n\t };\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\tvar _Renderer = __webpack_require__(26);\n\t\n\tvar _Renderer2 = _interopRequireDefault(_Renderer);\n\t\n\tvar _Camera = __webpack_require__(27);\n\t\n\tvar _Camera2 = _interopRequireDefault(_Camera);\n\t\n\tvar Engine = (function (_EventEmitter) {\n\t _inherits(Engine, _EventEmitter);\n\t\n\t function Engine(container) {\n\t _classCallCheck(this, Engine);\n\t\n\t console.log('Init Engine');\n\t\n\t _get(Object.getPrototypeOf(Engine.prototype), 'constructor', this).call(this);\n\t\n\t this._scene = _Scene2['default'];\n\t this._renderer = (0, _Renderer2['default'])(container);\n\t this._camera = (0, _Camera2['default'])(container);\n\t this.clock = new _three2['default'].Clock();\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(Engine, [{\n\t key: 'update',\n\t value: function update(delta) {\n\t this.emit('preRender');\n\t this._renderer.render(this._scene, this._camera);\n\t this.emit('postRender');\n\t }\n\t }]);\n\t\n\t return Engine;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (container) {\n\t return new Engine(container);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can be imported from anywhere and will still reference the same scene,\n\t// though there is a helper reference in Engine.scene\n\t\n\texports['default'] = (function () {\n\t var scene = new _three2['default'].Scene();\n\t scene.fog = new _three2['default'].Fog(0xffffff, 1, 15000);\n\t return scene;\n\t})();\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\t// This can only be accessed from Engine.renderer if you want to reference the\n\t// same scene in multiple places\n\t\n\texports['default'] = function (container) {\n\t var renderer = new _three2['default'].WebGLRenderer({\n\t antialias: true\n\t });\n\t\n\t renderer.setClearColor(_Scene2['default'].fog.color, 1);\n\t\n\t // Gamma settings make things look nicer\n\t renderer.gammaInput = true;\n\t renderer.gammaOutput = true;\n\t\n\t container.appendChild(renderer.domElement);\n\t\n\t var updateSize = function updateSize() {\n\t renderer.setSize(container.clientWidth, container.clientHeight);\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return renderer;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can only be accessed from Engine.camera if you want to reference the\n\t// same scene in multiple places\n\t\n\t// TODO: Ensure that FOV looks natural on all aspect ratios\n\t// http://stackoverflow.com/q/26655930/997339\n\t\n\texports['default'] = function (container) {\n\t var camera = new _three2['default'].PerspectiveCamera(45, 1, 1, 40000);\n\t camera.position.y = 400;\n\t camera.position.z = 400;\n\t\n\t var updateSize = function updateSize() {\n\t camera.aspect = container.clientWidth / container.clientHeight;\n\t camera.updateProjectionMatrix();\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return camera;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _ControlsOrbit = __webpack_require__(29);\n\t\n\tvar _ControlsOrbit2 = _interopRequireDefault(_ControlsOrbit);\n\t\n\tvar Controls = {\n\t Orbit: _ControlsOrbit2['default']\n\t};\n\t\n\texports['default'] = Controls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _vendorOrbitControls = __webpack_require__(30);\n\t\n\tvar _vendorOrbitControls2 = _interopRequireDefault(_vendorOrbitControls);\n\t\n\tvar Orbit = (function (_EventEmitter) {\n\t _inherits(Orbit, _EventEmitter);\n\t\n\t function Orbit() {\n\t _classCallCheck(this, Orbit);\n\t\n\t _get(Object.getPrototypeOf(Orbit.prototype), 'constructor', this).call(this);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Proxy control events\n\t //\n\t // There's currently no distinction between pan, orbit and zoom events\n\t\n\t _createClass(Orbit, [{\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t var _this = this;\n\t\n\t this._controls.addEventListener('start', function (event) {\n\t _this._world.emit('controlsMoveStart', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('change', function (event) {\n\t _this._world.emit('controlsMove', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('end', function (event) {\n\t _this._world.emit('controlsMoveEnd', event.target.target);\n\t });\n\t }\n\t\n\t // Moving the camera along the [x,y,z] axis based on a target position\n\t }, {\n\t key: '_panTo',\n\t value: function _panTo(point, animate) {}\n\t }, {\n\t key: '_panBy',\n\t value: function _panBy(pointDelta, animate) {}\n\t\n\t // Zooming the camera in and out\n\t }, {\n\t key: '_zoomTo',\n\t value: function _zoomTo(metres, animate) {}\n\t }, {\n\t key: '_zoomBy',\n\t value: function _zoomBy(metresDelta, animate) {}\n\t\n\t // Force camera to look at something other than the target\n\t }, {\n\t key: '_lookAt',\n\t value: function _lookAt(point, animate) {}\n\t\n\t // Make camera look at the target\n\t }, {\n\t key: '_lookAtTarget',\n\t value: function _lookAtTarget() {}\n\t\n\t // Tilt (up and down)\n\t }, {\n\t key: '_tiltTo',\n\t value: function _tiltTo(angle, animate) {}\n\t }, {\n\t key: '_tiltBy',\n\t value: function _tiltBy(angleDelta, animate) {}\n\t\n\t // Rotate (left and right)\n\t }, {\n\t key: '_rotateTo',\n\t value: function _rotateTo(angle, animate) {}\n\t }, {\n\t key: '_rotateBy',\n\t value: function _rotateBy(angleDelta, animate) {}\n\t\n\t // Fly to the given point, animating pan and tilt/rotation to final position\n\t // with nice zoom out and in\n\t //\n\t // Calling flyTo a second time before the previous animation has completed\n\t // will immediately start the new animation from wherever the previous one\n\t // has got to\n\t }, {\n\t key: '_flyTo',\n\t value: function _flyTo(point, noZoom) {}\n\t\n\t // Proxy to OrbitControls.update()\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t this._controls.update();\n\t }\n\t\n\t // Add controls to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addControls(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addControls to actually add the controls\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t\n\t // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n\t // See: http://stackoverflow.com/a/26188674/997339\n\t this._controls = new _vendorOrbitControls2['default'](world._engine._camera, world._container);\n\t\n\t // Disable keys for now as no events are fired for them anyway\n\t this._controls.keys = false;\n\t\n\t // 89 degrees\n\t this._controls.maxPolarAngle = 1.5533;\n\t\n\t // this._controls.enableDamping = true;\n\t // this._controls.dampingFactor = 0.25;\n\t\n\t this._initEvents();\n\t\n\t this.emit('added');\n\t }\n\t }]);\n\t\n\t return Orbit;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function () {\n\t return new Orbit();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\t\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finter swipe\n\t\n\tvar OrbitControls = function OrbitControls(object, domElement) {\n\t\n\t\tthis.object = object;\n\t\n\t\tthis.domElement = domElement !== undefined ? domElement : document;\n\t\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\t\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new _three2['default'].Vector3();\n\t\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\t\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\t\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\t\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\t\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\t\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\t\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\t\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\t\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\t\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\t\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\t\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: _three2['default'].MOUSE.LEFT, ZOOM: _three2['default'].MOUSE.MIDDLE, PAN: _three2['default'].MOUSE.RIGHT };\n\t\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\t\n\t\t//\n\t\t// public methods\n\t\t//\n\t\n\t\tthis.getPolarAngle = function () {\n\t\n\t\t\treturn phi;\n\t\t};\n\t\n\t\tthis.getAzimuthalAngle = function () {\n\t\n\t\t\treturn theta;\n\t\t};\n\t\n\t\tthis.reset = function () {\n\t\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\tscope.update();\n\t\n\t\t\tstate = STATE.NONE;\n\t\t};\n\t\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new _three2['default'].Quaternion().setFromUnitVectors(object.up, new _three2['default'].Vector3(0, 1, 0));\n\t\t\tvar quatInverse = quat.clone().inverse();\n\t\n\t\t\tvar lastPosition = new _three2['default'].Vector3();\n\t\t\tvar lastQuaternion = new _three2['default'].Quaternion();\n\t\n\t\t\treturn function () {\n\t\n\t\t\t\tvar position = scope.object.position;\n\t\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\n\t\t\t\t// angle from z-axis around y-axis\n\t\n\t\t\t\ttheta = Math.atan2(offset.x, offset.z);\n\t\n\t\t\t\t// angle from y-axis\n\t\n\t\t\t\tphi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);\n\t\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\n\t\t\t\ttheta += thetaDelta;\n\t\t\t\tphi += phiDelta;\n\t\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\ttheta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, theta));\n\t\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tphi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, phi));\n\t\n\t\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\t\tphi = Math.max(EPS, Math.min(Math.PI - EPS, phi));\n\t\n\t\t\t\tvar radius = offset.length() * scale;\n\t\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tradius = Math.max(scope.minDistance, Math.min(scope.maxDistance, radius));\n\t\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\n\t\t\t\toffset.x = radius * Math.sin(phi) * Math.sin(theta);\n\t\t\t\toffset.y = radius * Math.cos(phi);\n\t\t\t\toffset.z = radius * Math.sin(phi) * Math.cos(theta);\n\t\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\n\t\t\t\tif (scope.enableDamping === true) {\n\t\n\t\t\t\t\tthetaDelta *= 1 - scope.dampingFactor;\n\t\t\t\t\tphiDelta *= 1 - scope.dampingFactor;\n\t\t\t\t} else {\n\t\n\t\t\t\t\tthetaDelta = 0;\n\t\t\t\t\tphiDelta = 0;\n\t\t\t\t}\n\t\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\n\t\t\t\tif (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\n\t\t\t\treturn false;\n\t\t\t};\n\t\t})();\n\t\n\t\tthis.dispose = function () {\n\t\n\t\t\tscope.domElement.removeEventListener('contextmenu', onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener('mousedown', onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener('mousewheel', onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\t\tscope.domElement.removeEventListener('touchstart', onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener('touchend', onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener('touchmove', onTouchMove, false);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\twindow.removeEventListener('keydown', onKeyDown, false);\n\t\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\t\t};\n\t\n\t\t//\n\t\t// internals\n\t\t//\n\t\n\t\tvar scope = this;\n\t\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\t\n\t\tvar STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\n\t\tvar state = STATE.NONE;\n\t\n\t\tvar EPS = 0.000001;\n\t\n\t\t// current position in spherical coordinates\n\t\tvar theta;\n\t\tvar phi;\n\t\n\t\tvar phiDelta = 0;\n\t\tvar thetaDelta = 0;\n\t\tvar scale = 1;\n\t\tvar panOffset = new _three2['default'].Vector3();\n\t\tvar zoomChanged = false;\n\t\n\t\tvar rotateStart = new _three2['default'].Vector2();\n\t\tvar rotateEnd = new _three2['default'].Vector2();\n\t\tvar rotateDelta = new _three2['default'].Vector2();\n\t\n\t\tvar panStart = new _three2['default'].Vector2();\n\t\tvar panEnd = new _three2['default'].Vector2();\n\t\tvar panDelta = new _three2['default'].Vector2();\n\t\n\t\tvar dollyStart = new _three2['default'].Vector2();\n\t\tvar dollyEnd = new _three2['default'].Vector2();\n\t\tvar dollyDelta = new _three2['default'].Vector2();\n\t\n\t\tfunction getAutoRotationAngle() {\n\t\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\n\t\tfunction getZoomScale() {\n\t\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\n\t\tfunction rotateLeft(angle) {\n\t\n\t\t\tthetaDelta -= angle;\n\t\t}\n\t\n\t\tfunction rotateUp(angle) {\n\t\n\t\t\tphiDelta -= angle;\n\t\t}\n\t\n\t\tvar panLeft = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panLeft( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get X column of objectMatrix\n\t\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( - distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\t// Fixed panning to x/y plane\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\t// var adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[0], 0, te[2]);\n\t\t\t\tv.multiplyScalar(-distance);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// Fixed panning to x/y plane\n\t\tvar panUp = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panUp( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get Y column of objectMatrix\n\t\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\tvar adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[4], 0, te[6]);\n\t\t\t\tv.multiplyScalar(adjDist);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\treturn function (deltaX, deltaY) {\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tvar targetDistance = offset.length();\n\t\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0);\n\t\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else {\n\t\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\t\n\t\tfunction dollyIn(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale /= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\tfunction dollyOut(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale *= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\n\t\tfunction handleMouseDownRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\t\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\t\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownPan(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownPan' );\n\t\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\t\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMovePan(event) {\n\t\n\t\t\t//console.log( 'handleMouseMovePan' );\n\t\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseUp(event) {\n\t\n\t\t\t//console.log( 'handleMouseUp' );\n\t\n\t\t}\n\t\n\t\tfunction handleMouseWheel(event) {\n\t\n\t\t\t//console.log( 'handleMouseWheel' );\n\t\n\t\t\tvar delta = 0;\n\t\n\t\t\tif (event.wheelDelta !== undefined) {\n\t\n\t\t\t\t// WebKit / Opera / Explorer 9\n\t\n\t\t\t\tdelta = event.wheelDelta;\n\t\t\t} else if (event.detail !== undefined) {\n\t\n\t\t\t\t// Firefox\n\t\n\t\t\t\tdelta = -event.detail;\n\t\t\t}\n\t\n\t\t\tif (delta > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (delta < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleKeyDown(event) {\n\t\n\t\t\t//console.log( 'handleKeyDown' );\n\t\n\t\t\tswitch (event.keyCode) {\n\t\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction handleTouchStartRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\t\n\t\t\trotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchStartDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\t\n\t\t\tvar dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tvar dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\n\t\tfunction handleTouchStartPan(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartPan' );\n\t\n\t\t\tpanStart.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\t\n\t\t\tvar dx = event.touches[0].pageX - event.touches[1].pageX;\n\t\t\tvar dy = event.touches[0].pageY - event.touches[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyEnd.set(0, distance);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMovePan(event) {\n\t\n\t\t\t//console.log( 'handleTouchMovePan' );\n\t\n\t\t\tpanEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchEnd(event) {}\n\t\n\t\t//console.log( 'handleTouchEnd' );\n\t\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\n\t\tfunction onMouseDown(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (event.button === scope.mouseButtons.ORBIT) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseDownRotate(event);\n\t\n\t\t\t\tstate = STATE.ROTATE;\n\t\t\t} else if (event.button === scope.mouseButtons.ZOOM) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseDownDolly(event);\n\t\n\t\t\t\tstate = STATE.DOLLY;\n\t\t\t} else if (event.button === scope.mouseButtons.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseDownPan(event);\n\t\n\t\t\t\tstate = STATE.PAN;\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tdocument.addEventListener('mousemove', onMouseMove, false);\n\t\t\t\tdocument.addEventListener('mouseup', onMouseUp, false);\n\t\t\t\tdocument.addEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (state === STATE.ROTATE) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t} else if (state === STATE.DOLLY) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t} else if (state === STATE.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseMovePan(event);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseUp(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleMouseUp(event);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onMouseWheel(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\thandleMouseWheel(event);\n\t\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\n\t\tfunction onKeyDown(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return;\n\t\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\n\t\tfunction onTouchStart(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\t\thandleTouchStartPan(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMovePan(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchEnd(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleTouchEnd(event);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onContextMenu(event) {\n\t\n\t\t\tevent.preventDefault();\n\t\t}\n\t\n\t\t//\n\t\n\t\tscope.domElement.addEventListener('contextmenu', onContextMenu, false);\n\t\n\t\tscope.domElement.addEventListener('mousedown', onMouseDown, false);\n\t\tscope.domElement.addEventListener('mousewheel', onMouseWheel, false);\n\t\tscope.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\tscope.domElement.addEventListener('touchstart', onTouchStart, false);\n\t\tscope.domElement.addEventListener('touchend', onTouchEnd, false);\n\t\tscope.domElement.addEventListener('touchmove', onTouchMove, false);\n\t\n\t\twindow.addEventListener('keydown', onKeyDown, false);\n\t\n\t\t// force an update at start\n\t\n\t\tthis.update();\n\t};\n\t\n\tOrbitControls.prototype = Object.create(_three2['default'].EventDispatcher.prototype);\n\tOrbitControls.prototype.constructor = _three2['default'].OrbitControls;\n\t\n\tObject.defineProperties(OrbitControls.prototype, {\n\t\n\t\tcenter: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .center has been renamed to .target');\n\t\t\t\treturn this.target;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t// backward compatibility\n\t\n\t\tnoZoom: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\treturn !this.enableZoom;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\tthis.enableZoom = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoRotate: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\treturn !this.enableRotate;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\tthis.enableRotate = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoPan: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\treturn !this.enablePan;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\tthis.enablePan = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoKeys: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\treturn !this.enableKeys;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\tthis.enableKeys = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tstaticMoving: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\treturn !this.constraint.enableDamping;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\tthis.constraint.enableDamping = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tdynamicDampingFactor: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\treturn this.constraint.dampingFactor;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\tthis.constraint.dampingFactor = value;\n\t\t\t}\n\t\n\t\t}\n\t\n\t});\n\t\n\texports['default'] = OrbitControls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar EnvironmentLayer = (function (_Layer) {\n\t _inherits(EnvironmentLayer, _Layer);\n\t\n\t function EnvironmentLayer() {\n\t _classCallCheck(this, EnvironmentLayer);\n\t\n\t _get(Object.getPrototypeOf(EnvironmentLayer.prototype), 'constructor', this).call(this);\n\t\n\t this._initLights();\n\t // this._initGrid();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(EnvironmentLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd() {}\n\t\n\t // Not fleshed out or thought through yet\n\t //\n\t // Lights could potentially be put it their own 'layer' to keep this class\n\t // much simpler and less messy\n\t }, {\n\t key: '_initLights',\n\t value: function _initLights() {\n\t // Position doesn't really matter (the angle is important), however it's\n\t // used here so the helpers look more natural.\n\t\n\t var directionalLight = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight.intesity = 0.1;\n\t directionalLight.position.x = 100;\n\t directionalLight.position.y = 100;\n\t directionalLight.position.z = 100;\n\t\n\t var directionalLight2 = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight2.intesity = 0.1;\n\t directionalLight2.position.x = -100;\n\t directionalLight2.position.y = 100;\n\t directionalLight2.position.z = -100;\n\t\n\t var helper = new _three2['default'].DirectionalLightHelper(directionalLight, 10);\n\t var helper2 = new _three2['default'].DirectionalLightHelper(directionalLight2, 10);\n\t\n\t this._layer.add(directionalLight);\n\t this._layer.add(directionalLight2);\n\t\n\t this._layer.add(helper);\n\t this._layer.add(helper2);\n\t }\n\t\n\t // Add grid helper for context during initial development\n\t }, {\n\t key: '_initGrid',\n\t value: function _initGrid() {\n\t var size = 4000;\n\t var step = 100;\n\t\n\t var gridHelper = new _three2['default'].GridHelper(size, step);\n\t this._layer.add(gridHelper);\n\t }\n\t }]);\n\t\n\t return EnvironmentLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = function () {\n\t return new EnvironmentLayer();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _engineScene = __webpack_require__(25);\n\t\n\tvar _engineScene2 = _interopRequireDefault(_engineScene);\n\t\n\tvar Layer = (function (_EventEmitter) {\n\t _inherits(Layer, _EventEmitter);\n\t\n\t function Layer() {\n\t _classCallCheck(this, Layer);\n\t\n\t _get(Object.getPrototypeOf(Layer.prototype), 'constructor', this).call(this);\n\t\n\t this._layer = new _three2['default'].Object3D();\n\t }\n\t\n\t // Add layer to world instance and store world reference\n\t\n\t _createClass(Layer, [{\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addLayer(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addLayer to actually add the layer\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t this._onAdd(world);\n\t this.emit('added');\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world = null;\n\t this._layer = null;\n\t }\n\t }]);\n\t\n\t return Layer;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = Layer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _TileLayer2 = __webpack_require__(34);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _ImageTile = __webpack_require__(44);\n\t\n\tvar _ImageTile2 = _interopRequireDefault(_ImageTile);\n\t\n\tvar _ImageTileLayerBaseMaterial = __webpack_require__(47);\n\t\n\tvar _ImageTileLayerBaseMaterial2 = _interopRequireDefault(_ImageTileLayerBaseMaterial);\n\t\n\tvar _lodashThrottle = __webpack_require__(48);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n\t// being removed and the new tiles being ready for display\n\t//\n\t// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n\t// of the basemap ground so it blends in a little more, or have a huge ground\n\t// plane underneath all the tiles that shows through between tile updates.\n\t//\n\t// Could keep the old tiles around until the new ones are ready, though they'd\n\t// probably need to be layered in a way so the old tiles don't overlap new ones,\n\t// which is similar to how Leaflet approaches this (it has 2 layers)\n\t//\n\t// Could keep the tile from the previous quadtree level visible until all 4\n\t// tiles at the new / current level have finished loading and are displayed.\n\t// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n\t// child quadcodes showing whether they are loaded and in view. If all true then\n\t// remove the parent tile, otherwise keep it on a lower layer.\n\t\n\t// TODO: Load and display a base layer separate to the LOD grid that is at a low\n\t// resolution – used as a backup / background to fill in empty areas / distance\n\t\n\t// DONE: Fix the issue where some tiles just don't load, or at least the texture\n\t// never shows up – tends to happen if you quickly zoom in / out past it while\n\t// it's still loading, leaving a blank space\n\t\n\t// TODO: Optimise the request of many image tiles – look at how Leaflet and\n\t// OpenWebGlobe approach this (eg. batching, queues, etc)\n\t\n\t// TODO: Cancel pending tile requests if they get removed from view before they\n\t// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n\t// images are re-requested when the tile is next in scene (even if from cache)\n\t\n\t// TODO: Consider not performing an LOD calculation on every frame, instead only\n\t// on move end so panning, orbiting and zooming stays smooth. Otherwise it's\n\t// possible for performance to tank if you pan, orbit or zoom rapidly while all\n\t// the LOD calculations are being made and new tiles requested.\n\t//\n\t// Pending tiles should continue to be requested and output to the scene on each\n\t// frame, but no new LOD calculations should be made.\n\t\n\tvar ImageTileLayer = (function (_TileLayer) {\n\t _inherits(ImageTileLayer, _TileLayer);\n\t\n\t function ImageTileLayer(path, options) {\n\t _classCallCheck(this, ImageTileLayer);\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(ImageTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t // Add base layer\n\t var geom = new _three2['default'].PlaneBufferGeometry(40000, 40000, 1);\n\t var mesh = new _three2['default'].Mesh(geom, (0, _ImageTileLayerBaseMaterial2['default'])('#f5f5f3'));\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t this._baseLayer = mesh;\n\t this._layer.add(mesh);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t _this._initEvents();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_moveBaseLayer',\n\t value: function _moveBaseLayer(point) {\n\t this._baseLayer.position.x = point.x;\n\t this._baseLayer.position.z = point.y;\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t return (0, _ImageTile2['default'])(quadcode, this._path, layer);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Dispose of mesh and materials\n\t this._baseLayer.geometry.dispose();\n\t this._baseLayer.geometry = null;\n\t\n\t if (this._baseLayer.material.map) {\n\t this._baseLayer.material.map.dispose();\n\t this._baseLayer.material.map = null;\n\t }\n\t\n\t this._baseLayer.material.dispose();\n\t this._baseLayer.material = null;\n\t\n\t this._baseLayer = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return ImageTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new ImageTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Layer2 = __webpack_require__(32);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _TileCache = __webpack_require__(35);\n\t\n\tvar _TileCache2 = _interopRequireDefault(_TileCache);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// TODO: Consider keeping a single TileLayer / LOD instance running by default\n\t// that keeps a standard LOD grid for other layers to utilise, rather than\n\t// having to create their own, unique LOD grid and duplicate calculations when\n\t// they're going to use the same grid setup anyway\n\t//\n\t// It still makes sense to be able to have a custom LOD grid for some layers as\n\t// they may want to customise things, maybe not even using a quadtree at all!\n\t//\n\t// Perhaps it makes sense to split out the quadtree stuff into a singleton and\n\t// pass in the necessary parameters each time for the calculation step.\n\t//\n\t// Either way, it seems silly to force layers to have to create a new LOD grid\n\t// each time and create extra, duplicated processing every frame.\n\t\n\t// TODO: Allow passing in of options to define min/max LOD and a distance to use\n\t// for culling tiles beyond that distance.\n\t\n\t// DONE: Prevent tiles from being loaded if they are further than a certain\n\t// distance from the camera and are unlikely to be seen anyway\n\t\n\t// TODO: Avoid performing LOD calculation when it isn't required. For example,\n\t// when nothing has changed since the last frame and there are no tiles to be\n\t// loaded or in need of rendering\n\t\n\t// TODO: Only remove tiles from the layer that aren't to be rendered in the\n\t// current frame – it seems excessive to remove all tiles and re-add them on\n\t// every single frame, even if it's just array manipulation\n\t\n\t// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n\t// problems (eg. making min above 5 causes all sorts of issues)\n\t\n\t// TODO: Reuse THREE objects where possible instead of creating new instances\n\t// on every LOD calculation\n\t\n\t// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n\t// to avoid creating unnecessary memory for garbage collection\n\t\n\t// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n\t// closest to the camera) so visual inconsistancies during loading are minimised\n\t\n\tvar TileLayer = (function (_Layer) {\n\t _inherits(TileLayer, _Layer);\n\t\n\t function TileLayer(options) {\n\t var _this = this;\n\t\n\t _classCallCheck(this, TileLayer);\n\t\n\t _get(Object.getPrototypeOf(TileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t var defaults = {\n\t maxCache: 1000,\n\t maxLOD: 18\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._tileCache = (0, _TileCache2['default'])(this._options.maxCache, function (tile) {\n\t _this._destroyTile(tile);\n\t });\n\t\n\t // TODO: Work out why changing the minLOD causes loads of issues\n\t this._minLOD = 3;\n\t this._maxLOD = this._options.maxLOD;\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t this._tiles = new _three2['default'].Object3D();\n\t }\n\t\n\t _createClass(TileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t this._layer.add(this._tiles);\n\t }\n\t }, {\n\t key: '_updateFrustum',\n\t value: function _updateFrustum() {\n\t var camera = this._world.getCamera();\n\t var projScreenMatrix = new _three2['default'].Matrix4();\n\t projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\n\t this._frustum.setFromMatrix(camera.projectionMatrix);\n\t this._frustum.setFromMatrix(new _three2['default'].Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n\t }\n\t }, {\n\t key: '_tileInFrustum',\n\t value: function _tileInFrustum(tile) {\n\t var bounds = tile.getBounds();\n\t return this._frustum.intersectsBox(new _three2['default'].Box3(new _three2['default'].Vector3(bounds[0], 0, bounds[3]), new _three2['default'].Vector3(bounds[2], 0, bounds[1])));\n\t }\n\t }, {\n\t key: '_calculateLOD',\n\t value: function _calculateLOD() {\n\t var _this2 = this;\n\t\n\t if (this._stop || !this._world) {\n\t return;\n\t }\n\t\n\t // var start = performance.now();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // 1. Update and retrieve camera frustum\n\t this._updateFrustum(this._frustum, camera);\n\t\n\t // 2. Add the four root items of the quadtree to a check list\n\t var checkList = this._checklist;\n\t checkList = [];\n\t checkList.push(this._requestTile('0', this));\n\t checkList.push(this._requestTile('1', this));\n\t checkList.push(this._requestTile('2', this));\n\t checkList.push(this._requestTile('3', this));\n\t\n\t // 3. Call Divide, passing in the check list\n\t this._divide(checkList);\n\t\n\t // 4. Remove all tiles from layer\n\t this._removeTiles();\n\t\n\t // 5. Render the tiles remaining in the check list\n\t checkList.forEach(function (tile, index) {\n\t // Skip tile if it's not in the current view frustum\n\t if (!_this2._tileInFrustum(tile)) {\n\t return;\n\t }\n\t\n\t if (_this2._options.distance && _this2._options.distance > 0) {\n\t // TODO: Can probably speed this up\n\t var center = tile.getCenter();\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t // Manual distance limit to cut down on tiles so far away\n\t if (dist > _this2._options.distance) {\n\t return;\n\t }\n\t }\n\t\n\t // Does the tile have a mesh?\n\t //\n\t // If yes, continue\n\t // If no, generate tile mesh, request texture and skip\n\t if (!tile.getMesh()) {\n\t tile.requestTileAsync();\n\t return;\n\t }\n\t\n\t // Are the mesh and texture ready?\n\t //\n\t // If yes, continue\n\t // If no, skip\n\t if (!tile.isReady()) {\n\t return;\n\t }\n\t\n\t // Add tile to layer (and to scene)\n\t _this2._tiles.add(tile.getMesh());\n\t });\n\t\n\t // console.log(performance.now() - start);\n\t }\n\t }, {\n\t key: '_divide',\n\t value: function _divide(checkList) {\n\t var count = 0;\n\t var currentItem;\n\t var quadcode;\n\t\n\t // 1. Loop until count equals check list length\n\t while (count != checkList.length) {\n\t currentItem = checkList[count];\n\t quadcode = currentItem.getQuadcode();\n\t\n\t // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n\t if (currentItem.length === this._maxLOD) {\n\t count++;\n\t continue;\n\t }\n\t\n\t // 3. Else, calculate screen-space error metric for quadcode\n\t if (this._screenSpaceError(currentItem)) {\n\t // 4. If error is sufficient...\n\t\n\t // 4a. Remove parent item from the check list\n\t checkList.splice(count, 1);\n\t\n\t // 4b. Add 4 child items to the check list\n\t checkList.push(this._requestTile(quadcode + '0', this));\n\t checkList.push(this._requestTile(quadcode + '1', this));\n\t checkList.push(this._requestTile(quadcode + '2', this));\n\t checkList.push(this._requestTile(quadcode + '3', this));\n\t\n\t // 4d. Continue the loop without increasing count\n\t continue;\n\t } else {\n\t // 5. Else, increase count and continue loop\n\t count++;\n\t }\n\t }\n\t }\n\t }, {\n\t key: '_screenSpaceError',\n\t value: function _screenSpaceError(tile) {\n\t var minDepth = this._minLOD;\n\t var maxDepth = this._maxLOD;\n\t\n\t var quadcode = tile.getQuadcode();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // Tweak this value to refine specific point that each quad is subdivided\n\t //\n\t // It's used to multiple the dimensions of the tile sides before\n\t // comparing against the tile distance from camera\n\t var quality = 3.0;\n\t\n\t // 1. Return false if quadcode length equals maxDepth (stop dividing)\n\t if (quadcode.length === maxDepth) {\n\t return false;\n\t }\n\t\n\t // 2. Return true if quadcode length is less than minDepth\n\t if (quadcode.length < minDepth) {\n\t return true;\n\t }\n\t\n\t // 3. Return false if quadcode bounds are not in view frustum\n\t if (!this._tileInFrustum(tile)) {\n\t return false;\n\t }\n\t\n\t var center = tile.getCenter();\n\t\n\t // 4. Calculate screen-space error metric\n\t // TODO: Use closest distance to one of the 4 tile corners\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t var error = quality * tile.getSide() / dist;\n\t\n\t // 5. Return true if error is greater than 1.0, else return false\n\t return error > 1.0;\n\t }\n\t }, {\n\t key: '_removeTiles',\n\t value: function _removeTiles() {\n\t for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t }\n\t\n\t // Return a new tile instance\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {}\n\t\n\t // Get a cached tile or request a new one if not in cache\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile(quadcode, layer) {\n\t var tile = this._tileCache.getTile(quadcode);\n\t\n\t if (!tile) {\n\t // Set up a brand new tile\n\t tile = this._createTile(quadcode, layer);\n\t\n\t // Add tile to cache, though it won't be ready yet as the data is being\n\t // requested from various places asynchronously\n\t this._tileCache.setTile(quadcode, tile);\n\t }\n\t\n\t return tile;\n\t }\n\t }, {\n\t key: '_destroyTile',\n\t value: function _destroyTile(tile) {\n\t // Remove tile from scene\n\t this._layer.remove(tile);\n\t\n\t // Delete any references to the tile within this component\n\t\n\t // Call destory on tile instance\n\t tile.destroy();\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t var i;\n\t\n\t // Remove all tiles\n\t for (i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t\n\t // Remove everything else in the layer\n\t for (i = this._layer.children.length - 1; i >= 0; i--) {\n\t this._layer.remove(this._layer.children[i]);\n\t }\n\t\n\t this._tileCache.destroy();\n\t this._tileCache = null;\n\t\n\t this._world = null;\n\t this._tiles = null;\n\t this._layer = null;\n\t this._frustum = null;\n\t }\n\t }]);\n\t\n\t return TileLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = TileLayer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _lruCache = __webpack_require__(36);\n\t\n\tvar _lruCache2 = _interopRequireDefault(_lruCache);\n\t\n\t// This process is based on a similar approach taken by OpenWebGlobe\n\t// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\t\n\tvar TileCache = (function () {\n\t function TileCache(cacheLimit, onDestroyTile) {\n\t _classCallCheck(this, TileCache);\n\t\n\t this._cache = (0, _lruCache2['default'])({\n\t max: cacheLimit,\n\t dispose: function dispose(key, tile) {\n\t onDestroyTile(tile);\n\t }\n\t });\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Returns true if all specified tile providers are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(TileCache, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return false;\n\t }\n\t\n\t // Get a cached tile without requesting a new one\n\t }, {\n\t key: 'getTile',\n\t value: function getTile(quadcode) {\n\t return this._cache.get(quadcode);\n\t }\n\t\n\t // Add tile to cache\n\t }, {\n\t key: 'setTile',\n\t value: function setTile(quadcode, tile) {\n\t this._cache.set(quadcode, tile);\n\t }\n\t\n\t // Destroy the cache and remove it from memory\n\t //\n\t // TODO: Call destroy method on items in cache\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cache.reset();\n\t this._cache = null;\n\t }\n\t }]);\n\t\n\t return TileCache;\n\t})();\n\t\n\texports['default'] = function (cacheLimit, onDestroyTile) {\n\t return new TileCache(cacheLimit, onDestroyTile);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = LRUCache\n\t\n\t// This will be a proper iterable 'Map' in engines that support it,\n\t// or a fakey-fake PseudoMap in older versions.\n\tvar Map = __webpack_require__(37)\n\tvar util = __webpack_require__(40)\n\t\n\t// A linked list to keep track of recently-used-ness\n\tvar Yallist = __webpack_require__(43)\n\t\n\t// use symbols if possible, otherwise just _props\n\tvar symbols = {}\n\tvar hasSymbol = typeof Symbol === 'function'\n\tvar makeSymbol\n\tif (hasSymbol) {\n\t makeSymbol = function (key) {\n\t return Symbol.for(key)\n\t }\n\t} else {\n\t makeSymbol = function (key) {\n\t return '_' + key\n\t }\n\t}\n\t\n\tfunction priv (obj, key, val) {\n\t var sym\n\t if (symbols[key]) {\n\t sym = symbols[key]\n\t } else {\n\t sym = makeSymbol(key)\n\t symbols[key] = sym\n\t }\n\t if (arguments.length === 2) {\n\t return obj[sym]\n\t } else {\n\t obj[sym] = val\n\t return val\n\t }\n\t}\n\t\n\tfunction naiveLength () { return 1 }\n\t\n\t// lruList is a yallist where the head is the youngest\n\t// item, and the tail is the oldest. the list contains the Hit\n\t// objects as the entries.\n\t// Each Hit object has a reference to its Yallist.Node. This\n\t// never changes.\n\t//\n\t// cache is a Map (or PseudoMap) that matches the keys to\n\t// the Yallist.Node object.\n\tfunction LRUCache (options) {\n\t if (!(this instanceof LRUCache)) {\n\t return new LRUCache(options)\n\t }\n\t\n\t if (typeof options === 'number') {\n\t options = { max: options }\n\t }\n\t\n\t if (!options) {\n\t options = {}\n\t }\n\t\n\t var max = priv(this, 'max', options.max)\n\t // Kind of weird to have a default max of Infinity, but oh well.\n\t if (!max ||\n\t !(typeof max === 'number') ||\n\t max <= 0) {\n\t priv(this, 'max', Infinity)\n\t }\n\t\n\t var lc = options.length || naiveLength\n\t if (typeof lc !== 'function') {\n\t lc = naiveLength\n\t }\n\t priv(this, 'lengthCalculator', lc)\n\t\n\t priv(this, 'allowStale', options.stale || false)\n\t priv(this, 'maxAge', options.maxAge || 0)\n\t priv(this, 'dispose', options.dispose)\n\t this.reset()\n\t}\n\t\n\t// resize the cache when the max changes.\n\tObject.defineProperty(LRUCache.prototype, 'max', {\n\t set: function (mL) {\n\t if (!mL || !(typeof mL === 'number') || mL <= 0) {\n\t mL = Infinity\n\t }\n\t priv(this, 'max', mL)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'max')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'allowStale', {\n\t set: function (allowStale) {\n\t priv(this, 'allowStale', !!allowStale)\n\t },\n\t get: function () {\n\t return priv(this, 'allowStale')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'maxAge', {\n\t set: function (mA) {\n\t if (!mA || !(typeof mA === 'number') || mA < 0) {\n\t mA = 0\n\t }\n\t priv(this, 'maxAge', mA)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'maxAge')\n\t },\n\t enumerable: true\n\t})\n\t\n\t// resize the cache when the lengthCalculator changes.\n\tObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n\t set: function (lC) {\n\t if (typeof lC !== 'function') {\n\t lC = naiveLength\n\t }\n\t if (lC !== priv(this, 'lengthCalculator')) {\n\t priv(this, 'lengthCalculator', lC)\n\t priv(this, 'length', 0)\n\t priv(this, 'lruList').forEach(function (hit) {\n\t hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t }, this)\n\t }\n\t trim(this)\n\t },\n\t get: function () { return priv(this, 'lengthCalculator') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'length', {\n\t get: function () { return priv(this, 'length') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'itemCount', {\n\t get: function () { return priv(this, 'lruList').length },\n\t enumerable: true\n\t})\n\t\n\tLRUCache.prototype.rforEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n\t var prev = walker.prev\n\t forEachStep(this, fn, walker, thisp)\n\t walker = prev\n\t }\n\t}\n\t\n\tfunction forEachStep (self, fn, node, thisp) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) {\n\t hit = undefined\n\t }\n\t }\n\t if (hit) {\n\t fn.call(thisp, hit.value, hit.key, self)\n\t }\n\t}\n\t\n\tLRUCache.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').head; walker !== null;) {\n\t var next = walker.next\n\t forEachStep(this, fn, walker, thisp)\n\t walker = next\n\t }\n\t}\n\t\n\tLRUCache.prototype.keys = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.key\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.values = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.value\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.reset = function () {\n\t if (priv(this, 'dispose') &&\n\t priv(this, 'lruList') &&\n\t priv(this, 'lruList').length) {\n\t priv(this, 'lruList').forEach(function (hit) {\n\t priv(this, 'dispose').call(this, hit.key, hit.value)\n\t }, this)\n\t }\n\t\n\t priv(this, 'cache', new Map()) // hash of items by key\n\t priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n\t priv(this, 'length', 0) // length of items in the list\n\t}\n\t\n\tLRUCache.prototype.dump = function () {\n\t return priv(this, 'lruList').map(function (hit) {\n\t if (!isStale(this, hit)) {\n\t return {\n\t k: hit.key,\n\t v: hit.value,\n\t e: hit.now + (hit.maxAge || 0)\n\t }\n\t }\n\t }, this).toArray().filter(function (h) {\n\t return h\n\t })\n\t}\n\t\n\tLRUCache.prototype.dumpLru = function () {\n\t return priv(this, 'lruList')\n\t}\n\t\n\tLRUCache.prototype.inspect = function (n, opts) {\n\t var str = 'LRUCache {'\n\t var extras = false\n\t\n\t var as = priv(this, 'allowStale')\n\t if (as) {\n\t str += '\\n allowStale: true'\n\t extras = true\n\t }\n\t\n\t var max = priv(this, 'max')\n\t if (max && max !== Infinity) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n max: ' + util.inspect(max, opts)\n\t extras = true\n\t }\n\t\n\t var maxAge = priv(this, 'maxAge')\n\t if (maxAge) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n\t extras = true\n\t }\n\t\n\t var lc = priv(this, 'lengthCalculator')\n\t if (lc && lc !== naiveLength) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n\t extras = true\n\t }\n\t\n\t var didFirst = false\n\t priv(this, 'lruList').forEach(function (item) {\n\t if (didFirst) {\n\t str += ',\\n '\n\t } else {\n\t if (extras) {\n\t str += ',\\n'\n\t }\n\t didFirst = true\n\t str += '\\n '\n\t }\n\t var key = util.inspect(item.key).split('\\n').join('\\n ')\n\t var val = { value: item.value }\n\t if (item.maxAge !== maxAge) {\n\t val.maxAge = item.maxAge\n\t }\n\t if (lc !== naiveLength) {\n\t val.length = item.length\n\t }\n\t if (isStale(this, item)) {\n\t val.stale = true\n\t }\n\t\n\t val = util.inspect(val, opts).split('\\n').join('\\n ')\n\t str += key + ' => ' + val\n\t })\n\t\n\t if (didFirst || extras) {\n\t str += '\\n'\n\t }\n\t str += '}'\n\t\n\t return str\n\t}\n\t\n\tLRUCache.prototype.set = function (key, value, maxAge) {\n\t maxAge = maxAge || priv(this, 'maxAge')\n\t\n\t var now = maxAge ? Date.now() : 0\n\t var len = priv(this, 'lengthCalculator').call(this, value, key)\n\t\n\t if (priv(this, 'cache').has(key)) {\n\t if (len > priv(this, 'max')) {\n\t del(this, priv(this, 'cache').get(key))\n\t return false\n\t }\n\t\n\t var node = priv(this, 'cache').get(key)\n\t var item = node.value\n\t\n\t // dispose of the old one before overwriting\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, item.value)\n\t }\n\t\n\t item.now = now\n\t item.maxAge = maxAge\n\t item.value = value\n\t priv(this, 'length', priv(this, 'length') + (len - item.length))\n\t item.length = len\n\t this.get(key)\n\t trim(this)\n\t return true\n\t }\n\t\n\t var hit = new Entry(key, value, len, now, maxAge)\n\t\n\t // oversized objects fall out of cache automatically.\n\t if (hit.length > priv(this, 'max')) {\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, value)\n\t }\n\t return false\n\t }\n\t\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t priv(this, 'lruList').unshift(hit)\n\t priv(this, 'cache').set(key, priv(this, 'lruList').head)\n\t trim(this)\n\t return true\n\t}\n\t\n\tLRUCache.prototype.has = function (key) {\n\t if (!priv(this, 'cache').has(key)) return false\n\t var hit = priv(this, 'cache').get(key).value\n\t if (isStale(this, hit)) {\n\t return false\n\t }\n\t return true\n\t}\n\t\n\tLRUCache.prototype.get = function (key) {\n\t return get(this, key, true)\n\t}\n\t\n\tLRUCache.prototype.peek = function (key) {\n\t return get(this, key, false)\n\t}\n\t\n\tLRUCache.prototype.pop = function () {\n\t var node = priv(this, 'lruList').tail\n\t if (!node) return null\n\t del(this, node)\n\t return node.value\n\t}\n\t\n\tLRUCache.prototype.del = function (key) {\n\t del(this, priv(this, 'cache').get(key))\n\t}\n\t\n\tLRUCache.prototype.load = function (arr) {\n\t // reset the cache\n\t this.reset()\n\t\n\t var now = Date.now()\n\t // A previous serialized cache has the most recent items first\n\t for (var l = arr.length - 1; l >= 0; l--) {\n\t var hit = arr[l]\n\t var expiresAt = hit.e || 0\n\t if (expiresAt === 0) {\n\t // the item was created without expiration in a non aged cache\n\t this.set(hit.k, hit.v)\n\t } else {\n\t var maxAge = expiresAt - now\n\t // dont add already expired items\n\t if (maxAge > 0) {\n\t this.set(hit.k, hit.v, maxAge)\n\t }\n\t }\n\t }\n\t}\n\t\n\tLRUCache.prototype.prune = function () {\n\t var self = this\n\t priv(this, 'cache').forEach(function (value, key) {\n\t get(self, key, false)\n\t })\n\t}\n\t\n\tfunction get (self, key, doUse) {\n\t var node = priv(self, 'cache').get(key)\n\t if (node) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) hit = undefined\n\t } else {\n\t if (doUse) {\n\t priv(self, 'lruList').unshiftNode(node)\n\t }\n\t }\n\t if (hit) hit = hit.value\n\t }\n\t return hit\n\t}\n\t\n\tfunction isStale (self, hit) {\n\t if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n\t return false\n\t }\n\t var stale = false\n\t var diff = Date.now() - hit.now\n\t if (hit.maxAge) {\n\t stale = diff > hit.maxAge\n\t } else {\n\t stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n\t }\n\t return stale\n\t}\n\t\n\tfunction trim (self) {\n\t if (priv(self, 'length') > priv(self, 'max')) {\n\t for (var walker = priv(self, 'lruList').tail;\n\t priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n\t // We know that we're about to delete this one, and also\n\t // what the next least recently used key will be, so just\n\t // go ahead and set it now.\n\t var prev = walker.prev\n\t del(self, walker)\n\t walker = prev\n\t }\n\t }\n\t}\n\t\n\tfunction del (self, node) {\n\t if (node) {\n\t var hit = node.value\n\t if (priv(self, 'dispose')) {\n\t priv(self, 'dispose').call(this, hit.key, hit.value)\n\t }\n\t priv(self, 'length', priv(self, 'length') - hit.length)\n\t priv(self, 'cache').delete(hit.key)\n\t priv(self, 'lruList').removeNode(node)\n\t }\n\t}\n\t\n\t// classy, since V8 prefers predictable objects.\n\tfunction Entry (key, value, length, now, maxAge) {\n\t this.key = key\n\t this.value = value\n\t this.length = length\n\t this.now = now\n\t this.maxAge = maxAge || 0\n\t}\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {if (process.env.npm_package_name === 'pseudomap' &&\n\t process.env.npm_lifecycle_script === 'test')\n\t process.env.TEST_PSEUDOMAP = 'true'\n\t\n\tif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n\t module.exports = Map\n\t} else {\n\t module.exports = __webpack_require__(39)\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(38)))\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\t\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = setTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t clearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t setTimeout(drainQueue, 0);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty\n\t\n\tmodule.exports = PseudoMap\n\t\n\tfunction PseudoMap (set) {\n\t if (!(this instanceof PseudoMap)) // whyyyyyyy\n\t throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\t\n\t this.clear()\n\t\n\t if (set) {\n\t if ((set instanceof PseudoMap) ||\n\t (typeof Map === 'function' && set instanceof Map))\n\t set.forEach(function (value, key) {\n\t this.set(key, value)\n\t }, this)\n\t else if (Array.isArray(set))\n\t set.forEach(function (kv) {\n\t this.set(kv[0], kv[1])\n\t }, this)\n\t else\n\t throw new TypeError('invalid argument')\n\t }\n\t}\n\t\n\tPseudoMap.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t Object.keys(this._data).forEach(function (k) {\n\t if (k !== 'size')\n\t fn.call(thisp, this._data[k].value, this._data[k].key)\n\t }, this)\n\t}\n\t\n\tPseudoMap.prototype.has = function (k) {\n\t return !!find(this._data, k)\n\t}\n\t\n\tPseudoMap.prototype.get = function (k) {\n\t var res = find(this._data, k)\n\t return res && res.value\n\t}\n\t\n\tPseudoMap.prototype.set = function (k, v) {\n\t set(this._data, k, v)\n\t}\n\t\n\tPseudoMap.prototype.delete = function (k) {\n\t var res = find(this._data, k)\n\t if (res) {\n\t delete this._data[res._index]\n\t this._data.size--\n\t }\n\t}\n\t\n\tPseudoMap.prototype.clear = function () {\n\t var data = Object.create(null)\n\t data.size = 0\n\t\n\t Object.defineProperty(this, '_data', {\n\t value: data,\n\t enumerable: false,\n\t configurable: true,\n\t writable: false\n\t })\n\t}\n\t\n\tObject.defineProperty(PseudoMap.prototype, 'size', {\n\t get: function () {\n\t return this._data.size\n\t },\n\t set: function (n) {},\n\t enumerable: true,\n\t configurable: true\n\t})\n\t\n\tPseudoMap.prototype.values =\n\tPseudoMap.prototype.keys =\n\tPseudoMap.prototype.entries = function () {\n\t throw new Error('iterators are not implemented in this version')\n\t}\n\t\n\t// Either identical, or both NaN\n\tfunction same (a, b) {\n\t return a === b || a !== a && b !== b\n\t}\n\t\n\tfunction Entry (k, v, i) {\n\t this.key = k\n\t this.value = v\n\t this._index = i\n\t}\n\t\n\tfunction find (data, k) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k))\n\t return data[key]\n\t }\n\t}\n\t\n\tfunction set (data, k, v) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k)) {\n\t data[key].value = v\n\t return\n\t }\n\t }\n\t data.size++\n\t data[key] = new Entry(k, v, key)\n\t}\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tvar formatRegExp = /%[sdj%]/g;\n\texports.format = function(f) {\n\t if (!isString(f)) {\n\t var objects = [];\n\t for (var i = 0; i < arguments.length; i++) {\n\t objects.push(inspect(arguments[i]));\n\t }\n\t return objects.join(' ');\n\t }\n\t\n\t var i = 1;\n\t var args = arguments;\n\t var len = args.length;\n\t var str = String(f).replace(formatRegExp, function(x) {\n\t if (x === '%%') return '%';\n\t if (i >= len) return x;\n\t switch (x) {\n\t case '%s': return String(args[i++]);\n\t case '%d': return Number(args[i++]);\n\t case '%j':\n\t try {\n\t return JSON.stringify(args[i++]);\n\t } catch (_) {\n\t return '[Circular]';\n\t }\n\t default:\n\t return x;\n\t }\n\t });\n\t for (var x = args[i]; i < len; x = args[++i]) {\n\t if (isNull(x) || !isObject(x)) {\n\t str += ' ' + x;\n\t } else {\n\t str += ' ' + inspect(x);\n\t }\n\t }\n\t return str;\n\t};\n\t\n\t\n\t// Mark that a method should not be used.\n\t// Returns a modified function which warns once by default.\n\t// If --no-deprecation is set, then it is a no-op.\n\texports.deprecate = function(fn, msg) {\n\t // Allow for deprecating things in the process of starting up.\n\t if (isUndefined(global.process)) {\n\t return function() {\n\t return exports.deprecate(fn, msg).apply(this, arguments);\n\t };\n\t }\n\t\n\t if (process.noDeprecation === true) {\n\t return fn;\n\t }\n\t\n\t var warned = false;\n\t function deprecated() {\n\t if (!warned) {\n\t if (process.throwDeprecation) {\n\t throw new Error(msg);\n\t } else if (process.traceDeprecation) {\n\t console.trace(msg);\n\t } else {\n\t console.error(msg);\n\t }\n\t warned = true;\n\t }\n\t return fn.apply(this, arguments);\n\t }\n\t\n\t return deprecated;\n\t};\n\t\n\t\n\tvar debugs = {};\n\tvar debugEnviron;\n\texports.debuglog = function(set) {\n\t if (isUndefined(debugEnviron))\n\t debugEnviron = process.env.NODE_DEBUG || '';\n\t set = set.toUpperCase();\n\t if (!debugs[set]) {\n\t if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n\t var pid = process.pid;\n\t debugs[set] = function() {\n\t var msg = exports.format.apply(exports, arguments);\n\t console.error('%s %d: %s', set, pid, msg);\n\t };\n\t } else {\n\t debugs[set] = function() {};\n\t }\n\t }\n\t return debugs[set];\n\t};\n\t\n\t\n\t/**\n\t * Echos the value of a value. Trys to print the value out\n\t * in the best way possible given the different types.\n\t *\n\t * @param {Object} obj The object to print out.\n\t * @param {Object} opts Optional options object that alters the output.\n\t */\n\t/* legacy: obj, showHidden, depth, colors*/\n\tfunction inspect(obj, opts) {\n\t // default options\n\t var ctx = {\n\t seen: [],\n\t stylize: stylizeNoColor\n\t };\n\t // legacy...\n\t if (arguments.length >= 3) ctx.depth = arguments[2];\n\t if (arguments.length >= 4) ctx.colors = arguments[3];\n\t if (isBoolean(opts)) {\n\t // legacy...\n\t ctx.showHidden = opts;\n\t } else if (opts) {\n\t // got an \"options\" object\n\t exports._extend(ctx, opts);\n\t }\n\t // set default options\n\t if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n\t if (isUndefined(ctx.depth)) ctx.depth = 2;\n\t if (isUndefined(ctx.colors)) ctx.colors = false;\n\t if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n\t if (ctx.colors) ctx.stylize = stylizeWithColor;\n\t return formatValue(ctx, obj, ctx.depth);\n\t}\n\texports.inspect = inspect;\n\t\n\t\n\t// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n\tinspect.colors = {\n\t 'bold' : [1, 22],\n\t 'italic' : [3, 23],\n\t 'underline' : [4, 24],\n\t 'inverse' : [7, 27],\n\t 'white' : [37, 39],\n\t 'grey' : [90, 39],\n\t 'black' : [30, 39],\n\t 'blue' : [34, 39],\n\t 'cyan' : [36, 39],\n\t 'green' : [32, 39],\n\t 'magenta' : [35, 39],\n\t 'red' : [31, 39],\n\t 'yellow' : [33, 39]\n\t};\n\t\n\t// Don't use 'blue' not visible on cmd.exe\n\tinspect.styles = {\n\t 'special': 'cyan',\n\t 'number': 'yellow',\n\t 'boolean': 'yellow',\n\t 'undefined': 'grey',\n\t 'null': 'bold',\n\t 'string': 'green',\n\t 'date': 'magenta',\n\t // \"name\": intentionally not styling\n\t 'regexp': 'red'\n\t};\n\t\n\t\n\tfunction stylizeWithColor(str, styleType) {\n\t var style = inspect.styles[styleType];\n\t\n\t if (style) {\n\t return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n\t '\\u001b[' + inspect.colors[style][1] + 'm';\n\t } else {\n\t return str;\n\t }\n\t}\n\t\n\t\n\tfunction stylizeNoColor(str, styleType) {\n\t return str;\n\t}\n\t\n\t\n\tfunction arrayToHash(array) {\n\t var hash = {};\n\t\n\t array.forEach(function(val, idx) {\n\t hash[val] = true;\n\t });\n\t\n\t return hash;\n\t}\n\t\n\t\n\tfunction formatValue(ctx, value, recurseTimes) {\n\t // Provide a hook for user-specified inspect functions.\n\t // Check that value is an object with an inspect function on it\n\t if (ctx.customInspect &&\n\t value &&\n\t isFunction(value.inspect) &&\n\t // Filter out the util module, it's inspect function is special\n\t value.inspect !== exports.inspect &&\n\t // Also filter out any prototype objects using the circular check.\n\t !(value.constructor && value.constructor.prototype === value)) {\n\t var ret = value.inspect(recurseTimes, ctx);\n\t if (!isString(ret)) {\n\t ret = formatValue(ctx, ret, recurseTimes);\n\t }\n\t return ret;\n\t }\n\t\n\t // Primitive types cannot have properties\n\t var primitive = formatPrimitive(ctx, value);\n\t if (primitive) {\n\t return primitive;\n\t }\n\t\n\t // Look up the keys of the object.\n\t var keys = Object.keys(value);\n\t var visibleKeys = arrayToHash(keys);\n\t\n\t if (ctx.showHidden) {\n\t keys = Object.getOwnPropertyNames(value);\n\t }\n\t\n\t // IE doesn't make error fields non-enumerable\n\t // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n\t if (isError(value)\n\t && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n\t return formatError(value);\n\t }\n\t\n\t // Some type of object without properties can be shortcutted.\n\t if (keys.length === 0) {\n\t if (isFunction(value)) {\n\t var name = value.name ? ': ' + value.name : '';\n\t return ctx.stylize('[Function' + name + ']', 'special');\n\t }\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t }\n\t if (isDate(value)) {\n\t return ctx.stylize(Date.prototype.toString.call(value), 'date');\n\t }\n\t if (isError(value)) {\n\t return formatError(value);\n\t }\n\t }\n\t\n\t var base = '', array = false, braces = ['{', '}'];\n\t\n\t // Make Array say that they are Array\n\t if (isArray(value)) {\n\t array = true;\n\t braces = ['[', ']'];\n\t }\n\t\n\t // Make functions say that they are functions\n\t if (isFunction(value)) {\n\t var n = value.name ? ': ' + value.name : '';\n\t base = ' [Function' + n + ']';\n\t }\n\t\n\t // Make RegExps say that they are RegExps\n\t if (isRegExp(value)) {\n\t base = ' ' + RegExp.prototype.toString.call(value);\n\t }\n\t\n\t // Make dates with properties first say the date\n\t if (isDate(value)) {\n\t base = ' ' + Date.prototype.toUTCString.call(value);\n\t }\n\t\n\t // Make error with message first say the error\n\t if (isError(value)) {\n\t base = ' ' + formatError(value);\n\t }\n\t\n\t if (keys.length === 0 && (!array || value.length == 0)) {\n\t return braces[0] + base + braces[1];\n\t }\n\t\n\t if (recurseTimes < 0) {\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t } else {\n\t return ctx.stylize('[Object]', 'special');\n\t }\n\t }\n\t\n\t ctx.seen.push(value);\n\t\n\t var output;\n\t if (array) {\n\t output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n\t } else {\n\t output = keys.map(function(key) {\n\t return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n\t });\n\t }\n\t\n\t ctx.seen.pop();\n\t\n\t return reduceToSingleString(output, base, braces);\n\t}\n\t\n\t\n\tfunction formatPrimitive(ctx, value) {\n\t if (isUndefined(value))\n\t return ctx.stylize('undefined', 'undefined');\n\t if (isString(value)) {\n\t var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n\t .replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"') + '\\'';\n\t return ctx.stylize(simple, 'string');\n\t }\n\t if (isNumber(value))\n\t return ctx.stylize('' + value, 'number');\n\t if (isBoolean(value))\n\t return ctx.stylize('' + value, 'boolean');\n\t // For some reason typeof null is \"object\", so special case here.\n\t if (isNull(value))\n\t return ctx.stylize('null', 'null');\n\t}\n\t\n\t\n\tfunction formatError(value) {\n\t return '[' + Error.prototype.toString.call(value) + ']';\n\t}\n\t\n\t\n\tfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n\t var output = [];\n\t for (var i = 0, l = value.length; i < l; ++i) {\n\t if (hasOwnProperty(value, String(i))) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t String(i), true));\n\t } else {\n\t output.push('');\n\t }\n\t }\n\t keys.forEach(function(key) {\n\t if (!key.match(/^\\d+$/)) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t key, true));\n\t }\n\t });\n\t return output;\n\t}\n\t\n\t\n\tfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n\t var name, str, desc;\n\t desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n\t if (desc.get) {\n\t if (desc.set) {\n\t str = ctx.stylize('[Getter/Setter]', 'special');\n\t } else {\n\t str = ctx.stylize('[Getter]', 'special');\n\t }\n\t } else {\n\t if (desc.set) {\n\t str = ctx.stylize('[Setter]', 'special');\n\t }\n\t }\n\t if (!hasOwnProperty(visibleKeys, key)) {\n\t name = '[' + key + ']';\n\t }\n\t if (!str) {\n\t if (ctx.seen.indexOf(desc.value) < 0) {\n\t if (isNull(recurseTimes)) {\n\t str = formatValue(ctx, desc.value, null);\n\t } else {\n\t str = formatValue(ctx, desc.value, recurseTimes - 1);\n\t }\n\t if (str.indexOf('\\n') > -1) {\n\t if (array) {\n\t str = str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n').substr(2);\n\t } else {\n\t str = '\\n' + str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n');\n\t }\n\t }\n\t } else {\n\t str = ctx.stylize('[Circular]', 'special');\n\t }\n\t }\n\t if (isUndefined(name)) {\n\t if (array && key.match(/^\\d+$/)) {\n\t return str;\n\t }\n\t name = JSON.stringify('' + key);\n\t if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n\t name = name.substr(1, name.length - 2);\n\t name = ctx.stylize(name, 'name');\n\t } else {\n\t name = name.replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"')\n\t .replace(/(^\"|\"$)/g, \"'\");\n\t name = ctx.stylize(name, 'string');\n\t }\n\t }\n\t\n\t return name + ': ' + str;\n\t}\n\t\n\t\n\tfunction reduceToSingleString(output, base, braces) {\n\t var numLinesEst = 0;\n\t var length = output.reduce(function(prev, cur) {\n\t numLinesEst++;\n\t if (cur.indexOf('\\n') >= 0) numLinesEst++;\n\t return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n\t }, 0);\n\t\n\t if (length > 60) {\n\t return braces[0] +\n\t (base === '' ? '' : base + '\\n ') +\n\t ' ' +\n\t output.join(',\\n ') +\n\t ' ' +\n\t braces[1];\n\t }\n\t\n\t return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n\t}\n\t\n\t\n\t// NOTE: These type checking functions intentionally don't use `instanceof`\n\t// because it is fragile and can be easily faked with `Object.create()`.\n\tfunction isArray(ar) {\n\t return Array.isArray(ar);\n\t}\n\texports.isArray = isArray;\n\t\n\tfunction isBoolean(arg) {\n\t return typeof arg === 'boolean';\n\t}\n\texports.isBoolean = isBoolean;\n\t\n\tfunction isNull(arg) {\n\t return arg === null;\n\t}\n\texports.isNull = isNull;\n\t\n\tfunction isNullOrUndefined(arg) {\n\t return arg == null;\n\t}\n\texports.isNullOrUndefined = isNullOrUndefined;\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\texports.isNumber = isNumber;\n\t\n\tfunction isString(arg) {\n\t return typeof arg === 'string';\n\t}\n\texports.isString = isString;\n\t\n\tfunction isSymbol(arg) {\n\t return typeof arg === 'symbol';\n\t}\n\texports.isSymbol = isSymbol;\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\texports.isUndefined = isUndefined;\n\t\n\tfunction isRegExp(re) {\n\t return isObject(re) && objectToString(re) === '[object RegExp]';\n\t}\n\texports.isRegExp = isRegExp;\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\texports.isObject = isObject;\n\t\n\tfunction isDate(d) {\n\t return isObject(d) && objectToString(d) === '[object Date]';\n\t}\n\texports.isDate = isDate;\n\t\n\tfunction isError(e) {\n\t return isObject(e) &&\n\t (objectToString(e) === '[object Error]' || e instanceof Error);\n\t}\n\texports.isError = isError;\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\texports.isFunction = isFunction;\n\t\n\tfunction isPrimitive(arg) {\n\t return arg === null ||\n\t typeof arg === 'boolean' ||\n\t typeof arg === 'number' ||\n\t typeof arg === 'string' ||\n\t typeof arg === 'symbol' || // ES6 symbol\n\t typeof arg === 'undefined';\n\t}\n\texports.isPrimitive = isPrimitive;\n\t\n\texports.isBuffer = __webpack_require__(41);\n\t\n\tfunction objectToString(o) {\n\t return Object.prototype.toString.call(o);\n\t}\n\t\n\t\n\tfunction pad(n) {\n\t return n < 10 ? '0' + n.toString(10) : n.toString(10);\n\t}\n\t\n\t\n\tvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n\t 'Oct', 'Nov', 'Dec'];\n\t\n\t// 26 Feb 16:19:34\n\tfunction timestamp() {\n\t var d = new Date();\n\t var time = [pad(d.getHours()),\n\t pad(d.getMinutes()),\n\t pad(d.getSeconds())].join(':');\n\t return [d.getDate(), months[d.getMonth()], time].join(' ');\n\t}\n\t\n\t\n\t// log is just a thin wrapper to console.log that prepends a timestamp\n\texports.log = function() {\n\t console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n\t};\n\t\n\t\n\t/**\n\t * Inherit the prototype methods from one constructor into another.\n\t *\n\t * The Function.prototype.inherits from lang.js rewritten as a standalone\n\t * function (not on Function.prototype). NOTE: If this file is to be loaded\n\t * during bootstrapping this function needs to be rewritten using some native\n\t * functions as prototype setup using normal JavaScript does not work as\n\t * expected during bootstrapping (see mirror.js in r114903).\n\t *\n\t * @param {function} ctor Constructor function which needs to inherit the\n\t * prototype.\n\t * @param {function} superCtor Constructor function to inherit prototype from.\n\t */\n\texports.inherits = __webpack_require__(42);\n\t\n\texports._extend = function(origin, add) {\n\t // Don't do anything if add isn't an object\n\t if (!add || !isObject(add)) return origin;\n\t\n\t var keys = Object.keys(add);\n\t var i = keys.length;\n\t while (i--) {\n\t origin[keys[i]] = add[keys[i]];\n\t }\n\t return origin;\n\t};\n\t\n\tfunction hasOwnProperty(obj, prop) {\n\t return Object.prototype.hasOwnProperty.call(obj, prop);\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(38)))\n\n/***/ },\n/* 41 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function isBuffer(arg) {\n\t return arg && typeof arg === 'object'\n\t && typeof arg.copy === 'function'\n\t && typeof arg.fill === 'function'\n\t && typeof arg.readUInt8 === 'function';\n\t}\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t // implementation from standard node.js 'util' module\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t ctor.prototype = Object.create(superCtor.prototype, {\n\t constructor: {\n\t value: ctor,\n\t enumerable: false,\n\t writable: true,\n\t configurable: true\n\t }\n\t });\n\t };\n\t} else {\n\t // old school shim for old browsers\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t var TempCtor = function () {}\n\t TempCtor.prototype = superCtor.prototype\n\t ctor.prototype = new TempCtor()\n\t ctor.prototype.constructor = ctor\n\t }\n\t}\n\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\tmodule.exports = Yallist\n\t\n\tYallist.Node = Node\n\tYallist.create = Yallist\n\t\n\tfunction Yallist (list) {\n\t var self = this\n\t if (!(self instanceof Yallist)) {\n\t self = new Yallist()\n\t }\n\t\n\t self.tail = null\n\t self.head = null\n\t self.length = 0\n\t\n\t if (list && typeof list.forEach === 'function') {\n\t list.forEach(function (item) {\n\t self.push(item)\n\t })\n\t } else if (arguments.length > 0) {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t self.push(arguments[i])\n\t }\n\t }\n\t\n\t return self\n\t}\n\t\n\tYallist.prototype.removeNode = function (node) {\n\t if (node.list !== this) {\n\t throw new Error('removing node which does not belong to this list')\n\t }\n\t\n\t var next = node.next\n\t var prev = node.prev\n\t\n\t if (next) {\n\t next.prev = prev\n\t }\n\t\n\t if (prev) {\n\t prev.next = next\n\t }\n\t\n\t if (node === this.head) {\n\t this.head = next\n\t }\n\t if (node === this.tail) {\n\t this.tail = prev\n\t }\n\t\n\t node.list.length --\n\t node.next = null\n\t node.prev = null\n\t node.list = null\n\t}\n\t\n\tYallist.prototype.unshiftNode = function (node) {\n\t if (node === this.head) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var head = this.head\n\t node.list = this\n\t node.next = head\n\t if (head) {\n\t head.prev = node\n\t }\n\t\n\t this.head = node\n\t if (!this.tail) {\n\t this.tail = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.pushNode = function (node) {\n\t if (node === this.tail) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var tail = this.tail\n\t node.list = this\n\t node.prev = tail\n\t if (tail) {\n\t tail.next = node\n\t }\n\t\n\t this.tail = node\n\t if (!this.head) {\n\t this.head = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.push = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t push(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.unshift = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t unshift(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.pop = function () {\n\t if (!this.tail)\n\t return undefined\n\t\n\t var res = this.tail.value\n\t this.tail = this.tail.prev\n\t this.tail.next = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.shift = function () {\n\t if (!this.head)\n\t return undefined\n\t\n\t var res = this.head.value\n\t this.head = this.head.next\n\t this.head.prev = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.head, i = 0; walker !== null; i++) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.next\n\t }\n\t}\n\t\n\tYallist.prototype.forEachReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.prev\n\t }\n\t}\n\t\n\tYallist.prototype.get = function (n) {\n\t for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.next\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.getReverse = function (n) {\n\t for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.prev\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.map = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.head; walker !== null; ) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.next\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.mapReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.tail; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.prev\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.reduce = function (fn, initial) {\n\t var acc\n\t var walker = this.head\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.head) {\n\t walker = this.head.next\n\t acc = this.head.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = 0; walker !== null; i++) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.next\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.reduceReverse = function (fn, initial) {\n\t var acc\n\t var walker = this.tail\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.tail) {\n\t walker = this.tail.prev\n\t acc = this.tail.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = this.length - 1; walker !== null; i--) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.prev\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.toArray = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.head; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.next\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.toArrayReverse = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.tail; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.prev\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.slice = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n\t walker = walker.next\n\t }\n\t for (; walker !== null && i < to; i++, walker = walker.next) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.sliceReverse = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n\t walker = walker.prev\n\t }\n\t for (; walker !== null && i > from; i--, walker = walker.prev) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.reverse = function () {\n\t var head = this.head\n\t var tail = this.tail\n\t for (var walker = head; walker !== null; walker = walker.prev) {\n\t var p = walker.prev\n\t walker.prev = walker.next\n\t walker.next = p\n\t }\n\t this.head = tail\n\t this.tail = head\n\t return this\n\t}\n\t\n\tfunction push (self, item) {\n\t self.tail = new Node(item, self.tail, null, self)\n\t if (!self.head) {\n\t self.head = self.tail\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction unshift (self, item) {\n\t self.head = new Node(item, null, self.head, self)\n\t if (!self.tail) {\n\t self.tail = self.head\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction Node (value, prev, next, list) {\n\t if (!(this instanceof Node)) {\n\t return new Node(value, prev, next, list)\n\t }\n\t\n\t this.list = list\n\t this.value = value\n\t\n\t if (prev) {\n\t prev.next = this\n\t this.prev = prev\n\t } else {\n\t this.prev = null\n\t }\n\t\n\t if (next) {\n\t next.prev = this\n\t this.next = next\n\t } else {\n\t this.next = null\n\t }\n\t}\n\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Tile2 = __webpack_require__(45);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(46);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar ImageTile = (function (_Tile) {\n\t _inherits(ImageTile, _Tile);\n\t\n\t function ImageTile(quadcode, path, layer) {\n\t _classCallCheck(this, ImageTile);\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the tile\n\t\n\t _createClass(ImageTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTile();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear image reference\n\t this._image = null;\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t depthWrite: false\n\t });\n\t\n\t var localMesh = new _three2['default'].Mesh(geom, material);\n\t localMesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t mesh.add(localMesh);\n\t\n\t mesh.renderOrder = 0;\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t // var box = new BoxHelper(localMesh);\n\t // mesh.add(box);\n\t //\n\t // mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t var image = document.createElement('img');\n\t\n\t image.addEventListener('load', function (event) {\n\t var texture = new _three2['default'].Texture();\n\t\n\t texture.image = image;\n\t texture.needsUpdate = true;\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t // Something went wrong and the tile or its material is missing\n\t //\n\t // Possibly removed by the cache before the image loaded\n\t if (!_this2._mesh || !_this2._mesh.children[0] || !_this2._mesh.children[0].material) {\n\t return;\n\t }\n\t\n\t _this2._mesh.children[0].material.map = texture;\n\t _this2._mesh.children[0].material.needsUpdate = true;\n\t\n\t _this2._texture = texture;\n\t _this2._ready = true;\n\t }, false);\n\t\n\t // image.addEventListener('progress', event => {}, false);\n\t // image.addEventListener('error', event => {}, false);\n\t\n\t image.crossOrigin = '';\n\t\n\t // Load image\n\t image.src = url;\n\t\n\t this._image = image;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._image) {\n\t return;\n\t }\n\t\n\t this._image.src = '';\n\t }\n\t }]);\n\t\n\t return ImageTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer) {\n\t return new ImageTile(quadcode, path, layer);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// Manages a single tile and its layers\n\t\n\tvar r2d = 180 / Math.PI;\n\t\n\tvar tileURLRegex = /\\{([szxy])\\}/g;\n\t\n\tvar Tile = (function () {\n\t function Tile(quadcode, path, layer) {\n\t _classCallCheck(this, Tile);\n\t\n\t this._layer = layer;\n\t this._quadcode = quadcode;\n\t this._path = path;\n\t\n\t this._ready = false;\n\t\n\t this._tile = this._quadcodeToTile(quadcode);\n\t\n\t // Bottom-left and top-right bounds in WGS84 coordinates\n\t this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\t\n\t // Bottom-left and top-right bounds in world coordinates\n\t this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\t\n\t // Tile center in world coordinates\n\t this._center = this._boundsToCenter(this._boundsWorld);\n\t\n\t // Length of a tile side in world coorindates\n\t this._side = this._getSide(this._boundsWorld);\n\t }\n\t\n\t // Returns true if the tile mesh and texture are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(Tile, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return this._ready;\n\t }\n\t\n\t // Request data for the tile\n\t }, {\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {}\n\t }, {\n\t key: 'getQuadcode',\n\t value: function getQuadcode() {\n\t return this._quadcode;\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {\n\t return this._boundsWorld;\n\t }\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t }, {\n\t key: 'getSide',\n\t value: function getSide() {\n\t return this._side;\n\t }\n\t }, {\n\t key: 'getMesh',\n\t value: function getMesh() {\n\t return this._mesh;\n\t }\n\t\n\t // Destroys the tile and removes it from the layer and memory\n\t //\n\t // Ensure that this leaves no trace of the tile – no textures, no meshes,\n\t // nothing in memory or the GPU\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Delete reference to layer\n\t this._layer = null;\n\t\n\t // Delete location references\n\t this._boundsLatLon = null;\n\t this._boundsWorld = null;\n\t this._center = null;\n\t\n\t // Done if no mesh\n\t if (!this._mesh) {\n\t return;\n\t }\n\t\n\t if (this._mesh.children) {\n\t // Dispose of mesh and materials\n\t this._mesh.children.forEach(function (child) {\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t });\n\t } else {\n\t this._mesh.geometry.dispose();\n\t this._mesh.geometry = null;\n\t\n\t if (this._mesh.material.map) {\n\t this._mesh.material.map.dispose();\n\t this._mesh.material.map = null;\n\t }\n\t\n\t this._mesh.material.dispose();\n\t this._mesh.material = null;\n\t }\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {}\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {}\n\t }, {\n\t key: '_getTileURL',\n\t value: function _getTileURL(urlParams) {\n\t if (!urlParams.s) {\n\t // Default to a random choice of a, b or c\n\t s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n\t }\n\t\n\t tileURLRegex.lastIndex = 0;\n\t return this._path.replace(tileURLRegex, function (value, key) {\n\t // Replace with paramter, otherwise keep existing value\n\t return urlParams[key];\n\t });\n\t }\n\t\n\t // Convert from quadcode to TMS tile coordinates\n\t }, {\n\t key: '_quadcodeToTile',\n\t value: function _quadcodeToTile(quadcode) {\n\t var x = 0;\n\t var y = 0;\n\t var z = quadcode.length;\n\t\n\t for (var i = z; i > 0; i--) {\n\t var mask = 1 << i - 1;\n\t var q = +quadcode[z - i];\n\t if (q === 1) {\n\t x |= mask;\n\t }\n\t if (q === 2) {\n\t y |= mask;\n\t }\n\t if (q === 3) {\n\t x |= mask;\n\t y |= mask;\n\t }\n\t }\n\t\n\t return [x, y, z];\n\t }\n\t\n\t // Convert WGS84 tile bounds to world coordinates\n\t }, {\n\t key: '_tileBoundsFromWGS84',\n\t value: function _tileBoundsFromWGS84(boundsWGS84) {\n\t var sw = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[1], boundsWGS84[0]));\n\t var ne = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[3], boundsWGS84[2]));\n\t\n\t return [sw.x, sw.y, ne.x, ne.y];\n\t }\n\t\n\t // Get tile bounds in WGS84 coordinates\n\t }, {\n\t key: '_tileBoundsWGS84',\n\t value: function _tileBoundsWGS84(tile) {\n\t var e = this._tile2lon(tile[0] + 1, tile[2]);\n\t var w = this._tile2lon(tile[0], tile[2]);\n\t var s = this._tile2lat(tile[1] + 1, tile[2]);\n\t var n = this._tile2lat(tile[1], tile[2]);\n\t return [w, s, e, n];\n\t }\n\t }, {\n\t key: '_tile2lon',\n\t value: function _tile2lon(x, z) {\n\t return x / Math.pow(2, z) * 360 - 180;\n\t }\n\t }, {\n\t key: '_tile2lat',\n\t value: function _tile2lat(y, z) {\n\t var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n\t return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n\t }\n\t }, {\n\t key: '_boundsToCenter',\n\t value: function _boundsToCenter(bounds) {\n\t var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n\t var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\t\n\t return [x, y];\n\t }\n\t }, {\n\t key: '_getSide',\n\t value: function _getSide(bounds) {\n\t return new _three2['default'].Vector3(bounds[0], 0, bounds[3]).sub(new _three2['default'].Vector3(bounds[0], 0, bounds[1])).length();\n\t }\n\t }]);\n\t\n\t return Tile;\n\t})();\n\t\n\texports['default'] = Tile;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tBoxHelper = function (object) {\n\t\n\t\tvar indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);\n\t\tvar positions = new Float32Array(8 * 3);\n\t\n\t\tvar geometry = new _three2['default'].BufferGeometry();\n\t\tgeometry.setIndex(new _three2['default'].BufferAttribute(indices, 1));\n\t\tgeometry.addAttribute('position', new _three2['default'].BufferAttribute(positions, 3));\n\t\n\t\t_three2['default'].LineSegments.call(this, geometry, new _three2['default'].LineBasicMaterial({ linewidth: 2, color: 0xff0000 }));\n\t\n\t\tif (object !== undefined) {\n\t\n\t\t\tthis.update(object);\n\t\t}\n\t};\n\t\n\tBoxHelper.prototype = Object.create(_three2['default'].LineSegments.prototype);\n\tBoxHelper.prototype.constructor = BoxHelper;\n\t\n\tBoxHelper.prototype.update = (function () {\n\t\n\t\tvar box = new _three2['default'].Box3();\n\t\n\t\treturn function (object) {\n\t\n\t\t\tbox.setFromObject(object);\n\t\n\t\t\tif (box.isEmpty()) return;\n\t\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\t\n\t\t\t/*\n\t 5____4\n\t 1/___0/|\n\t | 6__|_7\n\t 2/___3/\n\t \t0: max.x, max.y, max.z\n\t 1: min.x, max.y, max.z\n\t 2: min.x, min.y, max.z\n\t 3: max.x, min.y, max.z\n\t 4: max.x, max.y, min.z\n\t 5: min.x, max.y, min.z\n\t 6: min.x, min.y, min.z\n\t 7: max.x, min.y, min.z\n\t */\n\t\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\t\n\t\t\tarray[0] = max.x;array[1] = max.y;array[2] = max.z;\n\t\t\tarray[3] = min.x;array[4] = max.y;array[5] = max.z;\n\t\t\tarray[6] = min.x;array[7] = min.y;array[8] = max.z;\n\t\t\tarray[9] = max.x;array[10] = min.y;array[11] = max.z;\n\t\t\tarray[12] = max.x;array[13] = max.y;array[14] = min.z;\n\t\t\tarray[15] = min.x;array[16] = max.y;array[17] = min.z;\n\t\t\tarray[18] = min.x;array[19] = min.y;array[20] = min.z;\n\t\t\tarray[21] = max.x;array[22] = min.y;array[23] = min.z;\n\t\n\t\t\tposition.needsUpdate = true;\n\t\n\t\t\tthis.geometry.computeBoundingSphere();\n\t\t};\n\t})();\n\t\n\texports['default'] = BoxHelper;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\texports['default'] = function (colour) {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 1;\n\t canvas.height = 1;\n\t\n\t var context = canvas.getContext('2d');\n\t context.fillStyle = colour;\n\t context.fillRect(0, 0, canvas.width, canvas.height);\n\t // context.strokeStyle = '#D0D0CF';\n\t // context.strokeRect(0, 0, canvas.width, canvas.height);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // // Silky smooth images when tilted\n\t // texture.magFilter = THREE.LinearFilter;\n\t // texture.minFilter = THREE.LinearMipMapLinearFilter;\n\t // //\n\t // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t // texture.anisotropy = 4;\n\t\n\t // texture.wrapS = THREE.RepeatWrapping;\n\t // texture.wrapT = THREE.RepeatWrapping;\n\t // texture.repeat.set(segments, segments);\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t depthWrite: false\n\t });\n\t\n\t return material;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.0 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\tvar debounce = __webpack_require__(49);\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/**\n\t * Creates a throttled function that only invokes `func` at most once per\n\t * every `wait` milliseconds. The throttled function comes with a `cancel`\n\t * method to cancel delayed `func` invocations and a `flush` method to\n\t * immediately invoke them. Provide an options object to indicate whether\n\t * `func` should be invoked on the leading and/or trailing edge of the `wait`\n\t * timeout. The `func` is invoked with the last arguments provided to the\n\t * throttled function. Subsequent calls to the throttled function return the\n\t * result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the throttled function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.throttle` and `_.debounce`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to throttle.\n\t * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=true] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new throttled function.\n\t * @example\n\t *\n\t * // avoid excessively updating the position while scrolling\n\t * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n\t *\n\t * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n\t * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n\t * jQuery(element).on('click', throttled);\n\t *\n\t * // cancel a trailing throttled invocation\n\t * jQuery(window).on('popstate', throttled.cancel);\n\t */\n\tfunction throttle(func, wait, options) {\n\t var leading = true,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t if (isObject(options)) {\n\t leading = 'leading' in options ? !!options.leading : leading;\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t // Avoid a V8 JIT bug in Chrome 19-20.\n\t // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\tmodule.exports = throttle;\n\n\n/***/ },\n/* 49 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license \n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Gets the timestamp of the number of milliseconds that have elapsed since\n\t * the Unix epoch (1 January 1970 00:00:00 UTC).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Date\n\t * @returns {number} Returns the timestamp.\n\t * @example\n\t *\n\t * _.defer(function(stamp) {\n\t * console.log(_.now() - stamp);\n\t * }, _.now());\n\t * // => logs the number of milliseconds it took for the deferred function to be invoked\n\t */\n\tvar now = Date.now;\n\t\n\t/**\n\t * Creates a debounced function that delays invoking `func` until after `wait`\n\t * milliseconds have elapsed since the last time the debounced function was\n\t * invoked. The debounced function comes with a `cancel` method to cancel\n\t * delayed `func` invocations and a `flush` method to immediately invoke them.\n\t * Provide an options object to indicate whether `func` should be invoked on\n\t * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n\t * with the last arguments provided to the debounced function. Subsequent calls\n\t * to the debounced function return the result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the debounced function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.debounce` and `_.throttle`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to debounce.\n\t * @param {number} [wait=0] The number of milliseconds to delay.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=false] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n\t * delayed before it's invoked.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new debounced function.\n\t * @example\n\t *\n\t * // Avoid costly calculations while the window size is in flux.\n\t * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n\t *\n\t * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n\t * jQuery(element).on('click', _.debounce(sendMail, 300, {\n\t * 'leading': true,\n\t * 'trailing': false\n\t * }));\n\t *\n\t * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n\t * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n\t * var source = new EventSource('/stream');\n\t * jQuery(source).on('message', debounced);\n\t *\n\t * // Cancel the trailing debounced invocation.\n\t * jQuery(window).on('popstate', debounced.cancel);\n\t */\n\tfunction debounce(func, wait, options) {\n\t var args,\n\t maxTimeoutId,\n\t result,\n\t stamp,\n\t thisArg,\n\t timeoutId,\n\t trailingCall,\n\t lastCalled = 0,\n\t leading = false,\n\t maxWait = false,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t wait = toNumber(wait) || 0;\n\t if (isObject(options)) {\n\t leading = !!options.leading;\n\t maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t\n\t function cancel() {\n\t if (timeoutId) {\n\t clearTimeout(timeoutId);\n\t }\n\t if (maxTimeoutId) {\n\t clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = 0;\n\t args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n\t }\n\t\n\t function complete(isCalled, id) {\n\t if (id) {\n\t clearTimeout(id);\n\t }\n\t maxTimeoutId = timeoutId = trailingCall = undefined;\n\t if (isCalled) {\n\t lastCalled = now();\n\t result = func.apply(thisArg, args);\n\t if (!timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t }\n\t }\n\t\n\t function delayed() {\n\t var remaining = wait - (now() - stamp);\n\t if (remaining <= 0 || remaining > wait) {\n\t complete(trailingCall, maxTimeoutId);\n\t } else {\n\t timeoutId = setTimeout(delayed, remaining);\n\t }\n\t }\n\t\n\t function flush() {\n\t if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n\t result = func.apply(thisArg, args);\n\t }\n\t cancel();\n\t return result;\n\t }\n\t\n\t function maxDelayed() {\n\t complete(trailing, timeoutId);\n\t }\n\t\n\t function debounced() {\n\t args = arguments;\n\t stamp = now();\n\t thisArg = this;\n\t trailingCall = trailing && (timeoutId || !leading);\n\t\n\t if (maxWait === false) {\n\t var leadingCall = leading && !timeoutId;\n\t } else {\n\t if (!maxTimeoutId && !leading) {\n\t lastCalled = stamp;\n\t }\n\t var remaining = maxWait - (stamp - lastCalled),\n\t isCalled = remaining <= 0 || remaining > maxWait;\n\t\n\t if (isCalled) {\n\t if (maxTimeoutId) {\n\t maxTimeoutId = clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = stamp;\n\t result = func.apply(thisArg, args);\n\t }\n\t else if (!maxTimeoutId) {\n\t maxTimeoutId = setTimeout(maxDelayed, remaining);\n\t }\n\t }\n\t if (isCalled && timeoutId) {\n\t timeoutId = clearTimeout(timeoutId);\n\t }\n\t else if (!timeoutId && wait !== maxWait) {\n\t timeoutId = setTimeout(delayed, wait);\n\t }\n\t if (leadingCall) {\n\t isCalled = true;\n\t result = func.apply(thisArg, args);\n\t }\n\t if (isCalled && !timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t return result;\n\t }\n\t debounced.cancel = cancel;\n\t debounced.flush = flush;\n\t return debounced;\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = debounce;\n\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _TileLayer2 = __webpack_require__(34);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _TopoJSONTile = __webpack_require__(51);\n\t\n\tvar _TopoJSONTile2 = _interopRequireDefault(_TopoJSONTile);\n\t\n\tvar _lodashThrottle = __webpack_require__(48);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar TopoJSONTileLayer = (function (_TileLayer) {\n\t _inherits(TopoJSONTileLayer, _TileLayer);\n\t\n\t function TopoJSONTileLayer(path, options) {\n\t _classCallCheck(this, TopoJSONTileLayer);\n\t\n\t var defaults = {\n\t maxLOD: 14,\n\t distance: 2000\n\t };\n\t\n\t options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(TopoJSONTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t _this._initEvents();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t // this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t var options = {};\n\t\n\t if (this._options.filter) {\n\t options.filter = this._options.filter;\n\t }\n\t\n\t if (this._options.style) {\n\t options.style = this._options.style;\n\t }\n\t\n\t return (0, _TopoJSONTile2['default'])(quadcode, this._path, layer, options);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return TopoJSONTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new TopoJSONTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _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\t\n\tvar _Tile2 = __webpack_require__(45);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(46);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _reqwest = __webpack_require__(52);\n\t\n\tvar _reqwest2 = _interopRequireDefault(_reqwest);\n\t\n\tvar _topojson = __webpack_require__(54);\n\t\n\tvar _topojson2 = _interopRequireDefault(_topojson);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _earcut = __webpack_require__(55);\n\t\n\tvar _earcut2 = _interopRequireDefault(_earcut);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _utilExtrudePolygon = __webpack_require__(56);\n\t\n\tvar _utilExtrudePolygon2 = _interopRequireDefault(_utilExtrudePolygon);\n\t\n\t// TODO: Perform tile request and processing in a Web Worker\n\t//\n\t// Use Operative (https://github.com/padolsey/operative)\n\t//\n\t// Would it make sense to have the worker functionality defined in a static\n\t// method so it only gets initialised once and not on every tile instance?\n\t//\n\t// Otherwise, worker processing logic would have to go in the tile layer so not\n\t// to waste loads of time setting up a brand new worker with three.js for each\n\t// tile every single time.\n\t//\n\t// Unsure of the best way to get three.js and VIZI into the worker\n\t//\n\t// Would need to set up a CRS / projection identical to the world instance\n\t//\n\t// Is it possible to bypass requirements on external script by having multiple\n\t// simple worker methods that each take enough inputs to perform a single task\n\t// without requiring VIZI or three.js? So long as the heaviest logic is done in\n\t// the worker and transferrable objects are used then it should be better than\n\t// nothing. Would probably still need things like earcut...\n\t//\n\t// After all, the three.js logic and object creation will still need to be\n\t// done on the main thread regardless so the worker should try to do as much as\n\t// possible with as few dependencies as possible.\n\t//\n\t// Have a look at how this is done in Tangram before implementing anything as\n\t// the approach there is pretty similar and robust.\n\t\n\tvar TopoJSONTile = (function (_Tile) {\n\t _inherits(TopoJSONTile, _Tile);\n\t\n\t function TopoJSONTile(quadcode, path, layer, options) {\n\t _classCallCheck(this, TopoJSONTile);\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t\n\t var defaults = {\n\t filter: null,\n\t style: {\n\t color: '#ff0000'\n\t }\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the tile\n\t\n\t _createClass(TopoJSONTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTile();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear request reference\n\t this._request = null;\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t\n\t mesh.renderOrder = 1;\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\t //\n\t // var material = new THREE.MeshBasicMaterial({\n\t // depthWrite: false\n\t // });\n\t //\n\t // var localMesh = new THREE.Mesh(geom, material);\n\t // localMesh.rotation.x = -90 * Math.PI / 180;\n\t //\n\t // mesh.add(localMesh);\n\t //\n\t // var box = new BoxHelper(localMesh);\n\t // mesh.add(box);\n\t //\n\t // mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t this._request = (0, _reqwest2['default'])({\n\t url: url,\n\t type: 'json',\n\t crossOrigin: true\n\t }).then(function (res) {\n\t // Clear request reference\n\t _this2._request = null;\n\t _this2._processTileData(res);\n\t })['catch'](function (err) {\n\t console.error(err);\n\t\n\t // Clear request reference\n\t _this2._request = null;\n\t });\n\t }\n\t }, {\n\t key: '_processTileData',\n\t value: function _processTileData(data) {\n\t var _this3 = this;\n\t\n\t console.time(this._tile);\n\t\n\t var geojson = _topojson2['default'].feature(data, data.objects.vectile);\n\t\n\t var offset = (0, _geoPoint2['default'])(0, 0);\n\t offset.x = -1 * this._center[0];\n\t offset.y = -1 * this._center[1];\n\t\n\t var coordinates;\n\t var earcutData;\n\t var faces;\n\t\n\t var allVertices = [];\n\t var allFaces = [];\n\t var allColours = [];\n\t var facesCount = 0;\n\t\n\t var colour = new _three2['default'].Color();\n\t\n\t var features = geojson.features;\n\t\n\t // Run filter, if provided\n\t if (this._options.filter) {\n\t features = geojson.features.filter(this._options.filter);\n\t }\n\t\n\t var style = this._options.style;\n\t\n\t features.forEach(function (feature) {\n\t // feature.geometry, feature.properties\n\t\n\t // Get style object, if provided\n\t if (typeof _this3._options.style === 'function') {\n\t style = _this3._options.style(feature);\n\t }\n\t\n\t // console.log(style);\n\t\n\t var coordinates = feature.geometry.coordinates;\n\t\n\t // Skip if geometry is a point\n\t //\n\t // This should be a user-defined filter as it would be wrong to assume\n\t // that people won't want to output points\n\t if (!coordinates[0] || !coordinates[0][0] || !Array.isArray(coordinates[0][0])) {\n\t return;\n\t }\n\t\n\t coordinates = coordinates.map(function (ring) {\n\t return ring.map(function (coordinate) {\n\t var latlon = (0, _geoLatLon2['default'])(coordinate[1], coordinate[0]);\n\t var point = _this3._layer._world.latLonToPoint(latlon);\n\t return [point.x, point.y];\n\t });\n\t });\n\t\n\t earcutData = _this3._toEarcut(coordinates);\n\t\n\t faces = _this3._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\t\n\t var groupedVertices = [];\n\t for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) {\n\t groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions));\n\t }\n\t\n\t var extruded = (0, _utilExtrudePolygon2['default'])(groupedVertices, faces);\n\t\n\t colour.set(style.color);\n\t\n\t // allVertices.push(earcutData.vertices);\n\t // allColours.push([colour.r, colour.g, colour.b]);\n\t // allFaces.push(faces);\n\t\n\t allVertices.push(extruded.positions);\n\t allColours.push([colour.r, colour.g, colour.b]);\n\t allFaces.push(extruded.faces);\n\t\n\t facesCount += extruded.faces.length;\n\t });\n\t\n\t // console.log(allVertices);\n\t // return;\n\t\n\t // Skip if no faces\n\t //\n\t // Need to check way before this if there are no faces, before even doing\n\t // earcut triangulation.\n\t if (facesCount === 0) {\n\t this._ready = true;\n\t return;\n\t }\n\t\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t // Three components per vertex per face (3 x 3 = 9)\n\t var vertices = new Float32Array(facesCount * 9);\n\t var normals = new Float32Array(facesCount * 9);\n\t var colours = new Float32Array(facesCount * 9);\n\t\n\t var pA = new _three2['default'].Vector3();\n\t var pB = new _three2['default'].Vector3();\n\t var pC = new _three2['default'].Vector3();\n\t\n\t var cb = new _three2['default'].Vector3();\n\t var ab = new _three2['default'].Vector3();\n\t\n\t var dim = 2;\n\t\n\t var index;\n\t var _faces;\n\t var _vertices;\n\t var _colour;\n\t var lastIndex = 0;\n\t for (var i = 0; i < allFaces.length; i++) {\n\t _faces = allFaces[i];\n\t _vertices = allVertices[i];\n\t _colour = allColours[i];\n\t\n\t for (var j = 0; j < _faces.length; j++) {\n\t // Array of vertex indexes for the face\n\t index = _faces[j][0];\n\t //\n\t // var ax = _vertices[index * dim] + offset.x;\n\t // var ay = 0;\n\t // var az = _vertices[index * dim + 1] + offset.y;\n\t //\n\t // index = _faces[j][1];\n\t //\n\t // var bx = _vertices[index * dim] + offset.x;\n\t // var by = 0;\n\t // var bz = _vertices[index * dim + 1] + offset.y;\n\t //\n\t // index = _faces[j][2];\n\t //\n\t // var cx = _vertices[index * dim] + offset.x;\n\t // var cy = 0;\n\t // var cz = _vertices[index * dim + 1] + offset.y;\n\t\n\t var ax = _vertices[index][0] + offset.x;\n\t var ay = _vertices[index][1];\n\t var az = _vertices[index][2] + offset.y;\n\t\n\t index = _faces[j][1];\n\t\n\t var bx = _vertices[index][0] + offset.x;\n\t var by = _vertices[index][1];\n\t var bz = _vertices[index][2] + offset.y;\n\t\n\t index = _faces[j][2];\n\t\n\t var cx = _vertices[index][0] + offset.x;\n\t var cy = _vertices[index][1];\n\t var cz = _vertices[index][2] + offset.y;\n\t\n\t // Flat face normals\n\t // From: http://threejs.org/examples/webgl_buffergeometry.html\n\t pA.set(ax, ay, az);\n\t pB.set(bx, by, bz);\n\t pC.set(cx, cy, cz);\n\t\n\t cb.subVectors(pC, pB);\n\t ab.subVectors(pA, pB);\n\t cb.cross(ab);\n\t\n\t cb.normalize();\n\t\n\t var nx = cb.x;\n\t var ny = cb.y;\n\t var nz = cb.z;\n\t\n\t vertices[lastIndex * 9 + 0] = ax;\n\t vertices[lastIndex * 9 + 1] = ay;\n\t vertices[lastIndex * 9 + 2] = az;\n\t\n\t normals[lastIndex * 9 + 0] = nx;\n\t normals[lastIndex * 9 + 1] = ny;\n\t normals[lastIndex * 9 + 2] = nz;\n\t\n\t colours[lastIndex * 9 + 0] = _colour[0];\n\t colours[lastIndex * 9 + 1] = _colour[1];\n\t colours[lastIndex * 9 + 2] = _colour[2];\n\t\n\t vertices[lastIndex * 9 + 3] = bx;\n\t vertices[lastIndex * 9 + 4] = by;\n\t vertices[lastIndex * 9 + 5] = bz;\n\t\n\t normals[lastIndex * 9 + 3] = nx;\n\t normals[lastIndex * 9 + 4] = ny;\n\t normals[lastIndex * 9 + 5] = nz;\n\t\n\t colours[lastIndex * 9 + 3] = _colour[0];\n\t colours[lastIndex * 9 + 4] = _colour[1];\n\t colours[lastIndex * 9 + 5] = _colour[2];\n\t\n\t vertices[lastIndex * 9 + 6] = cx;\n\t vertices[lastIndex * 9 + 7] = cy;\n\t vertices[lastIndex * 9 + 8] = cz;\n\t\n\t normals[lastIndex * 9 + 6] = nx;\n\t normals[lastIndex * 9 + 7] = ny;\n\t normals[lastIndex * 9 + 8] = nz;\n\t\n\t colours[lastIndex * 9 + 6] = _colour[0];\n\t colours[lastIndex * 9 + 7] = _colour[1];\n\t colours[lastIndex * 9 + 8] = _colour[2];\n\t\n\t lastIndex++;\n\t }\n\t }\n\t\n\t // itemSize = 3 because there are 3 values (components) per vertex\n\t geometry.addAttribute('position', new _three2['default'].BufferAttribute(vertices, 3));\n\t geometry.addAttribute('normal', new _three2['default'].BufferAttribute(normals, 3));\n\t geometry.addAttribute('color', new _three2['default'].BufferAttribute(colours, 3));\n\t\n\t geometry.computeBoundingBox();\n\t\n\t var material = new _three2['default'].MeshPhongMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t side: _three2['default'].BackSide\n\t // depthWrite: false\n\t });\n\t var mesh = new _three2['default'].Mesh(geometry, material);\n\t // mesh.renderOrder = 1;\n\t\n\t this._mesh.add(mesh);\n\t\n\t this._ready = true;\n\t console.timeEnd(this._tile);\n\t console.log(this._tile + ': ' + features.length + ' features');\n\t }\n\t }, {\n\t key: '_toEarcut',\n\t value: function _toEarcut(data) {\n\t var dim = data[0][0].length;\n\t var result = { vertices: [], holes: [], dimensions: dim };\n\t var holeIndex = 0;\n\t\n\t for (var i = 0; i < data.length; i++) {\n\t for (var j = 0; j < data[i].length; j++) {\n\t for (var d = 0; d < dim; d++) {\n\t result.vertices.push(data[i][j][d]);\n\t }\n\t }\n\t if (i > 0) {\n\t holeIndex += data[i - 1].length;\n\t result.holes.push(holeIndex);\n\t }\n\t }\n\t\n\t return result;\n\t }\n\t }, {\n\t key: '_triangulate',\n\t value: function _triangulate(contour, holes, dim) {\n\t // console.time('earcut');\n\t\n\t var faces = (0, _earcut2['default'])(contour, holes, dim);\n\t var result = [];\n\t\n\t for (i = 0, il = faces.length; i < il; i += 3) {\n\t result.push(faces.slice(i, i + 3));\n\t }\n\t\n\t // console.timeEnd('earcut');\n\t\n\t return result;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._request) {\n\t return;\n\t }\n\t\n\t this._request.abort();\n\t }\n\t }]);\n\t\n\t return TopoJSONTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer, options) {\n\t return new TopoJSONTile(quadcode, path, layer, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t * Reqwest! A general purpose XHR connection manager\n\t * license MIT (c) Dustin Diaz 2015\n\t * https://github.com/ded/reqwest\n\t */\n\t\n\t!function (name, context, definition) {\n\t if (typeof module != 'undefined' && module.exports) module.exports = definition()\n\t else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\t else context[name] = definition()\n\t}('reqwest', this, function () {\n\t\n\t var context = this\n\t\n\t if ('window' in context) {\n\t var doc = document\n\t , byTag = 'getElementsByTagName'\n\t , head = doc[byTag]('head')[0]\n\t } else {\n\t var XHR2\n\t try {\n\t XHR2 = __webpack_require__(53)\n\t } catch (ex) {\n\t throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n\t }\n\t }\n\t\n\t\n\t var httpsRe = /^http/\n\t , protocolRe = /(^\\w+):\\/\\//\n\t , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n\t , readyState = 'readyState'\n\t , contentType = 'Content-Type'\n\t , requestedWith = 'X-Requested-With'\n\t , uniqid = 0\n\t , callbackPrefix = 'reqwest_' + (+new Date())\n\t , lastValue // data stored by the most recent JSONP callback\n\t , xmlHttpRequest = 'XMLHttpRequest'\n\t , xDomainRequest = 'XDomainRequest'\n\t , noop = function () {}\n\t\n\t , isArray = typeof Array.isArray == 'function'\n\t ? Array.isArray\n\t : function (a) {\n\t return a instanceof Array\n\t }\n\t\n\t , defaultHeaders = {\n\t 'contentType': 'application/x-www-form-urlencoded'\n\t , 'requestedWith': xmlHttpRequest\n\t , 'accept': {\n\t '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n\t , 'xml': 'application/xml, text/xml'\n\t , 'html': 'text/html'\n\t , 'text': 'text/plain'\n\t , 'json': 'application/json, text/javascript'\n\t , 'js': 'application/javascript, text/javascript'\n\t }\n\t }\n\t\n\t , xhr = function(o) {\n\t // is it x-domain\n\t if (o['crossOrigin'] === true) {\n\t var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n\t if (xhr && 'withCredentials' in xhr) {\n\t return xhr\n\t } else if (context[xDomainRequest]) {\n\t return new XDomainRequest()\n\t } else {\n\t throw new Error('Browser does not support cross-origin requests')\n\t }\n\t } else if (context[xmlHttpRequest]) {\n\t return new XMLHttpRequest()\n\t } else if (XHR2) {\n\t return new XHR2()\n\t } else {\n\t return new ActiveXObject('Microsoft.XMLHTTP')\n\t }\n\t }\n\t , globalSetupOptions = {\n\t dataFilter: function (data) {\n\t return data\n\t }\n\t }\n\t\n\t function succeed(r) {\n\t var protocol = protocolRe.exec(r.url)\n\t protocol = (protocol && protocol[1]) || context.location.protocol\n\t return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n\t }\n\t\n\t function handleReadyState(r, success, error) {\n\t return function () {\n\t // use _aborted to mitigate against IE err c00c023f\n\t // (can't read props on aborted request objects)\n\t if (r._aborted) return error(r.request)\n\t if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n\t if (r.request && r.request[readyState] == 4) {\n\t r.request.onreadystatechange = noop\n\t if (succeed(r)) success(r.request)\n\t else\n\t error(r.request)\n\t }\n\t }\n\t }\n\t\n\t function setHeaders(http, o) {\n\t var headers = o['headers'] || {}\n\t , h\n\t\n\t headers['Accept'] = headers['Accept']\n\t || defaultHeaders['accept'][o['type']]\n\t || defaultHeaders['accept']['*']\n\t\n\t var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n\t // breaks cross-origin requests with legacy browsers\n\t if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n\t if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n\t for (h in headers)\n\t headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n\t }\n\t\n\t function setCredentials(http, o) {\n\t if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n\t http.withCredentials = !!o['withCredentials']\n\t }\n\t }\n\t\n\t function generalCallback(data) {\n\t lastValue = data\n\t }\n\t\n\t function urlappend (url, s) {\n\t return url + (/\\?/.test(url) ? '&' : '?') + s\n\t }\n\t\n\t function handleJsonp(o, fn, err, url) {\n\t var reqId = uniqid++\n\t , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n\t , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n\t , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n\t , match = url.match(cbreg)\n\t , script = doc.createElement('script')\n\t , loaded = 0\n\t , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\t\n\t if (match) {\n\t if (match[3] === '?') {\n\t url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n\t } else {\n\t cbval = match[3] // provided callback func name\n\t }\n\t } else {\n\t url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n\t }\n\t\n\t context[cbval] = generalCallback\n\t\n\t script.type = 'text/javascript'\n\t script.src = url\n\t script.async = true\n\t if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n\t // need this for IE due to out-of-order onreadystatechange(), binding script\n\t // execution to an event listener gives us control over when the script\n\t // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n\t script.htmlFor = script.id = '_reqwest_' + reqId\n\t }\n\t\n\t script.onload = script.onreadystatechange = function () {\n\t if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n\t return false\n\t }\n\t script.onload = script.onreadystatechange = null\n\t script.onclick && script.onclick()\n\t // Call the user callback with the last value stored and clean up values and scripts.\n\t fn(lastValue)\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t\n\t // Add the script to the DOM head\n\t head.appendChild(script)\n\t\n\t // Enable JSONP timeout\n\t return {\n\t abort: function () {\n\t script.onload = script.onreadystatechange = null\n\t err({}, 'Request is aborted: timeout', {})\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t }\n\t }\n\t\n\t function getRequest(fn, err) {\n\t var o = this.o\n\t , method = (o['method'] || 'GET').toUpperCase()\n\t , url = typeof o === 'string' ? o : o['url']\n\t // convert non-string objects to query-string form unless o['processData'] is false\n\t , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n\t ? reqwest.toQueryString(o['data'])\n\t : (o['data'] || null)\n\t , http\n\t , sendWait = false\n\t\n\t // if we're working on a GET request and we have data then we should append\n\t // query string to end of URL and not post data\n\t if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n\t url = urlappend(url, data)\n\t data = null\n\t }\n\t\n\t if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\t\n\t // get the xhr from the factory if passed\n\t // if the factory returns null, fall-back to ours\n\t http = (o.xhr && o.xhr(o)) || xhr(o)\n\t\n\t http.open(method, url, o['async'] === false ? false : true)\n\t setHeaders(http, o)\n\t setCredentials(http, o)\n\t if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n\t http.onload = fn\n\t http.onerror = err\n\t // NOTE: see\n\t // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n\t http.onprogress = function() {}\n\t sendWait = true\n\t } else {\n\t http.onreadystatechange = handleReadyState(this, fn, err)\n\t }\n\t o['before'] && o['before'](http)\n\t if (sendWait) {\n\t setTimeout(function () {\n\t http.send(data)\n\t }, 200)\n\t } else {\n\t http.send(data)\n\t }\n\t return http\n\t }\n\t\n\t function Reqwest(o, fn) {\n\t this.o = o\n\t this.fn = fn\n\t\n\t init.apply(this, arguments)\n\t }\n\t\n\t function setType(header) {\n\t // json, javascript, text/plain, text/html, xml\n\t if (header === null) return undefined; //In case of no content-type.\n\t if (header.match('json')) return 'json'\n\t if (header.match('javascript')) return 'js'\n\t if (header.match('text')) return 'html'\n\t if (header.match('xml')) return 'xml'\n\t }\n\t\n\t function init(o, fn) {\n\t\n\t this.url = typeof o == 'string' ? o : o['url']\n\t this.timeout = null\n\t\n\t // whether request has been fulfilled for purpose\n\t // of tracking the Promises\n\t this._fulfilled = false\n\t // success handlers\n\t this._successHandler = function(){}\n\t this._fulfillmentHandlers = []\n\t // error handlers\n\t this._errorHandlers = []\n\t // complete (both success and fail) handlers\n\t this._completeHandlers = []\n\t this._erred = false\n\t this._responseArgs = {}\n\t\n\t var self = this\n\t\n\t fn = fn || function () {}\n\t\n\t if (o['timeout']) {\n\t this.timeout = setTimeout(function () {\n\t timedOut()\n\t }, o['timeout'])\n\t }\n\t\n\t if (o['success']) {\n\t this._successHandler = function () {\n\t o['success'].apply(o, arguments)\n\t }\n\t }\n\t\n\t if (o['error']) {\n\t this._errorHandlers.push(function () {\n\t o['error'].apply(o, arguments)\n\t })\n\t }\n\t\n\t if (o['complete']) {\n\t this._completeHandlers.push(function () {\n\t o['complete'].apply(o, arguments)\n\t })\n\t }\n\t\n\t function complete (resp) {\n\t o['timeout'] && clearTimeout(self.timeout)\n\t self.timeout = null\n\t while (self._completeHandlers.length > 0) {\n\t self._completeHandlers.shift()(resp)\n\t }\n\t }\n\t\n\t function success (resp) {\n\t var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n\t resp = (type !== 'jsonp') ? self.request : resp\n\t // use global data filter on response text\n\t var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n\t , r = filteredResponse\n\t try {\n\t resp.responseText = r\n\t } catch (e) {\n\t // can't assign this in IE<=8, just ignore\n\t }\n\t if (r) {\n\t switch (type) {\n\t case 'json':\n\t try {\n\t resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n\t } catch (err) {\n\t return error(resp, 'Could not parse JSON in response', err)\n\t }\n\t break\n\t case 'js':\n\t resp = eval(r)\n\t break\n\t case 'html':\n\t resp = r\n\t break\n\t case 'xml':\n\t resp = resp.responseXML\n\t && resp.responseXML.parseError // IE trololo\n\t && resp.responseXML.parseError.errorCode\n\t && resp.responseXML.parseError.reason\n\t ? null\n\t : resp.responseXML\n\t break\n\t }\n\t }\n\t\n\t self._responseArgs.resp = resp\n\t self._fulfilled = true\n\t fn(resp)\n\t self._successHandler(resp)\n\t while (self._fulfillmentHandlers.length > 0) {\n\t resp = self._fulfillmentHandlers.shift()(resp)\n\t }\n\t\n\t complete(resp)\n\t }\n\t\n\t function timedOut() {\n\t self._timedOut = true\n\t self.request.abort()\n\t }\n\t\n\t function error(resp, msg, t) {\n\t resp = self.request\n\t self._responseArgs.resp = resp\n\t self._responseArgs.msg = msg\n\t self._responseArgs.t = t\n\t self._erred = true\n\t while (self._errorHandlers.length > 0) {\n\t self._errorHandlers.shift()(resp, msg, t)\n\t }\n\t complete(resp)\n\t }\n\t\n\t this.request = getRequest.call(this, success, error)\n\t }\n\t\n\t Reqwest.prototype = {\n\t abort: function () {\n\t this._aborted = true\n\t this.request.abort()\n\t }\n\t\n\t , retry: function () {\n\t init.call(this, this.o, this.fn)\n\t }\n\t\n\t /**\n\t * Small deviation from the Promises A CommonJs specification\n\t * http://wiki.commonjs.org/wiki/Promises/A\n\t */\n\t\n\t /**\n\t * `then` will execute upon successful requests\n\t */\n\t , then: function (success, fail) {\n\t success = success || function () {}\n\t fail = fail || function () {}\n\t if (this._fulfilled) {\n\t this._responseArgs.resp = success(this._responseArgs.resp)\n\t } else if (this._erred) {\n\t fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._fulfillmentHandlers.push(success)\n\t this._errorHandlers.push(fail)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `always` will execute whether the request succeeds or fails\n\t */\n\t , always: function (fn) {\n\t if (this._fulfilled || this._erred) {\n\t fn(this._responseArgs.resp)\n\t } else {\n\t this._completeHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `fail` will execute when the request fails\n\t */\n\t , fail: function (fn) {\n\t if (this._erred) {\n\t fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._errorHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t , 'catch': function (fn) {\n\t return this.fail(fn)\n\t }\n\t }\n\t\n\t function reqwest(o, fn) {\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t // normalize newline variants according to spec -> CRLF\n\t function normalize(s) {\n\t return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n\t }\n\t\n\t function serial(el, cb) {\n\t var n = el.name\n\t , t = el.tagName.toLowerCase()\n\t , optCb = function (o) {\n\t // IE gives value=\"\" even where there is no value attribute\n\t // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n\t if (o && !o['disabled'])\n\t cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n\t }\n\t , ch, ra, val, i\n\t\n\t // don't serialize elements that are disabled or without a name\n\t if (el.disabled || !n) return\n\t\n\t switch (t) {\n\t case 'input':\n\t if (!/reset|button|image|file/i.test(el.type)) {\n\t ch = /checkbox/i.test(el.type)\n\t ra = /radio/i.test(el.type)\n\t val = el.value\n\t // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n\t ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n\t }\n\t break\n\t case 'textarea':\n\t cb(n, normalize(el.value))\n\t break\n\t case 'select':\n\t if (el.type.toLowerCase() === 'select-one') {\n\t optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n\t } else {\n\t for (i = 0; el.length && i < el.length; i++) {\n\t el.options[i].selected && optCb(el.options[i])\n\t }\n\t }\n\t break\n\t }\n\t }\n\t\n\t // collect up all form elements found from the passed argument elements all\n\t // the way down to child elements; pass a '' or form fields.\n\t // called with 'this'=callback to use for serial() on each element\n\t function eachFormElement() {\n\t var cb = this\n\t , e, i\n\t , serializeSubtags = function (e, tags) {\n\t var i, j, fa\n\t for (i = 0; i < tags.length; i++) {\n\t fa = e[byTag](tags[i])\n\t for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n\t }\n\t }\n\t\n\t for (i = 0; i < arguments.length; i++) {\n\t e = arguments[i]\n\t if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n\t serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n\t }\n\t }\n\t\n\t // standard query string style serialization\n\t function serializeQueryString() {\n\t return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n\t }\n\t\n\t // { 'name': 'value', ... } style serialization\n\t function serializeHash() {\n\t var hash = {}\n\t eachFormElement.apply(function (name, value) {\n\t if (name in hash) {\n\t hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n\t hash[name].push(value)\n\t } else hash[name] = value\n\t }, arguments)\n\t return hash\n\t }\n\t\n\t // [ { name: 'name', value: 'value' }, ... ] style serialization\n\t reqwest.serializeArray = function () {\n\t var arr = []\n\t eachFormElement.apply(function (name, value) {\n\t arr.push({name: name, value: value})\n\t }, arguments)\n\t return arr\n\t }\n\t\n\t reqwest.serialize = function () {\n\t if (arguments.length === 0) return ''\n\t var opt, fn\n\t , args = Array.prototype.slice.call(arguments, 0)\n\t\n\t opt = args.pop()\n\t opt && opt.nodeType && args.push(opt) && (opt = null)\n\t opt && (opt = opt.type)\n\t\n\t if (opt == 'map') fn = serializeHash\n\t else if (opt == 'array') fn = reqwest.serializeArray\n\t else fn = serializeQueryString\n\t\n\t return fn.apply(null, args)\n\t }\n\t\n\t reqwest.toQueryString = function (o, trad) {\n\t var prefix, i\n\t , traditional = trad || false\n\t , s = []\n\t , enc = encodeURIComponent\n\t , add = function (key, value) {\n\t // If value is a function, invoke it and return its value\n\t value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n\t s[s.length] = enc(key) + '=' + enc(value)\n\t }\n\t // If an array was passed in, assume that it is an array of form elements.\n\t if (isArray(o)) {\n\t for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n\t } else {\n\t // If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t // did it), otherwise encode params recursively.\n\t for (prefix in o) {\n\t if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n\t }\n\t }\n\t\n\t // spaces should be + according to spec\n\t return s.join('&').replace(/%20/g, '+')\n\t }\n\t\n\t function buildParams(prefix, obj, traditional, add) {\n\t var name, i, v\n\t , rbracket = /\\[\\]$/\n\t\n\t if (isArray(obj)) {\n\t // Serialize array item.\n\t for (i = 0; obj && i < obj.length; i++) {\n\t v = obj[i]\n\t if (traditional || rbracket.test(prefix)) {\n\t // Treat each array item as a scalar.\n\t add(prefix, v)\n\t } else {\n\t buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n\t }\n\t }\n\t } else if (obj && obj.toString() === '[object Object]') {\n\t // Serialize object item.\n\t for (name in obj) {\n\t buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n\t }\n\t\n\t } else {\n\t // Serialize scalar item.\n\t add(prefix, obj)\n\t }\n\t }\n\t\n\t reqwest.getcallbackPrefix = function () {\n\t return callbackPrefix\n\t }\n\t\n\t // jQuery and Zepto compatibility, differences can be remapped here so you can call\n\t // .ajax.compat(options, callback)\n\t reqwest.compat = function (o, fn) {\n\t if (o) {\n\t o['type'] && (o['method'] = o['type']) && delete o['type']\n\t o['dataType'] && (o['type'] = o['dataType'])\n\t o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n\t o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n\t }\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t reqwest.ajaxSetup = function (options) {\n\t options = options || {}\n\t for (var k in options) {\n\t globalSetupOptions[k] = options[k]\n\t }\n\t }\n\t\n\t return reqwest\n\t});\n\n\n/***/ },\n/* 53 */\n/***/ function(module, exports) {\n\n\t/* (ignored) */\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function (global, factory) {\n\t true ? factory(exports) :\n\t typeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t (factory((global.topojson = {})));\n\t}(this, function (exports) { 'use strict';\n\t\n\t function noop() {}\n\t\n\t function absolute(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t point[0] = (x0 += point[0]) * kx + dx;\n\t point[1] = (y0 += point[1]) * ky + dy;\n\t };\n\t }\n\t\n\t function relative(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t var x1 = (point[0] - dx) / kx | 0,\n\t y1 = (point[1] - dy) / ky | 0;\n\t point[0] = x1 - x0;\n\t point[1] = y1 - y0;\n\t x0 = x1;\n\t y0 = y1;\n\t };\n\t }\n\t\n\t function reverse(array, n) {\n\t var t, j = array.length, i = j - n;\n\t while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n\t }\n\t\n\t function bisect(a, x) {\n\t var lo = 0, hi = a.length;\n\t while (lo < hi) {\n\t var mid = lo + hi >>> 1;\n\t if (a[mid] < x) lo = mid + 1;\n\t else hi = mid;\n\t }\n\t return lo;\n\t }\n\t\n\t function feature(topology, o) {\n\t return o.type === \"GeometryCollection\" ? {\n\t type: \"FeatureCollection\",\n\t features: o.geometries.map(function(o) { return feature$1(topology, o); })\n\t } : feature$1(topology, o);\n\t }\n\t\n\t function feature$1(topology, o) {\n\t var f = {\n\t type: \"Feature\",\n\t id: o.id,\n\t properties: o.properties || {},\n\t geometry: object(topology, o)\n\t };\n\t if (o.id == null) delete f.id;\n\t return f;\n\t }\n\t\n\t function object(topology, o) {\n\t var absolute$$ = absolute(topology.transform),\n\t arcs = topology.arcs;\n\t\n\t function arc(i, points) {\n\t if (points.length) points.pop();\n\t for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n\t points.push(p = a[k].slice());\n\t absolute$$(p, k);\n\t }\n\t if (i < 0) reverse(points, n);\n\t }\n\t\n\t function point(p) {\n\t p = p.slice();\n\t absolute$$(p, 0);\n\t return p;\n\t }\n\t\n\t function line(arcs) {\n\t var points = [];\n\t for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n\t if (points.length < 2) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function ring(arcs) {\n\t var points = line(arcs);\n\t while (points.length < 4) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function polygon(arcs) {\n\t return arcs.map(ring);\n\t }\n\t\n\t function geometry(o) {\n\t var t = o.type;\n\t return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n\t : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n\t : null;\n\t }\n\t\n\t var geometryType = {\n\t Point: function(o) { return point(o.coordinates); },\n\t MultiPoint: function(o) { return o.coordinates.map(point); },\n\t LineString: function(o) { return line(o.arcs); },\n\t MultiLineString: function(o) { return o.arcs.map(line); },\n\t Polygon: function(o) { return polygon(o.arcs); },\n\t MultiPolygon: function(o) { return o.arcs.map(polygon); }\n\t };\n\t\n\t return geometry(o);\n\t }\n\t\n\t function stitchArcs(topology, arcs) {\n\t var stitchedArcs = {},\n\t fragmentByStart = {},\n\t fragmentByEnd = {},\n\t fragments = [],\n\t emptyIndex = -1;\n\t\n\t // Stitch empty arcs first, since they may be subsumed by other arcs.\n\t arcs.forEach(function(i, j) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], t;\n\t if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n\t t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n\t }\n\t });\n\t\n\t arcs.forEach(function(i) {\n\t var e = ends(i),\n\t start = e[0],\n\t end = e[1],\n\t f, g;\n\t\n\t if (f = fragmentByEnd[start]) {\n\t delete fragmentByEnd[f.end];\n\t f.push(i);\n\t f.end = end;\n\t if (g = fragmentByStart[end]) {\n\t delete fragmentByStart[g.start];\n\t var fg = g === f ? f : f.concat(g);\n\t fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else if (f = fragmentByStart[end]) {\n\t delete fragmentByStart[f.start];\n\t f.unshift(i);\n\t f.start = start;\n\t if (g = fragmentByEnd[start]) {\n\t delete fragmentByEnd[g.end];\n\t var gf = g === f ? f : g.concat(f);\n\t fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else {\n\t f = [i];\n\t fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n\t }\n\t });\n\t\n\t function ends(i) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n\t if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n\t else p1 = arc[arc.length - 1];\n\t return i < 0 ? [p1, p0] : [p0, p1];\n\t }\n\t\n\t function flush(fragmentByEnd, fragmentByStart) {\n\t for (var k in fragmentByEnd) {\n\t var f = fragmentByEnd[k];\n\t delete fragmentByStart[f.start];\n\t delete f.start;\n\t delete f.end;\n\t f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n\t fragments.push(f);\n\t }\n\t }\n\t\n\t flush(fragmentByEnd, fragmentByStart);\n\t flush(fragmentByStart, fragmentByEnd);\n\t arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\t\n\t return fragments;\n\t }\n\t\n\t function mesh(topology) {\n\t return object(topology, meshArcs.apply(this, arguments));\n\t }\n\t\n\t function meshArcs(topology, o, filter) {\n\t var arcs = [];\n\t\n\t function arc(i) {\n\t var j = i < 0 ? ~i : i;\n\t (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n\t }\n\t\n\t function line(arcs) {\n\t arcs.forEach(arc);\n\t }\n\t\n\t function polygon(arcs) {\n\t arcs.forEach(line);\n\t }\n\t\n\t function geometry(o) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n\t else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n\t }\n\t\n\t if (arguments.length > 1) {\n\t var geomsByArc = [],\n\t geom;\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n\t };\n\t\n\t geometry(o);\n\t\n\t geomsByArc.forEach(arguments.length < 3\n\t ? function(geoms) { arcs.push(geoms[0].i); }\n\t : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n\t } else {\n\t for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n\t }\n\t\n\t return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n\t }\n\t\n\t function triangle(triangle) {\n\t var a = triangle[0], b = triangle[1], c = triangle[2];\n\t return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n\t }\n\t\n\t function ring(ring) {\n\t var i = -1,\n\t n = ring.length,\n\t a,\n\t b = ring[n - 1],\n\t area = 0;\n\t\n\t while (++i < n) {\n\t a = b;\n\t b = ring[i];\n\t area += a[0] * b[1] - a[1] * b[0];\n\t }\n\t\n\t return area / 2;\n\t }\n\t\n\t function merge(topology) {\n\t return object(topology, mergeArcs.apply(this, arguments));\n\t }\n\t\n\t function mergeArcs(topology, objects) {\n\t var polygonsByArc = {},\n\t polygons = [],\n\t components = [];\n\t\n\t objects.forEach(function(o) {\n\t if (o.type === \"Polygon\") register(o.arcs);\n\t else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n\t });\n\t\n\t function register(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n\t });\n\t });\n\t polygons.push(polygon);\n\t }\n\t\n\t function exterior(ring$$) {\n\t return ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]) > 0; // TODO allow spherical?\n\t }\n\t\n\t polygons.forEach(function(polygon) {\n\t if (!polygon._) {\n\t var component = [],\n\t neighbors = [polygon];\n\t polygon._ = 1;\n\t components.push(component);\n\t while (polygon = neighbors.pop()) {\n\t component.push(polygon);\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n\t if (!polygon._) {\n\t polygon._ = 1;\n\t neighbors.push(polygon);\n\t }\n\t });\n\t });\n\t });\n\t }\n\t }\n\t });\n\t\n\t polygons.forEach(function(polygon) {\n\t delete polygon._;\n\t });\n\t\n\t return {\n\t type: \"MultiPolygon\",\n\t arcs: components.map(function(polygons) {\n\t var arcs = [], n;\n\t\n\t // Extract the exterior (unique) arcs.\n\t polygons.forEach(function(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n\t arcs.push(arc);\n\t }\n\t });\n\t });\n\t });\n\t\n\t // Stitch the arcs into one or more rings.\n\t arcs = stitchArcs(topology, arcs);\n\t\n\t // If more than one ring is returned,\n\t // at most one of these rings can be the exterior;\n\t // this exterior ring has the same winding order\n\t // as any exterior ring in the original polygons.\n\t if ((n = arcs.length) > 1) {\n\t var sgn = exterior(polygons[0][0]);\n\t for (var i = 0, t; i < n; ++i) {\n\t if (sgn === exterior(arcs[i])) {\n\t t = arcs[0], arcs[0] = arcs[i], arcs[i] = t;\n\t break;\n\t }\n\t }\n\t }\n\t\n\t return arcs;\n\t })\n\t };\n\t }\n\t\n\t function neighbors(objects) {\n\t var indexesByArc = {}, // arc index -> array of object indexes\n\t neighbors = objects.map(function() { return []; });\n\t\n\t function line(arcs, i) {\n\t arcs.forEach(function(a) {\n\t if (a < 0) a = ~a;\n\t var o = indexesByArc[a];\n\t if (o) o.push(i);\n\t else indexesByArc[a] = [i];\n\t });\n\t }\n\t\n\t function polygon(arcs, i) {\n\t arcs.forEach(function(arc) { line(arc, i); });\n\t }\n\t\n\t function geometry(o, i) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n\t else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n\t }\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n\t };\n\t\n\t objects.forEach(geometry);\n\t\n\t for (var i in indexesByArc) {\n\t for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n\t for (var k = j + 1; k < m; ++k) {\n\t var ij = indexes[j], ik = indexes[k], n;\n\t if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n\t if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n\t }\n\t }\n\t }\n\t\n\t return neighbors;\n\t }\n\t\n\t function compareArea(a, b) {\n\t return a[1][2] - b[1][2];\n\t }\n\t\n\t function minAreaHeap() {\n\t var heap = {},\n\t array = [],\n\t size = 0;\n\t\n\t heap.push = function(object) {\n\t up(array[object._ = size] = object, size++);\n\t return size;\n\t };\n\t\n\t heap.pop = function() {\n\t if (size <= 0) return;\n\t var removed = array[0], object;\n\t if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n\t return removed;\n\t };\n\t\n\t heap.remove = function(removed) {\n\t var i = removed._, object;\n\t if (array[i] !== removed) return; // invalid request\n\t if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n\t return i;\n\t };\n\t\n\t function up(object, i) {\n\t while (i > 0) {\n\t var j = ((i + 1) >> 1) - 1,\n\t parent = array[j];\n\t if (compareArea(object, parent) >= 0) break;\n\t array[parent._ = i] = parent;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t function down(object, i) {\n\t while (true) {\n\t var r = (i + 1) << 1,\n\t l = r - 1,\n\t j = i,\n\t child = array[j];\n\t if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n\t if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n\t if (j === i) break;\n\t array[child._ = i] = child;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t return heap;\n\t }\n\t\n\t function presimplify(topology, triangleArea) {\n\t var absolute$$ = absolute(topology.transform),\n\t relative$$ = relative(topology.transform),\n\t heap = minAreaHeap();\n\t\n\t if (!triangleArea) triangleArea = triangle;\n\t\n\t topology.arcs.forEach(function(arc) {\n\t var triangles = [],\n\t maxArea = 0,\n\t triangle,\n\t i,\n\t n,\n\t p;\n\t\n\t // To store each point’s effective area, we create a new array rather than\n\t // extending the passed-in point to workaround a Chrome/V8 bug (getting\n\t // stuck in smi mode). For midpoints, the initial effective area of\n\t // Infinity will be computed in the next step.\n\t for (i = 0, n = arc.length; i < n; ++i) {\n\t p = arc[i];\n\t absolute$$(arc[i] = [p[0], p[1], Infinity], i);\n\t }\n\t\n\t for (i = 1, n = arc.length - 1; i < n; ++i) {\n\t triangle = arc.slice(i - 1, i + 2);\n\t triangle[1][2] = triangleArea(triangle);\n\t triangles.push(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t for (i = 0, n = triangles.length; i < n; ++i) {\n\t triangle = triangles[i];\n\t triangle.previous = triangles[i - 1];\n\t triangle.next = triangles[i + 1];\n\t }\n\t\n\t while (triangle = heap.pop()) {\n\t var previous = triangle.previous,\n\t next = triangle.next;\n\t\n\t // If the area of the current point is less than that of the previous point\n\t // to be eliminated, use the latter's area instead. This ensures that the\n\t // current point cannot be eliminated without eliminating previously-\n\t // eliminated points.\n\t if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n\t else maxArea = triangle[1][2];\n\t\n\t if (previous) {\n\t previous.next = next;\n\t previous[2] = triangle[2];\n\t update(previous);\n\t }\n\t\n\t if (next) {\n\t next.previous = previous;\n\t next[0] = triangle[0];\n\t update(next);\n\t }\n\t }\n\t\n\t arc.forEach(relative$$);\n\t });\n\t\n\t function update(triangle) {\n\t heap.remove(triangle);\n\t triangle[1][2] = triangleArea(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t return topology;\n\t }\n\t\n\t var version = \"1.6.24\";\n\t\n\t exports.version = version;\n\t exports.mesh = mesh;\n\t exports.meshArcs = meshArcs;\n\t exports.merge = merge;\n\t exports.mergeArcs = mergeArcs;\n\t exports.feature = feature;\n\t exports.neighbors = neighbors;\n\t exports.presimplify = presimplify;\n\t\n\t}));\n\n/***/ },\n/* 55 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = earcut;\n\t\n\tfunction earcut(data, holeIndices, dim) {\n\t\n\t dim = dim || 2;\n\t\n\t var hasHoles = holeIndices && holeIndices.length,\n\t outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n\t outerNode = linkedList(data, 0, outerLen, dim, true),\n\t triangles = [];\n\t\n\t if (!outerNode) return triangles;\n\t\n\t var minX, minY, maxX, maxY, x, y, size;\n\t\n\t if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\t\n\t // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t if (data.length > 80 * dim) {\n\t minX = maxX = data[0];\n\t minY = maxY = data[1];\n\t\n\t for (var i = dim; i < outerLen; i += dim) {\n\t x = data[i];\n\t y = data[i + 1];\n\t if (x < minX) minX = x;\n\t if (y < minY) minY = y;\n\t if (x > maxX) maxX = x;\n\t if (y > maxY) maxY = y;\n\t }\n\t\n\t // minX, minY and size are later used to transform coords into integers for z-order calculation\n\t size = Math.max(maxX - minX, maxY - minY);\n\t }\n\t\n\t earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\t\n\t return triangles;\n\t}\n\t\n\t// create a circular doubly linked list from polygon points in the specified winding order\n\tfunction linkedList(data, start, end, dim, clockwise) {\n\t var sum = 0,\n\t i, j, last;\n\t\n\t // calculate original winding order of a polygon ring\n\t for (i = start, j = end - dim; i < end; i += dim) {\n\t sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n\t j = i;\n\t }\n\t\n\t // link points into circular doubly-linked list in the specified winding order\n\t if (clockwise === (sum > 0)) {\n\t for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n\t } else {\n\t for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n\t }\n\t\n\t return last;\n\t}\n\t\n\t// eliminate colinear or duplicate points\n\tfunction filterPoints(start, end) {\n\t if (!start) return start;\n\t if (!end) end = start;\n\t\n\t var p = start,\n\t again;\n\t do {\n\t again = false;\n\t\n\t if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n\t removeNode(p);\n\t p = end = p.prev;\n\t if (p === p.next) return null;\n\t again = true;\n\t\n\t } else {\n\t p = p.next;\n\t }\n\t } while (again || p !== end);\n\t\n\t return end;\n\t}\n\t\n\t// main ear slicing loop which triangulates a polygon (given as a linked list)\n\tfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n\t if (!ear) return;\n\t\n\t // interlink polygon nodes in z-order\n\t if (!pass && size) indexCurve(ear, minX, minY, size);\n\t\n\t var stop = ear,\n\t prev, next;\n\t\n\t // iterate through ears, slicing them one by one\n\t while (ear.prev !== ear.next) {\n\t prev = ear.prev;\n\t next = ear.next;\n\t\n\t if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n\t // cut off the triangle\n\t triangles.push(prev.i / dim);\n\t triangles.push(ear.i / dim);\n\t triangles.push(next.i / dim);\n\t\n\t removeNode(ear);\n\t\n\t // skipping the next vertice leads to less sliver triangles\n\t ear = next.next;\n\t stop = next.next;\n\t\n\t continue;\n\t }\n\t\n\t ear = next;\n\t\n\t // if we looped through the whole remaining polygon and can't find any more ears\n\t if (ear === stop) {\n\t // try filtering points and slicing again\n\t if (!pass) {\n\t earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\t\n\t // if this didn't work, try curing all small self-intersections locally\n\t } else if (pass === 1) {\n\t ear = cureLocalIntersections(ear, triangles, dim);\n\t earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\t\n\t // as a last resort, try splitting the remaining polygon into two\n\t } else if (pass === 2) {\n\t splitEarcut(ear, triangles, dim, minX, minY, size);\n\t }\n\t\n\t break;\n\t }\n\t }\n\t}\n\t\n\t// check whether a polygon node forms a valid ear with adjacent nodes\n\tfunction isEar(ear) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // now make sure we don't have other points inside the potential ear\n\t var p = ear.next.next;\n\t\n\t while (p !== ear.prev) {\n\t if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.next;\n\t }\n\t\n\t return true;\n\t}\n\t\n\tfunction isEarHashed(ear, minX, minY, size) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // triangle bbox; min & max are calculated like this for speed\n\t var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n\t minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n\t maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n\t maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\t\n\t // z-order range for the current triangle bbox;\n\t var minZ = zOrder(minTX, minTY, minX, minY, size),\n\t maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\t\n\t // first look for points inside the triangle in increasing z-order\n\t var p = ear.nextZ;\n\t\n\t while (p && p.z <= maxZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.nextZ;\n\t }\n\t\n\t // then look for points in decreasing z-order\n\t p = ear.prevZ;\n\t\n\t while (p && p.z >= minZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.prevZ;\n\t }\n\t\n\t return true;\n\t}\n\t\n\t// go through all polygon nodes and cure small local self-intersections\n\tfunction cureLocalIntersections(start, triangles, dim) {\n\t var p = start;\n\t do {\n\t var a = p.prev,\n\t b = p.next.next;\n\t\n\t // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])\n\t if (intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\t\n\t triangles.push(a.i / dim);\n\t triangles.push(p.i / dim);\n\t triangles.push(b.i / dim);\n\t\n\t // remove two nodes involved\n\t removeNode(p);\n\t removeNode(p.next);\n\t\n\t p = start = b;\n\t }\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return p;\n\t}\n\t\n\t// try splitting polygon into two and triangulate them independently\n\tfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n\t // look for a valid diagonal that divides the polygon into two\n\t var a = start;\n\t do {\n\t var b = a.next.next;\n\t while (b !== a.prev) {\n\t if (a.i !== b.i && isValidDiagonal(a, b)) {\n\t // split the polygon in two by the diagonal\n\t var c = splitPolygon(a, b);\n\t\n\t // filter colinear points around the cuts\n\t a = filterPoints(a, a.next);\n\t c = filterPoints(c, c.next);\n\t\n\t // run earcut on each half\n\t earcutLinked(a, triangles, dim, minX, minY, size);\n\t earcutLinked(c, triangles, dim, minX, minY, size);\n\t return;\n\t }\n\t b = b.next;\n\t }\n\t a = a.next;\n\t } while (a !== start);\n\t}\n\t\n\t// link every hole into the outer loop, producing a single-ring polygon without holes\n\tfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n\t var queue = [],\n\t i, len, start, end, list;\n\t\n\t for (i = 0, len = holeIndices.length; i < len; i++) {\n\t start = holeIndices[i] * dim;\n\t end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t list = linkedList(data, start, end, dim, false);\n\t if (list === list.next) list.steiner = true;\n\t queue.push(getLeftmost(list));\n\t }\n\t\n\t queue.sort(compareX);\n\t\n\t // process holes from left to right\n\t for (i = 0; i < queue.length; i++) {\n\t eliminateHole(queue[i], outerNode);\n\t outerNode = filterPoints(outerNode, outerNode.next);\n\t }\n\t\n\t return outerNode;\n\t}\n\t\n\tfunction compareX(a, b) {\n\t return a.x - b.x;\n\t}\n\t\n\t// find a bridge between vertices that connects hole with an outer ring and and link it\n\tfunction eliminateHole(hole, outerNode) {\n\t outerNode = findHoleBridge(hole, outerNode);\n\t if (outerNode) {\n\t var b = splitPolygon(outerNode, hole);\n\t filterPoints(b, b.next);\n\t }\n\t}\n\t\n\t// David Eberly's algorithm for finding a bridge between hole and outer polygon\n\tfunction findHoleBridge(hole, outerNode) {\n\t var p = outerNode,\n\t hx = hole.x,\n\t hy = hole.y,\n\t qx = -Infinity,\n\t m;\n\t\n\t // find a segment intersected by a ray from the hole's leftmost point to the left;\n\t // segment's endpoint with lesser x will be potential connection point\n\t do {\n\t if (hy <= p.y && hy >= p.next.y) {\n\t var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n\t if (x <= hx && x > qx) {\n\t qx = x;\n\t m = p.x < p.next.x ? p : p.next;\n\t }\n\t }\n\t p = p.next;\n\t } while (p !== outerNode);\n\t\n\t if (!m) return null;\n\t\n\t if (hole.x === m.x) return m.prev; // hole touches outer segment; pick lower endpoint\n\t\n\t // look for points inside the triangle of hole point, segment intersection and endpoint;\n\t // if there are no points found, we have a valid connection;\n\t // otherwise choose the point of the minimum angle with the ray as connection point\n\t\n\t var stop = m,\n\t tanMin = Infinity,\n\t tan;\n\t\n\t p = m.next;\n\t\n\t while (p !== stop) {\n\t if (hx >= p.x && p.x >= m.x &&\n\t pointInTriangle(hy < m.y ? hx : qx, hy, m.x, m.y, hy < m.y ? qx : hx, hy, p.x, p.y)) {\n\t\n\t tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\t\n\t if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n\t m = p;\n\t tanMin = tan;\n\t }\n\t }\n\t\n\t p = p.next;\n\t }\n\t\n\t return m;\n\t}\n\t\n\t// interlink polygon nodes in z-order\n\tfunction indexCurve(start, minX, minY, size) {\n\t var p = start;\n\t do {\n\t if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n\t p.prevZ = p.prev;\n\t p.nextZ = p.next;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t p.prevZ.nextZ = null;\n\t p.prevZ = null;\n\t\n\t sortLinked(p);\n\t}\n\t\n\t// Simon Tatham's linked list merge sort algorithm\n\t// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\n\tfunction sortLinked(list) {\n\t var i, p, q, e, tail, numMerges, pSize, qSize,\n\t inSize = 1;\n\t\n\t do {\n\t p = list;\n\t list = null;\n\t tail = null;\n\t numMerges = 0;\n\t\n\t while (p) {\n\t numMerges++;\n\t q = p;\n\t pSize = 0;\n\t for (i = 0; i < inSize; i++) {\n\t pSize++;\n\t q = q.nextZ;\n\t if (!q) break;\n\t }\n\t\n\t qSize = inSize;\n\t\n\t while (pSize > 0 || (qSize > 0 && q)) {\n\t\n\t if (pSize === 0) {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t } else if (qSize === 0 || !q) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else if (p.z <= q.z) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t }\n\t\n\t if (tail) tail.nextZ = e;\n\t else list = e;\n\t\n\t e.prevZ = tail;\n\t tail = e;\n\t }\n\t\n\t p = q;\n\t }\n\t\n\t tail.nextZ = null;\n\t inSize *= 2;\n\t\n\t } while (numMerges > 1);\n\t\n\t return list;\n\t}\n\t\n\t// z-order of a point given coords and size of the data bounding box\n\tfunction zOrder(x, y, minX, minY, size) {\n\t // coords are transformed into non-negative 15-bit integer range\n\t x = 32767 * (x - minX) / size;\n\t y = 32767 * (y - minY) / size;\n\t\n\t x = (x | (x << 8)) & 0x00FF00FF;\n\t x = (x | (x << 4)) & 0x0F0F0F0F;\n\t x = (x | (x << 2)) & 0x33333333;\n\t x = (x | (x << 1)) & 0x55555555;\n\t\n\t y = (y | (y << 8)) & 0x00FF00FF;\n\t y = (y | (y << 4)) & 0x0F0F0F0F;\n\t y = (y | (y << 2)) & 0x33333333;\n\t y = (y | (y << 1)) & 0x55555555;\n\t\n\t return x | (y << 1);\n\t}\n\t\n\t// find the leftmost node of a polygon ring\n\tfunction getLeftmost(start) {\n\t var p = start,\n\t leftmost = start;\n\t do {\n\t if (p.x < leftmost.x) leftmost = p;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return leftmost;\n\t}\n\t\n\t// check if a point lies within a convex triangle\n\tfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n\t return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n\t (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n\t (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n\t}\n\t\n\t// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n\tfunction isValidDiagonal(a, b) {\n\t return equals(a, b) || a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n\t locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n\t}\n\t\n\t// signed area of a triangle\n\tfunction area(p, q, r) {\n\t return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n\t}\n\t\n\t// check if two points are equal\n\tfunction equals(p1, p2) {\n\t return p1.x === p2.x && p1.y === p2.y;\n\t}\n\t\n\t// check if two segments intersect\n\tfunction intersects(p1, q1, p2, q2) {\n\t return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n\t area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n\t}\n\t\n\t// check if a polygon diagonal intersects any polygon segments\n\tfunction intersectsPolygon(a, b) {\n\t var p = a;\n\t do {\n\t if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t intersects(p, p.next, a, b)) return true;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return false;\n\t}\n\t\n\t// check if a polygon diagonal is locally inside the polygon\n\tfunction locallyInside(a, b) {\n\t return area(a.prev, a, a.next) < 0 ?\n\t area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n\t area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n\t}\n\t\n\t// check if the middle point of a polygon diagonal is inside the polygon\n\tfunction middleInside(a, b) {\n\t var p = a,\n\t inside = false,\n\t px = (a.x + b.x) / 2,\n\t py = (a.y + b.y) / 2;\n\t do {\n\t if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n\t inside = !inside;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return inside;\n\t}\n\t\n\t// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n\t// if one belongs to the outer ring and another to a hole, it merges it into a single ring\n\tfunction splitPolygon(a, b) {\n\t var a2 = new Node(a.i, a.x, a.y),\n\t b2 = new Node(b.i, b.x, b.y),\n\t an = a.next,\n\t bp = b.prev;\n\t\n\t a.next = b;\n\t b.prev = a;\n\t\n\t a2.next = an;\n\t an.prev = a2;\n\t\n\t b2.next = a2;\n\t a2.prev = b2;\n\t\n\t bp.next = b2;\n\t b2.prev = bp;\n\t\n\t return b2;\n\t}\n\t\n\t// create a node and optionally link it with previous one (in a circular doubly linked list)\n\tfunction insertNode(i, x, y, last) {\n\t var p = new Node(i, x, y);\n\t\n\t if (!last) {\n\t p.prev = p;\n\t p.next = p;\n\t\n\t } else {\n\t p.next = last.next;\n\t p.prev = last;\n\t last.next.prev = p;\n\t last.next = p;\n\t }\n\t return p;\n\t}\n\t\n\tfunction removeNode(p) {\n\t p.next.prev = p.prev;\n\t p.prev.next = p.next;\n\t\n\t if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n\t if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n\t}\n\t\n\tfunction Node(i, x, y) {\n\t // vertice index in coordinates array\n\t this.i = i;\n\t\n\t // vertex coordinates\n\t this.x = x;\n\t this.y = y;\n\t\n\t // previous and next vertice nodes in a polygon ring\n\t this.prev = null;\n\t this.next = null;\n\t\n\t // z-order curve value\n\t this.z = null;\n\t\n\t // previous and next nodes in z-order\n\t this.prevZ = null;\n\t this.nextZ = null;\n\t\n\t // indicates whether this is a steiner point\n\t this.steiner = false;\n\t}\n\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Extrude a polygon given its vertices and triangulated faces\n\t *\n\t * Based on:\n\t * https://github.com/freeman-lab/extrude\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar extrudePolygon = function extrudePolygon(points, faces, _options) {\n\t var defaults = {\n\t top: 1,\n\t bottom: 0,\n\t closed: true\n\t };\n\t\n\t var options = (0, _lodashAssign2['default'])(defaults, _options);\n\t\n\t var n = points.length;\n\t var positions;\n\t var cells;\n\t\n\t // If bottom and top values are identical then return the flat shape\n\t options.top === options.bottom ? flat() : full();\n\t\n\t function flat() {\n\t positions = points.map(function (p) {\n\t return [p[0], options.top, p[1]];\n\t });\n\t cells = faces;\n\t }\n\t\n\t function full() {\n\t positions = [];\n\t points.forEach(function (p) {\n\t positions.push([p[0], options.top, p[1]]);\n\t });\n\t points.forEach(function (p) {\n\t positions.push([p[0], options.bottom, p[1]]);\n\t });\n\t\n\t cells = [];\n\t for (var i = 0; i < n; i++) {\n\t if (i === n - 1) {\n\t cells.push([i + n, n, i]);\n\t cells.push([0, i, n]);\n\t } else {\n\t cells.push([i + n, i + n + 1, i]);\n\t cells.push([i + 1, i, i + n + 1]);\n\t }\n\t }\n\t\n\t if (options.closed) {\n\t var top = faces;\n\t var bottom = top.map(function (p) {\n\t return p.map(function (v) {\n\t return v + n;\n\t });\n\t });\n\t bottom = bottom.map(function (p) {\n\t return [p[0], p[2], p[1]];\n\t });\n\t cells = cells.concat(top).concat(bottom);\n\t }\n\t }\n\t\n\t return {\n\t positions: positions,\n\t faces: cells\n\t };\n\t};\n\t\n\texports['default'] = extrudePolygon;\n\tmodule.exports = exports['default'];\n\n/***/ }\n/******/ ])\n});\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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap adeb8da861902db1c4c6\n **/","import World from './World';\nimport Controls from './controls/index';\nimport EnvironmentLayer from './layer/environment/EnvironmentLayer';\nimport ImageTileLayer from './layer/tile/ImageTileLayer';\nimport TopoJSONTileLayer from './layer/tile/TopoJSONTileLayer';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\n\nconst VIZI = {\n version: '0.3',\n\n // Public API\n World: World,\n Controls: Controls,\n EnvironmentLayer: EnvironmentLayer,\n ImageTileLayer: ImageTileLayer,\n TopoJSONTileLayer: TopoJSONTileLayer,\n Point: Point,\n LatLon: LatLon\n};\n\nexport default VIZI;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vizicities.js\n **/","import EventEmitter from 'eventemitter3';\nimport extend from 'lodash.assign';\nimport CRS from './geo/CRS/index';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\nimport Engine from './engine/Engine';\n\n// Pretty much any event someone using ViziCities would need will be emitted or\n// proxied by World (eg. render events, etc)\n\nclass World extends EventEmitter {\n constructor(domId, options) {\n super();\n\n var defaults = {\n crs: CRS.EPSG3857\n };\n\n this.options = extend(defaults, options);\n\n this._layers = [];\n this._controls = [];\n\n this._initContainer(domId);\n this._initEngine();\n this._initEvents();\n\n // Kick off the update and render loop\n this._update();\n }\n\n _initContainer(domId) {\n this._container = document.getElementById(domId);\n }\n\n _initEngine() {\n this._engine = Engine(this._container);\n\n // Engine events\n //\n // Consider proxying these through events on World for public access\n // this._engine.on('preRender', () => {});\n // this._engine.on('postRender', () => {});\n }\n\n _initEvents() {\n this.on('controlsMoveEnd', this._onControlsMoveEnd);\n }\n\n _onControlsMoveEnd(point) {\n var _point = Point(point.x, point.z);\n this._resetView(this.pointToLatLon(_point), _point);\n }\n\n // Reset world view\n _resetView(latlon, point) {\n this.emit('preResetView');\n\n this._moveStart();\n this._move(latlon, point);\n this._moveEnd();\n\n this.emit('postResetView');\n }\n\n _moveStart() {\n this.emit('moveStart');\n }\n\n _move(latlon, point) {\n this._lastPosition = latlon;\n this.emit('move', latlon, point);\n }\n _moveEnd() {\n this.emit('moveEnd');\n }\n\n _update() {\n var delta = this._engine.clock.getDelta();\n\n // Once _update is called it will run forever, for now\n window.requestAnimationFrame(this._update.bind(this));\n\n // Update controls\n this._controls.forEach(controls => {\n controls.update();\n });\n\n this.emit('preUpdate');\n this._engine.update(delta);\n this.emit('postUpdate');\n }\n\n // Set world view\n setView(latlon) {\n // Store initial geographic coordinate for the [0,0,0] world position\n //\n // The origin point doesn't move in three.js / 3D space so only set it once\n // here instead of every time _resetView is called\n //\n // If it was updated every time then coorindates would shift over time and\n // would be out of place / context with previously-placed points (0,0 would\n // refer to a different point each time)\n this._originLatlon = latlon;\n this._originPoint = this.project(latlon);\n\n this._resetView(latlon);\n return this;\n }\n\n // Return world geographic position\n getPosition() {\n return this._lastPosition;\n }\n\n // Transform geographic coordinate to world point\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the origin point of the projection (not the world)\n project(latlon) {\n return this.options.crs.latLonToPoint(LatLon(latlon));\n }\n\n // Transform world point to geographic coordinate\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a point relative to the origin point of the\n // projection (not the world) and returns a geographic coordinate\n unproject(point) {\n return this.options.crs.pointToLatLon(Point(point));\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the three.js / 3D origin (0,0)\n latLonToPoint(latlon) {\n var projectedPoint = this.project(LatLon(latlon));\n return projectedPoint._subtract(this._originPoint);\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a point relative to the three.js / 3D origin (0,0)\n // and returns the exact geographic coordinate at that point\n pointToLatLon(point) {\n var projectedPoint = Point(point).add(this._originPoint);\n return this.unproject(projectedPoint);\n }\n\n // Unsure if it's a good idea to expose this here for components like\n // GridLayer to use (eg. to keep track of a frustum)\n getCamera() {\n return this._engine._camera;\n }\n\n addLayer(layer) {\n layer._addToWorld(this);\n\n this._layers.push(layer);\n\n // Could move this into Layer but it'll do here for now\n this._engine._scene.add(layer._layer);\n\n this.emit('layerAdded', layer);\n return this;\n }\n\n // Remove layer and perform clean up operations\n removeLayer(layer) {\n var layerIndex = this._layers.indexOf(layer);\n\n if (layerIndex > -1) {\n // Remove from this._layers\n this._layers.splice(layerIndex, 1);\n };\n\n this._engine._scene.remove(layer._layer);\n\n layer.destroy();\n\n this.emit('layerRemoved');\n return this;\n }\n\n addControls(controls) {\n controls._addToWorld(this);\n\n this._controls.push(controls);\n\n this.emit('controlsAdded', controls);\n return this;\n }\n\n removeControls(controls) {}\n}\n\n// Initialise without requiring new keyword\nexport default function(domId, options) {\n return new World(domId, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/World.js\n **/","'use strict';\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} once Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Holds the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events && this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if ('function' === typeof listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Functon} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return this;\n\n var listeners = this._events[evt]\n , events = [];\n\n if (fn) {\n if (listeners.fn) {\n if (\n listeners.fn !== fn\n || (once && !listeners.once)\n || (context && listeners.context !== context)\n ) {\n events.push(listeners);\n }\n } else {\n for (var i = 0, length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) {\n this._events[evt] = events.length === 1 ? events[0] : events;\n } else {\n delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n if (!this._events) return this;\n\n if (event) delete this._events[prefix ? prefix + event : event];\n else this._events = prefix ? {} : Object.create(null);\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/eventemitter3/index.js\n ** module id = 2\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar keys = require('lodash.keys'),\n rest = require('lodash.rest');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if ((!eq(objValue, value) ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object) {\n return copyObjectWith(source, props, object);\n}\n\n/**\n * This function is like `copyObject` except that it accepts a function to\n * customize copied values.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObjectWith(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\n assignValue(object, key, newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return rest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Assigns own enumerable properties of source objects to the destination\n * object. Source objects are applied from left to right. Subsequent sources\n * overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.c = 3;\n * }\n *\n * function Bar() {\n * this.e = 5;\n * }\n *\n * Foo.prototype.d = 4;\n * Bar.prototype.f = 6;\n *\n * _.assign({ 'a': 1 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3, 'e': 5 }\n */\nvar assign = createAssigner(function(object, source) {\n copyObject(source, keys(source), object);\n});\n\nmodule.exports = assign;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.assign/index.js\n ** module id = 3\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n stringTag = '[object String]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototypeOf = Object.getPrototypeOf,\n propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = Object.keys;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n // that are composed entirely of index properties, return `false` for\n // `hasOwnProperty` checks of them.\n return hasOwnProperty.call(object, key) ||\n (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @type Function\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n var length = object ? object.length : undefined;\n if (isLength(length) &&\n (isArray(object) || isString(object) || isArguments(object))) {\n return baseTimes(length, String);\n }\n return null;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n var isProto = isPrototype(object);\n if (!(isProto || isArrayLike(object))) {\n return baseKeys(object);\n }\n var indexes = indexKeys(object),\n skipIndexes = !!indexes,\n result = indexes || [],\n length = result.length;\n\n for (var key in object) {\n if (baseHas(object, key) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n !(isProto && key == 'constructor')) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.keys/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n var length = args.length;\n switch (length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3');\n * // => 3\n */\nfunction toInteger(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n var remainder = value % 1;\n return value === value ? (remainder ? value - remainder : value) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = rest;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.rest/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import EPSG3857 from './CRS.EPSG3857';\nimport {EPSG900913} from './CRS.EPSG3857';\nimport EPSG3395 from './CRS.EPSG3395';\nimport EPSG4326 from './CRS.EPSG4326';\nimport Simple from './CRS.Simple';\nimport Proj4 from './CRS.Proj4';\n\nconst CRS = {};\n\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\nCRS.Proj4 = Proj4;\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/index.js\n **/","/*\n * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport SphericalMercator from '../projection/Projection.SphericalMercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3857 = {\n code: 'EPSG:3857',\n projection: SphericalMercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * SphericalMercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * SphericalMercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3857 = extend({}, Earth, _EPSG3857);\n\nconst EPSG900913 = extend({}, EPSG3857, {\n code: 'EPSG:900913'\n});\n\nexport {EPSG900913};\n\nexport default EPSG3857;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3857.js\n **/","/*\n * CRS.Earth is the base class for all CRS representing Earth.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLon from '../LatLon';\n\nconst Earth = {\n wrapLon: [-180, 180],\n\n R: 6378137,\n\n // Distance between two geographical points using spherical law of cosines\n // approximation or Haversine\n //\n // See: http://www.movable-type.co.uk/scripts/latlong.html\n distance: function(latlon1, latlon2, accurate) {\n var rad = Math.PI / 180;\n\n var lat1;\n var lat2;\n\n var a;\n\n if (!accurate) {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\n return this.R * Math.acos(Math.min(a, 1));\n } else {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n var lon1 = latlon1.lon * rad;\n var lon2 = latlon2.lon * rad;\n\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n\n var halfDeltaLat = deltaLat / 2;\n var halfDeltaLon = deltaLon / 2;\n\n a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return this.R * c;\n }\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Defaults to a scale factor of 1 if no calculation method exists\n //\n // Probably need to run this through the CRS transformation or similar so the\n // resulting scale is relative to the dimensions of the world space\n // Eg. 1 metre in projected space is likly scaled up or down to some other\n // number\n pointScale: function(latlon, accurate) {\n return (this.projection.pointScale) ? this.projection.pointScale(latlon, accurate) : [1, 1];\n },\n\n // Convert real metres to projected units\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n metresToProjected: function(metres, pointScale) {\n return metres * pointScale[1];\n },\n\n // Convert projected units to real metres\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n projectedToMetres: function(projectedUnits, pointScale) {\n return projectedUnits / pointScale[1];\n },\n\n // Convert real metres to a value in world (WebGL) units\n metresToWorld: function(metres, pointScale, zoom) {\n // Transform metres to projected metres using the latitude point scale\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n var projectedMetres = this.metresToProjected(metres, pointScale);\n\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n // Scale projected metres\n var scaledMetres = (scale * (this.transformScale * projectedMetres)) / pointScale[1];\n\n return scaledMetres;\n },\n\n // Convert world (WebGL) units to a value in real metres\n worldToMetres: function(worldUnits, pointScale, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var projectedUnits = ((worldUnits / scale) / this.transformScale) * pointScale[1];\n var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\n return realMetres;\n }\n};\n\nexport default extend({}, CRS, Earth);\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Earth.js\n **/","/*\n * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\nimport wrapNum from '../../util/wrapNum';\n\nconst CRS = {\n // Scale factor determines final dimensions of world space\n //\n // Projection transformation in range -1 to 1 is multiplied by scale factor to\n // find final world coordinates\n //\n // Scale factor can be considered as half the amount of the desired dimension\n // for the largest side when transformation is equal to 1 or -1, or as the\n // distance between 0 and 1 on the largest side\n //\n // For example, if you want the world dimensions to be between -1000 and 1000\n // then the scale factor will be 1000\n scaleFactor: 1000000,\n\n // Converts geo coords to pixel / WebGL ones\n latLonToPoint: function(latlon, zoom) {\n var projectedPoint = this.projection.project(latlon);\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n return this.transformation._transform(projectedPoint, scale);\n },\n\n // Converts pixel / WebGL coords to geo coords\n pointToLatLon: function(point, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var untransformedPoint = this.transformation.untransform(point, scale);\n\n return this.projection.unproject(untransformedPoint);\n },\n\n // Converts geo coords to projection-specific coords (e.g. in meters)\n project: function(latlon) {\n return this.projection.project(latlon);\n },\n\n // Converts projected coords to geo coords\n unproject: function(point) {\n return this.projection.unproject(point);\n },\n\n // If zoom is provided, returns the map width in pixels for a given zoom\n // Else, provides fixed scale value\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom >= 0) {\n return 256 * Math.pow(2, zoom);\n // Else, return fixed scale value to expand projected coordinates from\n // their 0 to 1 range into something more practical\n } else {\n return this.scaleFactor;\n }\n },\n\n // Returns zoom level for a given scale value\n // This only works with a scale value that is based on map pixel width\n zoom: function(scale) {\n return Math.log(scale / 256) / Math.LN2;\n },\n\n // Returns the bounds of the world in projected coords if applicable\n getProjectedBounds: function(zoom) {\n if (this.infinite) { return null; }\n\n var b = this.projection.bounds;\n var s = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n s /= 2;\n }\n\n // Bottom left\n var min = this.transformation.transform(Point(b[0]), s);\n\n // Top right\n var max = this.transformation.transform(Point(b[1]), s);\n\n return [min, max];\n },\n\n // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n // wrapLon: [min, max],\n // wrapLat: [min, max],\n\n // If true, the coordinate space will be unbounded (infinite in all directions)\n // infinite: false,\n\n // Wraps geo coords in certain ranges if applicable\n wrapLatLon: function(latlon) {\n var lat = this.wrapLat ? wrapNum(latlon.lat, this.wrapLat, true) : latlon.lat;\n var lon = this.wrapLon ? wrapNum(latlon.lon, this.wrapLon, true) : latlon.lon;\n var alt = latlon.alt;\n\n return LatLon(lat, lon, alt);\n }\n};\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.js\n **/","/*\n * LatLon is a helper class for ensuring consistent geographic coordinates.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n */\n\nclass LatLon {\n constructor(lat, lon, alt) {\n if (isNaN(lat) || isNaN(lon)) {\n throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n }\n\n this.lat = +lat;\n this.lon = +lon;\n\n if (alt !== undefined) {\n this.alt = +alt;\n }\n }\n\n clone() {\n return new LatLon(this.lat, this.lon, this.alt);\n }\n}\n\n// Initialise without requiring new keyword\n//\n// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n// Also converts between lng and lon\nexport default function(a, b, c) {\n if (a instanceof LatLon) {\n return a;\n }\n if (Array.isArray(a) && typeof a[0] !== 'object') {\n if (a.length === 3) {\n return new LatLon(a[0], a[1], a[2]);\n }\n if (a.length === 2) {\n return new LatLon(a[0], a[1]);\n }\n return null;\n }\n if (a === undefined || a === null) {\n return a;\n }\n if (typeof a === 'object' && 'lat' in a) {\n return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n }\n if (b === undefined) {\n return null;\n }\n return new LatLon(a, b, c);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/LatLon.js\n **/","/*\n * Point is a helper class for ensuring consistent world positions.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n */\n\nclass Point {\n constructor(x, y, round) {\n this.x = (round ? Math.round(x) : x);\n this.y = (round ? Math.round(y) : y);\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n // Non-destructive\n add(point) {\n return this.clone()._add(_point(point));\n }\n\n // Destructive\n _add(point) {\n this.x += point.x;\n this.y += point.y;\n return this;\n }\n\n // Non-destructive\n subtract(point) {\n return this.clone()._subtract(_point(point));\n }\n\n // Destructive\n _subtract(point) {\n this.x -= point.x;\n this.y -= point.y;\n return this;\n }\n}\n\n// Accepts (point), ([x, y]) and (x, y, round)\nvar _point = function(x, y, round) {\n if (x instanceof Point) {\n return x;\n }\n if (Array.isArray(x)) {\n return new Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n return new Point(x, y, round);\n};\n\n// Initialise without requiring new keyword\nexport default _point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Point.js\n **/","/*\n * Wrap the given number to lie within a certain range (eg. longitude)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n */\n\nvar wrapNum = function(x, range, includeMax) {\n var max = range[1];\n var min = range[0];\n var d = max - min;\n return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n};\n\nexport default wrapNum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/wrapNum.js\n **/","/*\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n * used by default.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst SphericalMercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n MAX_LATITUDE: 85.0511287798,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var max = this.MAX_LATITUDE;\n var lat = Math.max(Math.min(max, latlon.lat), -max);\n var sin = Math.sin(lat * d);\n\n return Point(\n this.R * latlon.lon * d,\n this.R * Math.log((1 + sin) / (1 - sin)) / 2\n );\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n\n return LatLon(\n (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\n point.x * d / this.R\n );\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Accurate scale factor uses proper Web Mercator scaling\n // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n // See: http://jsfiddle.net/robhawkes/yws924cf/\n pointScale: function(latlon, accurate) {\n var rad = Math.PI / 180;\n\n var k;\n\n if (!accurate) {\n k = 1 / Math.cos(latlon.lat * rad);\n\n // [scaleX, scaleY]\n return [k, k];\n } else {\n var lat = latlon.lat * rad;\n var lon = latlon.lon * rad;\n\n var a = this.R;\n\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n\n var cosLat = Math.cos(lat);\n\n // Radius meridian\n var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\n // Radius prime meridian\n var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\n // Scale N/S\n var h = (a / p) / cosLat;\n\n // Scale E/W\n k = (a / v) / cosLat;\n\n // [scaleX, scaleY]\n return [k, h];\n }\n },\n\n // Not using this.R due to scoping\n bounds: (function() {\n var d = 6378137 * Math.PI;\n return [[-d, -d], [d, d]];\n })()\n};\n\nexport default SphericalMercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.SphericalMercator.js\n **/","/*\n * Transformation is an utility class to perform simple point transformations\n * through a 2d-matrix.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n */\n\nimport Point from '../geo/Point';\n\nclass Transformation {\n constructor(a, b, c, d) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n }\n\n transform(point, scale) {\n // Copy input point as to not destroy the original data\n return this._transform(point.clone(), scale);\n }\n\n // Destructive transform (faster)\n _transform(point, scale) {\n scale = scale || 1;\n\n point.x = scale * (this._a * point.x + this._b);\n point.y = scale * (this._c * point.y + this._d);\n return point;\n }\n\n untransform(point, scale) {\n scale = scale || 1;\n return Point(\n (point.x / scale - this._b) / this._a,\n (point.y / scale - this._d) / this._c\n );\n }\n}\n\nexport default Transformation;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Transformation.js\n **/","/*\n * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Mercator from '../projection/Projection.Mercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3395 = {\n code: 'EPSG:3395',\n projection: Mercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * Mercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * Mercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3395 = extend({}, Earth, _EPSG3395);\n\nexport default EPSG3395;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG3395.js\n **/","/*\n * Mercator projection that takes into account that the Earth is not a perfect\n * sphere. Less popular than spherical mercator; used by projections like\n * EPSG:3395.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Mercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n R_MINOR: 6356752.314245179,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var r = this.R;\n var y = latlon.lat * d;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var con = e * Math.sin(y);\n\n var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n y = -r * Math.log(Math.max(ts, 1E-10));\n\n return Point(latlon.lon * d * r, y);\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n var r = this.R;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var ts = Math.exp(-point.y / r);\n var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\n for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n con = e * Math.sin(phi);\n con = Math.pow((1 - con) / (1 + con), e / 2);\n dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n phi += dphi;\n }\n\n return LatLon(phi * d, point.x * d / r);\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n pointScale: function(latlon) {\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n var cosLat = Math.cos(lat);\n\n var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\n // [scaleX, scaleY]\n return [k, k];\n },\n\n bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n};\n\nexport default Mercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Mercator.js\n **/","/*\n * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG4326 = {\n code: 'EPSG:4326',\n projection: LatLonProjection,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / 180,\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n //\n // TODO: Cannot use this.transformScale due to scope\n transformation: new Transformation(1 / 180, 0, -1 / 180, 0)\n};\n\nconst EPSG4326 = extend({}, Earth, _EPSG4326);\n\nexport default EPSG4326;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.EPSG4326.js\n **/","/*\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n * and Simple.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst ProjectionLatLon = {\n project: function(latlon) {\n return Point(latlon.lon, latlon.lat);\n },\n\n unproject: function(point) {\n return LatLon(point.y, point.x);\n },\n\n // Scale factor for converting between real metres and degrees\n //\n // degrees = realMetres * pointScale\n // realMetres = degrees / pointScale\n //\n // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n pointScale: function(latlon) {\n var m1 = 111132.92;\n var m2 = -559.82;\n var m3 = 1.175;\n var m4 = -0.0023;\n var p1 = 111412.84;\n var p2 = -93.5;\n var p3 = 0.118;\n\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n\n var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\n return [1 / latlen, 1 / lonlen];\n },\n\n bounds: [[-180, -90], [180, 90]]\n};\n\nexport default ProjectionLatLon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.LatLon.js\n **/","/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n * maps.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _Simple = {\n projection: LatLonProjection,\n\n // Straight 1:1 mapping (-1, -1 would be top-left)\n transformation: new Transformation(1, 0, 1, 0),\n\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom) {\n return Math.pow(2, zoom);\n // Else, make no change to scale – may need to increase this or make it a\n // user-definable variable\n } else {\n return 1;\n }\n },\n\n zoom: function(scale) {\n return Math.log(scale) / Math.LN2;\n },\n\n distance: function(latlon1, latlon2) {\n var dx = latlon2.lon - latlon1.lon;\n var dy = latlon2.lat - latlon1.lat;\n\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n infinite: true\n};\n\nconst Simple = extend({}, CRS, _Simple);\n\nexport default Simple;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Simple.js\n **/","/*\n * CRS.Proj4 for any Proj4-supported CRS.\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Proj4Projection from '../projection/Projection.Proj4';\nimport Transformation from '../../util/Transformation';\n\nvar _Proj4 = function(code, def, bounds) {\n var projection = Proj4Projection(def, bounds);\n\n // Transformation calcuations\n var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\n var halfX = diffX / 2;\n var halfY = diffY / 2;\n\n // This is the raw scale factor\n var scaleX = 1 / halfX;\n var scaleY = 1 / halfY;\n\n // Find the minimum scale factor\n //\n // The minimum scale factor comes from the largest side and is the one\n // you want to use for both axis so they stay relative in dimension\n var scale = Math.min(scaleX, scaleY);\n\n // Find amount to offset each axis by to make the central point lie on\n // the [0,0] origin\n var offsetX = scale * (projection.bounds[0][0] + halfX);\n var offsetY = scale * (projection.bounds[0][1] + halfY);\n\n return {\n code: code,\n projection: projection,\n\n transformScale: scale,\n\n // Map the input to a [-1,1] range with [0,0] in the centre\n transformation: new Transformation(scale, -offsetX, -scale, offsetY)\n };\n};\n\nconst Proj4 = function(code, def, bounds) {\n return extend({}, Earth, _Proj4(code, def, bounds));\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/CRS/CRS.Proj4.js\n **/","/*\n * Proj4 support for any projection.\n */\n\nimport proj4 from 'proj4';\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Proj4 = function(def, bounds) {\n var proj = proj4(def);\n\n var project = function(latlon) {\n return Point(proj.forward([latlon.lon, latlon.lat]));\n };\n\n var unproject = function(point) {\n var inverse = proj.inverse([point.x, point.y]);\n return LatLon(inverse[1], inverse[0]);\n };\n\n return {\n project: project,\n unproject: unproject,\n\n // Scale factor for converting between real metres and projected metres\\\n //\n // Need to work out the best way to provide the pointScale calculations\n // for custom, unknown projections (if wanting to override default)\n //\n // For now, user can manually override crs.pointScale or\n // crs.projection.pointScale\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n pointScale: function(latlon, accurate) {\n return [1, 1];\n },\n\n // Try and calculate bounds if none are provided\n //\n // This will provide incorrect bounds for some projections, so perhaps make\n // bounds a required input instead\n bounds: (function() {\n if (bounds) {\n return bounds;\n } else {\n var bottomLeft = project([-90, -180]);\n var topRight = project([90, 180]);\n\n return [bottomLeft, topRight];\n }\n })()\n };\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Proj4.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"proj4\"\n ** module id = 22\n ** module chunks = 0\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from './Scene';\nimport Renderer from './Renderer';\nimport Camera from './Camera';\n\nclass Engine extends EventEmitter {\n constructor(container) {\n console.log('Init Engine');\n\n super();\n\n this._scene = Scene;\n this._renderer = Renderer(container);\n this._camera = Camera(container);\n this.clock = new THREE.Clock();\n\n this._frustum = new THREE.Frustum();\n }\n\n update(delta) {\n this.emit('preRender');\n this._renderer.render(this._scene, this._camera);\n this.emit('postRender');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(container) {\n return new Engine(container);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Engine.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"THREE\"\n ** module id = 24\n ** module chunks = 0\n **/","import THREE from 'three';\n\n// This can be imported from anywhere and will still reference the same scene,\n// though there is a helper reference in Engine.scene\n\nexport default (function() {\n var scene = new THREE.Scene();\n scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n return scene;\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Scene.js\n **/","import THREE from 'three';\nimport Scene from './Scene';\n\n// This can only be accessed from Engine.renderer if you want to reference the\n// same scene in multiple places\n\nexport default function(container) {\n var renderer = new THREE.WebGLRenderer({\n antialias: true\n });\n\n renderer.setClearColor(Scene.fog.color, 1);\n\n // Gamma settings make things look nicer\n renderer.gammaInput = true;\n renderer.gammaOutput = true;\n\n container.appendChild(renderer.domElement);\n\n var updateSize = function() {\n renderer.setSize(container.clientWidth, container.clientHeight);\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return renderer;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Renderer.js\n **/","import THREE from 'three';\n\n// This can only be accessed from Engine.camera if you want to reference the\n// same scene in multiple places\n\n// TODO: Ensure that FOV looks natural on all aspect ratios\n// http://stackoverflow.com/q/26655930/997339\n\nexport default function(container) {\n var camera = new THREE.PerspectiveCamera(45, 1, 1, 40000);\n camera.position.y = 400;\n camera.position.z = 400;\n\n var updateSize = function() {\n camera.aspect = container.clientWidth / container.clientHeight;\n camera.updateProjectionMatrix();\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return camera;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Camera.js\n **/","import Orbit from './Controls.Orbit';\n\nconst Controls = {\n Orbit: Orbit\n};\n\nexport default Controls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/index.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport OrbitControls from '../vendor/OrbitControls';\n\nclass Orbit extends EventEmitter {\n constructor() {\n super();\n }\n\n // Proxy control events\n //\n // There's currently no distinction between pan, orbit and zoom events\n _initEvents() {\n this._controls.addEventListener('start', (event) => {\n this._world.emit('controlsMoveStart', event.target.target);\n });\n\n this._controls.addEventListener('change', (event) => {\n this._world.emit('controlsMove', event.target.target);\n });\n\n this._controls.addEventListener('end', (event) => {\n this._world.emit('controlsMoveEnd', event.target.target);\n });\n }\n\n // Moving the camera along the [x,y,z] axis based on a target position\n _panTo(point, animate) {}\n _panBy(pointDelta, animate) {}\n\n // Zooming the camera in and out\n _zoomTo(metres, animate) {}\n _zoomBy(metresDelta, animate) {}\n\n // Force camera to look at something other than the target\n _lookAt(point, animate) {}\n\n // Make camera look at the target\n _lookAtTarget() {}\n\n // Tilt (up and down)\n _tiltTo(angle, animate) {}\n _tiltBy(angleDelta, animate) {}\n\n // Rotate (left and right)\n _rotateTo(angle, animate) {}\n _rotateBy(angleDelta, animate) {}\n\n // Fly to the given point, animating pan and tilt/rotation to final position\n // with nice zoom out and in\n //\n // Calling flyTo a second time before the previous animation has completed\n // will immediately start the new animation from wherever the previous one\n // has got to\n _flyTo(point, noZoom) {}\n\n // Proxy to OrbitControls.update()\n update() {\n this._controls.update();\n }\n\n // Add controls to world instance and store world reference\n addTo(world) {\n world.addControls(this);\n return this;\n }\n\n // Internal method called by World.addControls to actually add the controls\n _addToWorld(world) {\n this._world = world;\n\n // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n // See: http://stackoverflow.com/a/26188674/997339\n this._controls = new OrbitControls(world._engine._camera, world._container);\n\n // Disable keys for now as no events are fired for them anyway\n this._controls.keys = false;\n\n // 89 degrees\n this._controls.maxPolarAngle = 1.5533;\n\n // this._controls.enableDamping = true;\n // this._controls.dampingFactor = 0.25;\n\n this._initEvents();\n\n this.emit('added');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new Orbit();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/Controls.Orbit.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nvar OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn theta;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function () {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\n\t\t\ttheta = Math.atan2( offset.x, offset.z );\n\n\t\t\t// angle from y-axis\n\n\t\t\tphi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\ttheta += thetaDelta;\n\t\t\tphi += phiDelta;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\ttheta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tphi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, phi ) );\n\n\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\t\tvar radius = offset.length() * scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tradius = Math.max( scope.minDistance, Math.min( scope.maxDistance, radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\t\toffset.y = radius * Math.cos( phi );\n\t\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tthetaDelta *= ( 1 - scope.dampingFactor );\n\t\t\t\tphiDelta *= ( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tthetaDelta = 0;\n\t\t\t\tphiDelta = 0;\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function() {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\tscope.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar theta;\n\tvar phi;\n\n\tvar phiDelta = 0;\n\tvar thetaDelta = 0;\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tthetaDelta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tphiDelta -= angle;\n\n\t}\n\n\tvar panLeft = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panLeft( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get X column of objectMatrix\n\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n //\n\t\t// \tv.multiplyScalar( - distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n // Fixed panning to x/y plane\n return function panLeft(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t // var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 0 ], 0, te[ 2 ]);\n\t v.multiplyScalar(-distance);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n // Fixed panning to x/y plane\n\tvar panUp = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panUp( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get Y column of objectMatrix\n\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n //\n\t\t// \tv.multiplyScalar( distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n return function panUp(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 4 ], 0, te[ 6 ]);\n\t v.multiplyScalar(adjDist);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t//console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t//console.log( 'handleMouseWheel' );\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) {\n\n\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) {\n\n\t\t\t// Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( delta < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t//console.log( 'handleKeyDown' );\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\t//console.log( 'handleTouchStartPan' );\n\n\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\t//console.log( 'handleTouchMovePan' );\n\n\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseDownRotate( event );\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseDownDolly( event );\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseDownPan( event );\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\tdocument.addEventListener( 'mouseout', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseMoveRotate( event );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseMoveDolly( event );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseMovePan( event );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tscope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nOrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.constraint.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.constraint.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.constraint.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.constraint.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n\nexport default OrbitControls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/OrbitControls.js\n **/","import Layer from '../Layer';\nimport THREE from 'three';\n\nclass EnvironmentLayer extends Layer {\n constructor() {\n super();\n\n this._initLights();\n // this._initGrid();\n }\n\n _onAdd() {}\n\n // Not fleshed out or thought through yet\n //\n // Lights could potentially be put it their own 'layer' to keep this class\n // much simpler and less messy\n _initLights() {\n // Position doesn't really matter (the angle is important), however it's\n // used here so the helpers look more natural.\n\n var directionalLight = new THREE.DirectionalLight(0x999999);\n directionalLight.intesity = 0.1;\n directionalLight.position.x = 100;\n directionalLight.position.y = 100;\n directionalLight.position.z = 100;\n\n var directionalLight2 = new THREE.DirectionalLight(0x999999);\n directionalLight2.intesity = 0.1;\n directionalLight2.position.x = -100;\n directionalLight2.position.y = 100;\n directionalLight2.position.z = -100;\n\n var helper = new THREE.DirectionalLightHelper(directionalLight, 10);\n var helper2 = new THREE.DirectionalLightHelper(directionalLight2, 10);\n\n this._layer.add(directionalLight);\n this._layer.add(directionalLight2);\n\n this._layer.add(helper);\n this._layer.add(helper2);\n }\n\n // Add grid helper for context during initial development\n _initGrid() {\n var size = 4000;\n var step = 100;\n\n var gridHelper = new THREE.GridHelper(size, step);\n this._layer.add(gridHelper);\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new EnvironmentLayer();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/EnvironmentLayer.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from '../engine/Scene';\n\nclass Layer extends EventEmitter {\n constructor() {\n super();\n\n this._layer = new THREE.Object3D();\n }\n\n // Add layer to world instance and store world reference\n addTo(world) {\n world.addLayer(this);\n return this;\n }\n\n // Internal method called by World.addLayer to actually add the layer\n _addToWorld(world) {\n this._world = world;\n this._onAdd(world);\n this.emit('added');\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world = null;\n this._layer = null;\n }\n}\n\nexport default Layer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/Layer.js\n **/","import TileLayer from './TileLayer';\nimport ImageTile from './ImageTile';\nimport ImageTileLayerBaseMaterial from './ImageTileLayerBaseMaterial';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\n// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n// being removed and the new tiles being ready for display\n//\n// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n// of the basemap ground so it blends in a little more, or have a huge ground\n// plane underneath all the tiles that shows through between tile updates.\n//\n// Could keep the old tiles around until the new ones are ready, though they'd\n// probably need to be layered in a way so the old tiles don't overlap new ones,\n// which is similar to how Leaflet approaches this (it has 2 layers)\n//\n// Could keep the tile from the previous quadtree level visible until all 4\n// tiles at the new / current level have finished loading and are displayed.\n// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n// child quadcodes showing whether they are loaded and in view. If all true then\n// remove the parent tile, otherwise keep it on a lower layer.\n\n// TODO: Load and display a base layer separate to the LOD grid that is at a low\n// resolution – used as a backup / background to fill in empty areas / distance\n\n// DONE: Fix the issue where some tiles just don't load, or at least the texture\n// never shows up – tends to happen if you quickly zoom in / out past it while\n// it's still loading, leaving a blank space\n\n// TODO: Optimise the request of many image tiles – look at how Leaflet and\n// OpenWebGlobe approach this (eg. batching, queues, etc)\n\n// TODO: Cancel pending tile requests if they get removed from view before they\n// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n// images are re-requested when the tile is next in scene (even if from cache)\n\n// TODO: Consider not performing an LOD calculation on every frame, instead only\n// on move end so panning, orbiting and zooming stays smooth. Otherwise it's\n// possible for performance to tank if you pan, orbit or zoom rapidly while all\n// the LOD calculations are being made and new tiles requested.\n//\n// Pending tiles should continue to be requested and output to the scene on each\n// frame, but no new LOD calculations should be made.\n\nclass ImageTileLayer extends TileLayer {\n constructor(path, options) {\n super(options);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n // Add base layer\n var geom = new THREE.PlaneBufferGeometry(40000, 40000, 1);\n var mesh = new THREE.Mesh(geom, ImageTileLayerBaseMaterial('#f5f5f3'));\n mesh.rotation.x = -90 * Math.PI / 180;\n\n this._baseLayer = mesh;\n this._layer.add(mesh);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n this._initEvents();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n }\n\n _onWorldMove(latlon, point) {\n this._moveBaseLayer(point);\n }\n\n _moveBaseLayer(point) {\n this._baseLayer.position.x = point.x;\n this._baseLayer.position.z = point.y;\n }\n\n _createTile(quadcode, layer) {\n return ImageTile(quadcode, this._path, layer);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Dispose of mesh and materials\n this._baseLayer.geometry.dispose();\n this._baseLayer.geometry = null;\n\n if (this._baseLayer.material.map) {\n this._baseLayer.material.map.dispose();\n this._baseLayer.material.map = null;\n }\n\n this._baseLayer.material.dispose();\n this._baseLayer.material = null;\n\n this._baseLayer = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new ImageTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayer.js\n **/","import Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport TileCache from './TileCache';\nimport THREE from 'three';\n\n// TODO: Consider keeping a single TileLayer / LOD instance running by default\n// that keeps a standard LOD grid for other layers to utilise, rather than\n// having to create their own, unique LOD grid and duplicate calculations when\n// they're going to use the same grid setup anyway\n//\n// It still makes sense to be able to have a custom LOD grid for some layers as\n// they may want to customise things, maybe not even using a quadtree at all!\n//\n// Perhaps it makes sense to split out the quadtree stuff into a singleton and\n// pass in the necessary parameters each time for the calculation step.\n//\n// Either way, it seems silly to force layers to have to create a new LOD grid\n// each time and create extra, duplicated processing every frame.\n\n// TODO: Allow passing in of options to define min/max LOD and a distance to use\n// for culling tiles beyond that distance.\n\n// DONE: Prevent tiles from being loaded if they are further than a certain\n// distance from the camera and are unlikely to be seen anyway\n\n// TODO: Avoid performing LOD calculation when it isn't required. For example,\n// when nothing has changed since the last frame and there are no tiles to be\n// loaded or in need of rendering\n\n// TODO: Only remove tiles from the layer that aren't to be rendered in the\n// current frame – it seems excessive to remove all tiles and re-add them on\n// every single frame, even if it's just array manipulation\n\n// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n// problems (eg. making min above 5 causes all sorts of issues)\n\n// TODO: Reuse THREE objects where possible instead of creating new instances\n// on every LOD calculation\n\n// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n// to avoid creating unnecessary memory for garbage collection\n\n// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n// closest to the camera) so visual inconsistancies during loading are minimised\n\nclass TileLayer extends Layer {\n constructor(options) {\n super(options);\n\n var defaults = {\n maxCache: 1000,\n maxLOD: 18\n };\n\n this._options = extend(defaults, options);\n\n this._tileCache = TileCache(this._options.maxCache, tile => {\n this._destroyTile(tile);\n });\n\n // TODO: Work out why changing the minLOD causes loads of issues\n this._minLOD = 3;\n this._maxLOD = this._options.maxLOD;\n\n this._frustum = new THREE.Frustum();\n this._tiles = new THREE.Object3D();\n }\n\n _onAdd(world) {\n this._layer.add(this._tiles);\n }\n\n _updateFrustum() {\n var camera = this._world.getCamera();\n var projScreenMatrix = new THREE.Matrix4();\n projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\n this._frustum.setFromMatrix(camera.projectionMatrix);\n this._frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n }\n\n _tileInFrustum(tile) {\n var bounds = tile.getBounds();\n return this._frustum.intersectsBox(new THREE.Box3(new THREE.Vector3(bounds[0], 0, bounds[3]), new THREE.Vector3(bounds[2], 0, bounds[1])));\n }\n\n _calculateLOD() {\n if (this._stop || !this._world) {\n return;\n }\n\n // var start = performance.now();\n\n var camera = this._world.getCamera();\n\n // 1. Update and retrieve camera frustum\n this._updateFrustum(this._frustum, camera);\n\n // 2. Add the four root items of the quadtree to a check list\n var checkList = this._checklist;\n checkList = [];\n checkList.push(this._requestTile('0', this));\n checkList.push(this._requestTile('1', this));\n checkList.push(this._requestTile('2', this));\n checkList.push(this._requestTile('3', this));\n\n // 3. Call Divide, passing in the check list\n this._divide(checkList);\n\n // 4. Remove all tiles from layer\n this._removeTiles();\n\n // 5. Render the tiles remaining in the check list\n checkList.forEach((tile, index) => {\n // Skip tile if it's not in the current view frustum\n if (!this._tileInFrustum(tile)) {\n return;\n }\n\n if (this._options.distance && this._options.distance > 0) {\n // TODO: Can probably speed this up\n var center = tile.getCenter();\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n // Manual distance limit to cut down on tiles so far away\n if (dist > this._options.distance) {\n return;\n }\n }\n\n // Does the tile have a mesh?\n //\n // If yes, continue\n // If no, generate tile mesh, request texture and skip\n if (!tile.getMesh()) {\n tile.requestTileAsync();\n return;\n }\n\n // Are the mesh and texture ready?\n //\n // If yes, continue\n // If no, skip\n if (!tile.isReady()) {\n return;\n }\n\n // Add tile to layer (and to scene)\n this._tiles.add(tile.getMesh());\n });\n\n // console.log(performance.now() - start);\n }\n\n _divide(checkList) {\n var count = 0;\n var currentItem;\n var quadcode;\n\n // 1. Loop until count equals check list length\n while (count != checkList.length) {\n currentItem = checkList[count];\n quadcode = currentItem.getQuadcode();\n\n // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n if (currentItem.length === this._maxLOD) {\n count++;\n continue;\n }\n\n // 3. Else, calculate screen-space error metric for quadcode\n if (this._screenSpaceError(currentItem)) {\n // 4. If error is sufficient...\n\n // 4a. Remove parent item from the check list\n checkList.splice(count, 1);\n\n // 4b. Add 4 child items to the check list\n checkList.push(this._requestTile(quadcode + '0', this));\n checkList.push(this._requestTile(quadcode + '1', this));\n checkList.push(this._requestTile(quadcode + '2', this));\n checkList.push(this._requestTile(quadcode + '3', this));\n\n // 4d. Continue the loop without increasing count\n continue;\n } else {\n // 5. Else, increase count and continue loop\n count++;\n }\n }\n }\n\n _screenSpaceError(tile) {\n var minDepth = this._minLOD;\n var maxDepth = this._maxLOD;\n\n var quadcode = tile.getQuadcode();\n\n var camera = this._world.getCamera();\n\n // Tweak this value to refine specific point that each quad is subdivided\n //\n // It's used to multiple the dimensions of the tile sides before\n // comparing against the tile distance from camera\n var quality = 3.0;\n\n // 1. Return false if quadcode length equals maxDepth (stop dividing)\n if (quadcode.length === maxDepth) {\n return false;\n }\n\n // 2. Return true if quadcode length is less than minDepth\n if (quadcode.length < minDepth) {\n return true;\n }\n\n // 3. Return false if quadcode bounds are not in view frustum\n if (!this._tileInFrustum(tile)) {\n return false;\n }\n\n var center = tile.getCenter();\n\n // 4. Calculate screen-space error metric\n // TODO: Use closest distance to one of the 4 tile corners\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n var error = quality * tile.getSide() / dist;\n\n // 5. Return true if error is greater than 1.0, else return false\n return (error > 1.0);\n }\n\n _removeTiles() {\n for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n }\n\n // Return a new tile instance\n _createTile(quadcode, layer) {}\n\n // Get a cached tile or request a new one if not in cache\n _requestTile(quadcode, layer) {\n var tile = this._tileCache.getTile(quadcode);\n\n if (!tile) {\n // Set up a brand new tile\n tile = this._createTile(quadcode, layer);\n\n // Add tile to cache, though it won't be ready yet as the data is being\n // requested from various places asynchronously\n this._tileCache.setTile(quadcode, tile);\n }\n\n return tile;\n }\n\n _destroyTile(tile) {\n // Remove tile from scene\n this._layer.remove(tile);\n\n // Delete any references to the tile within this component\n\n // Call destory on tile instance\n tile.destroy();\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n var i;\n\n // Remove all tiles\n for (i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n\n // Remove everything else in the layer\n for (i = this._layer.children.length - 1; i >= 0; i--) {\n this._layer.remove(this._layer.children[i]);\n }\n\n this._tileCache.destroy();\n this._tileCache = null;\n\n this._world = null;\n this._tiles = null;\n this._layer = null;\n this._frustum = null;\n }\n}\n\nexport default TileLayer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileLayer.js\n **/","import LRUCache from 'lru-cache';\n\n// This process is based on a similar approach taken by OpenWebGlobe\n// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\nclass TileCache {\n constructor(cacheLimit, onDestroyTile) {\n this._cache = LRUCache({\n max: cacheLimit,\n dispose: (key, tile) => {\n onDestroyTile(tile);\n }\n });\n }\n\n // Returns true if all specified tile providers are ready to be used\n // Otherwise, returns false\n isReady() {\n return false;\n }\n\n // Get a cached tile without requesting a new one\n getTile(quadcode) {\n return this._cache.get(quadcode);\n }\n\n // Add tile to cache\n setTile(quadcode, tile) {\n this._cache.set(quadcode, tile);\n }\n\n // Destroy the cache and remove it from memory\n //\n // TODO: Call destroy method on items in cache\n destroy() {\n this._cache.reset();\n this._cache = null;\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(cacheLimit, onDestroyTile) {\n return new TileCache(cacheLimit, onDestroyTile);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileCache.js\n **/","module.exports = LRUCache\n\n// This will be a proper iterable 'Map' in engines that support it,\n// or a fakey-fake PseudoMap in older versions.\nvar Map = require('pseudomap')\nvar util = require('util')\n\n// A linked list to keep track of recently-used-ness\nvar Yallist = require('yallist')\n\n// use symbols if possible, otherwise just _props\nvar symbols = {}\nvar hasSymbol = typeof Symbol === 'function'\nvar makeSymbol\nif (hasSymbol) {\n makeSymbol = function (key) {\n return Symbol.for(key)\n }\n} else {\n makeSymbol = function (key) {\n return '_' + key\n }\n}\n\nfunction priv (obj, key, val) {\n var sym\n if (symbols[key]) {\n sym = symbols[key]\n } else {\n sym = makeSymbol(key)\n symbols[key] = sym\n }\n if (arguments.length === 2) {\n return obj[sym]\n } else {\n obj[sym] = val\n return val\n }\n}\n\nfunction naiveLength () { return 1 }\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nfunction LRUCache (options) {\n if (!(this instanceof LRUCache)) {\n return new LRUCache(options)\n }\n\n if (typeof options === 'number') {\n options = { max: options }\n }\n\n if (!options) {\n options = {}\n }\n\n var max = priv(this, 'max', options.max)\n // Kind of weird to have a default max of Infinity, but oh well.\n if (!max ||\n !(typeof max === 'number') ||\n max <= 0) {\n priv(this, 'max', Infinity)\n }\n\n var lc = options.length || naiveLength\n if (typeof lc !== 'function') {\n lc = naiveLength\n }\n priv(this, 'lengthCalculator', lc)\n\n priv(this, 'allowStale', options.stale || false)\n priv(this, 'maxAge', options.maxAge || 0)\n priv(this, 'dispose', options.dispose)\n this.reset()\n}\n\n// resize the cache when the max changes.\nObject.defineProperty(LRUCache.prototype, 'max', {\n set: function (mL) {\n if (!mL || !(typeof mL === 'number') || mL <= 0) {\n mL = Infinity\n }\n priv(this, 'max', mL)\n trim(this)\n },\n get: function () {\n return priv(this, 'max')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'allowStale', {\n set: function (allowStale) {\n priv(this, 'allowStale', !!allowStale)\n },\n get: function () {\n return priv(this, 'allowStale')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'maxAge', {\n set: function (mA) {\n if (!mA || !(typeof mA === 'number') || mA < 0) {\n mA = 0\n }\n priv(this, 'maxAge', mA)\n trim(this)\n },\n get: function () {\n return priv(this, 'maxAge')\n },\n enumerable: true\n})\n\n// resize the cache when the lengthCalculator changes.\nObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n set: function (lC) {\n if (typeof lC !== 'function') {\n lC = naiveLength\n }\n if (lC !== priv(this, 'lengthCalculator')) {\n priv(this, 'lengthCalculator', lC)\n priv(this, 'length', 0)\n priv(this, 'lruList').forEach(function (hit) {\n hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n priv(this, 'length', priv(this, 'length') + hit.length)\n }, this)\n }\n trim(this)\n },\n get: function () { return priv(this, 'lengthCalculator') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'length', {\n get: function () { return priv(this, 'length') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'itemCount', {\n get: function () { return priv(this, 'lruList').length },\n enumerable: true\n})\n\nLRUCache.prototype.rforEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n var prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n}\n\nfunction forEachStep (self, fn, node, thisp) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) {\n hit = undefined\n }\n }\n if (hit) {\n fn.call(thisp, hit.value, hit.key, self)\n }\n}\n\nLRUCache.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').head; walker !== null;) {\n var next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n}\n\nLRUCache.prototype.keys = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.key\n }, this)\n}\n\nLRUCache.prototype.values = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.value\n }, this)\n}\n\nLRUCache.prototype.reset = function () {\n if (priv(this, 'dispose') &&\n priv(this, 'lruList') &&\n priv(this, 'lruList').length) {\n priv(this, 'lruList').forEach(function (hit) {\n priv(this, 'dispose').call(this, hit.key, hit.value)\n }, this)\n }\n\n priv(this, 'cache', new Map()) // hash of items by key\n priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n priv(this, 'length', 0) // length of items in the list\n}\n\nLRUCache.prototype.dump = function () {\n return priv(this, 'lruList').map(function (hit) {\n if (!isStale(this, hit)) {\n return {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }\n }\n }, this).toArray().filter(function (h) {\n return h\n })\n}\n\nLRUCache.prototype.dumpLru = function () {\n return priv(this, 'lruList')\n}\n\nLRUCache.prototype.inspect = function (n, opts) {\n var str = 'LRUCache {'\n var extras = false\n\n var as = priv(this, 'allowStale')\n if (as) {\n str += '\\n allowStale: true'\n extras = true\n }\n\n var max = priv(this, 'max')\n if (max && max !== Infinity) {\n if (extras) {\n str += ','\n }\n str += '\\n max: ' + util.inspect(max, opts)\n extras = true\n }\n\n var maxAge = priv(this, 'maxAge')\n if (maxAge) {\n if (extras) {\n str += ','\n }\n str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n extras = true\n }\n\n var lc = priv(this, 'lengthCalculator')\n if (lc && lc !== naiveLength) {\n if (extras) {\n str += ','\n }\n str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n extras = true\n }\n\n var didFirst = false\n priv(this, 'lruList').forEach(function (item) {\n if (didFirst) {\n str += ',\\n '\n } else {\n if (extras) {\n str += ',\\n'\n }\n didFirst = true\n str += '\\n '\n }\n var key = util.inspect(item.key).split('\\n').join('\\n ')\n var val = { value: item.value }\n if (item.maxAge !== maxAge) {\n val.maxAge = item.maxAge\n }\n if (lc !== naiveLength) {\n val.length = item.length\n }\n if (isStale(this, item)) {\n val.stale = true\n }\n\n val = util.inspect(val, opts).split('\\n').join('\\n ')\n str += key + ' => ' + val\n })\n\n if (didFirst || extras) {\n str += '\\n'\n }\n str += '}'\n\n return str\n}\n\nLRUCache.prototype.set = function (key, value, maxAge) {\n maxAge = maxAge || priv(this, 'maxAge')\n\n var now = maxAge ? Date.now() : 0\n var len = priv(this, 'lengthCalculator').call(this, value, key)\n\n if (priv(this, 'cache').has(key)) {\n if (len > priv(this, 'max')) {\n del(this, priv(this, 'cache').get(key))\n return false\n }\n\n var node = priv(this, 'cache').get(key)\n var item = node.value\n\n // dispose of the old one before overwriting\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n priv(this, 'length', priv(this, 'length') + (len - item.length))\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n var hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > priv(this, 'max')) {\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, value)\n }\n return false\n }\n\n priv(this, 'length', priv(this, 'length') + hit.length)\n priv(this, 'lruList').unshift(hit)\n priv(this, 'cache').set(key, priv(this, 'lruList').head)\n trim(this)\n return true\n}\n\nLRUCache.prototype.has = function (key) {\n if (!priv(this, 'cache').has(key)) return false\n var hit = priv(this, 'cache').get(key).value\n if (isStale(this, hit)) {\n return false\n }\n return true\n}\n\nLRUCache.prototype.get = function (key) {\n return get(this, key, true)\n}\n\nLRUCache.prototype.peek = function (key) {\n return get(this, key, false)\n}\n\nLRUCache.prototype.pop = function () {\n var node = priv(this, 'lruList').tail\n if (!node) return null\n del(this, node)\n return node.value\n}\n\nLRUCache.prototype.del = function (key) {\n del(this, priv(this, 'cache').get(key))\n}\n\nLRUCache.prototype.load = function (arr) {\n // reset the cache\n this.reset()\n\n var now = Date.now()\n // A previous serialized cache has the most recent items first\n for (var l = arr.length - 1; l >= 0; l--) {\n var hit = arr[l]\n var expiresAt = hit.e || 0\n if (expiresAt === 0) {\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n } else {\n var maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n}\n\nLRUCache.prototype.prune = function () {\n var self = this\n priv(this, 'cache').forEach(function (value, key) {\n get(self, key, false)\n })\n}\n\nfunction get (self, key, doUse) {\n var node = priv(self, 'cache').get(key)\n if (node) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) hit = undefined\n } else {\n if (doUse) {\n priv(self, 'lruList').unshiftNode(node)\n }\n }\n if (hit) hit = hit.value\n }\n return hit\n}\n\nfunction isStale (self, hit) {\n if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n return false\n }\n var stale = false\n var diff = Date.now() - hit.now\n if (hit.maxAge) {\n stale = diff > hit.maxAge\n } else {\n stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n }\n return stale\n}\n\nfunction trim (self) {\n if (priv(self, 'length') > priv(self, 'max')) {\n for (var walker = priv(self, 'lruList').tail;\n priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n var prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nfunction del (self, node) {\n if (node) {\n var hit = node.value\n if (priv(self, 'dispose')) {\n priv(self, 'dispose').call(this, hit.key, hit.value)\n }\n priv(self, 'length', priv(self, 'length') - hit.length)\n priv(self, 'cache').delete(hit.key)\n priv(self, 'lruList').removeNode(node)\n }\n}\n\n// classy, since V8 prefers predictable objects.\nfunction Entry (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lru-cache/lib/lru-cache.js\n ** module id = 36\n ** module chunks = 0\n **/","if (process.env.npm_package_name === 'pseudomap' &&\n process.env.npm_lifecycle_script === 'test')\n process.env.TEST_PSEUDOMAP = 'true'\n\nif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n module.exports = Map\n} else {\n module.exports = require('./pseudomap')\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/map.js\n ** module id = 37\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\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 = setTimeout(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 clearTimeout(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 setTimeout(drainQueue, 0);\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;\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 = 38\n ** module chunks = 0\n **/","var hasOwnProperty = Object.prototype.hasOwnProperty\n\nmodule.exports = PseudoMap\n\nfunction PseudoMap (set) {\n if (!(this instanceof PseudoMap)) // whyyyyyyy\n throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\n this.clear()\n\n if (set) {\n if ((set instanceof PseudoMap) ||\n (typeof Map === 'function' && set instanceof Map))\n set.forEach(function (value, key) {\n this.set(key, value)\n }, this)\n else if (Array.isArray(set))\n set.forEach(function (kv) {\n this.set(kv[0], kv[1])\n }, this)\n else\n throw new TypeError('invalid argument')\n }\n}\n\nPseudoMap.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n Object.keys(this._data).forEach(function (k) {\n if (k !== 'size')\n fn.call(thisp, this._data[k].value, this._data[k].key)\n }, this)\n}\n\nPseudoMap.prototype.has = function (k) {\n return !!find(this._data, k)\n}\n\nPseudoMap.prototype.get = function (k) {\n var res = find(this._data, k)\n return res && res.value\n}\n\nPseudoMap.prototype.set = function (k, v) {\n set(this._data, k, v)\n}\n\nPseudoMap.prototype.delete = function (k) {\n var res = find(this._data, k)\n if (res) {\n delete this._data[res._index]\n this._data.size--\n }\n}\n\nPseudoMap.prototype.clear = function () {\n var data = Object.create(null)\n data.size = 0\n\n Object.defineProperty(this, '_data', {\n value: data,\n enumerable: false,\n configurable: true,\n writable: false\n })\n}\n\nObject.defineProperty(PseudoMap.prototype, 'size', {\n get: function () {\n return this._data.size\n },\n set: function (n) {},\n enumerable: true,\n configurable: true\n})\n\nPseudoMap.prototype.values =\nPseudoMap.prototype.keys =\nPseudoMap.prototype.entries = function () {\n throw new Error('iterators are not implemented in this version')\n}\n\n// Either identical, or both NaN\nfunction same (a, b) {\n return a === b || a !== a && b !== b\n}\n\nfunction Entry (k, v, i) {\n this.key = k\n this.value = v\n this._index = i\n}\n\nfunction find (data, k) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k))\n return data[key]\n }\n}\n\nfunction set (data, k, v) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k)) {\n data[key].value = v\n return\n }\n }\n data.size++\n data[key] = new Entry(k, v, key)\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/pseudomap.js\n ** module id = 39\n ** module chunks = 0\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/util.js\n ** module id = 40\n ** module chunks = 0\n **/","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/support/isBufferBrowser.js\n ** module id = 41\n ** module chunks = 0\n **/","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/inherits/inherits_browser.js\n ** module id = 42\n ** module chunks = 0\n **/","module.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length --\n node.next = null\n node.prev = null\n node.list = null\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length ++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length ++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail)\n return undefined\n\n var res = this.tail.value\n this.tail = this.tail.prev\n this.tail.next = null\n this.length --\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head)\n return undefined\n\n var res = this.head.value\n this.head = this.head.next\n this.head.prev = null\n this.length --\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length ++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length ++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/yallist/yallist.js\n ** module id = 43\n ** module chunks = 0\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\n\nclass ImageTile extends Tile {\n constructor(quadcode, path, layer) {\n super(quadcode, path, layer);\n }\n\n // Request data for the tile\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTile();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear image reference\n this._image = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\n var material = new THREE.MeshBasicMaterial({\n depthWrite: false\n });\n\n var localMesh = new THREE.Mesh(geom, material);\n localMesh.rotation.x = -90 * Math.PI / 180;\n\n mesh.add(localMesh);\n\n mesh.renderOrder = 0;\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n // var box = new BoxHelper(localMesh);\n // mesh.add(box);\n //\n // mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTile() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n var image = document.createElement('img');\n\n image.addEventListener('load', event => {\n var texture = new THREE.Texture();\n\n texture.image = image;\n texture.needsUpdate = true;\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n // Something went wrong and the tile or its material is missing\n //\n // Possibly removed by the cache before the image loaded\n if (!this._mesh || !this._mesh.children[0] || !this._mesh.children[0].material) {\n return;\n }\n\n this._mesh.children[0].material.map = texture;\n this._mesh.children[0].material.needsUpdate = true;\n\n this._texture = texture;\n this._ready = true;\n }, false);\n\n // image.addEventListener('progress', event => {}, false);\n // image.addEventListener('error', event => {}, false);\n\n image.crossOrigin = '';\n\n // Load image\n image.src = url;\n\n this._image = image;\n }\n\n _abortRequest() {\n if (!this._image) {\n return;\n }\n\n this._image.src = '';\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer) {\n return new ImageTile(quadcode, path, layer);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTile.js\n **/","import LatLon from '../../geo/LatLon';\nimport THREE from 'three';\n\n// Manages a single tile and its layers\n\nvar r2d = 180 / Math.PI;\n\nvar tileURLRegex = /\\{([szxy])\\}/g;\n\nclass Tile {\n constructor(quadcode, path, layer) {\n this._layer = layer;\n this._quadcode = quadcode;\n this._path = path;\n\n this._ready = false;\n\n this._tile = this._quadcodeToTile(quadcode);\n\n // Bottom-left and top-right bounds in WGS84 coordinates\n this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\n // Bottom-left and top-right bounds in world coordinates\n this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\n // Tile center in world coordinates\n this._center = this._boundsToCenter(this._boundsWorld);\n\n // Length of a tile side in world coorindates\n this._side = this._getSide(this._boundsWorld);\n }\n\n // Returns true if the tile mesh and texture are ready to be used\n // Otherwise, returns false\n isReady() {\n return this._ready;\n }\n\n // Request data for the tile\n requestTileAsync() {}\n\n getQuadcode() {\n return this._quadcode;\n }\n\n getBounds() {\n return this._boundsWorld;\n }\n\n getCenter() {\n return this._center;\n }\n\n getSide() {\n return this._side;\n }\n\n getMesh() {\n return this._mesh;\n }\n\n // Destroys the tile and removes it from the layer and memory\n //\n // Ensure that this leaves no trace of the tile – no textures, no meshes,\n // nothing in memory or the GPU\n destroy() {\n // Delete reference to layer\n this._layer = null;\n\n // Delete location references\n this._boundsLatLon = null;\n this._boundsWorld = null;\n this._center = null;\n\n // Done if no mesh\n if (!this._mesh) {\n return;\n }\n\n if (this._mesh.children) {\n // Dispose of mesh and materials\n this._mesh.children.forEach(child => {\n child.geometry.dispose();\n child.geometry = null;\n\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n });\n } else {\n this._mesh.geometry.dispose();\n this._mesh.geometry = null;\n\n if (this._mesh.material.map) {\n this._mesh.material.map.dispose();\n this._mesh.material.map = null;\n }\n\n this._mesh.material.dispose();\n this._mesh.material = null;\n }\n }\n\n _createMesh() {}\n _createDebugMesh() {}\n\n _getTileURL(urlParams) {\n if (!urlParams.s) {\n // Default to a random choice of a, b or c\n s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n }\n\n tileURLRegex.lastIndex = 0;\n return this._path.replace(tileURLRegex, function(value, key) {\n // Replace with paramter, otherwise keep existing value\n return urlParams[key];\n });\n }\n\n // Convert from quadcode to TMS tile coordinates\n _quadcodeToTile(quadcode) {\n var x = 0;\n var y = 0;\n var z = quadcode.length;\n\n for (var i = z; i > 0; i--) {\n var mask = 1 << (i - 1);\n var q = +quadcode[z - i];\n if (q === 1) {\n x |= mask;\n }\n if (q === 2) {\n y |= mask;\n }\n if (q === 3) {\n x |= mask;\n y |= mask;\n }\n }\n\n return [x, y, z];\n }\n\n // Convert WGS84 tile bounds to world coordinates\n _tileBoundsFromWGS84(boundsWGS84) {\n var sw = this._layer._world.latLonToPoint(LatLon(boundsWGS84[1], boundsWGS84[0]));\n var ne = this._layer._world.latLonToPoint(LatLon(boundsWGS84[3], boundsWGS84[2]));\n\n return [sw.x, sw.y, ne.x, ne.y];\n }\n\n // Get tile bounds in WGS84 coordinates\n _tileBoundsWGS84(tile) {\n var e = this._tile2lon(tile[0] + 1, tile[2]);\n var w = this._tile2lon(tile[0], tile[2]);\n var s = this._tile2lat(tile[1] + 1, tile[2]);\n var n = this._tile2lat(tile[1], tile[2]);\n return [w, s, e, n];\n }\n\n _tile2lon(x, z) {\n return x / Math.pow(2, z) * 360 - 180;\n }\n\n _tile2lat(y, z) {\n var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n }\n\n _boundsToCenter(bounds) {\n var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\n return [x, y];\n }\n\n _getSide(bounds) {\n return (new THREE.Vector3(bounds[0], 0, bounds[3])).sub(new THREE.Vector3(bounds[0], 0, bounds[1])).length();\n }\n}\n\nexport default Tile;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/Tile.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nBoxHelper = function ( object ) {\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new THREE.BufferGeometry();\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { linewidth: 2, color: 0xff0000 } ) );\n\n\tif ( object !== undefined ) {\n\n\t\tthis.update( object );\n\n\t}\n\n};\n\nBoxHelper.prototype = Object.create( THREE.LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new THREE.Box3();\n\n\treturn function ( object ) {\n\n\t\tbox.setFromObject( object );\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nexport default BoxHelper;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/BoxHelper.js\n **/","import THREE from 'three';\n\nexport default function(colour) {\n var canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n\n var context = canvas.getContext('2d');\n context.fillStyle = colour;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.strokeStyle = '#D0D0CF';\n // context.strokeRect(0, 0, canvas.width, canvas.height);\n\n var texture = new THREE.Texture(canvas);\n\n // // Silky smooth images when tilted\n // texture.magFilter = THREE.LinearFilter;\n // texture.minFilter = THREE.LinearMipMapLinearFilter;\n // //\n // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n // texture.anisotropy = 4;\n\n // texture.wrapS = THREE.RepeatWrapping;\n // texture.wrapT = THREE.RepeatWrapping;\n // texture.repeat.set(segments, segments);\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n depthWrite: false\n });\n\n return material;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayerBaseMaterial.js\n **/","/**\n * lodash 4.0.0 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar debounce = require('lodash.debounce');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide an options object to indicate whether\n * `func` should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // cancel a trailing throttled invocation\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = throttle;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/index.js\n ** module id = 48\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = Date.now;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide an options object to indicate whether `func` should be invoked on\n * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent calls\n * to the debounced function return the result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n leading = false,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function flush() {\n if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n result = func.apply(thisArg, args);\n }\n cancel();\n return result;\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/~/lodash.debounce/index.js\n ** module id = 49\n ** module chunks = 0\n **/","import TileLayer from './TileLayer';\nimport extend from 'lodash.assign';\nimport TopoJSONTile from './TopoJSONTile';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\nclass TopoJSONTileLayer extends TileLayer {\n constructor(path, options) {\n var defaults = {\n maxLOD: 14,\n distance: 2000\n };\n\n options = extend(defaults, options);\n\n super(options);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n this._initEvents();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n }\n\n _onWorldMove(latlon, point) {\n // this._moveBaseLayer(point);\n }\n\n _createTile(quadcode, layer) {\n var options = {};\n\n if (this._options.filter) {\n options.filter = this._options.filter;\n }\n\n if (this._options.style) {\n options.style = this._options.style;\n }\n\n return TopoJSONTile(quadcode, this._path, layer, options);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new TopoJSONTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TopoJSONTileLayer.js\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\nimport reqwest from 'reqwest';\nimport topojson from 'topojson';\nimport Point from '../../geo/Point';\nimport LatLon from '../../geo/LatLon';\nimport earcut from 'earcut';\nimport extend from 'lodash.assign';\nimport extrudePolygon from '../../util/extrudePolygon';\n\n// TODO: Perform tile request and processing in a Web Worker\n//\n// Use Operative (https://github.com/padolsey/operative)\n//\n// Would it make sense to have the worker functionality defined in a static\n// method so it only gets initialised once and not on every tile instance?\n//\n// Otherwise, worker processing logic would have to go in the tile layer so not\n// to waste loads of time setting up a brand new worker with three.js for each\n// tile every single time.\n//\n// Unsure of the best way to get three.js and VIZI into the worker\n//\n// Would need to set up a CRS / projection identical to the world instance\n//\n// Is it possible to bypass requirements on external script by having multiple\n// simple worker methods that each take enough inputs to perform a single task\n// without requiring VIZI or three.js? So long as the heaviest logic is done in\n// the worker and transferrable objects are used then it should be better than\n// nothing. Would probably still need things like earcut...\n//\n// After all, the three.js logic and object creation will still need to be\n// done on the main thread regardless so the worker should try to do as much as\n// possible with as few dependencies as possible.\n//\n// Have a look at how this is done in Tangram before implementing anything as\n// the approach there is pretty similar and robust.\n\nclass TopoJSONTile extends Tile {\n constructor(quadcode, path, layer, options) {\n super(quadcode, path, layer);\n\n var defaults = {\n filter: null,\n style: {\n color: '#ff0000'\n }\n };\n\n this._options = extend(defaults, options);\n }\n\n // Request data for the tile\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTile();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear request reference\n this._request = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n\n mesh.renderOrder = 1;\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n //\n // var material = new THREE.MeshBasicMaterial({\n // depthWrite: false\n // });\n //\n // var localMesh = new THREE.Mesh(geom, material);\n // localMesh.rotation.x = -90 * Math.PI / 180;\n //\n // mesh.add(localMesh);\n //\n // var box = new BoxHelper(localMesh);\n // mesh.add(box);\n //\n // mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTile() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n this._request = reqwest({\n url: url,\n type: 'json',\n crossOrigin: true\n }).then(res => {\n // Clear request reference\n this._request = null;\n this._processTileData(res);\n }).catch(err => {\n console.error(err);\n\n // Clear request reference\n this._request = null;\n });\n }\n\n _processTileData(data) {\n console.time(this._tile);\n\n var geojson = topojson.feature(data, data.objects.vectile);\n\n var offset = Point(0, 0);\n offset.x = -1 * this._center[0];\n offset.y = -1 * this._center[1];\n\n var coordinates;\n var earcutData;\n var faces;\n\n var allVertices = [];\n var allFaces = [];\n var allColours = [];\n var facesCount = 0;\n\n var colour = new THREE.Color();\n\n var features = geojson.features;\n\n // Run filter, if provided\n if (this._options.filter) {\n features = geojson.features.filter(this._options.filter);\n }\n\n var style = this._options.style;\n\n features.forEach(feature => {\n // feature.geometry, feature.properties\n\n // Get style object, if provided\n if (typeof this._options.style === 'function') {\n style = this._options.style(feature);\n }\n\n // console.log(style);\n\n var coordinates = feature.geometry.coordinates;\n\n // Skip if geometry is a point\n //\n // This should be a user-defined filter as it would be wrong to assume\n // that people won't want to output points\n if (!coordinates[0] || !coordinates[0][0] || !Array.isArray(coordinates[0][0])) {\n return;\n }\n\n coordinates = coordinates.map(ring => {\n return ring.map(coordinate => {\n var latlon = LatLon(coordinate[1], coordinate[0]);\n var point = this._layer._world.latLonToPoint(latlon);\n return [point.x, point.y];\n });\n });\n\n earcutData = this._toEarcut(coordinates);\n\n faces = this._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\n var groupedVertices = [];\n for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) {\n groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions));\n }\n\n var extruded = extrudePolygon(groupedVertices, faces);\n\n colour.set(style.color);\n\n // allVertices.push(earcutData.vertices);\n // allColours.push([colour.r, colour.g, colour.b]);\n // allFaces.push(faces);\n\n allVertices.push(extruded.positions);\n allColours.push([colour.r, colour.g, colour.b]);\n allFaces.push(extruded.faces);\n\n facesCount += extruded.faces.length;\n });\n\n // console.log(allVertices);\n // return;\n\n // Skip if no faces\n //\n // Need to check way before this if there are no faces, before even doing\n // earcut triangulation.\n if (facesCount === 0) {\n this._ready = true;\n return;\n }\n\n var geometry = new THREE.BufferGeometry();\n\n // Three components per vertex per face (3 x 3 = 9)\n var vertices = new Float32Array(facesCount * 9);\n var normals = new Float32Array(facesCount * 9);\n var colours = new Float32Array(facesCount * 9);\n\n var pA = new THREE.Vector3();\n var pB = new THREE.Vector3();\n var pC = new THREE.Vector3();\n\n var cb = new THREE.Vector3();\n var ab = new THREE.Vector3();\n\n var dim = 2;\n\n var index;\n var _faces;\n var _vertices;\n var _colour;\n var lastIndex = 0;\n for (var i = 0; i < allFaces.length; i++) {\n _faces = allFaces[i];\n _vertices = allVertices[i];\n _colour = allColours[i];\n\n for (var j = 0; j < _faces.length; j++) {\n // Array of vertex indexes for the face\n index = _faces[j][0];\n //\n // var ax = _vertices[index * dim] + offset.x;\n // var ay = 0;\n // var az = _vertices[index * dim + 1] + offset.y;\n //\n // index = _faces[j][1];\n //\n // var bx = _vertices[index * dim] + offset.x;\n // var by = 0;\n // var bz = _vertices[index * dim + 1] + offset.y;\n //\n // index = _faces[j][2];\n //\n // var cx = _vertices[index * dim] + offset.x;\n // var cy = 0;\n // var cz = _vertices[index * dim + 1] + offset.y;\n\n var ax = _vertices[index][0] + offset.x;\n var ay = _vertices[index][1];\n var az = _vertices[index][2] + offset.y;\n\n index = _faces[j][1];\n\n var bx = _vertices[index][0] + offset.x;\n var by = _vertices[index][1];\n var bz = _vertices[index][2] + offset.y;\n\n index = _faces[j][2];\n\n var cx = _vertices[index][0] + offset.x;\n var cy = _vertices[index][1];\n var cz = _vertices[index][2] + offset.y;\n\n // Flat face normals\n // From: http://threejs.org/examples/webgl_buffergeometry.html\n pA.set(ax, ay, az);\n pB.set(bx, by, bz);\n pC.set(cx, cy, cz);\n\n cb.subVectors(pC, pB);\n ab.subVectors(pA, pB);\n cb.cross(ab);\n\n cb.normalize();\n\n var nx = cb.x;\n var ny = cb.y;\n var nz = cb.z;\n\n vertices[lastIndex * 9 + 0] = ax;\n vertices[lastIndex * 9 + 1] = ay;\n vertices[lastIndex * 9 + 2] = az;\n\n normals[lastIndex * 9 + 0] = nx;\n normals[lastIndex * 9 + 1] = ny;\n normals[lastIndex * 9 + 2] = nz;\n\n colours[lastIndex * 9 + 0] = _colour[0];\n colours[lastIndex * 9 + 1] = _colour[1];\n colours[lastIndex * 9 + 2] = _colour[2];\n\n vertices[lastIndex * 9 + 3] = bx;\n vertices[lastIndex * 9 + 4] = by;\n vertices[lastIndex * 9 + 5] = bz;\n\n normals[lastIndex * 9 + 3] = nx;\n normals[lastIndex * 9 + 4] = ny;\n normals[lastIndex * 9 + 5] = nz;\n\n colours[lastIndex * 9 + 3] = _colour[0];\n colours[lastIndex * 9 + 4] = _colour[1];\n colours[lastIndex * 9 + 5] = _colour[2];\n\n vertices[lastIndex * 9 + 6] = cx;\n vertices[lastIndex * 9 + 7] = cy;\n vertices[lastIndex * 9 + 8] = cz;\n\n normals[lastIndex * 9 + 6] = nx;\n normals[lastIndex * 9 + 7] = ny;\n normals[lastIndex * 9 + 8] = nz;\n\n colours[lastIndex * 9 + 6] = _colour[0];\n colours[lastIndex * 9 + 7] = _colour[1];\n colours[lastIndex * 9 + 8] = _colour[2];\n\n lastIndex++;\n }\n }\n\n // itemSize = 3 because there are 3 values (components) per vertex\n geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));\n geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3));\n geometry.addAttribute('color', new THREE.BufferAttribute(colours, 3));\n\n geometry.computeBoundingBox();\n\n var material = new THREE.MeshPhongMaterial({\n vertexColors: THREE.VertexColors,\n side: THREE.BackSide\n // depthWrite: false\n });\n var mesh = new THREE.Mesh(geometry, material);\n // mesh.renderOrder = 1;\n\n this._mesh.add(mesh);\n\n this._ready = true;\n console.timeEnd(this._tile);\n console.log(`${this._tile}: ${features.length} features`);\n }\n\n _toEarcut(data) {\n var dim = data[0][0].length;\n var result = {vertices: [], holes: [], dimensions: dim};\n var holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) {\n result.vertices.push(data[i][j][d]);\n }\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n\n return result;\n }\n\n _triangulate(contour, holes, dim) {\n // console.time('earcut');\n\n var faces = earcut(contour, holes, dim);\n var result = [];\n\n for (i = 0, il = faces.length; i < il; i += 3) {\n result.push(faces.slice(i, i + 3));\n }\n\n // console.timeEnd('earcut');\n\n return result;\n }\n\n _abortRequest() {\n if (!this._request) {\n return;\n }\n\n this._request.abort();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer, options) {\n return new TopoJSONTile(quadcode, path, layer, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TopoJSONTile.js\n **/","/*!\n * Reqwest! A general purpose XHR connection manager\n * license MIT (c) Dustin Diaz 2015\n * https://github.com/ded/reqwest\n */\n\n!function (name, context, definition) {\n if (typeof module != 'undefined' && module.exports) module.exports = definition()\n else if (typeof define == 'function' && define.amd) define(definition)\n else context[name] = definition()\n}('reqwest', this, function () {\n\n var context = this\n\n if ('window' in context) {\n var doc = document\n , byTag = 'getElementsByTagName'\n , head = doc[byTag]('head')[0]\n } else {\n var XHR2\n try {\n XHR2 = require('xhr2')\n } catch (ex) {\n throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n }\n }\n\n\n var httpsRe = /^http/\n , protocolRe = /(^\\w+):\\/\\//\n , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n , readyState = 'readyState'\n , contentType = 'Content-Type'\n , requestedWith = 'X-Requested-With'\n , uniqid = 0\n , callbackPrefix = 'reqwest_' + (+new Date())\n , lastValue // data stored by the most recent JSONP callback\n , xmlHttpRequest = 'XMLHttpRequest'\n , xDomainRequest = 'XDomainRequest'\n , noop = function () {}\n\n , isArray = typeof Array.isArray == 'function'\n ? Array.isArray\n : function (a) {\n return a instanceof Array\n }\n\n , defaultHeaders = {\n 'contentType': 'application/x-www-form-urlencoded'\n , 'requestedWith': xmlHttpRequest\n , 'accept': {\n '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n , 'xml': 'application/xml, text/xml'\n , 'html': 'text/html'\n , 'text': 'text/plain'\n , 'json': 'application/json, text/javascript'\n , 'js': 'application/javascript, text/javascript'\n }\n }\n\n , xhr = function(o) {\n // is it x-domain\n if (o['crossOrigin'] === true) {\n var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n if (xhr && 'withCredentials' in xhr) {\n return xhr\n } else if (context[xDomainRequest]) {\n return new XDomainRequest()\n } else {\n throw new Error('Browser does not support cross-origin requests')\n }\n } else if (context[xmlHttpRequest]) {\n return new XMLHttpRequest()\n } else if (XHR2) {\n return new XHR2()\n } else {\n return new ActiveXObject('Microsoft.XMLHTTP')\n }\n }\n , globalSetupOptions = {\n dataFilter: function (data) {\n return data\n }\n }\n\n function succeed(r) {\n var protocol = protocolRe.exec(r.url)\n protocol = (protocol && protocol[1]) || context.location.protocol\n return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n }\n\n function handleReadyState(r, success, error) {\n return function () {\n // use _aborted to mitigate against IE err c00c023f\n // (can't read props on aborted request objects)\n if (r._aborted) return error(r.request)\n if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n if (r.request && r.request[readyState] == 4) {\n r.request.onreadystatechange = noop\n if (succeed(r)) success(r.request)\n else\n error(r.request)\n }\n }\n }\n\n function setHeaders(http, o) {\n var headers = o['headers'] || {}\n , h\n\n headers['Accept'] = headers['Accept']\n || defaultHeaders['accept'][o['type']]\n || defaultHeaders['accept']['*']\n\n var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n // breaks cross-origin requests with legacy browsers\n if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n for (h in headers)\n headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n }\n\n function setCredentials(http, o) {\n if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n http.withCredentials = !!o['withCredentials']\n }\n }\n\n function generalCallback(data) {\n lastValue = data\n }\n\n function urlappend (url, s) {\n return url + (/\\?/.test(url) ? '&' : '?') + s\n }\n\n function handleJsonp(o, fn, err, url) {\n var reqId = uniqid++\n , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n , match = url.match(cbreg)\n , script = doc.createElement('script')\n , loaded = 0\n , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\n if (match) {\n if (match[3] === '?') {\n url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n } else {\n cbval = match[3] // provided callback func name\n }\n } else {\n url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n }\n\n context[cbval] = generalCallback\n\n script.type = 'text/javascript'\n script.src = url\n script.async = true\n if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n // need this for IE due to out-of-order onreadystatechange(), binding script\n // execution to an event listener gives us control over when the script\n // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n script.htmlFor = script.id = '_reqwest_' + reqId\n }\n\n script.onload = script.onreadystatechange = function () {\n if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n return false\n }\n script.onload = script.onreadystatechange = null\n script.onclick && script.onclick()\n // Call the user callback with the last value stored and clean up values and scripts.\n fn(lastValue)\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n\n // Add the script to the DOM head\n head.appendChild(script)\n\n // Enable JSONP timeout\n return {\n abort: function () {\n script.onload = script.onreadystatechange = null\n err({}, 'Request is aborted: timeout', {})\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n }\n }\n\n function getRequest(fn, err) {\n var o = this.o\n , method = (o['method'] || 'GET').toUpperCase()\n , url = typeof o === 'string' ? o : o['url']\n // convert non-string objects to query-string form unless o['processData'] is false\n , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n ? reqwest.toQueryString(o['data'])\n : (o['data'] || null)\n , http\n , sendWait = false\n\n // if we're working on a GET request and we have data then we should append\n // query string to end of URL and not post data\n if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n url = urlappend(url, data)\n data = null\n }\n\n if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\n // get the xhr from the factory if passed\n // if the factory returns null, fall-back to ours\n http = (o.xhr && o.xhr(o)) || xhr(o)\n\n http.open(method, url, o['async'] === false ? false : true)\n setHeaders(http, o)\n setCredentials(http, o)\n if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n http.onload = fn\n http.onerror = err\n // NOTE: see\n // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n http.onprogress = function() {}\n sendWait = true\n } else {\n http.onreadystatechange = handleReadyState(this, fn, err)\n }\n o['before'] && o['before'](http)\n if (sendWait) {\n setTimeout(function () {\n http.send(data)\n }, 200)\n } else {\n http.send(data)\n }\n return http\n }\n\n function Reqwest(o, fn) {\n this.o = o\n this.fn = fn\n\n init.apply(this, arguments)\n }\n\n function setType(header) {\n // json, javascript, text/plain, text/html, xml\n if (header === null) return undefined; //In case of no content-type.\n if (header.match('json')) return 'json'\n if (header.match('javascript')) return 'js'\n if (header.match('text')) return 'html'\n if (header.match('xml')) return 'xml'\n }\n\n function init(o, fn) {\n\n this.url = typeof o == 'string' ? o : o['url']\n this.timeout = null\n\n // whether request has been fulfilled for purpose\n // of tracking the Promises\n this._fulfilled = false\n // success handlers\n this._successHandler = function(){}\n this._fulfillmentHandlers = []\n // error handlers\n this._errorHandlers = []\n // complete (both success and fail) handlers\n this._completeHandlers = []\n this._erred = false\n this._responseArgs = {}\n\n var self = this\n\n fn = fn || function () {}\n\n if (o['timeout']) {\n this.timeout = setTimeout(function () {\n timedOut()\n }, o['timeout'])\n }\n\n if (o['success']) {\n this._successHandler = function () {\n o['success'].apply(o, arguments)\n }\n }\n\n if (o['error']) {\n this._errorHandlers.push(function () {\n o['error'].apply(o, arguments)\n })\n }\n\n if (o['complete']) {\n this._completeHandlers.push(function () {\n o['complete'].apply(o, arguments)\n })\n }\n\n function complete (resp) {\n o['timeout'] && clearTimeout(self.timeout)\n self.timeout = null\n while (self._completeHandlers.length > 0) {\n self._completeHandlers.shift()(resp)\n }\n }\n\n function success (resp) {\n var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n resp = (type !== 'jsonp') ? self.request : resp\n // use global data filter on response text\n var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n , r = filteredResponse\n try {\n resp.responseText = r\n } catch (e) {\n // can't assign this in IE<=8, just ignore\n }\n if (r) {\n switch (type) {\n case 'json':\n try {\n resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n } catch (err) {\n return error(resp, 'Could not parse JSON in response', err)\n }\n break\n case 'js':\n resp = eval(r)\n break\n case 'html':\n resp = r\n break\n case 'xml':\n resp = resp.responseXML\n && resp.responseXML.parseError // IE trololo\n && resp.responseXML.parseError.errorCode\n && resp.responseXML.parseError.reason\n ? null\n : resp.responseXML\n break\n }\n }\n\n self._responseArgs.resp = resp\n self._fulfilled = true\n fn(resp)\n self._successHandler(resp)\n while (self._fulfillmentHandlers.length > 0) {\n resp = self._fulfillmentHandlers.shift()(resp)\n }\n\n complete(resp)\n }\n\n function timedOut() {\n self._timedOut = true\n self.request.abort()\n }\n\n function error(resp, msg, t) {\n resp = self.request\n self._responseArgs.resp = resp\n self._responseArgs.msg = msg\n self._responseArgs.t = t\n self._erred = true\n while (self._errorHandlers.length > 0) {\n self._errorHandlers.shift()(resp, msg, t)\n }\n complete(resp)\n }\n\n this.request = getRequest.call(this, success, error)\n }\n\n Reqwest.prototype = {\n abort: function () {\n this._aborted = true\n this.request.abort()\n }\n\n , retry: function () {\n init.call(this, this.o, this.fn)\n }\n\n /**\n * Small deviation from the Promises A CommonJs specification\n * http://wiki.commonjs.org/wiki/Promises/A\n */\n\n /**\n * `then` will execute upon successful requests\n */\n , then: function (success, fail) {\n success = success || function () {}\n fail = fail || function () {}\n if (this._fulfilled) {\n this._responseArgs.resp = success(this._responseArgs.resp)\n } else if (this._erred) {\n fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._fulfillmentHandlers.push(success)\n this._errorHandlers.push(fail)\n }\n return this\n }\n\n /**\n * `always` will execute whether the request succeeds or fails\n */\n , always: function (fn) {\n if (this._fulfilled || this._erred) {\n fn(this._responseArgs.resp)\n } else {\n this._completeHandlers.push(fn)\n }\n return this\n }\n\n /**\n * `fail` will execute when the request fails\n */\n , fail: function (fn) {\n if (this._erred) {\n fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._errorHandlers.push(fn)\n }\n return this\n }\n , 'catch': function (fn) {\n return this.fail(fn)\n }\n }\n\n function reqwest(o, fn) {\n return new Reqwest(o, fn)\n }\n\n // normalize newline variants according to spec -> CRLF\n function normalize(s) {\n return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n }\n\n function serial(el, cb) {\n var n = el.name\n , t = el.tagName.toLowerCase()\n , optCb = function (o) {\n // IE gives value=\"\" even where there is no value attribute\n // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n if (o && !o['disabled'])\n cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n }\n , ch, ra, val, i\n\n // don't serialize elements that are disabled or without a name\n if (el.disabled || !n) return\n\n switch (t) {\n case 'input':\n if (!/reset|button|image|file/i.test(el.type)) {\n ch = /checkbox/i.test(el.type)\n ra = /radio/i.test(el.type)\n val = el.value\n // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n }\n break\n case 'textarea':\n cb(n, normalize(el.value))\n break\n case 'select':\n if (el.type.toLowerCase() === 'select-one') {\n optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n } else {\n for (i = 0; el.length && i < el.length; i++) {\n el.options[i].selected && optCb(el.options[i])\n }\n }\n break\n }\n }\n\n // collect up all form elements found from the passed argument elements all\n // the way down to child elements; pass a '' or form fields.\n // called with 'this'=callback to use for serial() on each element\n function eachFormElement() {\n var cb = this\n , e, i\n , serializeSubtags = function (e, tags) {\n var i, j, fa\n for (i = 0; i < tags.length; i++) {\n fa = e[byTag](tags[i])\n for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n }\n }\n\n for (i = 0; i < arguments.length; i++) {\n e = arguments[i]\n if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n }\n }\n\n // standard query string style serialization\n function serializeQueryString() {\n return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n }\n\n // { 'name': 'value', ... } style serialization\n function serializeHash() {\n var hash = {}\n eachFormElement.apply(function (name, value) {\n if (name in hash) {\n hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n hash[name].push(value)\n } else hash[name] = value\n }, arguments)\n return hash\n }\n\n // [ { name: 'name', value: 'value' }, ... ] style serialization\n reqwest.serializeArray = function () {\n var arr = []\n eachFormElement.apply(function (name, value) {\n arr.push({name: name, value: value})\n }, arguments)\n return arr\n }\n\n reqwest.serialize = function () {\n if (arguments.length === 0) return ''\n var opt, fn\n , args = Array.prototype.slice.call(arguments, 0)\n\n opt = args.pop()\n opt && opt.nodeType && args.push(opt) && (opt = null)\n opt && (opt = opt.type)\n\n if (opt == 'map') fn = serializeHash\n else if (opt == 'array') fn = reqwest.serializeArray\n else fn = serializeQueryString\n\n return fn.apply(null, args)\n }\n\n reqwest.toQueryString = function (o, trad) {\n var prefix, i\n , traditional = trad || false\n , s = []\n , enc = encodeURIComponent\n , add = function (key, value) {\n // If value is a function, invoke it and return its value\n value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n s[s.length] = enc(key) + '=' + enc(value)\n }\n // If an array was passed in, assume that it is an array of form elements.\n if (isArray(o)) {\n for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n } else {\n // If traditional, encode the \"old\" way (the way 1.3.2 or older\n // did it), otherwise encode params recursively.\n for (prefix in o) {\n if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n }\n }\n\n // spaces should be + according to spec\n return s.join('&').replace(/%20/g, '+')\n }\n\n function buildParams(prefix, obj, traditional, add) {\n var name, i, v\n , rbracket = /\\[\\]$/\n\n if (isArray(obj)) {\n // Serialize array item.\n for (i = 0; obj && i < obj.length; i++) {\n v = obj[i]\n if (traditional || rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v)\n } else {\n buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n }\n }\n } else if (obj && obj.toString() === '[object Object]') {\n // Serialize object item.\n for (name in obj) {\n buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n }\n\n } else {\n // Serialize scalar item.\n add(prefix, obj)\n }\n }\n\n reqwest.getcallbackPrefix = function () {\n return callbackPrefix\n }\n\n // jQuery and Zepto compatibility, differences can be remapped here so you can call\n // .ajax.compat(options, callback)\n reqwest.compat = function (o, fn) {\n if (o) {\n o['type'] && (o['method'] = o['type']) && delete o['type']\n o['dataType'] && (o['type'] = o['dataType'])\n o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n }\n return new Reqwest(o, fn)\n }\n\n reqwest.ajaxSetup = function (options) {\n options = options || {}\n for (var k in options) {\n globalSetupOptions[k] = options[k]\n }\n }\n\n return reqwest\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/reqwest/reqwest.js\n ** module id = 52\n ** module chunks = 0\n **/","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.topojson = {})));\n}(this, function (exports) { 'use strict';\n\n function noop() {}\n\n function absolute(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n point[0] = (x0 += point[0]) * kx + dx;\n point[1] = (y0 += point[1]) * ky + dy;\n };\n }\n\n function relative(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n var x1 = (point[0] - dx) / kx | 0,\n y1 = (point[1] - dy) / ky | 0;\n point[0] = x1 - x0;\n point[1] = y1 - y0;\n x0 = x1;\n y0 = y1;\n };\n }\n\n function reverse(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n }\n\n function bisect(a, x) {\n var lo = 0, hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (a[mid] < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n function feature(topology, o) {\n return o.type === \"GeometryCollection\" ? {\n type: \"FeatureCollection\",\n features: o.geometries.map(function(o) { return feature$1(topology, o); })\n } : feature$1(topology, o);\n }\n\n function feature$1(topology, o) {\n var f = {\n type: \"Feature\",\n id: o.id,\n properties: o.properties || {},\n geometry: object(topology, o)\n };\n if (o.id == null) delete f.id;\n return f;\n }\n\n function object(topology, o) {\n var absolute$$ = absolute(topology.transform),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) points.pop();\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n points.push(p = a[k].slice());\n absolute$$(p, k);\n }\n if (i < 0) reverse(points, n);\n }\n\n function point(p) {\n p = p.slice();\n absolute$$(p, 0);\n return p;\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n if (points.length < 2) points.push(points[0].slice());\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) points.push(points[0].slice());\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var t = o.type;\n return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n : null;\n }\n\n var geometryType = {\n Point: function(o) { return point(o.coordinates); },\n MultiPoint: function(o) { return o.coordinates.map(point); },\n LineString: function(o) { return line(o.arcs); },\n MultiLineString: function(o) { return o.arcs.map(line); },\n Polygon: function(o) { return polygon(o.arcs); },\n MultiPolygon: function(o) { return o.arcs.map(polygon); }\n };\n\n return geometry(o);\n }\n\n function stitchArcs(topology, arcs) {\n var stitchedArcs = {},\n fragmentByStart = {},\n fragmentByEnd = {},\n fragments = [],\n emptyIndex = -1;\n\n // Stitch empty arcs first, since they may be subsumed by other arcs.\n arcs.forEach(function(i, j) {\n var arc = topology.arcs[i < 0 ? ~i : i], t;\n if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n }\n });\n\n arcs.forEach(function(i) {\n var e = ends(i),\n start = e[0],\n end = e[1],\n f, g;\n\n if (f = fragmentByEnd[start]) {\n delete fragmentByEnd[f.end];\n f.push(i);\n f.end = end;\n if (g = fragmentByStart[end]) {\n delete fragmentByStart[g.start];\n var fg = g === f ? f : f.concat(g);\n fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else if (f = fragmentByStart[end]) {\n delete fragmentByStart[f.start];\n f.unshift(i);\n f.start = start;\n if (g = fragmentByEnd[start]) {\n delete fragmentByEnd[g.end];\n var gf = g === f ? f : g.concat(f);\n fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else {\n f = [i];\n fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n }\n });\n\n function ends(i) {\n var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n else p1 = arc[arc.length - 1];\n return i < 0 ? [p1, p0] : [p0, p1];\n }\n\n function flush(fragmentByEnd, fragmentByStart) {\n for (var k in fragmentByEnd) {\n var f = fragmentByEnd[k];\n delete fragmentByStart[f.start];\n delete f.start;\n delete f.end;\n f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n fragments.push(f);\n }\n }\n\n flush(fragmentByEnd, fragmentByStart);\n flush(fragmentByStart, fragmentByEnd);\n arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\n return fragments;\n }\n\n function mesh(topology) {\n return object(topology, meshArcs.apply(this, arguments));\n }\n\n function meshArcs(topology, o, filter) {\n var arcs = [];\n\n function arc(i) {\n var j = i < 0 ? ~i : i;\n (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n }\n\n function line(arcs) {\n arcs.forEach(arc);\n }\n\n function polygon(arcs) {\n arcs.forEach(line);\n }\n\n function geometry(o) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n }\n\n if (arguments.length > 1) {\n var geomsByArc = [],\n geom;\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n };\n\n geometry(o);\n\n geomsByArc.forEach(arguments.length < 3\n ? function(geoms) { arcs.push(geoms[0].i); }\n : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n } else {\n for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n }\n\n return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n }\n\n function triangle(triangle) {\n var a = triangle[0], b = triangle[1], c = triangle[2];\n return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n }\n\n function ring(ring) {\n var i = -1,\n n = ring.length,\n a,\n b = ring[n - 1],\n area = 0;\n\n while (++i < n) {\n a = b;\n b = ring[i];\n area += a[0] * b[1] - a[1] * b[0];\n }\n\n return area / 2;\n }\n\n function merge(topology) {\n return object(topology, mergeArcs.apply(this, arguments));\n }\n\n function mergeArcs(topology, objects) {\n var polygonsByArc = {},\n polygons = [],\n components = [];\n\n objects.forEach(function(o) {\n if (o.type === \"Polygon\") register(o.arcs);\n else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n });\n\n function register(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n });\n });\n polygons.push(polygon);\n }\n\n function exterior(ring$$) {\n return ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]) > 0; // TODO allow spherical?\n }\n\n polygons.forEach(function(polygon) {\n if (!polygon._) {\n var component = [],\n neighbors = [polygon];\n polygon._ = 1;\n components.push(component);\n while (polygon = neighbors.pop()) {\n component.push(polygon);\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n if (!polygon._) {\n polygon._ = 1;\n neighbors.push(polygon);\n }\n });\n });\n });\n }\n }\n });\n\n polygons.forEach(function(polygon) {\n delete polygon._;\n });\n\n return {\n type: \"MultiPolygon\",\n arcs: components.map(function(polygons) {\n var arcs = [], n;\n\n // Extract the exterior (unique) arcs.\n polygons.forEach(function(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n arcs.push(arc);\n }\n });\n });\n });\n\n // Stitch the arcs into one or more rings.\n arcs = stitchArcs(topology, arcs);\n\n // If more than one ring is returned,\n // at most one of these rings can be the exterior;\n // this exterior ring has the same winding order\n // as any exterior ring in the original polygons.\n if ((n = arcs.length) > 1) {\n var sgn = exterior(polygons[0][0]);\n for (var i = 0, t; i < n; ++i) {\n if (sgn === exterior(arcs[i])) {\n t = arcs[0], arcs[0] = arcs[i], arcs[i] = t;\n break;\n }\n }\n }\n\n return arcs;\n })\n };\n }\n\n function neighbors(objects) {\n var indexesByArc = {}, // arc index -> array of object indexes\n neighbors = objects.map(function() { return []; });\n\n function line(arcs, i) {\n arcs.forEach(function(a) {\n if (a < 0) a = ~a;\n var o = indexesByArc[a];\n if (o) o.push(i);\n else indexesByArc[a] = [i];\n });\n }\n\n function polygon(arcs, i) {\n arcs.forEach(function(arc) { line(arc, i); });\n }\n\n function geometry(o, i) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n }\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n };\n\n objects.forEach(geometry);\n\n for (var i in indexesByArc) {\n for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n for (var k = j + 1; k < m; ++k) {\n var ij = indexes[j], ik = indexes[k], n;\n if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n }\n }\n }\n\n return neighbors;\n }\n\n function compareArea(a, b) {\n return a[1][2] - b[1][2];\n }\n\n function minAreaHeap() {\n var heap = {},\n array = [],\n size = 0;\n\n heap.push = function(object) {\n up(array[object._ = size] = object, size++);\n return size;\n };\n\n heap.pop = function() {\n if (size <= 0) return;\n var removed = array[0], object;\n if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n return removed;\n };\n\n heap.remove = function(removed) {\n var i = removed._, object;\n if (array[i] !== removed) return; // invalid request\n if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n return i;\n };\n\n function up(object, i) {\n while (i > 0) {\n var j = ((i + 1) >> 1) - 1,\n parent = array[j];\n if (compareArea(object, parent) >= 0) break;\n array[parent._ = i] = parent;\n array[object._ = i = j] = object;\n }\n }\n\n function down(object, i) {\n while (true) {\n var r = (i + 1) << 1,\n l = r - 1,\n j = i,\n child = array[j];\n if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n if (j === i) break;\n array[child._ = i] = child;\n array[object._ = i = j] = object;\n }\n }\n\n return heap;\n }\n\n function presimplify(topology, triangleArea) {\n var absolute$$ = absolute(topology.transform),\n relative$$ = relative(topology.transform),\n heap = minAreaHeap();\n\n if (!triangleArea) triangleArea = triangle;\n\n topology.arcs.forEach(function(arc) {\n var triangles = [],\n maxArea = 0,\n triangle,\n i,\n n,\n p;\n\n // To store each point’s effective area, we create a new array rather than\n // extending the passed-in point to workaround a Chrome/V8 bug (getting\n // stuck in smi mode). For midpoints, the initial effective area of\n // Infinity will be computed in the next step.\n for (i = 0, n = arc.length; i < n; ++i) {\n p = arc[i];\n absolute$$(arc[i] = [p[0], p[1], Infinity], i);\n }\n\n for (i = 1, n = arc.length - 1; i < n; ++i) {\n triangle = arc.slice(i - 1, i + 2);\n triangle[1][2] = triangleArea(triangle);\n triangles.push(triangle);\n heap.push(triangle);\n }\n\n for (i = 0, n = triangles.length; i < n; ++i) {\n triangle = triangles[i];\n triangle.previous = triangles[i - 1];\n triangle.next = triangles[i + 1];\n }\n\n while (triangle = heap.pop()) {\n var previous = triangle.previous,\n next = triangle.next;\n\n // If the area of the current point is less than that of the previous point\n // to be eliminated, use the latter's area instead. This ensures that the\n // current point cannot be eliminated without eliminating previously-\n // eliminated points.\n if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n else maxArea = triangle[1][2];\n\n if (previous) {\n previous.next = next;\n previous[2] = triangle[2];\n update(previous);\n }\n\n if (next) {\n next.previous = previous;\n next[0] = triangle[0];\n update(next);\n }\n }\n\n arc.forEach(relative$$);\n });\n\n function update(triangle) {\n heap.remove(triangle);\n triangle[1][2] = triangleArea(triangle);\n heap.push(triangle);\n }\n\n return topology;\n }\n\n var version = \"1.6.24\";\n\n exports.version = version;\n exports.mesh = mesh;\n exports.meshArcs = meshArcs;\n exports.merge = merge;\n exports.mergeArcs = mergeArcs;\n exports.feature = feature;\n exports.neighbors = neighbors;\n exports.presimplify = presimplify;\n\n}));\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/topojson/build/topojson.js\n ** module id = 54\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode) return triangles;\n\n var minX, minY, maxX, maxY, x, y, size;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and size are later used to transform coords into integers for z-order calculation\n size = Math.max(maxX - minX, maxY - minY);\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var sum = 0,\n i, j, last;\n\n // calculate original winding order of a polygon ring\n for (i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n\n // link points into circular doubly-linked list in the specified winding order\n if (clockwise === (sum > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) return null;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && size) indexCurve(ear, minX, minY, size);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim);\n triangles.push(ear.i / dim);\n triangles.push(next.i / dim);\n\n removeNode(ear);\n\n // skipping the next vertice leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(ear, triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, size);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n\n while (p !== ear.prev) {\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, size) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, size),\n maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\n // first look for points inside the triangle in increasing z-order\n var p = ear.nextZ;\n\n while (p && p.z <= maxZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.nextZ;\n }\n\n // then look for points in decreasing z-order\n p = ear.prevZ;\n\n while (p && p.z >= minZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])\n if (intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim);\n triangles.push(p.i / dim);\n triangles.push(b.i / dim);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return p;\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, size);\n earcutLinked(c, triangles, dim, minX, minY, size);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n filterPoints(b, b.next);\n }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n if (hole.x === m.x) return m.prev; // hole touches outer segment; pick lower endpoint\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n tanMin = Infinity,\n tan;\n\n p = m.next;\n\n while (p !== stop) {\n if (hx >= p.x && p.x >= m.x &&\n pointInTriangle(hy < m.y ? hx : qx, hy, m.x, m.y, hy < m.y ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n }\n\n return m;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, size) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize === 0) {\n e = q;\n q = q.nextZ;\n qSize--;\n } else if (qSize === 0 || !q) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else if (p.z <= q.z) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and size of the data bounding box\nfunction zOrder(x, y, minX, minY, size) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) / size;\n y = 32767 * (y - minY) / size;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return equals(a, b) || a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertice index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertice nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = null;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/earcut/src/earcut.js\n ** module id = 55\n ** module chunks = 0\n **/","/*\n * Extrude a polygon given its vertices and triangulated faces\n *\n * Based on:\n * https://github.com/freeman-lab/extrude\n */\n\nimport extend from 'lodash.assign';\n\nvar extrudePolygon = function(points, faces, _options) {\n var defaults = {\n top: 1,\n bottom: 0,\n closed: true\n };\n\n var options = extend(defaults, _options);\n\n var n = points.length;\n var positions;\n var cells;\n\n // If bottom and top values are identical then return the flat shape\n (options.top === options.bottom) ? flat() : full();\n\n function flat() {\n positions = points.map(function(p) { return [p[0], options.top, p[1]]; });\n cells = faces;\n }\n\n function full() {\n positions = [];\n points.forEach(function(p) { positions.push([p[0], options.top, p[1]]); });\n points.forEach(function(p) { positions.push([p[0], options.bottom, p[1]]); });\n\n cells = [];\n for (var i = 0; i < n; i++) {\n if (i === (n - 1)) {\n cells.push([i + n, n, i]);\n cells.push([0, i, n]);\n } else {\n cells.push([i + n, i + n + 1, i]);\n cells.push([i + 1, i, i + n + 1]);\n }\n }\n\n if (options.closed) {\n var top = faces;\n var bottom = top.map(function(p) { return p.map(function(v) { return v + n; }); });\n bottom = bottom.map(function(p) { return [p[0], p[2], p[1]]; });\n cells = cells.concat(top).concat(bottom);\n }\n }\n\n return {\n positions: positions,\n faces: cells\n };\n};\n\nexport default extrudePolygon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/extrudePolygon.js\n **/"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/examples/basic/main.js b/examples/basic/main.js index 89e84ba..bab083b 100644 --- a/examples/basic/main.js +++ b/examples/basic/main.js @@ -16,15 +16,15 @@ var imageTileLayer = VIZI.ImageTileLayer('http://{s}.basemaps.cartocdn.com/light }).addTo(world); var topoJSONTileLayer = VIZI.TopoJSONTileLayer('https://vector.mapzen.com/osm/buildings/{z}/{x}/{y}.topojson', { - style: (feature) => { + style: function(feature) { return { color: (feature.properties.area > 10000) ? '#ff0000' : '#0000ff' }; }, - filter: (feature) => { - // Only show features with an area larger than 5000 (metres squared in - // projected units) - return feature.properties.area > 5000; - }, + // filter: function(feature) { + // // Only show features with an area larger than 5000 (metres squared in + // // projected units) + // return feature.properties.area > 5000; + // }, attribution: '© OpenStreetMap contributors, Who\'s On First.' }).addTo(world); diff --git a/gulpfile.babel.js b/gulpfile.babel.js index 5e9dfa3..4b2e24d 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -93,9 +93,12 @@ function build() { // Don't mangle class names so we can use them in the console // jscs:disable - .pipe($.uglify({ mangle: { keep_fnames: true }})) + // .pipe($.uglify({ mangle: { keep_fnames: true }})) // jscs:enable + // Using the mangle option above breaks the sourcemap for some reason + .pipe($.uglify()) + .pipe($.sourcemaps.write('./')) .pipe(gulp.dest(destinationFolder)) .pipe($.livereload()); diff --git a/src/layer/tile/TopoJSONTile.js b/src/layer/tile/TopoJSONTile.js index 2a99715..591b59c 100644 --- a/src/layer/tile/TopoJSONTile.js +++ b/src/layer/tile/TopoJSONTile.js @@ -7,6 +7,7 @@ import Point from '../../geo/Point'; import LatLon from '../../geo/LatLon'; import earcut from 'earcut'; import extend from 'lodash.assign'; +import extrudePolygon from '../../util/extrudePolygon'; // TODO: Perform tile request and processing in a Web Worker // @@ -168,6 +169,8 @@ class TopoJSONTile extends Tile { } _processTileData(data) { + console.time(this._tile); + var geojson = topojson.feature(data, data.objects.vectile); var offset = Point(0, 0); @@ -177,7 +180,6 @@ class TopoJSONTile extends Tile { var coordinates; var earcutData; var faces; - // var geometry; var allVertices = []; var allFaces = []; @@ -227,85 +229,29 @@ class TopoJSONTile extends Tile { faces = this._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions); + var groupedVertices = []; + for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) { + groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions)); + } + + var extruded = extrudePolygon(groupedVertices, faces); + colour.set(style.color); - allVertices.push(earcutData.vertices); + // allVertices.push(earcutData.vertices); + // allColours.push([colour.r, colour.g, colour.b]); + // allFaces.push(faces); + + allVertices.push(extruded.positions); allColours.push([colour.r, colour.g, colour.b]); - allFaces.push(faces); + allFaces.push(extruded.faces); - facesCount += faces.length; - - // console.log(earcutData.vertices); - // console.log(faces); - // return; - - // geometry = new THREE.BufferGeometry(); - // - // // Three components per vertex per face (3 x 3 = 9) - // var vertices = new Float32Array(faces.length * 9); - // - // var index; - // for (var i = 0; i < faces.length; i++) { - // // Array of vertex indexes for the face - // index = faces[i][0]; - // - // vertices[i * 9 + 0] = earcutData.vertices[index * dim]; - // vertices[i * 9 + 1] = 0; - // vertices[i * 9 + 2] = earcutData.vertices[index * dim + 1]; - // - // // Array of vertex indexes for the face - // index = faces[i][1]; - // - // vertices[i * 9 + 3] = earcutData.vertices[index * dim]; - // vertices[i * 9 + 4] = 0; - // vertices[i * 9 + 5] = earcutData.vertices[index * dim + 1]; - // - // // Array of vertex indexes for the face - // index = faces[i][2]; - // - // vertices[i * 9 + 6] = earcutData.vertices[index * dim]; - // vertices[i * 9 + 7] = 0; - // vertices[i * 9 + 8] = earcutData.vertices[index * dim + 1]; - // } - - // var shape = new THREE.Shape(); - // - // var outer = coordinates.shift(); - // var inners = coordinates; - // - // if (!outer || !outer[0] || !Array.isArray(outer[0])) { - // return; - // } - // - // // Create outer shape - // outer.forEach((coord, index) => { - // var latlon = LatLon(coord[1], coord[0]); - // var point = this._layer._world.latLonToPoint(latlon); - // - // // Move if first coordinate - // if (index === 0) { - // shape.moveTo(point.x + offset.x, point.y + offset.y); - // } else { - // shape.lineTo(point.x + offset.x, point.y + offset.y); - // } - // }); - // - // var geom = new THREE.ShapeGeometry(shape); - // var mesh = new THREE.Mesh(geom, new THREE.MeshBasicMaterial({ - // color: 0x0000ff, - // side: THREE.BackSide, - // depthWrite: false - // })); - // - // // Offset - // // mesh.position.x = -1 * offset.x; - // // mesh.position.z = -1 * offset.y; - // - // mesh.rotation.x = 90 * Math.PI / 180; - // - // this._mesh.add(mesh); + facesCount += extruded.faces.length; }); + // console.log(allVertices); + // return; + // Skip if no faces // // Need to check way before this if there are no faces, before even doing @@ -344,22 +290,38 @@ class TopoJSONTile extends Tile { for (var j = 0; j < _faces.length; j++) { // Array of vertex indexes for the face index = _faces[j][0]; + // + // var ax = _vertices[index * dim] + offset.x; + // var ay = 0; + // var az = _vertices[index * dim + 1] + offset.y; + // + // index = _faces[j][1]; + // + // var bx = _vertices[index * dim] + offset.x; + // var by = 0; + // var bz = _vertices[index * dim + 1] + offset.y; + // + // index = _faces[j][2]; + // + // var cx = _vertices[index * dim] + offset.x; + // var cy = 0; + // var cz = _vertices[index * dim + 1] + offset.y; - var ax = _vertices[index * dim] + offset.x; - var ay = 0; - var az = _vertices[index * dim + 1] + offset.y; + var ax = _vertices[index][0] + offset.x; + var ay = _vertices[index][1]; + var az = _vertices[index][2] + offset.y; index = _faces[j][1]; - var bx = _vertices[index * dim] + offset.x; - var by = 0; - var bz = _vertices[index * dim + 1] + offset.y; + var bx = _vertices[index][0] + offset.x; + var by = _vertices[index][1]; + var bz = _vertices[index][2] + offset.y; index = _faces[j][2]; - var cx = _vertices[index * dim] + offset.x; - var cy = 0; - var cz = _vertices[index * dim + 1] + offset.y; + var cx = _vertices[index][0] + offset.x; + var cy = _vertices[index][1]; + var cz = _vertices[index][2] + offset.y; // Flat face normals // From: http://threejs.org/examples/webgl_buffergeometry.html @@ -424,17 +386,19 @@ class TopoJSONTile extends Tile { geometry.computeBoundingBox(); - var material = new THREE.MeshBasicMaterial({ + var material = new THREE.MeshPhongMaterial({ vertexColors: THREE.VertexColors, - side: THREE.BackSide, - depthWrite: false + side: THREE.BackSide + // depthWrite: false }); var mesh = new THREE.Mesh(geometry, material); - mesh.renderOrder = 1; + // mesh.renderOrder = 1; this._mesh.add(mesh); this._ready = true; + console.timeEnd(this._tile); + console.log(`${this._tile}: ${features.length} features`); } _toEarcut(data) { diff --git a/src/layer/tile/TopoJSONTileLayer.js b/src/layer/tile/TopoJSONTileLayer.js index c389d7d..51f4b9f 100644 --- a/src/layer/tile/TopoJSONTileLayer.js +++ b/src/layer/tile/TopoJSONTileLayer.js @@ -7,7 +7,7 @@ import THREE from 'three'; class TopoJSONTileLayer extends TileLayer { constructor(path, options) { var defaults = { - maxLOD: 13, + maxLOD: 14, distance: 2000 }; diff --git a/src/util/extrudePolygon.js b/src/util/extrudePolygon.js new file mode 100644 index 0000000..c186ab7 --- /dev/null +++ b/src/util/extrudePolygon.js @@ -0,0 +1,61 @@ +/* + * Extrude a polygon given its vertices and triangulated faces + * + * Based on: + * https://github.com/freeman-lab/extrude + */ + +import extend from 'lodash.assign'; + +var extrudePolygon = function(points, faces, _options) { + var defaults = { + top: 1, + bottom: 0, + closed: true + }; + + var options = extend(defaults, _options); + + var n = points.length; + var positions; + var cells; + + // If bottom and top values are identical then return the flat shape + (options.top === options.bottom) ? flat() : full(); + + function flat() { + positions = points.map(function(p) { return [p[0], options.top, p[1]]; }); + cells = faces; + } + + function full() { + positions = []; + points.forEach(function(p) { positions.push([p[0], options.top, p[1]]); }); + points.forEach(function(p) { positions.push([p[0], options.bottom, p[1]]); }); + + cells = []; + for (var i = 0; i < n; i++) { + if (i === (n - 1)) { + cells.push([i + n, n, i]); + cells.push([0, i, n]); + } else { + cells.push([i + n, i + n + 1, i]); + cells.push([i + 1, i, i + n + 1]); + } + } + + if (options.closed) { + var top = faces; + var bottom = top.map(function(p) { return p.map(function(v) { return v + n; }); }); + bottom = bottom.map(function(p) { return [p[0], p[2], p[1]]; }); + cells = cells.concat(top).concat(bottom); + } + } + + return { + positions: positions, + faces: cells + }; +}; + +export default extrudePolygon; diff --git a/src/util/index.js b/src/util/index.js index 0a0c3df..e9daedd 100644 --- a/src/util/index.js +++ b/src/util/index.js @@ -1,9 +1,13 @@ +// TODO: A lot of these utils don't need to be in separate, tiny files + import Transformation from './Transformation'; import wrapNum from './wrapNum'; +import extrudePolygon from './extrudePolygon'; const Util = {}; Util.Transformation = Transformation; Util.wrapNum = wrapNum; +Util.extrudePolygon = extrudePolygon; export default Util; diff --git a/src/util/wrapNum.js b/src/util/wrapNum.js index e0df773..f7d0a7a 100644 --- a/src/util/wrapNum.js +++ b/src/util/wrapNum.js @@ -5,7 +5,7 @@ * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js */ -const wrapNum = function(x, range, includeMax) { +var wrapNum = function(x, range, includeMax) { var max = range[1]; var min = range[0]; var d = max - min;