{"version":3,"file":"73973c73a085e36af36e5df3.js?3.6.14.7428b935c.1723600572441","mappings":"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","sources":["webpack://mono-repo/./src/js/lib/leaflet-src.js"],"sourcesContent":["/*** IMPORTS FROM imports-loader ***/\n\nvar define = false; /* Disable AMD for misbehaving libraries */\n\n/*** IMPORTS FROM imports-loader ***/\n\nvar require = false; var exports = null;\n\n/*\n Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com\n (c) 2010-2013, Vladimir Agafonkin\n (c) 2010-2011, CloudMade\n*/\n(function (window, document, undefined) {\r\nvar oldL = window.L,\r\n L = {};\r\n\r\nL.version = '0.7.2';\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\n\r\nL.noConflict = function () {\r\n\twindow.L = oldL;\r\n\treturn this;\r\n};\r\n\r\nwindow.L = L;\r\n\n\n/*\r\n * L.Util contains various utility functions used throughout Leaflet code.\r\n */\r\n\r\nL.Util = {\r\n\textend: function (dest) { // (Object[, Object, ...]) ->\r\n\t\tvar sources = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, j, len, src;\r\n\r\n\t\tfor (j = 0, len = sources.length; j < len; j++) {\r\n\t\t\tsrc = sources[j] || {};\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tif (src.hasOwnProperty(i)) {\r\n\t\t\t\t\tdest[i] = src[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\tbind: function (fn, obj) { // (Function, Object) -> Function\r\n\t\tvar args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args || arguments);\r\n\t\t};\r\n\t},\r\n\r\n\tstamp: (function () {\r\n\t\tvar lastId = 0,\r\n\t\t key = '_leaflet_id';\r\n\t\treturn function (obj) {\r\n\t\t\tobj[key] = obj[key] || ++lastId;\r\n\t\t\treturn obj[key];\r\n\t\t};\r\n\t}()),\r\n\r\n\tinvokeEach: function (obj, method, context) {\r\n\t\tvar i, args;\r\n\r\n\t\tif (typeof obj === 'object') {\r\n\t\t\targs = Array.prototype.slice.call(arguments, 3);\r\n\r\n\t\t\tfor (i in obj) {\r\n\t\t\t\tmethod.apply(context, [i, obj[i]].concat(args));\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\tlimitExecByInterval: function (fn, time, context) {\r\n\t\tvar lock, execOnUnlock;\r\n\r\n\t\treturn function wrapperFn() {\r\n\t\t\tvar args = arguments;\r\n\r\n\t\t\tif (lock) {\r\n\t\t\t\texecOnUnlock = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlock = true;\r\n\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tlock = false;\r\n\r\n\t\t\t\tif (execOnUnlock) {\r\n\t\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\t\texecOnUnlock = false;\r\n\t\t\t\t}\r\n\t\t\t}, time);\r\n\r\n\t\t\tfn.apply(context, args);\r\n\t\t};\r\n\t},\r\n\r\n\tfalseFn: function () {\r\n\t\treturn false;\r\n\t},\r\n\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\tsetOptions: function (obj, options) {\r\n\t\tobj.options = L.extend({}, obj.options, options);\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(/\\{ *([\\w_]+) *\\}/g, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\tvar i, fn,\r\n\t\t prefixes = ['webkit', 'moz', 'o', 'ms'];\r\n\r\n\t\tfor (i = 0; i < prefixes.length && !fn; i++) {\r\n\t\t\tfn = window[prefixes[i] + name];\r\n\t\t}\r\n\r\n\t\treturn fn;\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame ||\r\n\t getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\n\r\n\tvar cancelFn = window.cancelAnimationFrame ||\r\n\t getPrefixed('CancelAnimationFrame') ||\r\n\t getPrefixed('CancelRequestAnimationFrame') ||\r\n\t function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate, element) {\r\n\t\tfn = L.bind(fn, context);\r\n\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn();\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, fn, element);\r\n\t\t}\r\n\t};\r\n\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n\r\n}());\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\n/*\r\n * L.Class powers the OOP facilities of the library.\r\n * Thanks to John Resig and Dean Edwards for inspiration!\r\n */\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// extended class with the new prototype\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tif (this._initHooks) {\r\n\t\t\tthis.callInitHooks();\r\n\t\t}\r\n\t};\r\n\r\n\t// instantiate class without calling constructor\r\n\tvar F = function () {};\r\n\tF.prototype = this.prototype;\r\n\r\n\tvar proto = new F();\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t//inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (props.options && proto.options) {\r\n\t\tprops.options = L.extend({}, proto.options, props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\tvar parent = this;\r\n\t// jshint camelcase: false\r\n\tNewClass.__super__ = parent.prototype;\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parent.prototype.callInitHooks) {\r\n\t\t\tparent.prototype.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// method for adding properties to prototype\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n};\r\n\r\n// merge new default options to the Class\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n};\r\n\r\n// add a constructor hook\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n};\r\n\n\n/*\r\n * L.Mixin.Events is used to add custom events functionality to Leaflet classes.\r\n */\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.Mixin = {};\r\n\r\nL.Mixin.Events = {\r\n\r\n\taddEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey] = this[eventsKey] || {},\r\n\t\t contextId = context && context !== this && L.stamp(context),\r\n\t\t i, len, event, type, indexKey, indexLenKey, typeIndex;\r\n\r\n\t\t// types can be a string of space-separated words\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\tevent = {\r\n\t\t\t\taction: fn,\r\n\t\t\t\tcontext: context || this\r\n\t\t\t};\r\n\t\t\ttype = types[i];\r\n\r\n\t\t\tif (contextId) {\r\n\t\t\t\t// store listeners of a particular context in a separate hash (if it has an id)\r\n\t\t\t\t// gives a major performance boost when removing thousands of map layers\r\n\r\n\t\t\t\tindexKey = type + '_idx';\r\n\t\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\t\ttypeIndex = events[indexKey] = events[indexKey] || {};\r\n\r\n\t\t\t\tif (!typeIndex[contextId]) {\r\n\t\t\t\t\ttypeIndex[contextId] = [];\r\n\r\n\t\t\t\t\t// keep track of the number of keys in the index to quickly check if it's empty\r\n\t\t\t\t\tevents[indexLenKey] = (events[indexLenKey] || 0) + 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttypeIndex[contextId].push(event);\r\n\r\n\r\n\t\t\t} else {\r\n\t\t\t\tevents[type] = events[type] || [];\r\n\t\t\t\tevents[type].push(event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasEventListeners: function (type) { // (String) -> Boolean\r\n\t\tvar events = this[eventsKey];\r\n\t\treturn !!events && ((type in events && events[type].length > 0) ||\r\n\t\t (type + '_idx' in events && events[type + '_idx_len'] > 0));\r\n\t},\r\n\r\n\tremoveEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])\r\n\r\n\t\tif (!this[eventsKey]) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!types) {\r\n\t\t\treturn this.clearAllEventListeners();\r\n\t\t}\r\n\r\n\t\tif (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t contextId = context && context !== this && L.stamp(context),\r\n\t\t i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;\r\n\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\ttype = types[i];\r\n\t\t\tindexKey = type + '_idx';\r\n\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\ttypeIndex = events[indexKey];\r\n\r\n\t\t\tif (!fn) {\r\n\t\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\t\tdelete events[type];\r\n\t\t\t\tdelete events[indexKey];\r\n\t\t\t\tdelete events[indexLenKey];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tlisteners = contextId && typeIndex ? typeIndex[contextId] : events[type];\r\n\r\n\t\t\t\tif (listeners) {\r\n\t\t\t\t\tfor (j = listeners.length - 1; j >= 0; j--) {\r\n\t\t\t\t\t\tif ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {\r\n\t\t\t\t\t\t\tremoved = listeners.splice(j, 1);\r\n\t\t\t\t\t\t\t// set the old action to a no-op, because it is possible\r\n\t\t\t\t\t\t\t// that the listener is being iterated over as part of a dispatch\r\n\t\t\t\t\t\t\tremoved[0].action = L.Util.falseFn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (context && typeIndex && (listeners.length === 0)) {\r\n\t\t\t\t\t\tdelete typeIndex[contextId];\r\n\t\t\t\t\t\tevents[indexLenKey]--;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclearAllEventListeners: function () {\r\n\t\tdelete this[eventsKey];\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfireEvent: function (type, data) { // (String[, Object])\r\n\t\tif (!this.hasEventListeners(type)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar event = L.Util.extend({}, data, { type: type, target: this });\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t listeners, i, len, typeIndex, contextId;\r\n\r\n\t\tif (events[type]) {\r\n\t\t\t// make sure adding/removing listeners inside other listeners won't cause infinite loop\r\n\t\t\tlisteners = events[type].slice();\r\n\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// fire event for the context-indexed listeners as well\r\n\t\ttypeIndex = events[type + '_idx'];\r\n\r\n\t\tfor (contextId in typeIndex) {\r\n\t\t\tlisteners = typeIndex[contextId].slice();\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOneTimeEventListener: function (types, fn, context) {\r\n\r\n\t\tif (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t .removeEventListener(types, fn, context)\r\n\t\t\t .removeEventListener(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\treturn this\r\n\t\t .addEventListener(types, fn, context)\r\n\t\t .addEventListener(types, handler, context);\r\n\t}\r\n};\r\n\r\nL.Mixin.Events.on = L.Mixin.Events.addEventListener;\r\nL.Mixin.Events.off = L.Mixin.Events.removeEventListener;\r\nL.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;\r\nL.Mixin.Events.fire = L.Mixin.Events.fireEvent;\r\n\n\n/*\r\n * L.Browser handles different browser and feature detections for internal Leaflet use.\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ie = 'ActiveXObject' in window,\r\n\t\tielt9 = ie && !document.addEventListener,\r\n\r\n\t // terrible browser detection to work around Safari / iOS / Android browser bugs\r\n\t ua = navigator.userAgent.toLowerCase(),\r\n\t webkit = ua.indexOf('webkit') !== -1,\r\n\t chrome = ua.indexOf('chrome') !== -1,\r\n\t phantomjs = ua.indexOf('phantom') !== -1,\r\n\t android = ua.indexOf('android') !== -1,\r\n\t android23 = ua.search('android [23]') !== -1,\r\n\t\tgecko = ua.indexOf('gecko') !== -1,\r\n\r\n\t mobile = typeof orientation !== undefined + '',\r\n\t msPointer = window.navigator && window.navigator.msPointerEnabled &&\r\n\t window.navigator.msMaxTouchPoints && !window.PointerEvent,\r\n\t\tpointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) ||\r\n\t\t\t\t msPointer,\r\n\t retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||\r\n\t ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&\r\n\t window.matchMedia('(min-resolution:144dpi)').matches),\r\n\r\n\t doc = document.documentElement,\r\n\t ie3d = ie && ('transition' in doc.style),\r\n\t webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t gecko3d = 'MozPerspective' in doc.style,\r\n\t opera3d = 'OTransition' in doc.style,\r\n\t any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;\r\n\r\n\r\n\t// PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch.\r\n\t// https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151\r\n\r\n\tvar touch = !window.L_NO_TOUCH && !phantomjs && (function () {\r\n\r\n\t\tvar startName = 'ontouchstart';\r\n\r\n\t\t// IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc.\r\n\t\tif (pointer || (startName in doc)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Firefox/Gecko\r\n\t\tvar div = document.createElement('div'),\r\n\t\t supported = false;\r\n\r\n\t\tif (!div.setAttribute) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tdiv.setAttribute(startName, 'return;');\r\n\r\n\t\tif (typeof div[startName] === 'function') {\r\n\t\t\tsupported = true;\r\n\t\t}\r\n\r\n\t\tdiv.removeAttribute(startName);\r\n\t\tdiv = null;\r\n\r\n\t\treturn supported;\r\n\t}());\r\n\r\n\r\n\tL.Browser = {\r\n\t\tie: ie,\r\n\t\tielt9: ielt9,\r\n\t\twebkit: webkit,\r\n\t\tgecko: gecko && !webkit && !window.opera && !ie,\r\n\r\n\t\tandroid: android,\r\n\t\tandroid23: android23,\r\n\r\n\t\tchrome: chrome,\r\n\r\n\t\tie3d: ie3d,\r\n\t\twebkit3d: webkit3d,\r\n\t\tgecko3d: gecko3d,\r\n\t\topera3d: opera3d,\r\n\t\tany3d: any3d,\r\n\r\n\t\tmobile: mobile,\r\n\t\tmobileWebkit: mobile && webkit,\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\ttouch: touch,\r\n\t\tmsPointer: msPointer,\r\n\t\tpointer: pointer,\r\n\r\n\t\tretina: retina\r\n\t};\r\n\r\n}());\r\n\n\n/*\r\n * L.Point represents a point with x and y coordinates.\r\n */\r\n\r\nL.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// non-destructive, returns a new point\r\n\tadd: function (point) {\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t_add: function (point) {\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t point.y === this.y;\r\n\t},\r\n\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t L.Util.formatNum(this.x) + ', ' +\r\n\t\t L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n\n/*\r\n * L.Bounds represents a rectangular area on the screen in pixel coordinates.\r\n */\r\n\r\nL.Bounds = function (a, b) { //(Point, Point) or Point[]\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// extend the bounds to contain the given point\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetCenter: function (round) { // (Boolean) -> Point\r\n\t\treturn new L.Point(\r\n\t\t (this.min.x + this.max.x) / 2,\r\n\t\t (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\tgetBottomLeft: function () { // -> Point\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\tcontains: function (obj) { // (Bounds) or (Point) -> Boolean\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t (max.x <= this.max.x) &&\r\n\t\t (min.y >= this.min.y) &&\r\n\t\t (max.y <= this.max.y);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t max = this.max,\r\n\t\t min2 = bounds.min,\r\n\t\t max2 = bounds.max,\r\n\t\t xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\nL.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.\r\n */\r\n\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t (point.x / scale - this._b) / this._a,\r\n\t\t (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.DomUtil contains various utility functions for working with DOM.\r\n */\r\n\r\nL.DomUtil = {\r\n\tget: function (id) {\r\n\t\treturn (typeof id === 'string' ? document.getElementById(id) : id);\r\n\t},\r\n\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style];\r\n\r\n\t\tif (!value && el.currentStyle) {\r\n\t\t\tvalue = el.currentStyle[style];\r\n\t\t}\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\tgetViewportOffset: function (element) {\r\n\r\n\t\tvar top = 0,\r\n\t\t left = 0,\r\n\t\t el = element,\r\n\t\t docBody = document.body,\r\n\t\t docEl = document.documentElement,\r\n\t\t pos;\r\n\r\n\t\tdo {\r\n\t\t\ttop += el.offsetTop || 0;\r\n\t\t\tleft += el.offsetLeft || 0;\r\n\r\n\t\t\t//add borders\r\n\t\t\ttop += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;\r\n\t\t\tleft += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;\r\n\r\n\t\t\tpos = L.DomUtil.getStyle(el, 'position');\r\n\r\n\t\t\tif (el.offsetParent === docBody && pos === 'absolute') { break; }\r\n\r\n\t\t\tif (pos === 'fixed') {\r\n\t\t\t\ttop += docBody.scrollTop || docEl.scrollTop || 0;\r\n\t\t\t\tleft += docBody.scrollLeft || docEl.scrollLeft || 0;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (pos === 'relative' && !el.offsetLeft) {\r\n\t\t\t\tvar width = L.DomUtil.getStyle(el, 'width'),\r\n\t\t\t\t maxWidth = L.DomUtil.getStyle(el, 'max-width'),\r\n\t\t\t\t r = el.getBoundingClientRect();\r\n\r\n\t\t\t\tif (width !== 'none' || maxWidth !== 'none') {\r\n\t\t\t\t\tleft += r.left + el.clientLeft;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//calculate full y offset since we're breaking out of the loop\r\n\t\t\t\ttop += r.top + (docBody.scrollTop || docEl.scrollTop || 0);\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tel = el.offsetParent;\r\n\r\n\t\t} while (el);\r\n\r\n\t\tel = element;\r\n\r\n\t\tdo {\r\n\t\t\tif (el === docBody) { break; }\r\n\r\n\t\t\ttop -= el.scrollTop || 0;\r\n\t\t\tleft -= el.scrollLeft || 0;\r\n\r\n\t\t\tel = el.parentNode;\r\n\t\t} while (el);\r\n\r\n\t\treturn new L.Point(left, top);\r\n\t},\r\n\r\n\tdocumentIsLtr: function () {\r\n\t\tif (!L.DomUtil._docIsLtrCached) {\r\n\t\t\tL.DomUtil._docIsLtrCached = true;\r\n\t\t\tL.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';\r\n\t\t}\r\n\t\treturn L.DomUtil._docIsLtr;\r\n\t},\r\n\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className;\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil._getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil._getClass(el);\r\n\t\t\tL.DomUtil._setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t_setClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t_getClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\r\n\t\t\tvar filter = false,\r\n\t\t\t filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\t\ttry {\r\n\t\t\t\tfilter = el.filters.item(filterName);\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\t\tif (value === 1) { return; }\r\n\t\t\t}\r\n\r\n\t\t\tvalue = Math.round(value * 100);\r\n\r\n\t\t\tif (filter) {\r\n\t\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\t\tfilter.Opacity = value;\r\n\t\t\t} else {\r\n\t\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tgetTranslateString: function (point) {\r\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\r\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\r\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\r\n\r\n\t\tvar is3d = L.Browser.webkit3d,\r\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\r\n\t\t close = (is3d ? ',0' : '') + ')';\r\n\r\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\r\n\t},\r\n\r\n\tgetScaleString: function (scale, origin) {\r\n\r\n\t\tvar preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),\r\n\t\t scaleStr = ' scale(' + scale + ') ';\r\n\r\n\t\treturn preTranslateStr + scaleStr;\r\n\t},\r\n\r\n\tsetPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t// jshint camelcase: false\r\n\t\tel._leaflet_pos = point;\r\n\r\n\t\tif (!disable3D && L.Browser.any3d) {\r\n\t\t\tel.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\t// jshint camelcase: false\r\n\t\treturn el._leaflet_pos;\r\n\t}\r\n};\r\n\r\n\r\n// prefix style property names\r\n\r\nL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\nL.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\nL.DomUtil.TRANSITION_END =\r\n L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?\r\n L.DomUtil.TRANSITION + 'End' : 'transitionend';\r\n\r\n(function () {\r\n if ('onselectstart' in document) {\r\n L.extend(L.DomUtil, {\r\n disableTextSelection: function () {\r\n L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n },\r\n\r\n enableTextSelection: function () {\r\n L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n }\r\n });\r\n } else {\r\n var userSelectProperty = L.DomUtil.testProp(\r\n ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n L.extend(L.DomUtil, {\r\n disableTextSelection: function () {\r\n if (userSelectProperty) {\r\n var style = document.documentElement.style;\r\n this._userSelect = style[userSelectProperty];\r\n style[userSelectProperty] = 'none';\r\n }\r\n },\r\n\r\n enableTextSelection: function () {\r\n if (userSelectProperty) {\r\n document.documentElement.style[userSelectProperty] = this._userSelect;\r\n delete this._userSelect;\r\n }\r\n }\r\n });\r\n }\r\n\r\n\tL.extend(L.DomUtil, {\r\n\t\tdisableImageDrag: function () {\r\n\t\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t},\r\n\r\n\t\tenableImageDrag: function () {\r\n\t\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t}\r\n\t});\r\n})();\r\n\n\n/*\r\n * L.LatLng represents a geographical point with latitude and longitude coordinates.\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) { // (Number, Number, Number)\r\n\tlat = parseFloat(lat);\r\n\tlng = parseFloat(lng);\r\n\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\tthis.lat = lat;\r\n\tthis.lng = lng;\r\n\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = parseFloat(alt);\r\n\t}\r\n};\r\n\r\nL.extend(L.LatLng, {\r\n\tDEG_TO_RAD: Math.PI / 180,\r\n\tRAD_TO_DEG: 180 / Math.PI,\r\n\tMAX_MARGIN: 1.0E-9 // max margin of error for the \"equals\" check\r\n});\r\n\r\nL.LatLng.prototype = {\r\n\tequals: function (obj) { // (LatLng) -> Boolean\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t Math.abs(this.lat - obj.lat),\r\n\t\t Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= L.LatLng.MAX_MARGIN;\r\n\t},\r\n\r\n\ttoString: function (precision) { // (Number) -> String\r\n\t\treturn 'LatLng(' +\r\n\t\t L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula\r\n\t// TODO move to projection code, LatLng shouldn't know about Earth\r\n\tdistanceTo: function (other) { // (LatLng) -> Number\r\n\t\tother = L.latLng(other);\r\n\r\n\t\tvar R = 6378137, // earth radius in meters\r\n\t\t d2r = L.LatLng.DEG_TO_RAD,\r\n\t\t dLat = (other.lat - this.lat) * d2r,\r\n\t\t dLon = (other.lng - this.lng) * d2r,\r\n\t\t lat1 = this.lat * d2r,\r\n\t\t lat2 = other.lat * d2r,\r\n\t\t sin1 = Math.sin(dLat / 2),\r\n\t\t sin2 = Math.sin(dLon / 2);\r\n\r\n\t\tvar a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);\r\n\r\n\t\treturn R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n\t},\r\n\r\n\twrap: function (a, b) { // (Number, Number) -> LatLng\r\n\t\tvar lng = this.lng;\r\n\r\n\t\ta = a || -180;\r\n\t\tb = b || 180;\r\n\r\n\t\tlng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);\r\n\r\n\t\treturn new L.LatLng(this.lat, lng);\r\n\t}\r\n};\r\n\r\nL.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a)) {\r\n\t\tif (typeof a[0] === 'number' || typeof a[0] === 'string') {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b);\r\n};\r\n\r\n\n\n/*\r\n * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.\r\n */\r\n\r\nL.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!southWest) { return; }\r\n\r\n\tvar latlngs = northEast ? [southWest, northEast] : southWest;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\t// extend the bounds to contain the given point or bounds\r\n\textend: function (obj) { // (LatLng) or (LatLngBounds)\r\n\t\tif (!obj) { return this; }\r\n\r\n\t\tvar latLng = L.latLng(obj);\r\n\t\tif (latLng !== null) {\r\n\t\t\tobj = latLng;\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tif (!this._southWest && !this._northEast) {\r\n\t\t\t\tthis._southWest = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t\tthis._northEast = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t} else {\r\n\t\t\t\tthis._southWest.lat = Math.min(obj.lat, this._southWest.lat);\r\n\t\t\t\tthis._southWest.lng = Math.min(obj.lng, this._southWest.lng);\r\n\r\n\t\t\t\tthis._northEast.lat = Math.max(obj.lat, this._northEast.lat);\r\n\t\t\t\tthis._northEast.lng = Math.max(obj.lng, this._northEast.lng);\r\n\t\t\t}\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tthis.extend(obj._southWest);\r\n\t\t\tthis.extend(obj._northEast);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// extend the bounds by a percentage\r\n\tpad: function (bufferRatio) { // (Number) -> LatLngBounds\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\tgetCenter: function () { // -> LatLng\r\n\t\treturn new L.LatLng(\r\n\t\t (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (LatLngBounds)\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2 = bounds.getSouthWest(),\r\n\t\t ne2 = bounds.getNorthEast(),\r\n\r\n\t\t latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\tequals: function (bounds) { // (LatLngBounds)\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n//TODO International date line?\r\n\r\nL.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)\r\n\tif (!a || a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Projection contains various geographical projections used by CRS classes.\r\n */\r\n\r\nL.Projection = {};\r\n\n\n/*\r\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t x = latlng.lng * d,\r\n\t\t y = lat * d;\r\n\r\n\t\ty = Math.log(Math.tan((Math.PI / 4) + (y / 2)));\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t lng = point.x * d,\r\n\t\t lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;\r\n\r\n\t\treturn new L.LatLng(lat, lng);\r\n\t}\r\n};\r\n\n\n/*\r\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.\r\n */\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.\r\n */\r\n\r\nL.CRS = {\r\n\tlatLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\tpointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\tgetSize: function (zoom) {\r\n\t\tvar s = this.scale(zoom);\r\n\t\treturn L.point(s, s);\r\n\t}\r\n};\r\n\n\n/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t}\n});\n\n\n/*\r\n * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping\r\n * and is used by Leaflet by default.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3857',\r\n\r\n\tprojection: L.Projection.SphericalMercator,\r\n\ttransformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t earthRadius = 6378137;\r\n\t\treturn projectedPoint.multiplyBy(earthRadius);\r\n\t}\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n\n/*\r\n * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:4326',\r\n\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)\r\n});\r\n\n\n/*\r\n * L.Map is the central class of the API - it is used to create a map.\r\n */\r\n\r\nL.Map = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t/*\r\n\t\tcenter: LatLng,\r\n\t\tzoom: Number,\r\n\t\tlayers: Array,\r\n\t\t*/\r\n\r\n\t\tfadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,\r\n\t\ttrackResize: true,\r\n\t\tmarkerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._tileLayersNum = 0;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\tthis._addLayers(options.layers);\r\n\t},\r\n\r\n\r\n\t// public methods that modify map state\r\n\r\n\t// replaced by animation-powered implementation in Map.PanAnimation.js\r\n\tsetView: function (center, zoom) {\r\n\t\tzoom = zoom === undefined ? this.getZoom() : zoom;\r\n\t\tthis._resetView(L.latLng(center), this._limitZoom(zoom));\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = this._limitZoom(zoom);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\tzoomIn: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom + (delta || 1), options);\r\n\t},\r\n\r\n\tzoomOut: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom - (delta || 1), options);\r\n\t},\r\n\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)),\r\n\t\t paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\tzoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\treturn this.setView(center, zoom, options);\r\n\t},\r\n\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\tpanBy: function (offset) { // (Point)\r\n\t\t// replaced with animated panBy in Map.PanAnimation.js\r\n\t\tthis.fire('movestart');\r\n\r\n\t\tthis._rawPanBy(L.point(offset));\r\n\r\n\t\tthis.fire('move');\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (!bounds) {\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds, this);\r\n\t},\r\n\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tvar center = this.getCenter(),\r\n\t\t\tnewCenter = this._limitCenter(center, this._zoom, bounds);\r\n\r\n\t\tif (center.equals(newCenter)) { return this; }\r\n\r\n\t\treturn this.panTo(newCenter, options);\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\t// TODO method is too big, refactor\r\n\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (this._layers[id]) { return this; }\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\t// TODO getMaxZoom, getMinZoom in ILayer (instead of options)\r\n\t\tif (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {\r\n\t\t\tthis._zoomBoundLayers[id] = layer;\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor!!!\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum++;\r\n\t\t\tthis._tileLayersToLoad++;\r\n\t\t\tlayer.on('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._layerAdd(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (!this._layers[id]) { return this; }\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tlayer.onRemove(this);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('layerremove', {layer: layer});\r\n\t\t}\r\n\r\n\t\tif (this._zoomBoundLayers[id]) {\r\n\t\t\tdelete this._zoomBoundLayers[id];\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum--;\r\n\t\t\tthis._tileLayersToLoad--;\r\n\t\t\tlayer.off('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (L.stamp(layer) in this._layers);\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._initialCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t oldCenter = oldSize.divideBy(2).round(),\r\n\t\t newCenter = newSize.divideBy(2).round(),\r\n\t\t offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// TODO handler.addTo\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremove: function () {\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tthis._initEvents('off');\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet;\r\n\t\t} catch (e) {\r\n\t\t\tthis._container._leaflet = undefined;\r\n\t\t}\r\n\r\n\t\tthis._clearPanes();\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// public methods for getting map state\r\n\r\n\tgetCenter: function () { // (Boolean) -> LatLng\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._initialCenter && !this._moved()) {\r\n\t\t\treturn this._initialCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ?\r\n\t\t\t(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :\r\n\t\t\tthis.options.minZoom;\r\n\t},\r\n\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar zoom = this.getMinZoom() - (inside ? 1 : 0),\r\n\t\t maxZoom = this.getMaxZoom(),\r\n\t\t size = this.getSize(),\r\n\r\n\t\t nw = bounds.getNorthWest(),\r\n\t\t se = bounds.getSouthEast(),\r\n\r\n\t\t zoomNotFound = true,\r\n\t\t boundsSize;\r\n\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tdo {\r\n\t\t\tzoom++;\r\n\t\t\tboundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);\r\n\t\t\tzoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;\r\n\r\n\t\t} while (zoomNotFound && zoom <= maxZoom);\r\n\r\n\t\tif (zoomNotFound && inside) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn inside ? zoom : zoom - 1;\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth,\r\n\t\t\t\tthis._container.clientHeight);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\tgetPixelBounds: function () {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint();\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._initialTopLeftPoint;\r\n\t},\r\n\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// TODO replace with universal implementation after refactoring projections\r\n\r\n\tgetZoomScale: function (toZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\treturn crs.scale(toZoom) / crs.scale(this._zoom);\r\n\t},\r\n\r\n\tgetScaleZoom: function (scale) {\r\n\t\treturn this._zoom + (Math.log(scale) / Math.LN2);\r\n\t},\r\n\r\n\r\n\t// conversion methods\r\n\r\n\tproject: function (latlng, zoom) { // (LatLng[, Number]) -> Point\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\tunproject: function (point, zoom) { // (Point[, Number]) -> LatLng\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\tlayerPointToLatLng: function (point) { // (Point)\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\tlatLngToLayerPoint: function (latlng) { // (LatLng)\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\tmouseEventToContainerPoint: function (e) { // (MouseEvent)\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\tmouseEventToLayerPoint: function (e) { // (MouseEvent)\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tcontainer._leaflet = true;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\r\n\t\tthis._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);\r\n\r\n\t\tthis._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);\r\n\t\tpanes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);\r\n\t\tpanes.shadowPane = this._createPane('leaflet-shadow-pane');\r\n\t\tpanes.overlayPane = this._createPane('leaflet-overlay-pane');\r\n\t\tpanes.markerPane = this._createPane('leaflet-marker-pane');\r\n\t\tpanes.popupPane = this._createPane('leaflet-popup-pane');\r\n\r\n\t\tvar zoomHide = ' leaflet-zoom-hide';\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.popupPane, zoomHide);\r\n\t\t}\r\n\t},\r\n\r\n\t_createPane: function (className, container) {\r\n\t\treturn L.DomUtil.create('div', className, container || this._panes.objectsPane);\r\n\t},\r\n\r\n\t_clearPanes: function () {\r\n\t\tthis._container.removeChild(this._mapPane);\r\n\t},\r\n\r\n\t_addLayers: function (layers) {\r\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\r\n\r\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\r\n\t\t\tthis.addLayer(layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {\r\n\r\n\t\tvar zoomChanged = (this._zoom !== zoom);\r\n\r\n\t\tif (!afterZoomAnim) {\r\n\t\t\tthis.fire('movestart');\r\n\r\n\t\t\tif (zoomChanged) {\r\n\t\t\t\tthis.fire('zoomstart');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._initialCenter = center;\r\n\r\n\t\tthis._initialTopLeftPoint = this._getNewTopLeftPoint(center);\r\n\r\n\t\tif (!preserveMapOffset) {\r\n\t\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\t\t} else {\r\n\t\t\tthis._initialTopLeftPoint._add(this._getMapPanePos());\r\n\t\t}\r\n\r\n\t\tthis._tileLayersToLoad = this._tileLayersNum;\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t\tthis.eachLayer(this._layerAdd, this);\r\n\t\t}\r\n\r\n\t\tthis.fire('viewreset', {hard: !preserveMapOffset});\r\n\r\n\t\tthis.fire('move');\r\n\r\n\t\tif (zoomChanged || afterZoomAnim) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\tthis.fire('moveend', {hard: !preserveMapOffset});\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_updateZoomLevels: function () {\r\n\t\tvar i,\r\n\t\t\tminZoom = Infinity,\r\n\t\t\tmaxZoom = -Infinity,\r\n\t\t\toldZoomSpan = this._getZoomSpan();\r\n\r\n\t\tfor (i in this._zoomBoundLayers) {\r\n\t\t\tvar layer = this._zoomBoundLayers[i];\r\n\t\t\tif (!isNaN(layer.options.minZoom)) {\r\n\t\t\t\tminZoom = Math.min(minZoom, layer.options.minZoom);\r\n\t\t\t}\r\n\t\t\tif (!isNaN(layer.options.maxZoom)) {\r\n\t\t\t\tmaxZoom = Math.max(maxZoom, layer.options.maxZoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (i === undefined) { // we have no tilelayers\r\n\t\t\tthis._layersMaxZoom = this._layersMinZoom = undefined;\r\n\t\t} else {\r\n\t\t\tthis._layersMaxZoom = maxZoom;\r\n\t\t\tthis._layersMinZoom = minZoom;\r\n\t\t}\r\n\r\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\t\t}\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// map events\r\n\r\n\t_initEvents: function (onOff) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tonOff = onOff || 'on';\r\n\r\n\t\tL.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\tvar events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',\r\n\t\t 'mouseleave', 'mousemove', 'contextmenu'],\r\n\t\t i, len;\r\n\r\n\t\tfor (i = 0, len = events.length; i < len; i++) {\r\n\t\t\tL.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (!this._loaded || (!e._simulated &&\r\n\t\t ((this.dragging && this.dragging.moved()) ||\r\n\t\t (this.boxZoom && this.boxZoom.moved()))) ||\r\n\t\t L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tthis.fire('preclick');\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type;\r\n\r\n\t\ttype = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));\r\n\r\n\t\tif (!this.hasEventListeners(type)) { return; }\r\n\r\n\t\tif (type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar containerPoint = this.mouseEventToContainerPoint(e),\r\n\t\t layerPoint = this.containerPointToLayerPoint(containerPoint),\r\n\t\t latlng = this.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\t},\r\n\r\n\t_onTileLayerLoad: function () {\r\n\t\tthis._tileLayersToLoad--;\r\n\t\tif (this._tileLayersNum && !this._tileLayersToLoad) {\r\n\t\t\tthis.fire('tilelayersload');\r\n\t\t}\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, this);\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_layerAdd: function (layer) {\r\n\t\tlayer.onAdd(this);\r\n\t\tthis.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function () {\r\n\t\treturn this.getPixelOrigin().subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewTopLeftPoint: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\t// TODO round on display, not calculation to increase precision?\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {\r\n\t\tvar topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());\r\n\t\treturn this.project(latlng, newZoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),\r\n\t\t seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),\r\n\r\n\t\t dx = this._rebound(nwOffset.x, -seOffset.x),\r\n\t\t dy = this._rebound(nwOffset.y, -seOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t max = this.getMaxZoom();\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t}\r\n});\r\n\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n/*\r\n * Mercator projection that takes into account that the Earth is not a perfect sphere.\r\n * Less popular than spherical mercator; used by projections like EPSG:3395.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tMAX_LATITUDE: 85.0840591556,\r\n\r\n\tR_MINOR: 6356752.314245179,\r\n\tR_MAJOR: 6378137,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t r = this.R_MAJOR,\r\n\t\t r2 = this.R_MINOR,\r\n\t\t x = latlng.lng * d * r,\r\n\t\t y = lat * d,\r\n\t\t tmp = r2 / r,\r\n\t\t eccent = Math.sqrt(1.0 - tmp * tmp),\r\n\t\t con = eccent * Math.sin(y);\r\n\r\n\t\tcon = Math.pow((1 - con) / (1 + con), eccent * 0.5);\r\n\r\n\t\tvar ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;\r\n\t\ty = -r * Math.log(ts);\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t r = this.R_MAJOR,\r\n\t\t r2 = this.R_MINOR,\r\n\t\t lng = point.x * d / r,\r\n\t\t tmp = r2 / r,\r\n\t\t eccent = Math.sqrt(1 - (tmp * tmp)),\r\n\t\t ts = Math.exp(- point.y / r),\r\n\t\t phi = (Math.PI / 2) - 2 * Math.atan(ts),\r\n\t\t numIter = 15,\r\n\t\t tol = 1e-7,\r\n\t\t i = numIter,\r\n\t\t dphi = 0.1,\r\n\t\t con;\r\n\r\n\t\twhile ((Math.abs(dphi) > tol) && (--i > 0)) {\r\n\t\t\tcon = eccent * Math.sin(phi);\r\n\t\t\tdphi = (Math.PI / 2) - 2 * Math.atan(ts *\r\n\t\t\t Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, lng);\r\n\t}\r\n};\r\n\n\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3395',\r\n\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar m = L.Projection.Mercator,\r\n\t\t r = m.R_MAJOR,\r\n\t\t scale = 0.5 / (Math.PI * r);\r\n\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n\n/*\r\n * L.TileLayer is used for standard xyz-numbered tile layers.\r\n */\r\n\r\nL.TileLayer = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminZoom: 0,\r\n\t\tmaxZoom: 18,\r\n\t\ttileSize: 256,\r\n\t\tsubdomains: 'abc',\r\n\t\terrorTileUrl: '',\r\n\t\tattribution: '',\r\n\t\tzoomOffset: 0,\r\n\t\topacity: 1,\r\n\t\t/*\r\n\t\tmaxNativeZoom: null,\r\n\t\tzIndex: null,\r\n\t\ttms: false,\r\n\t\tcontinuousWorld: false,\r\n\t\tnoWrap: false,\r\n\t\tzoomReverse: false,\r\n\t\tdetectRetina: false,\r\n\t\treuseTiles: false,\r\n\t\tbounds: false,\r\n\t\t*/\r\n\t\tunloadInvisibleTiles: L.Browser.mobile,\r\n\t\tupdateWhenIdle: L.Browser.mobile\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\t\t\toptions.zoomOffset++;\r\n\r\n\t\t\tif (options.minZoom > 0) {\r\n\t\t\t\toptions.minZoom--;\r\n\t\t\t}\r\n\t\t\tthis.options.maxZoom--;\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\toptions.bounds = L.latLngBounds(options.bounds);\r\n\t\t}\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar subdomains = this.options.subdomains;\r\n\r\n\t\tif (typeof subdomains === 'string') {\r\n\t\t\tthis.options.subdomains = subdomains.split('');\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis._animated = map._zoomAnimated;\r\n\r\n\t\t// create a container div for tiles\r\n\t\tthis._initContainer();\r\n\r\n\t\t// set up events\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.on({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tthis._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);\r\n\t\t\tmap.on('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t\tthis._update();\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis._container.parentNode.removeChild(this._container);\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.off({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tmap.off('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._container = null;\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.appendChild(this._container);\r\n\t\t\tthis._setAutoZIndex(pane, Math.max);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.insertBefore(this._container, pane.firstChild);\r\n\t\t\tthis._setAutoZIndex(pane, Math.min);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\tthis.options.zIndex = zIndex;\r\n\t\tthis._updateZIndex();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateZIndex: function () {\r\n\t\tif (this._container && this.options.zIndex !== undefined) {\r\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\r\n\t\t}\r\n\t},\r\n\r\n\t_setAutoZIndex: function (pane, compare) {\r\n\r\n\t\tvar layers = pane.children,\r\n\t\t edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min\r\n\t\t zIndex, i, len;\r\n\r\n\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\r\n\t\t\tif (layers[i] !== this._container) {\r\n\t\t\t\tzIndex = parseInt(layers[i].style.zIndex, 10);\r\n\r\n\t\t\t\tif (!isNaN(zIndex)) {\r\n\t\t\t\t\tedgeZIndex = compare(edgeZIndex, zIndex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.options.zIndex = this._container.style.zIndex =\r\n\t\t (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar i,\r\n\t\t tiles = this._tiles;\r\n\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tfor (i in tiles) {\r\n\t\t\t\tL.DomUtil.setOpacity(tiles[i], this.options.opacity);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_initContainer: function () {\r\n\t\tvar tilePane = this._map._panes.tilePane;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer');\r\n\r\n\t\t\tthis._updateZIndex();\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\tvar className = 'leaflet-tile-container';\r\n\r\n\t\t\t\tthis._bgBuffer = L.DomUtil.create('div', className, this._container);\r\n\t\t\t\tthis._tileContainer = L.DomUtil.create('div', className, this._container);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis._tileContainer = this._container;\r\n\t\t\t}\r\n\r\n\t\t\ttilePane.appendChild(this._container);\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_reset: function (e) {\r\n\t\tfor (var key in this._tiles) {\r\n\t\t\tthis.fire('tileunload', {tile: this._tiles[key]});\r\n\t\t}\r\n\r\n\t\tthis._tiles = {};\r\n\t\tthis._tilesToLoad = 0;\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tthis._unusedTiles = [];\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.innerHTML = '';\r\n\r\n\t\tif (this._animated && e && e.hard) {\r\n\t\t\tthis._clearBgBuffer();\r\n\t\t}\r\n\r\n\t\tthis._initContainer();\r\n\t},\r\n\r\n\t_getTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\t zoom = map.getZoom() + this.options.zoomOffset,\r\n\t\t zoomN = this.options.maxNativeZoom,\r\n\t\t tileSize = this.options.tileSize;\r\n\r\n\t\tif (zoomN && zoom > zoomN) {\r\n\t\t\ttileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);\r\n\t\t}\r\n\r\n\t\treturn tileSize;\r\n\t},\r\n\r\n\t_update: function () {\r\n\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t bounds = map.getPixelBounds(),\r\n\t\t zoom = map.getZoom(),\r\n\t\t tileSize = this._getTileSize();\r\n\r\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tileBounds = L.bounds(\r\n\t\t bounds.min.divideBy(tileSize)._floor(),\r\n\t\t bounds.max.divideBy(tileSize)._floor());\r\n\r\n\t\tthis._addTilesFromCenterOut(tileBounds);\r\n\r\n\t\tif (this.options.unloadInvisibleTiles || this.options.reuseTiles) {\r\n\t\t\tthis._removeOtherTiles(tileBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_addTilesFromCenterOut: function (bounds) {\r\n\t\tvar queue = [],\r\n\t\t center = bounds.getCenter();\r\n\r\n\t\tvar j, i, point;\r\n\r\n\t\tfor (j = bounds.min.y; j <= bounds.max.y; j++) {\r\n\t\t\tfor (i = bounds.min.x; i <= bounds.max.x; i++) {\r\n\t\t\t\tpoint = new L.Point(i, j);\r\n\r\n\t\t\t\tif (this._tileShouldBeLoaded(point)) {\r\n\t\t\t\t\tqueue.push(point);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar tilesToLoad = queue.length;\r\n\r\n\t\tif (tilesToLoad === 0) { return; }\r\n\r\n\t\t// load tiles in order of their distance to center\r\n\t\tqueue.sort(function (a, b) {\r\n\t\t\treturn a.distanceTo(center) - b.distanceTo(center);\r\n\t\t});\r\n\r\n\t\tvar fragment = document.createDocumentFragment();\r\n\r\n\t\t// if its the first batch of tiles to load\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('loading');\r\n\t\t}\r\n\r\n\t\tthis._tilesToLoad += tilesToLoad;\r\n\r\n\t\tfor (i = 0; i < tilesToLoad; i++) {\r\n\t\t\tthis._addTile(queue[i], fragment);\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.appendChild(fragment);\r\n\t},\r\n\r\n\t_tileShouldBeLoaded: function (tilePoint) {\r\n\t\tif ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {\r\n\t\t\treturn false; // already loaded\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (!options.continuousWorld) {\r\n\t\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t\t// don't load if exceeds world bounds\r\n\t\t\tif ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||\r\n\t\t\t\ttilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\tvar tileSize = options.tileSize,\r\n\t\t\t nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t\t sePoint = nwPoint.add([tileSize, tileSize]),\r\n\t\t\t nw = this._map.unproject(nwPoint),\r\n\t\t\t se = this._map.unproject(sePoint);\r\n\r\n\t\t\t// TODO temporary hack, will be removed after refactoring projections\r\n\t\t\t// https://github.com/Leaflet/Leaflet/issues/1618\r\n\t\t\tif (!options.continuousWorld && !options.noWrap) {\r\n\t\t\t\tnw = nw.wrap();\r\n\t\t\t\tse = se.wrap();\r\n\t\t\t}\r\n\r\n\t\t\tif (!options.bounds.intersects([nw, se])) { return false; }\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_removeOtherTiles: function (bounds) {\r\n\t\tvar kArr, x, y, key;\r\n\r\n\t\tfor (key in this._tiles) {\r\n\t\t\tkArr = key.split(':');\r\n\t\t\tx = parseInt(kArr[0], 10);\r\n\t\t\ty = parseInt(kArr[1], 10);\r\n\r\n\t\t\t// remove tile if it's out of bounds\r\n\t\t\tif (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {\r\n\t\t\t\tthis._removeTile(key);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_removeTile: function (key) {\r\n\t\tvar tile = this._tiles[key];\r\n\r\n\t\tthis.fire('tileunload', {tile: tile, url: tile.src});\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tL.DomUtil.removeClass(tile, 'leaflet-tile-loaded');\r\n\t\t\tthis._unusedTiles.push(tile);\r\n\r\n\t\t} else if (tile.parentNode === this._tileContainer) {\r\n\t\t\tthis._tileContainer.removeChild(tile);\r\n\t\t}\r\n\r\n\t\t// for https://github.com/CloudMade/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\ttile.onload = null;\r\n\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t}\r\n\r\n\t\tdelete this._tiles[key];\r\n\t},\r\n\r\n\t_addTile: function (tilePoint, container) {\r\n\t\tvar tilePos = this._getTilePos(tilePoint);\r\n\r\n\t\t// get unused tile - or create a new tile\r\n\t\tvar tile = this._getTile();\r\n\r\n\t\t/*\r\n\t\tChrome 20 layouts much faster with top/left (verify with timeline, frames)\r\n\t\tAndroid 4 browser has display issues with top/left and requires transform instead\r\n\t\t(other browsers don't currently care) - see debug/hacks/jitter.html for an example\r\n\t\t*/\r\n\t\tL.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);\r\n\r\n\t\tthis._tiles[tilePoint.x + ':' + tilePoint.y] = tile;\r\n\r\n\t\tthis._loadTile(tile, tilePoint);\r\n\r\n\t\tif (tile.parentNode !== this._tileContainer) {\r\n\t\t\tcontainer.appendChild(tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\r\n\t\tvar options = this.options,\r\n\t\t zoom = this._map.getZoom();\r\n\r\n\t\tif (options.zoomReverse) {\r\n\t\t\tzoom = options.maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += options.zoomOffset;\r\n\r\n\t\treturn options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;\r\n\t},\r\n\r\n\t_getTilePos: function (tilePoint) {\r\n\t\tvar origin = this._map.getPixelOrigin(),\r\n\t\t tileSize = this._getTileSize();\r\n\r\n\t\treturn tilePoint.multiplyBy(tileSize).subtract(origin);\r\n\t},\r\n\r\n\t// image-specific code (override to implement e.g. Canvas or SVG tile layer)\r\n\r\n\tgetTileUrl: function (tilePoint) {\r\n\t\treturn L.Util.template(this._url, L.extend({\r\n\t\t\ts: this._getSubdomain(tilePoint),\r\n\t\t\tz: tilePoint.z,\r\n\t\t\tx: tilePoint.x,\r\n\t\t\ty: tilePoint.y\r\n\t\t}, this.options));\r\n\t},\r\n\r\n\t_getWrapTileNum: function () {\r\n\t\tvar crs = this._map.options.crs,\r\n\t\t size = crs.getSize(this._map.getZoom());\r\n\t\treturn size.divideBy(this._getTileSize())._floor();\r\n\t},\r\n\r\n\t_adjustTilePoint: function (tilePoint) {\r\n\r\n\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t// wrap tile coordinates\r\n\t\tif (!this.options.continuousWorld && !this.options.noWrap) {\r\n\t\t\ttilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;\r\n\t\t}\r\n\r\n\t\tif (this.options.tms) {\r\n\t\t\ttilePoint.y = limit.y - tilePoint.y - 1;\r\n\t\t}\r\n\r\n\t\ttilePoint.z = this._getZoomForUrl();\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t_getTile: function () {\r\n\t\tif (this.options.reuseTiles && this._unusedTiles.length > 0) {\r\n\t\t\tvar tile = this._unusedTiles.pop();\r\n\t\t\tthis._resetTile(tile);\r\n\t\t\treturn tile;\r\n\t\t}\r\n\t\treturn this._createTile();\r\n\t},\r\n\r\n\t// Override if data stored on a tile needs to be cleaned up before reuse\r\n\t_resetTile: function (/*tile*/) {},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('img', 'leaflet-tile');\r\n\t\ttile.style.width = tile.style.height = this._getTileSize() + 'px';\r\n\t\ttile.galleryimg = 'no';\r\n\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\r\n\t\tif (L.Browser.ielt9 && this.options.opacity !== undefined) {\r\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\r\n\t\t}\r\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\r\n\t\tif (L.Browser.mobileWebkit3d) {\r\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\r\n\t\t}\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile.onload = this._tileOnLoad;\r\n\t\ttile.onerror = this._tileOnError;\r\n\r\n\t\tthis._adjustTilePoint(tilePoint);\r\n\t\ttile.src = this.getTileUrl(tilePoint);\r\n\r\n\t\tthis.fire('tileloadstart', {\r\n\t\t\ttile: tile,\r\n\t\t\turl: tile.src\r\n\t\t});\r\n\t},\r\n\r\n\t_tileLoaded: function () {\r\n\t\tthis._tilesToLoad--;\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tL.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');\r\n\t\t}\r\n\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('load');\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\t// clear scaled tiles after all new tiles are loaded (for performance)\r\n\t\t\t\tclearTimeout(this._clearBgBufferTimer);\r\n\t\t\t\tthis._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnLoad: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\t//Only if we are loading an actual image\r\n\t\tif (this.src !== L.Util.emptyImageUrl) {\r\n\t\t\tL.DomUtil.addClass(this, 'leaflet-tile-loaded');\r\n\r\n\t\t\tlayer.fire('tileload', {\r\n\t\t\t\ttile: this,\r\n\t\t\t\turl: this.src\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t},\r\n\r\n\t_tileOnError: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\tlayer.fire('tileerror', {\r\n\t\t\ttile: this,\r\n\t\t\turl: this.src\r\n\t\t});\r\n\r\n\t\tvar newUrl = layer.options.errorTileUrl;\r\n\t\tif (newUrl) {\r\n\t\t\tthis.src = newUrl;\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t}\r\n});\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.WMS is used for putting WMS tile layers on the map.\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\t\tversion: '1.1.1',\r\n\t\tlayers: '',\r\n\t\tstyles: '',\r\n\t\tformat: 'image/jpeg',\r\n\t\ttransparent: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) { // (String, Object)\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams),\r\n\t\t tileSize = options.tileSize || this.options.tileSize;\r\n\r\n\t\tif (options.detectRetina && L.Browser.retina) {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize * 2;\r\n\t\t} else {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize;\r\n\t\t}\r\n\r\n\t\tfor (var i in options) {\r\n\t\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\t\tif (!this.options.hasOwnProperty(i) && i !== 'crs') {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (tilePoint) { // (Point, Number) -> String\r\n\r\n\t\tvar map = this._map,\r\n\t\t tileSize = this.options.tileSize,\r\n\r\n\t\t nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t sePoint = nwPoint.add([tileSize, tileSize]),\r\n\r\n\t\t nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),\r\n\t\t se = this._crs.project(map.unproject(sePoint, tilePoint.z)),\r\n\t\t bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t [se.y, nw.x, nw.y, se.x].join(',') :\r\n\t\t [nw.x, se.y, se.x, nw.y].join(','),\r\n\r\n\t\t url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});\r\n\r\n\t\treturn url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;\r\n\t},\r\n\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.Canvas is a class that you can use as a base for creating\r\n * dynamically drawn Canvas-based tile layers.\r\n */\r\n\r\nL.TileLayer.Canvas = L.TileLayer.extend({\r\n\toptions: {\r\n\t\tasync: false\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tfor (var i in this._tiles) {\r\n\t\t\tthis._redrawTile(this._tiles[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_redrawTile: function (tile) {\r\n\t\tthis.drawTile(tile, tile._tilePoint, this._map._zoom);\r\n\t},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('canvas', 'leaflet-tile');\r\n\t\ttile.width = tile.height = this.options.tileSize;\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile._tilePoint = tilePoint;\r\n\r\n\t\tthis._redrawTile(tile);\r\n\r\n\t\tif (!this.options.async) {\r\n\t\t\tthis.tileDrawn(tile);\r\n\t\t}\r\n\t},\r\n\r\n\tdrawTile: function (/*tile, tilePoint*/) {\r\n\t\t// override with rendering code\r\n\t},\r\n\r\n\ttileDrawn: function (tile) {\r\n\t\tthis._tileOnLoad.call(tile);\r\n\t}\r\n});\r\n\r\n\r\nL.tileLayer.canvas = function (options) {\r\n\treturn new L.TileLayer.Canvas(options);\r\n};\r\n\n\n/*\r\n * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).\r\n */\r\n\r\nL.ImageOverlay = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\topacity: 1\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\t\t}\r\n\r\n\t\tmap._panes.overlayPane.appendChild(this._image);\r\n\r\n\t\tmap.on('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.getPanes().overlayPane.removeChild(this._image);\r\n\r\n\t\tmap.off('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tthis._updateOpacity();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// TODO remove bringToFront/bringToBack duplication from TileLayer/Path\r\n\tbringToFront: function () {\r\n\t\tif (this._image) {\r\n\t\t\tthis._map._panes.overlayPane.appendChild(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.overlayPane;\r\n\t\tif (this._image) {\r\n\t\t\tpane.insertBefore(this._image, pane.firstChild);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\t\tthis._image.src = this._url;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tthis._image = L.DomUtil.create('img', 'leaflet-image-layer');\r\n\r\n\t\tif (this._map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-animated');\r\n\t\t} else {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-hide');\r\n\t\t}\r\n\r\n\t\tthis._updateOpacity();\r\n\r\n\t\t//TODO createImage util method to remove duplication\r\n\t\tL.extend(this._image, {\r\n\t\t\tgalleryimg: 'no',\r\n\t\t\tonselectstart: L.Util.falseFn,\r\n\t\t\tonmousemove: L.Util.falseFn,\r\n\t\t\tonload: L.bind(this._onImageLoad, this),\r\n\t\t\tsrc: this._url\r\n\t\t});\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar map = this._map,\r\n\t\t image = this._image,\r\n\t\t scale = map.getZoomScale(e.zoom),\r\n\t\t nw = this._bounds.getNorthWest(),\r\n\t\t se = this._bounds.getSouthEast(),\r\n\r\n\t\t topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),\r\n\t\t size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),\r\n\t\t origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));\r\n\r\n\t\timage.style[L.DomUtil.TRANSFORM] =\r\n\t\t L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);\r\n\r\n\t\tL.DomUtil.setPosition(image, topLeft);\r\n\r\n\t\timage.style.width = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_onImageLoad: function () {\r\n\t\tthis.fire('load');\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n\n/*\r\n * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\toptions: {\r\n\t\t/*\r\n\t\ticonUrl: (String) (required)\r\n\t\ticonRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\ticonSize: (Point) (can be set through CSS)\r\n\t\ticonAnchor: (Point) (centered by default, can be set in CSS with negative margins)\r\n\t\tpopupAnchor: (Point) (if not specified, popup opens in the anchor point)\r\n\t\tshadowUrl: (String) (no shadow by default)\r\n\t\tshadowRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\tshadowSize: (Point)\r\n\t\tshadowAnchor: (Point)\r\n\t\t*/\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img;\r\n\t\tif (!oldIcon || oldIcon.tagName !== 'IMG') {\r\n\t\t\timg = this._createImg(src);\r\n\t\t} else {\r\n\t\t\timg = this._createImg(src, oldIcon);\r\n\t\t}\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options,\r\n\t\t size = L.point(options[name + 'Size']),\r\n\t\t anchor;\r\n\r\n\t\tif (name === 'shadow') {\r\n\t\t\tanchor = L.point(options.shadowAnchor || options.iconAnchor);\r\n\t\t} else {\r\n\t\t\tanchor = L.point(options.iconAnchor);\r\n\t\t}\r\n\r\n\t\tif (!anchor && size) {\r\n\t\t\tanchor = size.divideBy(2, true);\r\n\t\t}\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + options.className;\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\tif (L.Browser.retina && this.options[name + 'RetinaUrl']) {\r\n\t\t\treturn this.options[name + 'RetinaUrl'];\r\n\t\t}\r\n\t\treturn this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n\n/*\n * L.Icon.Default is the blue marker icon used by default in Leaflet.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonSize: [25, 41],\n\t\ticonAnchor: [12, 41],\n\t\tpopupAnchor: [1, -34],\n\n\t\tshadowSize: [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tvar key = name + 'Url';\n\n\t\tif (this.options[key]) {\n\t\t\treturn this.options[key];\n\t\t}\n\n\t\tif (L.Browser.retina && name === 'icon') {\n\t\t\tname += '-2x';\n\t\t}\n\n\t\tvar path = L.Icon.Default.imagePath;\n\n\t\tif (!path) {\n\t\t\tthrow new Error('Couldn\\'t autodetect L.Icon.Default.imagePath, set it manually.');\n\t\t}\n\n\t\treturn path + '/marker-' + name + '.png';\n\t}\n});\n\nL.Icon.Default.imagePath = (function () {\n\tvar scripts = document.getElementsByTagName('script'),\n\t leafletRe = /[\\/^]leaflet[\\-\\._]?([\\w\\-\\._]*)\\.js\\??/;\n\n\tvar i, len, src, matches, path;\n\n\tfor (i = 0, len = scripts.length; i < len; i++) {\n\t\tsrc = scripts[i].src;\n\t\tmatches = src.match(leafletRe);\n\n\t\tif (matches) {\n\t\t\tpath = src.split(leafletRe)[0];\n\t\t\treturn (path ? path + '/' : '') + 'images';\n\t\t}\n\t}\n}());\n\n\n/*\r\n * L.Marker is used to display clickable/draggable icons on the map.\r\n */\r\n\r\nL.Marker = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\ticon: new L.Icon.Default(),\r\n\t\ttitle: '',\r\n\t\talt: '',\r\n\t\tclickable: true,\r\n\t\tdraggable: false,\r\n\t\tkeyboard: true,\r\n\t\tzIndexOffset: 0,\r\n\t\topacity: 1,\r\n\t\triseOnHover: false,\r\n\t\triseOffset: 250\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tmap.on('viewreset', this.update, this);\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t\tthis.fire('add');\r\n\r\n\t\tif (map.options.zoomAnimation && map.options.markerZoomAnimation) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging) {\r\n\t\t\tthis.dragging.disable();\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\r\n\t\tthis.fire('remove');\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.update,\r\n\t\t\t'zoomanim': this._animateZoom\r\n\t\t}, this);\r\n\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\r\n\t\tthis.update();\r\n\r\n\t\treturn this.fire('move', { latlng: this._latlng });\r\n\t},\r\n\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\tthis.update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (this._icon) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t map = this._map,\r\n\t\t animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),\r\n\t\t classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t\taddIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tthis._initInteraction();\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.on(icon, 'mouseover', this._bringToFront, this)\r\n\t\t\t\t.on(icon, 'mouseout', this._resetZIndex, this);\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t\taddShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tvar panes = this._map._panes;\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tpanes.markerPane.appendChild(this._icon);\r\n\t\t}\r\n\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tpanes.shadowPane.appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t .off(this._icon, 'mouseover', this._bringToFront)\r\n\t\t\t .off(this._icon, 'mouseout', this._resetZIndex);\r\n\t\t}\r\n\r\n\t\tthis._map._panes.markerPane.removeChild(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tthis._map._panes.shadowPane.removeChild(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.clickable) { return; }\r\n\r\n\t\t// TODO refactor into something shared with Map/Path/etc. to DRY it up\r\n\r\n\t\tvar icon = this._icon,\r\n\t\t events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];\r\n\r\n\t\tL.DomUtil.addClass(icon, 'leaflet-clickable');\r\n\t\tL.DomEvent.on(icon, 'click', this._onMouseClick, this);\r\n\t\tL.DomEvent.on(icon, 'keypress', this._onKeyPress, this);\r\n\r\n\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\tL.DomEvent.on(icon, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (this.options.draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tvar wasDragged = this.dragging && this.dragging.moved();\r\n\r\n\t\tif (this.hasEventListeners(e.type) || wasDragged) {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\r\n\t\tif (wasDragged) { return; }\r\n\r\n\t\tif ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\t},\r\n\r\n\t_onKeyPress: function (e) {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\tthis.fire('click', {\r\n\t\t\t\toriginalEvent: e,\r\n\t\t\t\tlatlng: this._latlng\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\r\n\t\t// TODO proper custom event propagation\r\n\t\t// this line will always be called if marker is in a FeatureGroup\r\n\t\tif (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousedown') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._icon, this.options.opacity);\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t}\r\n});\r\n\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n\n/*\n * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)\n * to use with L.Marker.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\ticonSize: [12, 12], // also can be set through CSS\n\t\t/*\n\t\ticonAnchor: (Point)\n\t\tpopupAnchor: (Point)\n\t\thtml: (String)\n\t\tbgPos: (Point)\n\t\t*/\n\t\tclassName: 'leaflet-div-icon',\n\t\thtml: false\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t options = this.options;\n\n\t\tif (options.html !== false) {\n\t\t\tdiv.innerHTML = options.html;\n\t\t} else {\n\t\t\tdiv.innerHTML = '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tdiv.style.backgroundPosition =\n\t\t\t (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';\n\t\t}\n\n\t\tthis._setIconStyles(div, 'icon');\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n/*\r\n * L.Popup is used for displaying popups on the map.\r\n */\r\n\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\nL.Popup = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminWidth: 50,\r\n\t\tmaxWidth: 300,\r\n\t\t// maxHeight: null,\r\n\t\tautoPan: true,\r\n\t\tcloseButton: true,\r\n\t\toffset: [0, 7],\r\n\t\tautoPanPadding: [5, 5],\r\n\t\t// autoPanPaddingTopLeft: null,\r\n\t\t// autoPanPaddingBottomRight: null,\r\n\t\tkeepInView: false,\r\n\t\tclassName: '',\r\n\t\tzoomAnimation: true\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t\tthis._animated = L.Browser.any3d && this.options.zoomAnimation;\r\n\t\tthis._isOpen = false;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tvar animFade = map.options.fadeAnimation;\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\t\tmap._panes.popupPane.appendChild(this._container);\r\n\r\n\t\tmap.on(this._getEvents(), this);\r\n\r\n\t\tthis.update();\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.fire('open');\r\n\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupopen', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._panes.popupPane.removeChild(this._container);\r\n\r\n\t\tL.Util.falseFn(this._container.offsetWidth); // force reflow\r\n\r\n\t\tmap.off(this._getEvents(), this);\r\n\r\n\t\tif (map.options.fadeAnimation) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\tthis.fire('close');\r\n\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupclose', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\t_getEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tevents.zoomanim = this._zoomAnimation;\r\n\t\t}\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t\tcontainerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +\r\n\t\t\t (this._animated ? 'animated' : 'hide'),\r\n\t\t\tcontainer = this._container = L.DomUtil.create('div', containerClass),\r\n\t\t\tcloseButton;\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tcloseButton = this._closeButton =\r\n\t\t\t L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '×';\r\n\t\t\tL.DomEvent.disableClickPropagation(closeButton);\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper =\r\n\t\t L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tL.DomEvent.disableClickPropagation(wrapper);\r\n\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent.disableScrollPropagation(this._contentNode);\r\n\t\tL.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tif (typeof this._content === 'string') {\r\n\t\t\tthis._contentNode.innerHTML = this._content;\r\n\t\t} else {\r\n\t\t\twhile (this._contentNode.hasChildNodes()) {\r\n\t\t\t\tthis._contentNode.removeChild(this._contentNode.firstChild);\r\n\t\t\t}\r\n\t\t\tthis._contentNode.appendChild(this._content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t maxHeight = this.options.maxHeight,\r\n\t\t scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t animated = this._animated,\r\n\t\t offset = L.point(this.options.offset);\r\n\r\n\t\tif (animated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t\t}\r\n\r\n\t\tthis._containerBottom = -offset.y - (animated ? 0 : pos.y);\r\n\t\tthis._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = this._containerBottom + 'px';\r\n\t\tthis._container.style.left = this._containerLeft + 'px';\r\n\t},\r\n\r\n\t_zoomAnimation: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);\r\n\r\n\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t containerHeight = this._container.offsetHeight,\r\n\t\t containerWidth = this._containerWidth,\r\n\r\n\t\t layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\t\t}\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t padding = L.point(this.options.autoPanPadding),\r\n\t\t paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t size = map.getSize(),\r\n\t\t dx = 0,\r\n\t\t dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t .fire('autopanstart')\r\n\t\t\t .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t}\r\n});\r\n\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\nL.Map.include({\r\n\topenPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])\r\n\t\tthis.closePopup();\r\n\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tvar content = popup;\r\n\r\n\t\t\tpopup = new L.Popup(options)\r\n\t\t\t .setLatLng(latlng)\r\n\t\t\t .setContent(content);\r\n\t\t}\r\n\t\tpopup._isOpen = true;\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t\tpopup._isOpen = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Marker, adding popup-related methods.\r\n */\r\n\r\nL.Marker.include({\r\n\topenPopup: function () {\r\n\t\tif (this._popup && this._map && !this._map.hasLayer(this._popup)) {\r\n\t\t\tthis._popup.setLatLng(this._latlng);\r\n\t\t\tthis._map.openPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttogglePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tif (this._popup._isOpen) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tvar anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);\r\n\r\n\t\tanchor = anchor.add(L.Popup.prototype.options.offset);\r\n\r\n\t\tif (options && options.offset) {\r\n\t\t\tanchor = anchor.add(options.offset);\r\n\t\t}\r\n\r\n\t\toptions = L.extend({offset: anchor}, options);\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t .on('click', this.togglePopup, this)\r\n\t\t\t .on('remove', this.closePopup, this)\r\n\t\t\t .on('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tL.setOptions(content, options);\r\n\t\t\tthis._popup = content;\r\n\t\t} else {\r\n\t\t\tthis._popup = new L.Popup(options, this)\r\n\t\t\t\t.setContent(content);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t .off('click', this.togglePopup, this)\r\n\t\t\t .off('remove', this.closePopup, this)\r\n\t\t\t .off('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LayerGroup is a class to combine several layers into one so that\r\n * you can manipulate the group (e.g. add/remove it) as one layer.\r\n */\r\n\r\nL.LayerGroup = L.Class.extend({\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\tclearLayers: function () {\r\n\t\tthis.eachLayer(this.removeLayer, this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis.eachLayer(map.addLayer, map);\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis.eachLayer(map.removeLayer, map);\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n\n/*\r\n * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods\r\n * shared between a group of interactive layers (like vectors or markers).\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tEVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ('on' in layer) {\r\n\t\t\tlayer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\t\t}\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent && layer.bindPopup) {\r\n\t\t\tlayer.bindPopup(this._popupContent, this._popupOptions);\r\n\t\t}\r\n\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent) {\r\n\t\t\tthis.invoke('unbindPopup');\r\n\t\t}\r\n\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tthis._popupContent = content;\r\n\t\tthis._popupOptions = options;\r\n\t\treturn this.invoke('bindPopup', content, options);\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\t\t// open popup on the first layer\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tthis._layers[id].openPopup(latlng);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tbounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());\r\n\t\t});\r\n\r\n\t\treturn bounds;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\te = L.extend({\r\n\t\t\tlayer: e.target,\r\n\t\t\ttarget: this\r\n\t\t}, e);\r\n\t\tthis.fire(e.type, e);\r\n\t}\r\n});\r\n\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n\n/*\r\n * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.\r\n */\r\n\r\nL.Path = L.Class.extend({\r\n\tincludes: [L.Mixin.Events],\r\n\r\n\tstatics: {\r\n\t\t// how much to extend the clip area around the map view\r\n\t\t// (relative to its size, e.g. 0.5 is half the screen in each direction)\r\n\t\t// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)\r\n\t\tCLIP_PADDING: (function () {\r\n\t\t\tvar max = L.Browser.mobile ? 1280 : 2000,\r\n\t\t\t target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;\r\n\t\t\treturn Math.max(0, Math.min(0.5, target));\r\n\t\t})()\r\n\t},\r\n\r\n\toptions: {\r\n\t\tstroke: true,\r\n\t\tcolor: '#0033ff',\r\n\t\tdashArray: null,\r\n\t\tlineCap: null,\r\n\t\tlineJoin: null,\r\n\t\tweight: 5,\r\n\t\topacity: 0.5,\r\n\r\n\t\tfill: false,\r\n\t\tfillColor: null, //same as color by default\r\n\t\tfillOpacity: 0.2,\r\n\r\n\t\tclickable: true\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initElements();\r\n\t\t\tthis._initEvents();\r\n\t\t}\r\n\r\n\t\tthis.projectLatlngs();\r\n\t\tthis._updatePath();\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._map._pathRoot.appendChild(this._container);\r\n\t\t}\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._pathRoot.removeChild(this._container);\r\n\r\n\t\t// Need to fire remove event before we set _map to null as the event hooks might need the object\r\n\t\tthis.fire('remove');\r\n\t\tthis._map = null;\r\n\r\n\t\tif (L.Browser.vml) {\r\n\t\t\tthis._container = null;\r\n\t\t\tthis._stroke = null;\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\t// do all projection stuff here\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._updateStyle();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._updatePath();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_updatePathViewport: function () {\r\n\t\tvar p = L.Path.CLIP_PADDING,\r\n\t\t size = this.getSize(),\r\n\t\t panePos = L.DomUtil.getPosition(this._mapPane),\r\n\t\t min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),\r\n\t\t max = min.add(size.multiplyBy(1 + p * 2)._round());\r\n\r\n\t\tthis._pathViewport = new L.Bounds(min, max);\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Path with SVG-specific rendering code.\r\n */\r\n\r\nL.Path.SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nL.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);\r\n\r\nL.Path = L.Path.extend({\r\n\tstatics: {\r\n\t\tSVG: L.Browser.svg\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t path = this._container;\r\n\r\n\t\tif (path && root.lastChild !== path) {\r\n\t\t\troot.appendChild(path);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t path = this._container,\r\n\t\t first = root.firstChild;\r\n\r\n\t\tif (path && first !== path) {\r\n\t\t\troot.insertBefore(path, first);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\t// form path string here\r\n\t},\r\n\r\n\t_createElement: function (name) {\r\n\t\treturn document.createElementNS(L.Path.SVG_NS, name);\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._initPath();\r\n\t\tthis._initStyle();\r\n\t},\r\n\r\n\t_initPath: function () {\r\n\t\tthis._container = this._createElement('g');\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\r\n\t\tif (this.options.className) {\r\n\t\t\tL.DomUtil.addClass(this._path, this.options.className);\r\n\t\t}\r\n\r\n\t\tthis._container.appendChild(this._path);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke-linejoin', 'round');\r\n\t\t\tthis._path.setAttribute('stroke-linecap', 'round');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill-rule', 'evenodd');\r\n\t\t}\r\n\t\tif (this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', this.options.pointerEvents);\r\n\t\t}\r\n\t\tif (!this.options.clickable && !this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', 'none');\r\n\t\t}\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke', this.options.color);\r\n\t\t\tthis._path.setAttribute('stroke-opacity', this.options.opacity);\r\n\t\t\tthis._path.setAttribute('stroke-width', this.options.weight);\r\n\t\t\tif (this.options.dashArray) {\r\n\t\t\t\tthis._path.setAttribute('stroke-dasharray', this.options.dashArray);\r\n\t\t\t} else {\r\n\t\t\t\tthis._path.removeAttribute('stroke-dasharray');\r\n\t\t\t}\r\n\t\t\tif (this.options.lineCap) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linecap', this.options.lineCap);\r\n\t\t\t}\r\n\t\t\tif (this.options.lineJoin) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linejoin', this.options.lineJoin);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('stroke', 'none');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill', this.options.fillColor || this.options.color);\r\n\t\t\tthis._path.setAttribute('fill-opacity', this.options.fillOpacity);\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('fill', 'none');\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar str = this.getPathString();\r\n\t\tif (!str) {\r\n\t\t\t// fix webkit empty string parsing bug\r\n\t\t\tstr = 'M0 0';\r\n\t\t}\r\n\t\tthis._path.setAttribute('d', str);\r\n\t},\r\n\r\n\t// TODO remove duplication with L.Map\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\tif (L.Browser.svg || !L.Browser.vml) {\r\n\t\t\t\tL.DomUtil.addClass(this._path, 'leaflet-clickable');\r\n\t\t\t}\r\n\r\n\t\t\tL.DomEvent.on(this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\t\tvar events = ['dblclick', 'mousedown', 'mouseover',\r\n\t\t\t 'mouseout', 'mousemove', 'contextmenu'];\r\n\t\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\t\tL.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this.hasEventListeners(e.type)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t containerPoint = map.mouseEventToContainerPoint(e),\r\n\t\t layerPoint = map.containerPointToLayerPoint(containerPoint),\r\n\t\t latlng = map.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\r\n\t\tif (e.type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousemove') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_initPathRoot: function () {\r\n\t\tif (!this._pathRoot) {\r\n\t\t\tthis._pathRoot = L.Path.prototype._createElement('svg');\r\n\t\t\tthis._panes.overlayPane.appendChild(this._pathRoot);\r\n\r\n\t\t\tif (this.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');\r\n\r\n\t\t\t\tthis.on({\r\n\t\t\t\t\t'zoomanim': this._animatePathZoom,\r\n\t\t\t\t\t'zoomend': this._endPathZoom\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');\r\n\t\t\t}\r\n\r\n\t\t\tthis.on('moveend', this._updateSvgViewport);\r\n\t\t\tthis._updateSvgViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_animatePathZoom: function (e) {\r\n\t\tvar scale = this.getZoomScale(e.zoom),\r\n\t\t offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);\r\n\r\n\t\tthis._pathRoot.style[L.DomUtil.TRANSFORM] =\r\n\t\t L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';\r\n\r\n\t\tthis._pathZooming = true;\r\n\t},\r\n\r\n\t_endPathZoom: function () {\r\n\t\tthis._pathZooming = false;\r\n\t},\r\n\r\n\t_updateSvgViewport: function () {\r\n\r\n\t\tif (this._pathZooming) {\r\n\t\t\t// Do not update SVGs while a zoom animation is going on otherwise the animation will break.\r\n\t\t\t// When the zoom animation ends we will be updated again anyway\r\n\t\t\t// This fixes the case where you do a momentum move and zoom while the move is still ongoing.\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t min = vp.min,\r\n\t\t max = vp.max,\r\n\t\t width = max.x - min.x,\r\n\t\t height = max.y - min.y,\r\n\t\t root = this._pathRoot,\r\n\t\t pane = this._panes.overlayPane;\r\n\r\n\t\t// Hack to make flicker on drag end on mobile webkit less irritating\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.removeChild(root);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.setAttribute('width', width);\r\n\t\troot.setAttribute('height', height);\r\n\t\troot.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));\r\n\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.appendChild(root);\r\n\t\t}\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.\r\n */\r\n\r\nL.Path.include({\r\n\r\n\tbindPopup: function (content, options) {\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tthis._popup = content;\r\n\t\t} else {\r\n\t\t\tif (!this._popup || options) {\r\n\t\t\t\tthis._popup = new L.Popup(options, this);\r\n\t\t\t}\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t .on('click', this._openPopup, this)\r\n\t\t\t .on('remove', this.closePopup, this);\r\n\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t .off('click', this._openPopup)\r\n\t\t\t .off('remove', this.closePopup);\r\n\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\r\n\t\tif (this._popup) {\r\n\t\t\t// open the popup from one of the path's points if not specified\r\n\t\t\tlatlng = latlng || this._latlng ||\r\n\t\t\t this._latlngs[Math.floor(this._latlngs.length / 2)];\r\n\r\n\t\t\tthis._openPopup({latlng: latlng});\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t\tthis._map.openPopup(this._popup);\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for IE6-8 through VML.\r\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\r\n */\r\n\r\nL.Browser.vml = !L.Browser.svg && (function () {\r\n\ttry {\r\n\t\tvar div = document.createElement('div');\r\n\t\tdiv.innerHTML = '';\r\n\r\n\t\tvar shape = div.firstChild;\r\n\t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n\t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}());\r\n\r\nL.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\tVML: true,\r\n\t\tCLIP_PADDING: 0.02\r\n\t},\r\n\r\n\t_createElement: (function () {\r\n\t\ttry {\r\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement('');\r\n\t\t\t};\r\n\t\t} catch (e) {\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement(\r\n\t\t\t\t '<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\r\n\t\t\t};\r\n\t\t}\r\n\t}()),\r\n\r\n\t_initPath: function () {\r\n\t\tvar container = this._container = this._createElement('shape');\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape' +\r\n\t\t\t(this.options.className ? ' ' + this.options.className : ''));\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tL.DomUtil.addClass(container, 'leaflet-clickable');\r\n\t\t}\r\n\r\n\t\tcontainer.coordsize = '1 1';\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\t\tcontainer.appendChild(this._path);\r\n\r\n\t\tthis._map._pathRoot.appendChild(container);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar stroke = this._stroke,\r\n\t\t fill = this._fill,\r\n\t\t options = this.options,\r\n\t\t container = this._container;\r\n\r\n\t\tcontainer.stroked = options.stroke;\r\n\t\tcontainer.filled = options.fill;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tif (!stroke) {\r\n\t\t\t\tstroke = this._stroke = this._createElement('stroke');\r\n\t\t\t\tstroke.endcap = 'round';\r\n\t\t\t\tcontainer.appendChild(stroke);\r\n\t\t\t}\r\n\t\t\tstroke.weight = options.weight + 'px';\r\n\t\t\tstroke.color = options.color;\r\n\t\t\tstroke.opacity = options.opacity;\r\n\r\n\t\t\tif (options.dashArray) {\r\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\r\n\t\t\t\t options.dashArray.join(' ') :\r\n\t\t\t\t options.dashArray.replace(/( *, *)/g, ' ');\r\n\t\t\t} else {\r\n\t\t\t\tstroke.dashStyle = '';\r\n\t\t\t}\r\n\t\t\tif (options.lineCap) {\r\n\t\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\r\n\t\t\t}\r\n\t\t\tif (options.lineJoin) {\r\n\t\t\t\tstroke.joinstyle = options.lineJoin;\r\n\t\t\t}\r\n\r\n\t\t} else if (stroke) {\r\n\t\t\tcontainer.removeChild(stroke);\r\n\t\t\tthis._stroke = null;\r\n\t\t}\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tif (!fill) {\r\n\t\t\t\tfill = this._fill = this._createElement('fill');\r\n\t\t\t\tcontainer.appendChild(fill);\r\n\t\t\t}\r\n\t\t\tfill.color = options.fillColor || options.color;\r\n\t\t\tfill.opacity = options.fillOpacity;\r\n\r\n\t\t} else if (fill) {\r\n\t\t\tcontainer.removeChild(fill);\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar style = this._container.style;\r\n\r\n\t\tstyle.display = 'none';\r\n\t\tthis._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug\r\n\t\tstyle.display = '';\r\n\t}\r\n});\r\n\r\nL.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tif (this._pathRoot) { return; }\r\n\r\n\t\tvar root = this._pathRoot = document.createElement('div');\r\n\t\troot.className = 'leaflet-vml-container';\r\n\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\tthis.on('moveend', this._updatePathViewport);\r\n\t\tthis._updatePathViewport();\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for all browsers that support canvas.\r\n */\r\n\r\nL.Browser.canvas = (function () {\r\n\treturn !!document.createElement('canvas').getContext;\r\n}());\r\n\r\nL.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\t//CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value\r\n\t\tCANVAS: true,\r\n\t\tSVG: false\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateStyle();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('viewreset', this.projectLatlngs, this)\r\n\t\t .off('moveend', this._updatePath, this);\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tthis._map.off('click', this._onClick, this);\r\n\t\t\tthis._map.off('mousemove', this._onMouseMove, this);\r\n\t\t}\r\n\r\n\t\tthis._requestUpdate();\r\n\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\t_requestUpdate: function () {\r\n\t\tif (this._map && !L.Path._updateRequest) {\r\n\t\t\tL.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMapMoveEnd: function () {\r\n\t\tL.Path._updateRequest = null;\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._ctx = this._map._canvasCtx;\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tthis._ctx.lineWidth = options.weight;\r\n\t\t\tthis._ctx.strokeStyle = options.color;\r\n\t\t}\r\n\t\tif (options.fill) {\r\n\t\t\tthis._ctx.fillStyle = options.fillColor || options.color;\r\n\t\t}\r\n\t},\r\n\r\n\t_drawPath: function () {\r\n\t\tvar i, j, len, len2, point, drawMethod;\r\n\r\n\t\tthis._ctx.beginPath();\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tfor (j = 0, len2 = this._parts[i].length; j < len2; j++) {\r\n\t\t\t\tpoint = this._parts[i][j];\r\n\t\t\t\tdrawMethod = (j === 0 ? 'move' : 'line') + 'To';\r\n\r\n\t\t\t\tthis._ctx[drawMethod](point.x, point.y);\r\n\t\t\t}\r\n\t\t\t// TODO refactor ugly hack\r\n\t\t\tif (this instanceof L.Polygon) {\r\n\t\t\t\tthis._ctx.closePath();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\treturn !this._parts.length;\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (this._checkIfEmpty()) { return; }\r\n\r\n\t\tvar ctx = this._ctx,\r\n\t\t options = this.options;\r\n\r\n\t\tthis._drawPath();\r\n\t\tctx.save();\r\n\t\tthis._updateStyle();\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tctx.globalAlpha = options.fillOpacity;\r\n\t\t\tctx.fill();\r\n\t\t}\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tctx.globalAlpha = options.opacity;\r\n\t\t\tctx.stroke();\r\n\t\t}\r\n\r\n\t\tctx.restore();\r\n\r\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\t// TODO dblclick\r\n\t\t\tthis._map.on('mousemove', this._onMouseMove, this);\r\n\t\t\tthis._map.on('click', this._onClick, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_onClick: function (e) {\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis.fire('click', e);\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseMove: function (e) {\r\n\t\tif (!this._map || this._map._animatingZoom) { return; }\r\n\r\n\t\t// TODO don't do on each move\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis._ctx.canvas.style.cursor = 'pointer';\r\n\t\t\tthis._mouseInside = true;\r\n\t\t\tthis.fire('mouseover', e);\r\n\r\n\t\t} else if (this._mouseInside) {\r\n\t\t\tthis._ctx.canvas.style.cursor = '';\r\n\t\t\tthis._mouseInside = false;\r\n\t\t\tthis.fire('mouseout', e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tvar root = this._pathRoot,\r\n\t\t ctx;\r\n\r\n\t\tif (!root) {\r\n\t\t\troot = this._pathRoot = document.createElement('canvas');\r\n\t\t\troot.style.position = 'absolute';\r\n\t\t\tctx = this._canvasCtx = root.getContext('2d');\r\n\r\n\t\t\tctx.lineCap = 'round';\r\n\t\t\tctx.lineJoin = 'round';\r\n\r\n\t\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\t\tif (this.options.zoomAnimation) {\r\n\t\t\t\tthis._pathRoot.className = 'leaflet-zoom-animated';\r\n\t\t\t\tthis.on('zoomanim', this._animatePathZoom);\r\n\t\t\t\tthis.on('zoomend', this._endPathZoom);\r\n\t\t\t}\r\n\t\t\tthis.on('moveend', this._updateCanvasViewport);\r\n\t\t\tthis._updateCanvasViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_updateCanvasViewport: function () {\r\n\t\t// don't redraw while zooming. See _updateSvgViewport for more details\r\n\t\tif (this._pathZooming) { return; }\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t min = vp.min,\r\n\t\t size = vp.max.subtract(min),\r\n\t\t root = this._pathRoot;\r\n\r\n\t\t//TODO check if this works properly on mobile webkit\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.width = size.x;\r\n\t\troot.height = size.y;\r\n\t\troot.getContext('2d').translate(-min.x, -min.y);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LineUtil contains different utility functions for line segments\r\n * and polylines (clipping, simplification, distances, etc.)\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations for this file\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\tsimplify: function (/*Point[]*/ points, /*Number*/ tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// distance from a point to a segment between two points\r\n\tpointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\tclosestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\t// Cohen-Sutherland line clipping algorithm.\r\n\t// Used to avoid rendering parts of a polyline that are not currently visible.\r\n\r\n\tclipSegment: function (a, b, bounds, useLastCode) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\t} else if (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t// other cases\r\n\t\t\t} else {\r\n\t\t\t\tcodeOut = codeA || codeB;\r\n\t\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds);\r\n\t\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\t\tif (codeOut === codeA) {\r\n\t\t\t\t\ta = p;\r\n\t\t\t\t\tcodeA = newCode;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb = p;\r\n\t\t\t\t\tcodeB = newCode;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t dy = b.y - a.y,\r\n\t\t min = bounds.min,\r\n\t\t max = bounds.max;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\treturn new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\treturn new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);\r\n\t\t} else if (code & 2) { // right\r\n\t\t\treturn new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);\r\n\t\t} else if (code & 1) { // left\r\n\t\t\treturn new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);\r\n\t\t}\r\n\t},\r\n\r\n\t_getBitCode: function (/*Point*/ p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t y = p1.y,\r\n\t\t dx = p2.x - x,\r\n\t\t dy = p2.y - y,\r\n\t\t dot = dx * dx + dy * dy,\r\n\t\t t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.Polyline is used to display polylines on a map.\r\n */\r\n\r\nL.Polyline = L.Path.extend({\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// how much to simplify the polyline on each zoom level\r\n\t\t// more = better performance and smoother look, less = more accurate\r\n\t\tsmoothFactor: 1.0,\r\n\t\tnoClip: false\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._originalPoints = [];\r\n\r\n\t\tfor (var i = 0, len = this._latlngs.length; i < len; i++) {\r\n\t\t\tthis._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tfor (var i = 0, len = this._parts.length, str = ''; i < len; i++) {\r\n\t\t\tstr += this._getPathPartStr(this._parts[i]);\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\tgetLatLngs: function () {\r\n\t\treturn this._latlngs;\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\taddLatLng: function (latlng) {\r\n\t\tthis._latlngs.push(L.latLng(latlng));\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tspliceLatLngs: function () { // (Number index, Number howMany)\r\n\t\tvar removed = [].splice.apply(this._latlngs, arguments);\r\n\t\tthis._convertLatLngs(this._latlngs, true);\r\n\t\tthis.redraw();\r\n\t\treturn removed;\r\n\t},\r\n\r\n\tclosestLayerPoint: function (p) {\r\n\t\tvar minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;\r\n\r\n\t\tfor (var j = 0, jLen = parts.length; j < jLen; j++) {\r\n\t\t\tvar points = parts[j];\r\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\r\n\t\t\t\tp1 = points[i - 1];\r\n\t\t\t\tp2 = points[i];\r\n\t\t\t\tvar sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);\r\n\t\t\t\tif (sqDist < minDistance) {\r\n\t\t\t\t\tminDistance = sqDist;\r\n\t\t\t\t\tminPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (minPoint) {\r\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\r\n\t\t}\r\n\t\treturn minPoint;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\treturn new L.LatLngBounds(this.getLatLngs());\r\n\t},\r\n\r\n\t_convertLatLngs: function (latlngs, overwrite) {\r\n\t\tvar i, len, target = overwrite ? latlngs : [];\r\n\r\n\t\tfor (i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tif (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttarget[i] = L.latLng(latlngs[i]);\r\n\t\t}\r\n\t\treturn target;\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tL.Path.prototype._initEvents.call(this);\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar round = L.Path.VML;\r\n\r\n\t\tfor (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {\r\n\t\t\tp = points[j];\r\n\t\t\tif (round) {\r\n\t\t\t\tp._round();\r\n\t\t\t}\r\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t len = points.length,\r\n\t\t i, k, segment;\r\n\r\n\t\tif (this.options.noClip) {\r\n\t\t\tthis._parts = [points];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._parts = [];\r\n\r\n\t\tvar parts = this._parts,\r\n\t\t vp = this._map._pathViewport,\r\n\t\t lu = L.LineUtil;\r\n\r\n\t\tfor (i = 0, k = 0; i < len - 1; i++) {\r\n\t\t\tsegment = lu.clipSegment(points[i], points[i + 1], vp, i);\r\n\t\t\tif (!segment) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tparts[k] = parts[k] || [];\r\n\t\t\tparts[k].push(segment[0]);\r\n\r\n\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\r\n\t\t\tif ((segment[1] !== points[i + 1]) || (i === len - 2)) {\r\n\t\t\t\tparts[k].push(segment[1]);\r\n\t\t\t\tk++;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// simplify each clipped part of the polyline\r\n\t_simplifyPoints: function () {\r\n\t\tvar parts = this._parts,\r\n\t\t lu = L.LineUtil;\r\n\r\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\r\n\t\t\tparts[i] = lu.simplify(parts[i], this.options.smoothFactor);\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._clipPoints();\r\n\t\tthis._simplifyPoints();\r\n\r\n\t\tL.Path.prototype._updatePath.call(this);\r\n\t}\r\n});\r\n\r\nL.polyline = function (latlngs, options) {\r\n\treturn new L.Polyline(latlngs, options);\r\n};\r\n\n\n/*\r\n * L.PolyUtil contains utility functions for polygons (clipping, etc.).\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations here\r\n\r\nL.PolyUtil = {};\r\n\r\n/*\r\n * Sutherland-Hodgeman polygon clipping algorithm.\r\n * Used to avoid rendering parts of a polygon that are not currently visible.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds) {\r\n\tvar clippedPoints,\r\n\t edges = [1, 4, 2, 8],\r\n\t i, j, k,\r\n\t a, b,\r\n\t len, edge, p,\r\n\t lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n\n/*\r\n * L.Polygon is used to display polygons on a map.\r\n */\r\n\r\nL.Polygon = L.Polyline.extend({\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Polyline.prototype.initialize.call(this, latlngs, options);\r\n\t\tthis._initWithHoles(latlngs);\r\n\t},\r\n\r\n\t_initWithHoles: function (latlngs) {\r\n\t\tvar i, len, hole;\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._latlngs = this._convertLatLngs(latlngs[0]);\r\n\t\t\tthis._holes = latlngs.slice(1);\r\n\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = this._holes[i] = this._convertLatLngs(this._holes[i]);\r\n\t\t\t\tif (hole[0].equals(hole[hole.length - 1])) {\r\n\t\t\t\t\thole.pop();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// filter out last point if its equal to the first one\r\n\t\tlatlngs = this._latlngs;\r\n\r\n\t\tif (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {\r\n\t\t\tlatlngs.pop();\r\n\t\t}\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tL.Polyline.prototype.projectLatlngs.call(this);\r\n\r\n\t\t// project polygon holes points\r\n\t\t// TODO move this logic to Polyline to get rid of duplication\r\n\t\tthis._holePoints = [];\r\n\r\n\t\tif (!this._holes) { return; }\r\n\r\n\t\tvar i, j, len, len2;\r\n\r\n\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\tthis._holePoints[i] = [];\r\n\r\n\t\t\tfor (j = 0, len2 = this._holes[i].length; j < len2; j++) {\r\n\t\t\t\tthis._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._initWithHoles(latlngs);\r\n\t\t\treturn this.redraw();\r\n\t\t} else {\r\n\t\t\treturn L.Polyline.prototype.setLatLngs.call(this, latlngs);\r\n\t\t}\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t newParts = [];\r\n\r\n\t\tthis._parts = [points].concat(this._holePoints);\r\n\r\n\t\tif (this.options.noClip) { return; }\r\n\r\n\t\tfor (var i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tvar clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);\r\n\t\t\tif (clipped.length) {\r\n\t\t\t\tnewParts.push(clipped);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._parts = newParts;\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar str = L.Polyline.prototype._getPathPartStr.call(this, points);\r\n\t\treturn str + (L.Browser.svg ? 'z' : 'x');\r\n\t}\r\n});\r\n\r\nL.polygon = function (latlngs, options) {\r\n\treturn new L.Polygon(latlngs, options);\r\n};\r\n\n\n/*\r\n * Contains L.MultiPolyline and L.MultiPolygon layers.\r\n */\r\n\r\n(function () {\r\n\tfunction createMulti(Klass) {\r\n\r\n\t\treturn L.FeatureGroup.extend({\r\n\r\n\t\t\tinitialize: function (latlngs, options) {\r\n\t\t\t\tthis._layers = {};\r\n\t\t\t\tthis._options = options;\r\n\t\t\t\tthis.setLatLngs(latlngs);\r\n\t\t\t},\r\n\r\n\t\t\tsetLatLngs: function (latlngs) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t len = latlngs.length;\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tif (i < len) {\r\n\t\t\t\t\t\tlayer.setLatLngs(latlngs[i++]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.removeLayer(layer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, this);\r\n\r\n\t\t\t\twhile (i < len) {\r\n\t\t\t\t\tthis.addLayer(new Klass(latlngs[i++], this._options));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\tgetLatLngs: function () {\r\n\t\t\t\tvar latlngs = [];\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tlatlngs.push(layer.getLatLngs());\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn latlngs;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tL.MultiPolyline = createMulti(L.Polyline);\r\n\tL.MultiPolygon = createMulti(L.Polygon);\r\n\r\n\tL.multiPolyline = function (latlngs, options) {\r\n\t\treturn new L.MultiPolyline(latlngs, options);\r\n\t};\r\n\r\n\tL.multiPolygon = function (latlngs, options) {\r\n\t\treturn new L.MultiPolygon(latlngs, options);\r\n\t};\r\n}());\r\n\n\n/*\r\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\r\n */\r\n\r\nL.Rectangle = L.Polygon.extend({\r\n\tinitialize: function (latLngBounds, options) {\r\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\r\n\t},\r\n\r\n\tsetBounds: function (latLngBounds) {\r\n\t\tthis.setLatLngs(this._boundsToLatLngs(latLngBounds));\r\n\t},\r\n\r\n\t_boundsToLatLngs: function (latLngBounds) {\r\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\r\n\t\treturn [\r\n\t\t\tlatLngBounds.getSouthWest(),\r\n\t\t\tlatLngBounds.getNorthWest(),\r\n\t\t\tlatLngBounds.getNorthEast(),\r\n\t\t\tlatLngBounds.getSouthEast()\r\n\t\t];\r\n\t}\r\n});\r\n\r\nL.rectangle = function (latLngBounds, options) {\r\n\treturn new L.Rectangle(latLngBounds, options);\r\n};\r\n\n\n/*\r\n * L.Circle is a circle overlay (with a certain radius in meters).\r\n */\r\n\r\nL.Circle = L.Path.extend({\r\n\tinitialize: function (latlng, radius, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis._mRadius = radius;\r\n\t},\r\n\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis._mRadius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t latlng = this._latlng,\r\n\t\t pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);\r\n\r\n\t\tthis._point = this._map.latLngToLayerPoint(latlng);\r\n\t\tthis._radius = Math.max(this._point.x - pointLeft.x, 1);\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t latRadius = (this._mRadius / 40075017) * 360,\r\n\t\t latlng = this._latlng;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t [latlng.lat - latRadius, latlng.lng - lngRadius],\r\n\t\t [latlng.lat + latRadius, latlng.lng + lngRadius]);\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tvar p = this._point,\r\n\t\t r = this._radius;\r\n\r\n\t\tif (this._checkIfEmpty()) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tif (L.Browser.svg) {\r\n\t\t\treturn 'M' + p.x + ',' + (p.y - r) +\r\n\t\t\t 'A' + r + ',' + r + ',0,1,1,' +\r\n\t\t\t (p.x - 0.1) + ',' + (p.y - r) + ' z';\r\n\t\t} else {\r\n\t\t\tp._round();\r\n\t\t\tr = Math.round(r);\r\n\t\t\treturn 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);\r\n\t\t}\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._mRadius;\r\n\t},\r\n\r\n\t// TODO Earth hardcoded, move into projection code!\r\n\r\n\t_getLatRadius: function () {\r\n\t\treturn (this._mRadius / 40075017) * 360;\r\n\t},\r\n\r\n\t_getLngRadius: function () {\r\n\t\treturn this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar vp = this._map._pathViewport,\r\n\t\t r = this._radius,\r\n\t\t p = this._point;\r\n\r\n\t\treturn p.x - r > vp.max.x || p.y - r > vp.max.y ||\r\n\t\t p.x + r < vp.min.x || p.y + r < vp.min.y;\r\n\t}\r\n});\r\n\r\nL.circle = function (latlng, radius, options) {\r\n\treturn new L.Circle(latlng, radius, options);\r\n};\r\n\n\n/*\r\n * L.CircleMarker is a circle overlay with a permanent pixel radius.\r\n */\r\n\r\nL.CircleMarker = L.Circle.extend({\r\n\toptions: {\r\n\t\tradius: 10,\r\n\t\tweight: 2\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.Circle.prototype.initialize.call(this, latlng, null, options);\r\n\t\tthis._radius = this.options.radius;\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\r\n\t},\r\n\r\n\t_updateStyle : function () {\r\n\t\tL.Circle.prototype._updateStyle.call(this);\r\n\t\tthis.setRadius(this.options.radius);\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tL.Circle.prototype.setLatLng.call(this, latlng);\r\n\t\tif (this._popup && this._popup._isOpen) {\r\n\t\t\tthis._popup.setLatLng(latlng);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis.options.radius = this._radius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._radius;\r\n\t}\r\n});\r\n\r\nL.circleMarker = function (latlng, options) {\r\n\treturn new L.CircleMarker(latlng, options);\r\n};\r\n\n\n/*\r\n * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.\r\n */\r\n\r\nL.Polyline.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p, closed) {\r\n\t\tvar i, j, k, len, len2, dist, part,\r\n\t\t w = this.options.weight / 2;\r\n\r\n\t\tif (L.Browser.touch) {\r\n\t\t\tw += 10; // polyline click tolerance on touch devices\r\n\t\t}\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tif (!closed && (j === 0)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);\r\n\r\n\t\t\t\tif (dist <= w) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.\r\n */\r\n\r\nL.Polygon.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p) {\r\n\t\tvar inside = false,\r\n\t\t part, p1, p2,\r\n\t\t i, j, k,\r\n\t\t len, len2;\r\n\r\n\t\t// TODO optimization: check if within bounds first\r\n\r\n\t\tif (L.Polyline.prototype._containsPoint.call(this, p, true)) {\r\n\t\t\t// click on polygon border\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// ray casting algorithm for detecting if point is in polygon\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tp1 = part[j];\r\n\t\t\t\tp2 = part[k];\r\n\r\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) &&\r\n\t\t\t\t\t\t(p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\r\n\t\t\t\t\tinside = !inside;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn inside;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Circle with Canvas-specific code.\r\n */\r\n\r\nL.Circle.include(!L.Path.CANVAS ? {} : {\r\n\t_drawPath: function () {\r\n\t\tvar p = this._point;\r\n\t\tthis._ctx.beginPath();\r\n\t\tthis._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);\r\n\t},\r\n\r\n\t_containsPoint: function (p) {\r\n\t\tvar center = this._point,\r\n\t\t w2 = this.options.stroke ? this.options.weight / 2 : 0;\r\n\r\n\t\treturn (p.distanceTo(center) <= this._radius + w2);\r\n\t}\r\n});\r\n\n\n/*\n * CircleMarker canvas specific drawing parts.\n */\n\nL.CircleMarker.include(!L.Path.CANVAS ? {} : {\n\t_updateStyle: function () {\n\t\tL.Path.prototype._updateStyle.call(this);\n\t}\n});\n\n\n/*\r\n * L.GeoJSON turns any GeoJSON data into a Leaflet layer.\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// Only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(features[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\tresetStyle: function (layer) {\r\n\t\tvar style = this.options.style;\r\n\t\tif (style) {\r\n\t\t\t// reset any custom styles\r\n\t\t\tL.Util.extend(layer.options, layer.defaultOptions);\r\n\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.extend(L.GeoJSON, {\r\n\tgeometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t coords = geometry.coordinates,\r\n\t\t layers = [],\r\n\t\t latlng, latlngs, i, len;\r\n\r\n\t\tcoordsToLatLng = coordsToLatLng || this.coordsToLatLng;\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'Polygon':\r\n\t\t\tif (coords.length === 2 && !coords[1].length) {\r\n\t\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t\t}\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\r\n\t\t\t\tlayers.push(this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, pointToLayer, coordsToLatLng, vectorOptions));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\tcoordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array\r\n\t\tvar latlng, i, len,\r\n\t\t latlngs = [];\r\n\r\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\tlatLngToCoords: function (latlng) {\r\n\t\tvar coords = [latlng.lng, latlng.lat];\r\n\r\n\t\tif (latlng.alt !== undefined) {\r\n\t\t\tcoords.push(latlng.alt);\r\n\t\t}\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tlatLngsToCoords: function (latLngs) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latLngs.length; i < len; i++) {\r\n\t\t\tcoords.push(L.GeoJSON.latLngToCoords(latLngs[i]));\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\tasFeature: function (geoJSON) {\r\n\t\tif (geoJSON.type === 'Feature') {\r\n\t\t\treturn geoJSON;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geoJSON\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\nL.Marker.include(PointToGeoJSON);\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\nL.Polyline.include({\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'LineString',\r\n\t\t\tcoordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())\r\n\t\t});\r\n\t}\r\n});\r\n\r\nL.Polygon.include({\r\n\ttoGeoJSON: function () {\r\n\t\tvar coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],\r\n\t\t i, len, hole;\r\n\r\n\t\tcoords[0].push(coords[0][0]);\r\n\r\n\t\tif (this._holes) {\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = L.GeoJSON.latLngsToCoords(this._holes[i]);\r\n\t\t\t\thole.push(hole[0]);\r\n\t\t\t\tcoords.push(hole);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Polygon',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n(function () {\r\n\tfunction multiToGeoJSON(type) {\r\n\t\treturn function () {\r\n\t\t\tvar coords = [];\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t\t});\r\n\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\ttype: type,\r\n\t\t\t\tcoordinates: coords\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\tL.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});\r\n\tL.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});\r\n\r\n\tL.LayerGroup.include({\r\n\t\ttoGeoJSON: function () {\r\n\r\n\t\t\tvar geometry = this.feature && this.feature.geometry,\r\n\t\t\t\tjsons = [],\r\n\t\t\t\tjson;\r\n\r\n\t\t\tif (geometry && geometry.type === 'MultiPoint') {\r\n\t\t\t\treturn multiToGeoJSON('MultiPoint').call(this);\r\n\t\t\t}\r\n\r\n\t\t\tvar isGeometryCollection = geometry && geometry.type === 'GeometryCollection';\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\t\tjson = layer.toGeoJSON();\r\n\t\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (isGeometryCollection) {\r\n\t\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\t\tgeometries: jsons,\r\n\t\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'FeatureCollection',\r\n\t\t\t\tfeatures: jsons\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}());\r\n\r\nL.geoJson = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n\n\n/*\r\n * L.DomEvent contains functions for working with DOM events.\r\n */\r\n\r\nL.DomEvent = {\r\n\t/* inspired by John Resig, Dean Edwards and YUI addEvent implementations */\r\n\taddListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t key = '_leaflet_' + type + id,\r\n\t\t handler, originalHandler, newType;\r\n\r\n\t\tif (obj[key]) { return this; }\r\n\r\n\t\thandler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || L.DomEvent._getEvent());\r\n\t\t};\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\treturn this.addPointerListener(obj, type, handler, id);\r\n\t\t}\r\n\t\tif (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\t\t}\r\n\r\n\t\tif ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\tnewType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');\r\n\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\tif (!L.DomEvent._checkMouse(obj, e)) { return; }\r\n\t\t\t\t\treturn originalHandler(e);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(newType, handler, false);\r\n\r\n\t\t\t} else if (type === 'click' && L.Browser.android) {\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveListener: function (obj, type, fn) { // (HTMLElement, String, Function)\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t key = '_leaflet_' + type + id,\r\n\t\t handler = obj[key];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\tobj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\t\t\t}\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdisableScrollPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'mousewheel', stop)\r\n\t\t\t.on(el, 'MozMousePixelScroll', stop);\r\n\t},\r\n\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(el, L.Draggable.START[i], stop);\r\n\t\t}\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'click', L.DomEvent._fakeStop)\r\n\t\t\t.on(el, 'dblclick', stop);\r\n\t},\r\n\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\tgetWheelDelta: function (e) {\r\n\r\n\t\tvar delta = 0;\r\n\r\n\t\tif (e.wheelDelta) {\r\n\t\t\tdelta = e.wheelDelta / 120;\r\n\t\t}\r\n\t\tif (e.detail) {\r\n\t\t\tdelta = -e.detail / 3;\r\n\t\t}\r\n\t\treturn delta;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_checkMouse: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t_getEvent: function () { // evil magic for IE\r\n\t\t/*jshint noarg:false */\r\n\t\tvar e = window.event;\r\n\t\tif (!e) {\r\n\t\t\tvar caller = arguments.callee.caller;\r\n\t\t\twhile (caller) {\r\n\t\t\t\te = caller['arguments'][0];\r\n\t\t\t\tif (e && window.Event === e.constructor) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcaller = caller.caller;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn e;\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || e.originalEvent.timeStamp),\r\n\t\t\telapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 1000ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\treturn handler(e);\r\n\t}\r\n};\r\n\r\nL.DomEvent.on = L.DomEvent.addListener;\r\nL.DomEvent.off = L.DomEvent.removeListener;\r\n\n\n/*\r\n * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.\r\n */\r\n\r\nL.Draggable = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (element, dragStartTarget) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\r\n\t\tL.DomEvent.stopPropagation(e);\r\n\r\n\t\tif (L.Draggable._disabled) { return; }\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\t\tthis._startPos = this._newPos = L.DomUtil.getPosition(this._element);\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t .on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\t\t\tL.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tthis.fire('predrag');\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\t\tthis.fire('drag');\r\n\t},\r\n\r\n\t_onUp: function (e) {\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\t\tL.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target');\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t .off(document, L.Draggable.MOVE[i], this._onMove)\r\n\t\t\t .off(document, L.Draggable.END[i], this._onUp);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t}\r\n});\r\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\tenable: function () {\n\t\tif (this._enabled) { return; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t},\n\n\tdisable: function () {\n\t\tif (!this._enabled) { return; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t},\n\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n});\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdragging: true,\n\n\tinertia: !L.Browser.android23,\n\tinertiaDeceleration: 3400, // px/s^2\n\tinertiaMaxSpeed: Infinity, // px/s\n\tinertiaThreshold: L.Browser.touch ? 32 : 18, // ms\n\teaseLinearity: 0.25,\n\n\t// TODO refactor, move to CRS\n\tworldCopyJump: false\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\t'dragstart': this._onDragStart,\n\t\t\t\t'drag': this._onDrag,\n\t\t\t\t'dragend': this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDrag, this);\n\t\t\t\tmap.on('viewreset', this._onViewReset, this);\n\n\t\t\t\tmap.whenReady(this._onViewReset, this);\n\t\t\t}\n\t\t}\n\t\tthis._draggable.enable();\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tmap\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function () {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t pos = this._lastPos = this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 200) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t .fire('move')\n\t\t .fire('drag');\n\t},\n\n\t_onViewReset: function () {\n\t\t// TODO fix hardcoded Earth values\n\t\tvar pxCenter = this._map.getSize()._divideBy(2),\n\t\t pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.project([0, 180]).x;\n\t},\n\n\t_onPreDrag: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t halfWidth = Math.round(worldWidth / 2),\n\t\t dx = this._initialWorldOffset,\n\t\t x = this._draggable._newPos.x,\n\t\t newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t options = map.options,\n\t\t delay = +new Date() - this._lastTime,\n\n\t\t noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t duration = (this._lastTime + delay - this._times[0]) / 1000,\n\t\t\t ease = options.easeLinearity,\n\n\t\t\t speedVector = direction.multiplyBy(ease / duration),\n\t\t\t speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x || !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\nL.Map.mergeOptions({\n\tscrollWheelZoom: true\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t\tL.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);\n\t\tL.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(40 - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.preventDefault(e);\n\t\tL.DomEvent.stopPropagation(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t delta = this._delta,\n\t\t zoom = map.getZoom();\n\n\t\tdelta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t\tdelta = Math.max(Math.min(delta, 4), -4);\n\t\tdelta = map._limitZoom(zoom + delta) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last,\r\n\t\t doubleTap = false,\r\n\t\t delay = 250,\r\n\t\t touch,\r\n\t\t pre = '_leaflet_',\r\n\t\t touchstart = this._touchstart,\r\n\t\t touchend = this._touchend,\r\n\t\t trackedTouches = [];\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\ttrackedTouches.push(e.pointerId);\r\n\t\t\t\tcount = trackedTouches.length;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\t\t\tif (count > 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t\tdelta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd(e) {\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tvar idx = trackedTouches.indexOf(e.pointerId);\r\n\t\t\t\tif (idx === -1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\ttrackedTouches.splice(idx, 1);\r\n\t\t\t}\r\n\r\n\t\t\tif (doubleTap) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = { },\r\n\t\t\t\t\t\tprop;\r\n\r\n\t\t\t\t\t// jshint forin:false\r\n\t\t\t\t\tfor (var i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tif (typeof prop === 'function') {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop.bind(touch);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\r\n\t\t// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen\r\n\t\t// will not come through to us, so we will lose track of how many touches are ongoing\r\n\t\tvar endElement = L.Browser.pointer ? document.documentElement : obj;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tendElement.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tendElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_';\r\n\r\n\t\tobj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);\r\n\t\t(L.Browser.pointer ? document.documentElement : obj).removeEventListener(\r\n\t\t this._touchend, obj[pre + this._touchend + id], false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tdocument.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],\r\n\t\t\t\tfalse);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\t//static\n\tPOINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',\n\tPOINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',\n\tPOINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\n\t_pointers: [],\n\t_pointerDocumentListener: false,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019\n\t//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\treturn this.addPointerListenerStart(obj, type, handler, id);\n\t\tcase 'touchend':\n\t\t\treturn this.addPointerListenerEnd(obj, type, handler, id);\n\t\tcase 'touchmove':\n\t\t\treturn this.addPointerListenerMove(obj, type, handler, id);\n\t\tdefault:\n\t\t\tthrow 'Unknown touch event type';\n\t\t}\n\t},\n\n\taddPointerListenerStart: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t pointers = this._pointers;\n\n\t\tvar cb = function (e) {\n\n\t\t\tL.DomEvent.preventDefault(e);\n\n\t\t\tvar alreadyInArray = false;\n\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\talreadyInArray = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!alreadyInArray) {\n\t\t\t\tpointers.push(e);\n\t\t\t}\n\n\t\t\te.touches = pointers.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchstart' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_DOWN, cb, false);\n\n\t\t// need to also listen for end events to keep the _pointers list accurate\n\t\t// this needs to be on the body and never go away\n\t\tif (!this._pointerDocumentListener) {\n\t\t\tvar internalCb = function (e) {\n\t\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, internalCb, false);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);\n\n\t\t\tthis._pointerDocumentListener = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerMove: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tfunction cb(e) {\n\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches[i] = e;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t}\n\n\t\tobj[pre + 'touchmove' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_MOVE, cb, false);\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerEnd: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchend' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_UP, cb, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, cb, false);\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar pre = '_leaflet_',\n\t\t cb = obj[pre + type + id];\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchmove':\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchend':\n\t\t\tobj.removeEventListener(this.POINTER_UP, cb, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, cb, false);\n\t\t\tbreak;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\nL.Map.mergeOptions({\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]),\n\t\t viewCenter = map._getCenterLayerPoint();\n\n\t\tthis._startCenter = p1.add(p2)._divideBy(2);\n\t\tthis._startDist = p1.distanceTo(p2);\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tthis._centerOffset = viewCenter.subtract(this._startCenter);\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(document, 'touchmove', this._onTouchMove, this)\n\t\t .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]);\n\n\t\tthis._scale = p1.distanceTo(p2) / this._startDist;\n\t\tthis._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);\n\n\t\tif (this._scale === 1) { return; }\n\n\t\tif (!map.options.bounceAtZoomLimits) {\n\t\t\tif ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||\n\t\t\t (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tL.DomUtil.addClass(map._mapPane, 'leaflet-touching');\n\n\t\t\tmap\n\t\t\t .fire('movestart')\n\t\t\t .fire('zoomstart');\n\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\t\tthis._animRequest = L.Util.requestAnimFrame(\n\t\t this._updateOnMove, this, true, this._map._container);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_updateOnMove: function () {\n\t\tvar map = this._map,\n\t\t origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\t\t zoom = map.getScaleZoom(this._scale);\n\n\t\tmap._animateZoom(center, zoom, this._startCenter, this._scale, this._delta);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tvar map = this._map;\n\n\t\tthis._zooming = false;\n\t\tL.DomUtil.removeClass(map._mapPane, 'leaflet-touching');\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t .off(document, 'touchmove', this._onTouchMove)\n\t\t .off(document, 'touchend', this._onTouchEnd);\n\n\t\tvar origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\n\t\t oldZoom = map.getZoom(),\n\t\t floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,\n\t\t roundZoomDelta = (floatZoomDelta > 0 ?\n\t\t Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),\n\n\t\t zoom = map._limitZoom(oldZoom + roundZoomDelta),\n\t\t scale = map.getZoomScale(zoom) / this._scale;\n\n\t\tmap._animateZoom(center, zoom, origin, scale);\n\t},\n\n\t_getScaleOrigin: function () {\n\t\tvar centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);\n\t\treturn this._startCenter.add(centerOffset);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\nL.Map.mergeOptions({\n\ttap: true,\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tL.DomEvent\n\t\t\t.on(document, 'touchmove', this._onMove, this)\n\t\t\t.on(document, 'touchend', this._onUp, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent\n\t\t\t.off(document, 'touchmove', this._onMove, this)\n\t\t\t.off(document, 'touchend', this._onUp, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t type, true, true, window, 1,\n\t\t e.screenX, e.screenY,\n\t\t e.clientX, e.clientY,\n\t\t false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n/*\n * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._moved = false;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n\t\tthis._moved = false;\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tthis._moved = false;\n\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n\t\tL.DomEvent\n\t\t .on(document, 'mousemove', this._onMouseMove, this)\n\t\t .on(document, 'mouseup', this._onMouseUp, this)\n\t\t .on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n\t\t\tL.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n\t\t\t//TODO refactor: move cursor to styles\n\t\t\tthis._container.style.cursor = 'crosshair';\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tvar startPoint = this._startLayerPoint,\n\t\t box = this._box,\n\n\t\t layerPoint = this._map.mouseEventToLayerPoint(e),\n\t\t offset = layerPoint.subtract(startPoint),\n\n\t\t newPos = new L.Point(\n\t\t Math.min(layerPoint.x, startPoint.x),\n\t\t Math.min(layerPoint.y, startPoint.y));\n\n\t\tL.DomUtil.setPosition(box, newPos);\n\n\t\tthis._moved = true;\n\n\t\t// TODO refactor: remove hardcoded 4 pixels\n\t\tbox.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n\t\tbox.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tthis._pane.removeChild(this._box);\n\t\t\tthis._container.style.cursor = '';\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent\n\t\t .off(document, 'mousemove', this._onMouseMove)\n\t\t .off(document, 'mouseup', this._onMouseUp)\n\t\t .off(document, 'keydown', this._onKeyDown);\n\t},\n\n\t_onMouseUp: function (e) {\n\n\t\tthis._finish();\n\n\t\tvar map = this._map,\n\t\t layerPoint = map.mouseEventToLayerPoint(e);\n\n\t\tif (this._startLayerPoint.equals(layerPoint)) { return; }\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t map.layerPointToLatLng(this._startLayerPoint),\n\t\t map.layerPointToLatLng(layerPoint));\n\n\t\tmap.fitBounds(bounds);\n\n\t\tmap.fire('boxzoomend', {\n\t\t\tboxZoomBounds: bounds\n\t\t});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tkeyboard: true,\n\tkeyboardPanOffset: 80,\n\tkeyboardZoomOffset: 1\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft: [37],\n\t\tright: [39],\n\t\tdown: [40],\n\t\tup: [38],\n\t\tzoomIn: [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanOffset(map.options.keyboardPanOffset);\n\t\tthis._setZoomOffset(map.options.keyboardZoomOffset);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex === -1) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(container, 'focus', this._onFocus, this)\n\t\t .on(container, 'blur', this._onBlur, this)\n\t\t .on(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .on('focus', this._addHooks, this)\n\t\t .on('blur', this._removeHooks, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tvar container = this._map._container;\n\n\t\tL.DomEvent\n\t\t .off(container, 'focus', this._onFocus, this)\n\t\t .off(container, 'blur', this._onBlur, this)\n\t\t .off(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .off('focus', this._addHooks, this)\n\t\t .off('blur', this._removeHooks, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t docEl = document.documentElement,\n\t\t top = body.scrollTop || docEl.scrollTop,\n\t\t left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanOffset: function (pan) {\n\t\tvar keys = this._panKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, pan];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * pan];\n\t\t}\n\t},\n\n\t_setZoomOffset: function (zoom) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoom;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoom;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tvar key = e.keyCode,\n\t\t map = this._map;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\tmap.panBy(this._panKeys[key]);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + this._zoomKeys[key]);\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon);\n\t\t}\n\n\t\tthis._draggable\n\t\t\t.on('dragstart', this._onDragStart, this)\n\t\t\t.on('drag', this._onDrag, this)\n\t\t\t.on('dragend', this._onDragEnd, this);\n\t\tthis._draggable.enable();\n\t\tL.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable\n\t\t\t.off('dragstart', this._onDragStart, this)\n\t\t\t.off('drag', this._onDrag, this)\n\t\t\t.off('dragend', this._onDragEnd, this);\n\n\t\tthis._draggable.disable();\n\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tthis._marker\n\t\t .closePopup()\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\t},\n\n\t_onDrag: function () {\n\t\tvar marker = this._marker,\n\t\t shadow = marker._shadow,\n\t\t iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\n\t\tmarker\n\t\t .fire('move', {latlng: latlng})\n\t\t .fire('drag');\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tthis._marker\n\t\t .fire('moveend')\n\t\t .fire('dragend', e);\n\t}\n});\n\n\n/*\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\toptions: {\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveFrom: function (map) {\r\n\t\tvar pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tcorner.removeChild(this._container);\r\n\t\tthis._map = null;\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(map);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n\r\n// adds control-related methods to L.Map\r\n\r\nL.Map.include({\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.removeFrom(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t l = 'leaflet-',\r\n\t\t container = this._controlContainer =\r\n\t\t L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tthis._container.removeChild(this._controlContainer);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.Control.Zoom is used for the default zoom buttons on the map.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\t\tzoomInText: '+',\r\n\t\tzoomInTitle: 'Zoom in',\r\n\t\tzoomOutText: '-',\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t container = L.DomUtil.create('div', zoomName + ' leaflet-bar');\r\n\r\n\t\tthis._map = map;\r\n\r\n\t\tthis._zoomInButton = this._createButton(\r\n\t\t this.options.zoomInText, this.options.zoomInTitle,\r\n\t\t zoomName + '-in', container, this._zoomIn, this);\r\n\t\tthis._zoomOutButton = this._createButton(\r\n\t\t this.options.zoomOutText, this.options.zoomOutTitle,\r\n\t\t zoomName + '-out', container, this._zoomOut, this);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tthis._map.zoomIn(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tthis._map.zoomOut(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn, context) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(link, 'click', stop)\r\n\t\t .on(link, 'mousedown', stop)\r\n\t\t .on(link, 'dblclick', stop)\r\n\t\t .on(link, 'click', L.DomEvent.preventDefault)\r\n\t\t .on(link, 'click', fn, context)\r\n\t\t .on(link, 'click', this._refocusOnMap, context);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t\tclassName = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\r\n\n\n/*\r\n * L.Control.Attribution is used for displaying attribution on the map (added by default).\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\t\tprefix: 'Leaflet'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tmap\r\n\t\t .on('layeradd', this._onLayerAdd, this)\r\n\t\t .on('layerremove', this._onLayerRemove, this);\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('layeradd', this._onLayerAdd)\r\n\t\t .off('layerremove', this._onLayerRemove);\r\n\r\n\t},\r\n\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t},\r\n\r\n\t_onLayerAdd: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.addAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t},\r\n\r\n\t_onLayerRemove: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.removeAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tthis.attributionControl = (new L.Control.Attribution()).addTo(this);\r\n\t}\r\n});\r\n\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n\n/*\n * L.Control.Scale is used for displaying metric/imperial scale on the map.\n */\n\nL.Control.Scale = L.Control.extend({\n\toptions: {\n\t\tposition: 'bottomleft',\n\t\tmaxWidth: 100,\n\t\tmetric: true,\n\t\timperial: true,\n\t\tupdateWhenIdle: false\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tvar className = 'leaflet-control-scale',\n\t\t container = L.DomUtil.create('div', className),\n\t\t options = this.options;\n\n\t\tthis._addScales(options, className, container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar bounds = this._map.getBounds(),\n\t\t centerLat = bounds.getCenter().lat,\n\t\t halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),\n\t\t dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,\n\n\t\t size = this._map.getSize(),\n\t\t options = this.options,\n\t\t maxMeters = 0;\n\n\t\tif (size.x > 0) {\n\t\t\tmaxMeters = dist * (options.maxWidth / size.x);\n\t\t}\n\n\t\tthis._updateScales(options, maxMeters);\n\t},\n\n\t_updateScales: function (options, maxMeters) {\n\t\tif (options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\n\t\tif (options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters);\n\n\t\tthis._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';\n\t\tthis._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t scale = this._iScale,\n\t\t maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\n\t\t\tscale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';\n\t\t\tscale.innerHTML = miles + ' mi';\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\n\t\t\tscale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';\n\t\t\tscale.innerHTML = feet + ' ft';\n\t\t}\n\t},\n\n\t_getScaleWidth: function (ratio) {\n\t\treturn Math.round(this.options.maxWidth * ratio) - 10;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t d = num / pow10;\n\n\t\td = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n/*\r\n * L.Control.Layers is a control to allow users to switch between different layers on the map.\r\n */\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\toptions: {\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\t\tautoZIndex: true\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tmap\r\n\t\t .on('layeradd', this._onLayerChange, this)\r\n\t\t .on('layerremove', this._onLayerChange, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('layeradd', this._onLayerChange)\r\n\t\t .off('layerremove', this._onLayerChange);\r\n\t},\r\n\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\t\tdelete this._layers[id];\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t container = this._container = L.DomUtil.create('div', className);\r\n\r\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.disableClickPropagation(container)\r\n\t\t\t\t.disableScrollPropagation(container);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (this.options.collapsed) {\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(container, 'mouseover', this._expand, this)\r\n\t\t\t\t .on(container, 'mouseout', this._collapse, this);\r\n\t\t\t}\r\n\t\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\t\tlink.href = '#';\r\n\t\t\tlink.title = 'Layers';\r\n\r\n\t\t\tif (L.Browser.touch) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t\t .on(link, 'click', this._expand, this);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tL.DomEvent.on(link, 'focus', this._expand, this);\r\n\t\t\t}\r\n\t\t\t//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t\t}, this);\r\n\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t\t// TODO keyboard accessibility\r\n\t\t} else {\r\n\t\t\tthis._expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tthis._layers[id] = {\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t};\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList.innerHTML = '';\r\n\t\tthis._overlaysList.innerHTML = '';\r\n\r\n\t\tvar baseLayersPresent = false,\r\n\t\t overlaysPresent = false,\r\n\t\t i, obj;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tvar obj = this._layers[L.stamp(e.layer)];\r\n\r\n\t\tif (!obj) { return; }\r\n\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'layeradd' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '= 0) {\n\t\t\tthis._onZoomTransitionEnd();\n\t\t}\n\t},\n\n\t_nothingToAnimate: function () {\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\n\t},\n\n\t_tryAnimatedZoom: function (center, zoom, options) {\n\n\t\tif (this._animatingZoom) { return true; }\n\n\t\toptions = options || {};\n\n\t\t// don't animate if disabled, not supported or zoom difference is too large\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\n\t\t Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\n\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),\n\t\t\torigin = this._getCenterLayerPoint()._add(offset);\n\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis\n\t\t .fire('movestart')\n\t\t .fire('zoomstart');\n\n\t\tthis._animateZoom(center, zoom, origin, scale, null, true);\n\n\t\treturn true;\n\t},\n\n\t_animateZoom: function (center, zoom, origin, scale, delta, backwards) {\n\n\t\tthis._animatingZoom = true;\n\n\t\t// put transform transition on all layers with leaflet-zoom-animated class\n\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\t// remember what center/zoom to set after animation\n\t\tthis._animateToCenter = center;\n\t\tthis._animateToZoom = zoom;\n\n\t\t// disable any dragging during animation\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = true;\n\t\t}\n\n\t\tthis.fire('zoomanim', {\n\t\t\tcenter: center,\n\t\t\tzoom: zoom,\n\t\t\torigin: origin,\n\t\t\tscale: scale,\n\t\t\tdelta: delta,\n\t\t\tbackwards: backwards\n\t\t});\n\t},\n\n\t_onZoomTransitionEnd: function () {\n\n\t\tthis._animatingZoom = false;\n\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\tthis._resetView(this._animateToCenter, this._animateToZoom, true, true);\n\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = false;\n\t\t}\n\t}\n});\n\n\n/*\n\tZoom animation logic for L.TileLayer.\n*/\n\nL.TileLayer.include({\n\t_animateZoom: function (e) {\n\t\tif (!this._animating) {\n\t\t\tthis._animating = true;\n\t\t\tthis._prepareBgBuffer();\n\t\t}\n\n\t\tvar bg = this._bgBuffer,\n\t\t transform = L.DomUtil.TRANSFORM,\n\t\t initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],\n\t\t scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);\n\n\t\tbg.style[transform] = e.backwards ?\n\t\t\t\tscaleStr + ' ' + initialTransform :\n\t\t\t\tinitialTransform + ' ' + scaleStr;\n\t},\n\n\t_endZoomAnim: function () {\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\tfront.style.visibility = '';\n\t\tfront.parentNode.appendChild(front); // Bring to fore\n\n\t\t// force reflow\n\t\tL.Util.falseFn(bg.offsetWidth);\n\n\t\tthis._animating = false;\n\t},\n\n\t_clearBgBuffer: function () {\n\t\tvar map = this._map;\n\n\t\tif (map && !map._animatingZoom && !map.touchZoom._zooming) {\n\t\t\tthis._bgBuffer.innerHTML = '';\n\t\t\tthis._bgBuffer.style[L.DomUtil.TRANSFORM] = '';\n\t\t}\n\t},\n\n\t_prepareBgBuffer: function () {\n\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\t// if foreground layer doesn't have many tiles but bg layer does,\n\t\t// keep the existing bg layer and just zoom it some more\n\n\t\tvar bgLoaded = this._getLoadedTilesPercentage(bg),\n\t\t frontLoaded = this._getLoadedTilesPercentage(front);\n\n\t\tif (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {\n\n\t\t\tfront.style.visibility = 'hidden';\n\t\t\tthis._stopLoadingImages(front);\n\t\t\treturn;\n\t\t}\n\n\t\t// prepare the buffer to become the front tile pane\n\t\tbg.style.visibility = 'hidden';\n\t\tbg.style[L.DomUtil.TRANSFORM] = '';\n\n\t\t// switch out the current layer to be the new bg layer (and vice-versa)\n\t\tthis._tileContainer = bg;\n\t\tbg = this._bgBuffer = front;\n\n\t\tthis._stopLoadingImages(bg);\n\n\t\t//prevent bg buffer from clearing right after zoom\n\t\tclearTimeout(this._clearBgBufferTimer);\n\t},\n\n\t_getLoadedTilesPercentage: function (container) {\n\t\tvar tiles = container.getElementsByTagName('img'),\n\t\t i, len, count = 0;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\tif (tiles[i].complete) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count / len;\n\t},\n\n\t// stops loading all tiles in the background layer\n\t_stopLoadingImages: function (container) {\n\t\tvar tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),\n\t\t i, len, tile;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\ttile = tiles[i];\n\n\t\t\tif (!tile.complete) {\n\t\t\t\ttile.onload = L.Util.falseFn;\n\t\t\t\ttile.onerror = L.Util.falseFn;\n\t\t\t\ttile.src = L.Util.emptyImageUrl;\n\n\t\t\t\ttile.parentNode.removeChild(tile);\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*\r\n * Provides L.Map with convenient shortcuts for using browser geolocation features.\r\n */\r\n\r\nL.Map.include({\r\n\t_defaultLocateOptions: {\r\n\t\twatch: false,\r\n\t\tsetView: false,\r\n\t\tmaxZoom: Infinity,\r\n\t\ttimeout: 10000,\r\n\t\tmaximumAge: 0,\r\n\t\tenableHighAccuracy: false\r\n\t},\r\n\r\n\tlocate: function (/*Object*/ options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend(this._defaultLocateOptions, options);\r\n\r\n\t\tif (!navigator.geolocation) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t\tonError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t message = error.message ||\r\n\t\t (c === 1 ? 'permission denied' :\r\n\t\t (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t lng = pos.coords.longitude,\r\n\t\t latlng = new L.LatLng(lat, lng),\r\n\r\n\t\t latAccuracy = 180 * pos.coords.accuracy / 40075017,\r\n\t\t lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),\r\n\r\n\t\t bounds = L.latLngBounds(\r\n\t\t [lat - latAccuracy, lng - lngAccuracy],\r\n\t\t [lat + latAccuracy, lng + lngAccuracy]),\r\n\r\n\t\t options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);\r\n\t\t\tthis.setView(latlng, zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.fire('locationfound', data);\r\n\t}\r\n});\r\n\n\n}(window, document));"],"names":["window","document","undefined","lastId","key","oldL","L","module","exports","noConflict","this","Util","extend","dest","i","j","len","src","sources","Array","prototype","slice","call","arguments","length","hasOwnProperty","bind","fn","obj","args","apply","stamp","invokeEach","method","context","concat","limitExecByInterval","time","lock","execOnUnlock","wrapperFn","setTimeout","falseFn","formatNum","num","digits","pow","Math","round","trim","str","replace","splitWords","split","setOptions","options","getParamString","existingUrl","uppercase","params","push","encodeURIComponent","toUpperCase","indexOf","join","template","data","value","Error","isArray","Object","toString","emptyImageUrl","getPrefixed","name","prefixes","lastTime","timeoutDefer","Date","timeToCall","max","requestFn","requestAnimationFrame","cancelFn","cancelAnimationFrame","id","clearTimeout","requestAnimFrame","immediate","element","cancelAnimFrame","Class","props","NewClass","initialize","_initHooks","callInitHooks","F","proto","constructor","statics","includes","parent","__super__","_initHooksCalled","include","mergeOptions","addInitHook","init","ie","ielt9","ua","webkit","chrome","phantomjs","android","android23","gecko","mobile","msPointer","pointer","retina","doc","ie3d","webkit3d","gecko3d","opera3d","any3d","touch","r","scale","target","eventsKey","Mixin","Events","addEventListener","types","event","type","indexKey","indexLenKey","typeIndex","events","contextId","action","hasEventListeners","removeEventListener","clearAllEventListeners","listeners","splice","fireEvent","addOneTimeEventListener","handler","on","off","once","fire","navigator","userAgent","toLowerCase","search","orientation","msPointerEnabled","msMaxTouchPoints","PointerEvent","pointerEnabled","maxTouchPoints","devicePixelRatio","matchMedia","matches","documentElement","style","WebKitCSSMatrix","L_DISABLE_3D","L_NO_TOUCH","startName","div","createElement","supported","setAttribute","removeAttribute","Browser","opera","mobileWebkit","mobileWebkit3d","mobileOpera","Point","x","y","clone","add","point","_add","subtract","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","_round","floor","_floor","distanceTo","sqrt","equals","contains","abs","Bounds","a","b","points","min","getCenter","getBottomLeft","getTopRight","getSize","bounds","intersects","min2","max2","xIntersects","yIntersects","isValid","Transformation","c","d","_a","_b","_c","_d","transform","_transform","untransform","DomUtil","get","getElementById","getStyle","el","currentStyle","defaultView","css","getComputedStyle","getViewportOffset","pos","top","left","docBody","body","docEl","offsetTop","offsetLeft","parseInt","offsetParent","scrollTop","scrollLeft","width","maxWidth","getBoundingClientRect","clientLeft","parentNode","documentIsLtr","_docIsLtrCached","_docIsLtr","create","tagName","className","container","appendChild","hasClass","classList","_getClass","RegExp","test","addClass","classes","_setClass","removeClass","remove","baseVal","setOpacity","opacity","filter","filterName","filters","item","e","Enabled","Opacity","testProp","getTranslateString","is3d","close","getScaleString","origin","setPosition","disable3D","_leaflet_pos","TRANSFORM","getPosition","TRANSITION","TRANSITION_END","disableTextSelection","DomEvent","preventDefault","enableTextSelection","userSelectProperty","_userSelect","disableImageDrag","enableImageDrag","LatLng","lat","lng","alt","parseFloat","isNaN","DEG_TO_RAD","PI","RAD_TO_DEG","MAX_MARGIN","latLng","precision","other","d2r","dLat","dLon","lat1","lat2","sin1","sin","sin2","cos","R","atan2","wrap","lon","LatLngBounds","southWest","northEast","latlngs","latLngBounds","_southWest","_northEast","pad","bufferRatio","sw","ne","heightBuffer","widthBuffer","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","sw2","ne2","latIntersects","lngIntersects","toBBoxString","Projection","SphericalMercator","MAX_LATITUDE","project","latlng","log","tan","unproject","atan","exp","LonLat","CRS","latLngToPoint","zoom","projectedPoint","projection","transformation","pointToLatLng","untransformedPoint","s","Simple","EPSG3857","code","EPSG900913","EPSG4326","Map","crs","fadeAnimation","trackResize","markerZoomAnimation","_initContainer","_initLayout","_onResize","_initEvents","maxBounds","setMaxBounds","center","setView","reset","_handlers","_layers","_zoomBoundLayers","_tileLayersNum","_addLayers","layers","getZoom","_resetView","_limitZoom","setZoom","_loaded","_zoom","zoomIn","delta","zoomOut","setZoomAround","getZoomScale","viewHalf","centerOffset","latLngToContainerPoint","newCenter","containerPointToLatLng","fitBounds","getBounds","paddingTL","paddingTopLeft","padding","paddingBR","paddingBottomRight","getBoundsZoom","paddingOffset","swPoint","nePoint","maxZoom","fitWorld","panTo","pan","panBy","offset","_rawPanBy","_panInsideMaxBounds","panInsideBounds","_limitCenter","addLayer","layer","minZoom","_updateZoomLevels","zoomAnimation","TileLayer","_tileLayersToLoad","_onTileLayerLoad","_layerAdd","removeLayer","onRemove","hasLayer","eachLayer","invalidateSize","animate","oldSize","_sizeChanged","_initialCenter","newSize","oldCenter","debounceMoveend","_sizeTimer","addHandler","HandlerClass","enable","_container","_leaflet","_clearPanes","_clearControlPos","_clearHandlers","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","Infinity","inside","boundsSize","size","nw","se","zoomNotFound","_size","clientWidth","clientHeight","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_initialTopLeftPoint","getPanes","_panes","getContainer","toZoom","getScaleZoom","LN2","latLngToLayerPoint","containerPointToLayerPoint","_getMapPanePos","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","getMousePosition","mouseEventToLayerPoint","mouseEventToLatLng","position","_initPanes","_initControlPos","panes","_mapPane","mapPane","_createPane","_tilePane","tilePane","objectsPane","shadowPane","overlayPane","markerPane","popupPane","zoomHide","removeChild","preserveMapOffset","afterZoomAnim","zoomChanged","_getNewTopLeftPoint","loading","hard","_getZoomSpan","oldZoomSpan","onOff","_onMouseClick","_fireMouseEvent","_resizeRequest","_simulated","dragging","moved","boxZoom","_skipped","containerPoint","originalEvent","disable","whenReady","callback","onAdd","_latLngToNewLayerPoint","newZoom","topLeft","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","nwOffset","seOffset","dx","_rebound","dy","right","ceil","map","Mercator","R_MINOR","R_MAJOR","r2","tmp","eccent","con","ts","phi","dphi","EPSG3395","tileSize","subdomains","errorTileUrl","attribution","zoomOffset","unloadInvisibleTiles","updateWhenIdle","url","detectRetina","_url","_map","_animated","_zoomAnimated","_reset","_update","_animateZoom","_endZoomAnim","_limitedUpdate","addTo","bringToFront","pane","_setAutoZIndex","bringToBack","insertBefore","firstChild","getAttribution","_updateOpacity","setZIndex","zIndex","_updateZIndex","setUrl","noRedraw","redraw","compare","children","edgeZIndex","isFinite","tiles","_tiles","_bgBuffer","_tileContainer","tile","_tilesToLoad","reuseTiles","_unusedTiles","innerHTML","_clearBgBuffer","_getTileSize","zoomN","maxNativeZoom","tileBounds","_addTilesFromCenterOut","_removeOtherTiles","queue","_tileShouldBeLoaded","tilesToLoad","sort","fragment","createDocumentFragment","_addTile","tilePoint","continuousWorld","limit","_getWrapTileNum","noWrap","nwPoint","sePoint","kArr","_removeTile","onload","tilePos","_getTilePos","_getTile","_loadTile","_getZoomForUrl","zoomReverse","getTileUrl","_getSubdomain","z","_adjustTilePoint","tms","index","pop","_resetTile","_createTile","height","galleryimg","onselectstart","onmousemove","WebkitBackfaceVisibility","_layer","_tileOnLoad","onerror","_tileOnError","_tileLoaded","_clearBgBufferTimer","newUrl","tileLayer","WMS","defaultWmsParams","service","request","version","styles","format","transparent","wmsParams","_crs","_wmsVersion","projectionKey","bbox","setParams","wms","Canvas","async","_redrawTile","drawTile","_tilePoint","tileDrawn","canvas","ImageOverlay","_bounds","_image","_initImage","_onImageLoad","image","imageOverlay","Icon","createIcon","oldIcon","_createIcon","createShadow","img","_getIconUrl","_createImg","_setIconStyles","anchor","shadowAnchor","iconAnchor","marginLeft","marginTop","icon","Default","iconSize","popupAnchor","shadowSize","path","imagePath","scripts","getElementsByTagName","leafletRe","match","Marker","title","clickable","draggable","keyboard","zIndexOffset","riseOnHover","riseOffset","_latlng","update","_initIcon","_removeIcon","_removeShadow","getLatLng","setLatLng","setZIndexOffset","setIcon","_popup","bindPopup","_icon","_setPos","classToAdd","addIcon","tabIndex","_initInteraction","_bringToFront","_resetZIndex","newShadow","_shadow","addShadow","_zIndex","opt","_onKeyPress","Handler","MarkerDrag","wasDragged","stopPropagation","_enabled","keyCode","marker","DivIcon","html","bgPos","backgroundPosition","divIcon","closePopupOnClick","Popup","minWidth","autoPan","closeButton","autoPanPadding","keepInView","source","_source","_isOpen","animFade","_getEvents","popup","openOn","openPopup","offsetWidth","_updatePosition","_adjustPan","getContent","_content","setContent","content","visibility","_updateContent","_updateLayout","viewreset","zoomanim","_zoomAnimation","closeOnClick","preclick","_close","moveend","closePopup","prefix","containerClass","_closeButton","href","disableClickPropagation","_onCloseButtonClick","wrapper","_wrapper","_contentNode","disableScrollPropagation","_tipContainer","_tip","hasChildNodes","whiteSpace","offsetHeight","maxHeight","scrolledClass","_containerWidth","animated","_containerBottom","_containerLeft","bottom","containerHeight","containerWidth","layerPos","containerPos","autoPanPaddingTopLeft","autoPanPaddingBottomRight","stop","togglePopup","_popupHandlersAdded","_movePopup","setPopupContent","unbindPopup","getPopup","LayerGroup","getLayerId","clearLayers","invoke","methodName","getLayer","getLayers","layerGroup","FeatureGroup","EVENTS","_propagateEvent","_popupContent","_popupOptions","setStyle","featureGroup","Path","CLIP_PADDING","outerWidth","outerHeight","stroke","color","dashArray","lineCap","lineJoin","weight","fill","fillColor","fillOpacity","_initElements","projectLatlngs","_updatePath","_pathRoot","vml","_stroke","_fill","_updateStyle","_updatePathViewport","p","_pathViewport","SVG_NS","svg","createElementNS","createSVGRect","SVG","root","lastChild","first","getPathString","_createElement","_initPathRoot","_initPath","_initStyle","_path","pointerEvents","_animatePathZoom","_endPathZoom","_updateSvgViewport","_pathZooming","vp","_openPopup","_latlngs","shape","behavior","adj","VML","namespaces","coordsize","stroked","filled","endcap","dashStyle","joinstyle","display","v","getContext","L_PREFER_CANVAS","CANVAS","_requestUpdate","_onClick","_onMouseMove","_updateRequest","_fireMapMoveEnd","_ctx","_canvasCtx","lineWidth","strokeStyle","fillStyle","_drawPath","len2","drawMethod","beginPath","_parts","Polygon","closePath","_checkIfEmpty","ctx","save","globalAlpha","restore","_containsPoint","_animatingZoom","cursor","_mouseInside","_updateCanvasViewport","translate","LineUtil","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","pointToSegmentDistance","p1","p2","_sqClosestPointOnSegment","closestPointOnSegment","markers","Uint8Array","_simplifyDPStep","newPoints","last","sqDist","maxSqDist","reducedPoints","prev","_sqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","t","dot","Polyline","_convertLatLngs","smoothFactor","noClip","_originalPoints","_getPathPartStr","getLatLngs","setLatLngs","addLatLng","spliceLatLngs","removed","closestLayerPoint","minDistance","parts","minPoint","jLen","distance","overwrite","_clipPoints","k","segment","lu","_simplifyPoints","polyline","PolyUtil","clipPolygon","clippedPoints","edge","edges","_code","_initWithHoles","hole","_holes","_holePoints","newParts","clipped","polygon","createMulti","Klass","_options","MultiPolyline","MultiPolygon","multiPolyline","multiPolygon","Rectangle","_boundsToLatLngs","setBounds","rectangle","Circle","radius","_mRadius","setRadius","lngRadius","_getLngRadius","pointLeft","_point","_radius","latRadius","getRadius","_getLatRadius","circle","CircleMarker","circleMarker","closed","part","w","arc","w2","GeoJSON","geojson","addData","feature","features","geometries","geometry","coordinates","geometryToLayer","pointToLayer","coordsToLatLng","asFeature","defaultOptions","resetStyle","onEachFeature","_setLayerStyle","vectorOptions","coords","coordsToLatLngs","properties","levelsDeep","latLngToCoords","latLngsToCoords","latLngs","getFeature","newGeometry","geoJSON","PointToGeoJSON","toGeoJSON","multiToGeoJSON","json","jsons","isGeometryCollection","geoJson","addListener","originalHandler","newType","_getEvent","addPointerListener","addDoubleTapListener","_checkMouse","_filterClick","attachEvent","removeListener","removePointerListener","removeDoubleTapListener","detachEvent","cancelBubble","Draggable","START","_fakeStop","returnValue","clientX","clientY","rect","clientTop","getWheelDelta","wheelDelta","detail","_skipEvents","skipped","related","relatedTarget","err","caller","callee","Event","timeStamp","elapsed","_lastClick","_simulatedClick","END","mousedown","touchstart","pointerdown","MSPointerDown","MOVE","dragStartTarget","_element","_dragStartTarget","_onDown","shiftKey","which","button","touches","_disabled","_moving","_startPoint","_startPos","_newPos","_onMove","_onUp","srcElement","_animRequest","addHooks","removeHooks","enabled","inertia","inertiaDeceleration","inertiaMaxSpeed","inertiaThreshold","easeLinearity","worldCopyJump","Drag","_draggable","_onDragStart","_onDrag","_onDragEnd","_onPreDrag","_onViewReset","_panAnim","_positions","_times","_lastTime","_lastPos","shift","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","worldWidth","halfWidth","newX1","newX2","newX","delay","noInertia","direction","duration","ease","speedVector","speed","limitedSpeed","limitedSpeedVector","decelerationDuration","noMoveStart","doubleClickZoom","DoubleClickZoom","_onDoubleClick","scrollWheelZoom","ScrollWheelZoom","_onWheelScroll","_delta","_lastMousePos","_startTime","_timer","_performZoom","_touchstart","_touchend","doubleTap","pre","touchend","trackedTouches","onTouchStart","count","pointerId","now","onTouchEnd","idx","prop","newTouch","endElement","POINTER_CANCEL","POINTER_DOWN","POINTER_MOVE","POINTER_UP","_pointers","_pointerDocumentListener","addPointerListenerStart","addPointerListenerEnd","addPointerListenerMove","pointers","cb","alreadyInArray","changedTouches","internalCb","pointerType","MSPOINTER_TYPE_MOUSE","buttons","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","viewCenter","_startCenter","_startDist","_centerOffset","_onTouchMove","_onTouchEnd","_scale","_updateOnMove","_getScaleOrigin","oldZoom","floatZoomDelta","roundZoomDelta","tap","tapTolerance","Tap","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","simulatedEvent","createEvent","initMouseEvent","screenX","screenY","dispatchEvent","BoxZoom","_pane","_onMouseDown","_startLayerPoint","_onMouseUp","_onKeyDown","_box","startPoint","box","newPos","_finish","boxZoomBounds","keyboardPanOffset","keyboardZoomOffset","Keyboard","keyCodes","down","up","_setPanOffset","_setZoomOffset","_onFocus","_onBlur","_addHooks","_removeHooks","_focused","focus","scrollTo","keys","_panKeys","codes","_zoomKeys","_inProgress","_marker","shadow","iconPos","Control","removeControl","addControl","corner","_controlCorners","removeFrom","_refocusOnMap","control","corners","l","_controlContainer","createCorner","vSide","hSide","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","link","zoomControl","Attribution","_attributions","addAttribution","_onLayerAdd","_onLayerRemove","setPrefix","text","removeAttribution","attribs","prefixAndAttribs","attributionControl","Scale","metric","imperial","_addScales","_mScale","_iScale","centerLat","dist","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_getScaleWidth","maxMiles","miles","feet","maxFeet","ratio","pow10","Layers","collapsed","autoZIndex","baseLayers","overlays","_lastZIndex","_handlingClick","_addLayer","_onLayerChange","addBaseLayer","addOverlay","form","_form","_expand","_collapse","_layersLink","_onInputClick","_baseLayersList","_separator","_overlaysList","overlay","baseLayersPresent","overlaysPresent","_addItem","_createRadioElement","checked","radioHtml","radioFragment","input","label","defaultChecked","layerId","inputs","inputsLen","PosAnimation","run","_el","_onTransitionEnd","_stepTimer","setInterval","_onStep","_getPos","stepPos","_transformRe","clearInterval","_tryAnimatedZoom","_tryAnimatedPan","_onPanTransitionStep","_onPanTransitionEnd","_duration","_easeOutPower","_offset","_animate","_step","_complete","_animId","_runFrame","_easeOut","progress","zoomAnimationThreshold","_catchTransitionEnd","propertyName","_onZoomTransitionEnd","_nothingToAnimate","getElementsByClassName","backwards","_animateToCenter","_animateToZoom","_animating","_prepareBgBuffer","bg","initialTransform","scaleStr","front","bgLoaded","_getLoadedTilesPercentage","frontLoaded","_stopLoadingImages","complete","_defaultLocateOptions","watch","timeout","maximumAge","enableHighAccuracy","locate","_locateOptions","geolocation","_handleGeolocationError","message","onResponse","_handleGeolocationResponse","onError","_locationWatchId","watchPosition","getCurrentPosition","stopLocate","clearWatch","error","latitude","longitude","latAccuracy","accuracy","lngAccuracy","timestamp"],"sourceRoot":""}