loleaflet/docs/highlight/highlight.pack.js                |    1 
 loleaflet/plugins/draw-0.2.4/examples/libs/leaflet-src.js | 9169 --------------
 2 files changed, 9170 deletions(-)

New commits:
commit 28721cc1cfa6d9ceeb7f0a24f67d9e20c3751c25
Author: Henry Castro <hcas...@collabora.com>
Date:   Thu May 17 17:25:57 2018 -0400

    loleaflet: remove unused js files
    
    Change-Id: I3474bd9b252cfbfddd14afd2fede9da1fcc19c8d

diff --git a/loleaflet/docs/highlight/highlight.pack.js 
b/loleaflet/docs/highlight/highlight.pack.js
deleted file mode 100644
index 12de77f55..000000000
--- a/loleaflet/docs/highlight/highlight.pack.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"undefined"!=typeof 
exports?e(exports):(window.hljs=e({}),"function"==typeof 
define&&define.amd&&define("hljs",[],function(){return 
window.hljs}))}(function(e){function n(e){return 
e.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function 
t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return 
t&&0==t.index}function a(e){return/no-?highlight|plain|text/.test(e)}function 
i(e){var n,t,r,i=e.className+" 
";if(i+=e.parentNode?e.parentNode.className:"",t=/\blang(?:uage)?-([\w-]+)\b/.exec(i))return
 
E(t[1])?t[1]:"no-highlight";for(i=i.split(/\s+/),n=0,r=i.length;r>n;n++)if(E(i[n])||a(i[n]))return
 i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in 
n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var 
i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i})
 );return a}(e,0),n}function c(e,r,a){function i(){return 
e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:"start"==r[0].event?e:r:e.length?e:r}function
 o(e){function r(e){return" 
"+e.nodeName+'="'+n(e.value)+'"'}f+="<"+t(e)+Array.prototype.map.call(e.attributes,r).join("")+">"}function
 u(e){f+="</"+t(e)+">"}function c(e){("start"==e.event?o:u)(e.node)}for(var 
s=0,f="",l=[];e.length||r.length;){var 
g=i();if(f+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){l.reverse().forEach(u);do
 
c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);l.reverse().forEach(o)}else"start"==g[0].event?l.push(g[0].node):l.pop(),c(g.splice(0,1)[0])}return
 f+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function 
t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function 
r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var 
u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" 
").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]
 ?Number(t[1]):1]})};"string"==typeof 
a.k?c("keyword",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\b\w+\b/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split("
 
").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),void
 0===a.r&&(a.r=1),a.c||(a.c=[]);var 
s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var
 f=a.c.map(function(e){return 
e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=f.length?t(f.join("|"),!0):{exec:function(){return
 null}}}}r(e)}function f(e,t,a,i){function o(e,n){for(var 
t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function 
u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return 
e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function 
g(e,n){var t=N.cI?n[0]
 .toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function 
h(e,n,t,r){var a=r?"":w.classPrefix,i='<span class="'+a,o=t?"":"</span>";return 
i+=e+'">',i+n+o}function p(){if(!L.k)return n(B);var 
e="",t=0;L.lR.lastIndex=0;for(var 
r=L.lR.exec(B);r;){e+=n(B.substr(t,r.index-t));var 
a=g(L,r);a?(y+=a[1],e+=h(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(B)}return
 e+n(B.substr(t))}function d(){if(L.sL&&!x[L.sL])return n(B);var 
e=L.sL?f(L.sL,B,!0,M[L.sL]):l(B);return 
L.r>0&&(y+=e.r),"continuous"==L.subLanguageMode&&(M[L.sL]=e.top),h(e.language,e.value,!1,!0)}function
 b(){return void 0!==L.sL?d():p()}function v(e,t){var 
r=e.cN?h(e.cN,"",!0):"";e.rB?(k+=r,B=""):e.eB?(k+=n(t)+r,B=""):(k+=r,B=t),L=Object.create(e,{parent:{value:L}})}function
 m(e,t){if(B+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return 
k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var 
i=L;i.rE||i.eE||(B+=t),k+=b();do 
L.cN&&(k+="</span>"),y+=L.r,L=L.parent;while(L!=a.parent);return 
i.eE&&(k+=n(t)),B="",a.st
 arts&&v(a.starts,""),i.rE?0:t.length}if(c(t,L))throw new Error('Illegal lexeme 
"'+t+'" for mode "'+(L.cN||"<unnamed>")+'"');return B+=t,t.length||1}var 
N=E(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var 
R,L=i||N,M={},k="";for(R=L;R!=N;R=R.parent)R.cN&&(k=h(R.cN,"",!0)+k);var 
B="",y=0;try{for(var 
C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+="</span>");return{r:y,value:k,language:e,top:L}}catch(O){if(-1!=O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw
 O}}function l(e,t){t=t||w.languages||Object.keys(x);var 
r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(E(n)){var 
t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function
 g(e){return 
w.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,function(e,n){return 
n.replace(/\t/g,w.tabReplace)})),w.useBR&&(e=e.replace(/\n/g,"<br>")),e}function
 h(e,n,t){var r=n?R[n]:t,a=
 [e.trim()];return 
e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" 
").trim()}function p(e){var n=i(e);if(!a(n)){var 
t;w.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div";),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[
 \/]*>/g,"\n")):t=e;var 
r=t.textContent,o=n?f(n,r,!0):l(r),s=u(t);if(s.length){var 
p=document.createElementNS("http://www.w3.org/1999/xhtml","div";);p.innerHTML=o.value,o.value=c(s,u(p),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=h(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function
 d(e){w=o(w,e)}function b(){if(!b.called){b.called=!0;var 
e=document.querySelectorAll("pre 
code");Array.prototype.forEach.call(e,p)}}function 
v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function
 m(n,t){var 
r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){R[e]=n})}function 
N(){return Object.
 keys(x)}function E(e){return x[e]||x[R[e]]}var 
w={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 
0},x={},R={};return 
e.highlight=f,e.highlightAuto=l,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=E,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},e.C=function(n,t,r){var
 a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return 
a.c.push(e.PWM),a.c.push({cN:"doctag
 ",bK:"TODO FIXME NOTE BUG 
XXX",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e});hljs.registerLanguage("javascript",function(e){return{aliases:["js"],k:{keyword:"in
 of if for while finally var new function do return void else break catch 
instanceof with throw case default try this switch continue typeof delete let 
yield const export super debugger as async await",literal:"true false null 
undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt 
decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape 
Object Function Boolean Error EvalError InternalError Rang
 eError ReferenceError StopIteration SyntaxError TypeError URIError Number Math 
Date String RegExp Array Float32Array Float64Array Int16Array Int32Array 
Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer 
DataView JSON Intl arguments require module console window document Symbol Set 
Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"pi",r:10,b:/^\s*['"]use 
(strict|asm)['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return
 throw 
case",c:[e.CLCM,e.CBCM,e.RM,{b:/</,e:/>\s*[);\]]/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{bK:"import",e:"[;$]",k:"import
 from as",c:[e.ASM,e.QSM]},{cN:"class",bK:"class",e:/[{;=]
 
/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]}]}});hljs.registerLanguage("css",function(e){var
 
c="[a-zA-Z-][a-zA-Z0-9_-]*",a={cN:"function",b:c+"\\(",rB:!0,eE:!0,e:"\\("},r={cN:"rule",b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{cN:"value",eW:!0,eE:!0,c:[a,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,r,{cN:"id",b:/\#[A-Za-z0-9_-]+/},{cN:"class",b:/\.[A-Za-z0-9_-]+/},{cN:"attr_selector",b:/\[/,e:/\]/,i:"$"},{cN:"pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"']+/},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face
 
page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[a,e.ASM,e.QSM,e.CSSNM]}]},{cN:"tag",b:c,r:0},{cN:"rules",b:"{",e:"}",i:/\S/,c:[e.CBCM,r]}]}});hljs.registerLanguage("json",function(e){var
 t={literal:"true false 
null"},i=[e.QSM,e.CNM],l={cN:"value",e:",",eW:!0,eE:!0,c:i,k:t},c={b:"{",e:"}",c:[{cN:"attribute"
 
,b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[e.BE],i:"\\n",starts:l}],i:"\\S"},n={b:"\\[",e:"\\]",c:[e.inherit(l,{cN:null})],i:"\\S"};return
 
i.splice(i.length,0,c,n),{c:i,k:t,i:"\\S"}});hljs.registerLanguage("xml",function(t){var
 
e="[A-Za-z0-9\\._:-]+",s={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"},c={eW:!0,i:/</,r:0,c:[s,{cN:"attribute",b:e,r:0},{b:"=",r:0,c:[{cN:"value",c:[s],v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:!0,c:[{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},t.C("<!--","-->",{r:10}),{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[c],starts:{e:"</style>",rE:!0,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[c],starts:{e:"</script>",rE:!0,sL:""}},s,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:/[^
 \/><\n\t]+/,r:0},c]}]}});hljs.registerLanguage("bash",fu
 nction(e){var 
t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if
 then else elif fi for while in do done case esac function",literal:"true 
false",built_in:"break cd continue eval exec exit export getopts hash pwd 
readonly return shift test times trap umask unset alias bind builtin caller 
command declare echo enable help let local logout mapfile printf read readarray 
source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir 
clone comparguments compcall compctl compdescribe compfiles compgroups 
compquote comptags comptry compvalues dirs disable disown echotc echoti emulate 
fc fg float functions getcap getln history integer jobs kill limit log noglob 
popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl 
unfunction unhash unlimit unsetopt vared wait whence where which zcompi
 le zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle 
ztcp",operator:"-ne -eq -lt -gt -f -d -e -s -l 
-a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,e.NM,s,a,t]}});
\ No newline at end of file
diff --git a/loleaflet/plugins/draw-0.2.4/examples/libs/leaflet-src.js 
b/loleaflet/plugins/draw-0.2.4/examples/libs/leaflet-src.js
deleted file mode 100644
index e40bfbfaf..000000000
--- a/loleaflet/plugins/draw-0.2.4/examples/libs/leaflet-src.js
+++ /dev/null
@@ -1,9169 +0,0 @@
-/*
- Leaflet, a JavaScript library for mobile-friendly interactive maps. 
http://leafletjs.com
- (c) 2010-2013, Vladimir Agafonkin
- (c) 2010-2011, CloudMade
-*/
-(function (window, document, undefined) {
-var oldL = window.L,
-    L = {};
-
-L.version = '0.7.2';
-
-// define Leaflet for Node module pattern loaders, including Browserify
-if (typeof module === 'object' && typeof module.exports === 'object') {
-       module.exports = L;
-
-// define Leaflet as an AMD module
-} else if (typeof define === 'function' && define.amd) {
-       define(L);
-}
-
-// define Leaflet as a global L variable, saving the original L to restore 
later if needed
-
-L.noConflict = function () {
-       window.L = oldL;
-       return this;
-};
-
-window.L = L;
-
-
-/*
- * L.Util contains various utility functions used throughout Leaflet code.
- */
-
-L.Util = {
-       extend: function (dest) { // (Object[, Object, ...]) ->
-               var sources = Array.prototype.slice.call(arguments, 1),
-                   i, j, len, src;
-
-               for (j = 0, len = sources.length; j < len; j++) {
-                       src = sources[j] || {};
-                       for (i in src) {
-                               if (src.hasOwnProperty(i)) {
-                                       dest[i] = src[i];
-                               }
-                       }
-               }
-               return dest;
-       },
-
-       bind: function (fn, obj) { // (Function, Object) -> Function
-               var args = arguments.length > 2 ? 
Array.prototype.slice.call(arguments, 2) : null;
-               return function () {
-                       return fn.apply(obj, args || arguments);
-               };
-       },
-
-       stamp: (function () {
-               var lastId = 0,
-                   key = '_leaflet_id';
-               return function (obj) {
-                       obj[key] = obj[key] || ++lastId;
-                       return obj[key];
-               };
-       }()),
-
-       invokeEach: function (obj, method, context) {
-               var i, args;
-
-               if (typeof obj === 'object') {
-                       args = Array.prototype.slice.call(arguments, 3);
-
-                       for (i in obj) {
-                               method.apply(context, [i, obj[i]].concat(args));
-                       }
-                       return true;
-               }
-
-               return false;
-       },
-
-       limitExecByInterval: function (fn, time, context) {
-               var lock, execOnUnlock;
-
-               return function wrapperFn() {
-                       var args = arguments;
-
-                       if (lock) {
-                               execOnUnlock = true;
-                               return;
-                       }
-
-                       lock = true;
-
-                       setTimeout(function () {
-                               lock = false;
-
-                               if (execOnUnlock) {
-                                       wrapperFn.apply(context, args);
-                                       execOnUnlock = false;
-                               }
-                       }, time);
-
-                       fn.apply(context, args);
-               };
-       },
-
-       falseFn: function () {
-               return false;
-       },
-
-       formatNum: function (num, digits) {
-               var pow = Math.pow(10, digits || 5);
-               return Math.round(num * pow) / pow;
-       },
-
-       trim: function (str) {
-               return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
-       },
-
-       splitWords: function (str) {
-               return L.Util.trim(str).split(/\s+/);
-       },
-
-       setOptions: function (obj, options) {
-               obj.options = L.extend({}, obj.options, options);
-               return obj.options;
-       },
-
-       getParamString: function (obj, existingUrl, uppercase) {
-               var params = [];
-               for (var i in obj) {
-                       params.push(encodeURIComponent(uppercase ? 
i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
-               }
-               return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' 
: '&') + params.join('&');
-       },
-       template: function (str, data) {
-               return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) {
-                       var value = data[key];
-                       if (value === undefined) {
-                               throw new Error('No value provided for variable 
' + str);
-                       } else if (typeof value === 'function') {
-                               value = value(data);
-                       }
-                       return value;
-               });
-       },
-
-       isArray: Array.isArray || function (obj) {
-               return (Object.prototype.toString.call(obj) === '[object 
Array]');
-       },
-
-       emptyImageUrl: 
'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
-};
-
-(function () {
-
-       // inspired by 
http://paulirish.com/2011/requestanimationframe-for-smart-animating/
-
-       function getPrefixed(name) {
-               var i, fn,
-                   prefixes = ['webkit', 'moz', 'o', 'ms'];
-
-               for (i = 0; i < prefixes.length && !fn; i++) {
-                       fn = window[prefixes[i] + name];
-               }
-
-               return fn;
-       }
-
-       var lastTime = 0;
-
-       function timeoutDefer(fn) {
-               var time = +new Date(),
-                   timeToCall = Math.max(0, 16 - (time - lastTime));
-
-               lastTime = time + timeToCall;
-               return window.setTimeout(fn, timeToCall);
-       }
-
-       var requestFn = window.requestAnimationFrame ||
-               getPrefixed('RequestAnimationFrame') || timeoutDefer;
-
-       var cancelFn = window.cancelAnimationFrame ||
-               getPrefixed('CancelAnimationFrame') ||
-               getPrefixed('CancelRequestAnimationFrame') ||
-               function (id) { window.clearTimeout(id); };
-
-
-       L.Util.requestAnimFrame = function (fn, context, immediate, element) {
-               fn = L.bind(fn, context);
-
-               if (immediate && requestFn === timeoutDefer) {
-                       fn();
-               } else {
-                       return requestFn.call(window, fn, element);
-               }
-       };
-
-       L.Util.cancelAnimFrame = function (id) {
-               if (id) {
-                       cancelFn.call(window, id);
-               }
-       };
-
-}());
-
-// shortcuts for most used utility functions
-L.extend = L.Util.extend;
-L.bind = L.Util.bind;
-L.stamp = L.Util.stamp;
-L.setOptions = L.Util.setOptions;
-
-
-/*
- * L.Class powers the OOP facilities of the library.
- * Thanks to John Resig and Dean Edwards for inspiration!
- */
-
-L.Class = function () {};
-
-L.Class.extend = function (props) {
-
-       // extended class with the new prototype
-       var NewClass = function () {
-
-               // call the constructor
-               if (this.initialize) {
-                       this.initialize.apply(this, arguments);
-               }
-
-               // call all constructor hooks
-               if (this._initHooks) {
-                       this.callInitHooks();
-               }
-       };
-
-       // instantiate class without calling constructor
-       var F = function () {};
-       F.prototype = this.prototype;
-
-       var proto = new F();
-       proto.constructor = NewClass;
-
-       NewClass.prototype = proto;
-
-       //inherit parent's statics
-       for (var i in this) {
-               if (this.hasOwnProperty(i) && i !== 'prototype') {
-                       NewClass[i] = this[i];
-               }
-       }
-
-       // mix static properties into the class
-       if (props.statics) {
-               L.extend(NewClass, props.statics);
-               delete props.statics;
-       }
-
-       // mix includes into the prototype
-       if (props.includes) {
-               L.Util.extend.apply(null, [proto].concat(props.includes));
-               delete props.includes;
-       }
-
-       // merge options
-       if (props.options && proto.options) {
-               props.options = L.extend({}, proto.options, props.options);
-       }
-
-       // mix given properties into the prototype
-       L.extend(proto, props);
-
-       proto._initHooks = [];
-
-       var parent = this;
-       // jshint camelcase: false
-       NewClass.__super__ = parent.prototype;
-
-       // add method for calling all hooks
-       proto.callInitHooks = function () {
-
-               if (this._initHooksCalled) { return; }
-
-               if (parent.prototype.callInitHooks) {
-                       parent.prototype.callInitHooks.call(this);
-               }
-
-               this._initHooksCalled = true;
-
-               for (var i = 0, len = proto._initHooks.length; i < len; i++) {
-                       proto._initHooks[i].call(this);
-               }
-       };
-
-       return NewClass;
-};
-
-
-// method for adding properties to prototype
-L.Class.include = function (props) {
-       L.extend(this.prototype, props);
-};
-
-// merge new default options to the Class
-L.Class.mergeOptions = function (options) {
-       L.extend(this.prototype.options, options);
-};
-
-// add a constructor hook
-L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
-       var args = Array.prototype.slice.call(arguments, 1);
-
-       var init = typeof fn === 'function' ? fn : function () {
-               this[fn].apply(this, args);
-       };
-
-       this.prototype._initHooks = this.prototype._initHooks || [];
-       this.prototype._initHooks.push(init);
-};
-
-
-/*
- * L.Mixin.Events is used to add custom events functionality to Leaflet 
classes.
- */
-
-var eventsKey = '_leaflet_events';
-
-L.Mixin = {};
-
-L.Mixin.Events = {
-
-       addEventListener: function (types, fn, context) { // (String, 
Function[, Object]) or (Object[, Object])
-
-               // types can be a map of types/handlers
-               if (L.Util.invokeEach(types, this.addEventListener, this, fn, 
context)) { return this; }
-
-               var events = this[eventsKey] = this[eventsKey] || {},
-                   contextId = context && context !== this && L.stamp(context),
-                   i, len, event, type, indexKey, indexLenKey, typeIndex;
-
-               // types can be a string of space-separated words
-               types = L.Util.splitWords(types);
-
-               for (i = 0, len = types.length; i < len; i++) {
-                       event = {
-                               action: fn,
-                               context: context || this
-                       };
-                       type = types[i];
-
-                       if (contextId) {
-                               // store listeners of a particular context in a 
separate hash (if it has an id)
-                               // gives a major performance boost when 
removing thousands of map layers
-
-                               indexKey = type + '_idx';
-                               indexLenKey = indexKey + '_len';
-
-                               typeIndex = events[indexKey] = events[indexKey] 
|| {};
-
-                               if (!typeIndex[contextId]) {
-                                       typeIndex[contextId] = [];
-
-                                       // keep track of the number of keys in 
the index to quickly check if it's empty
-                                       events[indexLenKey] = 
(events[indexLenKey] || 0) + 1;
-                               }
-
-                               typeIndex[contextId].push(event);
-
-
-                       } else {
-                               events[type] = events[type] || [];
-                               events[type].push(event);
-                       }
-               }
-
-               return this;
-       },
-
-       hasEventListeners: function (type) { // (String) -> Boolean
-               var events = this[eventsKey];
-               return !!events && ((type in events && events[type].length > 0) 
||
-                                   (type + '_idx' in events && events[type + 
'_idx_len'] > 0));
-       },
-
-       removeEventListener: function (types, fn, context) { // ([String, 
Function, Object]) or (Object[, Object])
-
-               if (!this[eventsKey]) {
-                       return this;
-               }
-
-               if (!types) {
-                       return this.clearAllEventListeners();
-               }
-
-               if (L.Util.invokeEach(types, this.removeEventListener, this, 
fn, context)) { return this; }
-
-               var events = this[eventsKey],
-                   contextId = context && context !== this && L.stamp(context),
-                   i, len, type, listeners, j, indexKey, indexLenKey, 
typeIndex, removed;
-
-               types = L.Util.splitWords(types);
-
-               for (i = 0, len = types.length; i < len; i++) {
-                       type = types[i];
-                       indexKey = type + '_idx';
-                       indexLenKey = indexKey + '_len';
-
-                       typeIndex = events[indexKey];
-
-                       if (!fn) {
-                               // clear all listeners for a type if function 
isn't specified
-                               delete events[type];
-                               delete events[indexKey];
-                               delete events[indexLenKey];
-
-                       } else {
-                               listeners = contextId && typeIndex ? 
typeIndex[contextId] : events[type];
-
-                               if (listeners) {
-                                       for (j = listeners.length - 1; j >= 0; 
j--) {
-                                               if ((listeners[j].action === 
fn) && (!context || (listeners[j].context === context))) {
-                                                       removed = 
listeners.splice(j, 1);
-                                                       // set the old action 
to a no-op, because it is possible
-                                                       // that the listener is 
being iterated over as part of a dispatch
-                                                       removed[0].action = 
L.Util.falseFn;
-                                               }
-                                       }
-
-                                       if (context && typeIndex && 
(listeners.length === 0)) {
-                                               delete typeIndex[contextId];
-                                               events[indexLenKey]--;
-                                       }
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       clearAllEventListeners: function () {
-               delete this[eventsKey];
-               return this;
-       },
-
-       fireEvent: function (type, data) { // (String[, Object])
-               if (!this.hasEventListeners(type)) {
-                       return this;
-               }
-
-               var event = L.Util.extend({}, data, { type: type, target: this 
});
-
-               var events = this[eventsKey],
-                   listeners, i, len, typeIndex, contextId;
-
-               if (events[type]) {
-                       // make sure adding/removing listeners inside other 
listeners won't cause infinite loop
-                       listeners = events[type].slice();
-
-                       for (i = 0, len = listeners.length; i < len; i++) {
-                               listeners[i].action.call(listeners[i].context, 
event);
-                       }
-               }
-
-               // fire event for the context-indexed listeners as well
-               typeIndex = events[type + '_idx'];
-
-               for (contextId in typeIndex) {
-                       listeners = typeIndex[contextId].slice();
-
-                       if (listeners) {
-                               for (i = 0, len = listeners.length; i < len; 
i++) {
-                                       
listeners[i].action.call(listeners[i].context, event);
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       addOneTimeEventListener: function (types, fn, context) {
-
-               if (L.Util.invokeEach(types, this.addOneTimeEventListener, 
this, fn, context)) { return this; }
-
-               var handler = L.bind(function () {
-                       this
-                           .removeEventListener(types, fn, context)
-                           .removeEventListener(types, handler, context);
-               }, this);
-
-               return this
-                   .addEventListener(types, fn, context)
-                   .addEventListener(types, handler, context);
-       }
-};
-
-L.Mixin.Events.on = L.Mixin.Events.addEventListener;
-L.Mixin.Events.off = L.Mixin.Events.removeEventListener;
-L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;
-L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
-
-
-/*
- * L.Browser handles different browser and feature detections for internal 
Leaflet use.
- */
-
-(function () {
-
-       var ie = 'ActiveXObject' in window,
-               ielt9 = ie && !document.addEventListener,
-
-           // terrible browser detection to work around Safari / iOS / Android 
browser bugs
-           ua = navigator.userAgent.toLowerCase(),
-           webkit = ua.indexOf('webkit') !== -1,
-           chrome = ua.indexOf('chrome') !== -1,
-           phantomjs = ua.indexOf('phantom') !== -1,
-           android = ua.indexOf('android') !== -1,
-           android23 = ua.search('android [23]') !== -1,
-               gecko = ua.indexOf('gecko') !== -1,
-
-           mobile = typeof orientation !== undefined + '',
-           msPointer = window.navigator && window.navigator.msPointerEnabled &&
-                     window.navigator.msMaxTouchPoints && !window.PointerEvent,
-               pointer = (window.PointerEvent && 
window.navigator.pointerEnabled && window.navigator.maxTouchPoints) ||
-                                 msPointer,
-           retina = ('devicePixelRatio' in window && window.devicePixelRatio > 
1) ||
-                    ('matchMedia' in window && 
window.matchMedia('(min-resolution:144dpi)') &&
-                     window.matchMedia('(min-resolution:144dpi)').matches),
-
-           doc = document.documentElement,
-           ie3d = ie && ('transition' in doc.style),
-           webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new 
window.WebKitCSSMatrix()) && !android23,
-           gecko3d = 'MozPerspective' in doc.style,
-           opera3d = 'OTransition' in doc.style,
-           any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || 
opera3d) && !phantomjs;
-
-
-       // PhantomJS has 'ontouchstart' in document.documentElement, but 
doesn't actually support touch.
-       // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151
-
-       var touch = !window.L_NO_TOUCH && !phantomjs && (function () {
-
-               var startName = 'ontouchstart';
-
-               // IE10+ (We simulate these into touch* events in L.DomEvent 
and L.DomEvent.Pointer) or WebKit, etc.
-               if (pointer || (startName in doc)) {
-                       return true;
-               }
-
-               // Firefox/Gecko
-               var div = document.createElement('div'),
-                   supported = false;
-
-               if (!div.setAttribute) {
-                       return false;
-               }
-               div.setAttribute(startName, 'return;');
-
-               if (typeof div[startName] === 'function') {
-                       supported = true;
-               }
-
-               div.removeAttribute(startName);
-               div = null;
-
-               return supported;
-       }());
-
-
-       L.Browser = {
-               ie: ie,
-               ielt9: ielt9,
-               webkit: webkit,
-               gecko: gecko && !webkit && !window.opera && !ie,
-
-               android: android,
-               android23: android23,
-
-               chrome: chrome,
-
-               ie3d: ie3d,
-               webkit3d: webkit3d,
-               gecko3d: gecko3d,
-               opera3d: opera3d,
-               any3d: any3d,
-
-               mobile: mobile,
-               mobileWebkit: mobile && webkit,
-               mobileWebkit3d: mobile && webkit3d,
-               mobileOpera: mobile && window.opera,
-
-               touch: touch,
-               msPointer: msPointer,
-               pointer: pointer,
-
-               retina: retina
-       };
-
-}());
-
-
-/*
- * L.Point represents a point with x and y coordinates.
- */
-
-L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {
-       this.x = (round ? Math.round(x) : x);
-       this.y = (round ? Math.round(y) : y);
-};
-
-L.Point.prototype = {
-
-       clone: function () {
-               return new L.Point(this.x, this.y);
-       },
-
-       // non-destructive, returns a new point
-       add: function (point) {
-               return this.clone()._add(L.point(point));
-       },
-
-       // destructive, used directly for performance in situations where it's 
safe to modify existing point
-       _add: function (point) {
-               this.x += point.x;
-               this.y += point.y;
-               return this;
-       },
-
-       subtract: function (point) {
-               return this.clone()._subtract(L.point(point));
-       },
-
-       _subtract: function (point) {
-               this.x -= point.x;
-               this.y -= point.y;
-               return this;
-       },
-
-       divideBy: function (num) {
-               return this.clone()._divideBy(num);
-       },
-
-       _divideBy: function (num) {
-               this.x /= num;
-               this.y /= num;
-               return this;
-       },
-
-       multiplyBy: function (num) {
-               return this.clone()._multiplyBy(num);
-       },
-
-       _multiplyBy: function (num) {
-               this.x *= num;
-               this.y *= num;
-               return this;
-       },
-
-       round: function () {
-               return this.clone()._round();
-       },
-
-       _round: function () {
-               this.x = Math.round(this.x);
-               this.y = Math.round(this.y);
-               return this;
-       },
-
-       floor: function () {
-               return this.clone()._floor();
-       },
-
-       _floor: function () {
-               this.x = Math.floor(this.x);
-               this.y = Math.floor(this.y);
-               return this;
-       },
-
-       distanceTo: function (point) {
-               point = L.point(point);
-
-               var x = point.x - this.x,
-                   y = point.y - this.y;
-
-               return Math.sqrt(x * x + y * y);
-       },
-
-       equals: function (point) {
-               point = L.point(point);
-
-               return point.x === this.x &&
-                      point.y === this.y;
-       },
-
-       contains: function (point) {
-               point = L.point(point);
-
-               return Math.abs(point.x) <= Math.abs(this.x) &&
-                      Math.abs(point.y) <= Math.abs(this.y);
-       },
-
-       toString: function () {
-               return 'Point(' +
-                       L.Util.formatNum(this.x) + ', ' +
-                       L.Util.formatNum(this.y) + ')';
-       }
-};
-
-L.point = function (x, y, round) {
-       if (x instanceof L.Point) {
-               return x;
-       }
-       if (L.Util.isArray(x)) {
-               return new L.Point(x[0], x[1]);
-       }
-       if (x === undefined || x === null) {
-               return x;
-       }
-       return new L.Point(x, y, round);
-};
-
-
-/*
- * L.Bounds represents a rectangular area on the screen in pixel coordinates.
- */
-
-L.Bounds = function (a, b) { //(Point, Point) or Point[]
-       if (!a) { return; }
-
-       var points = b ? [a, b] : a;
-
-       for (var i = 0, len = points.length; i < len; i++) {
-               this.extend(points[i]);
-       }
-};
-
-L.Bounds.prototype = {
-       // extend the bounds to contain the given point
-       extend: function (point) { // (Point)
-               point = L.point(point);
-
-               if (!this.min && !this.max) {
-                       this.min = point.clone();
-                       this.max = point.clone();
-               } else {
-                       this.min.x = Math.min(point.x, this.min.x);
-                       this.max.x = Math.max(point.x, this.max.x);
-                       this.min.y = Math.min(point.y, this.min.y);
-                       this.max.y = Math.max(point.y, this.max.y);
-               }
-               return this;
-       },
-
-       getCenter: function (round) { // (Boolean) -> Point
-               return new L.Point(
-                       (this.min.x + this.max.x) / 2,
-                       (this.min.y + this.max.y) / 2, round);
-       },
-
-       getBottomLeft: function () { // -> Point
-               return new L.Point(this.min.x, this.max.y);
-       },
-
-       getTopRight: function () { // -> Point
-               return new L.Point(this.max.x, this.min.y);
-       },
-
-       getSize: function () {
-               return this.max.subtract(this.min);
-       },
-
-       contains: function (obj) { // (Bounds) or (Point) -> Boolean
-               var min, max;
-
-               if (typeof obj[0] === 'number' || obj instanceof L.Point) {
-                       obj = L.point(obj);
-               } else {
-                       obj = L.bounds(obj);
-               }
-
-               if (obj instanceof L.Bounds) {
-                       min = obj.min;
-                       max = obj.max;
-               } else {
-                       min = max = obj;
-               }
-
-               return (min.x >= this.min.x) &&
-                      (max.x <= this.max.x) &&
-                      (min.y >= this.min.y) &&
-                      (max.y <= this.max.y);
-       },
-
-       intersects: function (bounds) { // (Bounds) -> Boolean
-               bounds = L.bounds(bounds);
-
-               var min = this.min,
-                   max = this.max,
-                   min2 = bounds.min,
-                   max2 = bounds.max,
-                   xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
-                   yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
-
-               return xIntersects && yIntersects;
-       },
-
-       isValid: function () {
-               return !!(this.min && this.max);
-       }
-};
-
-L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])
-       if (!a || a instanceof L.Bounds) {
-               return a;
-       }
-       return new L.Bounds(a, b);
-};
-
-
-/*
- * L.Transformation is an utility class to perform simple point 
transformations through a 2d-matrix.
- */
-
-L.Transformation = function (a, b, c, d) {
-       this._a = a;
-       this._b = b;
-       this._c = c;
-       this._d = d;
-};
-
-L.Transformation.prototype = {
-       transform: function (point, scale) { // (Point, Number) -> Point
-               return this._transform(point.clone(), scale);
-       },
-
-       // destructive transform (faster)
-       _transform: function (point, scale) {
-               scale = scale || 1;
-               point.x = scale * (this._a * point.x + this._b);
-               point.y = scale * (this._c * point.y + this._d);
-               return point;
-       },
-
-       untransform: function (point, scale) {
-               scale = scale || 1;
-               return new L.Point(
-                       (point.x / scale - this._b) / this._a,
-                       (point.y / scale - this._d) / this._c);
-       }
-};
-
-
-/*
- * L.DomUtil contains various utility functions for working with DOM.
- */
-
-L.DomUtil = {
-       get: function (id) {
-               return (typeof id === 'string' ? document.getElementById(id) : 
id);
-       },
-
-       getStyle: function (el, style) {
-
-               var value = el.style[style];
-
-               if (!value && el.currentStyle) {
-                       value = el.currentStyle[style];
-               }
-
-               if ((!value || value === 'auto') && document.defaultView) {
-                       var css = document.defaultView.getComputedStyle(el, 
null);
-                       value = css ? css[style] : null;
-               }
-
-               return value === 'auto' ? null : value;
-       },
-
-       getViewportOffset: function (element) {
-
-               var top = 0,
-                   left = 0,
-                   el = element,
-                   docBody = document.body,
-                   docEl = document.documentElement,
-                   pos;
-
-               do {
-                       top  += el.offsetTop  || 0;
-                       left += el.offsetLeft || 0;
-
-                       //add borders
-                       top += parseInt(L.DomUtil.getStyle(el, 
'borderTopWidth'), 10) || 0;
-                       left += parseInt(L.DomUtil.getStyle(el, 
'borderLeftWidth'), 10) || 0;
-
-                       pos = L.DomUtil.getStyle(el, 'position');
-
-                       if (el.offsetParent === docBody && pos === 'absolute') 
{ break; }
-
-                       if (pos === 'fixed') {
-                               top  += docBody.scrollTop  || docEl.scrollTop  
|| 0;
-                               left += docBody.scrollLeft || docEl.scrollLeft 
|| 0;
-                               break;
-                       }
-
-                       if (pos === 'relative' && !el.offsetLeft) {
-                               var width = L.DomUtil.getStyle(el, 'width'),
-                                   maxWidth = L.DomUtil.getStyle(el, 
'max-width'),
-                                   r = el.getBoundingClientRect();
-
-                               if (width !== 'none' || maxWidth !== 'none') {
-                                       left += r.left + el.clientLeft;
-                               }
-
-                               //calculate full y offset since we're breaking 
out of the loop
-                               top += r.top + (docBody.scrollTop  || 
docEl.scrollTop  || 0);
-
-                               break;
-                       }
-
-                       el = el.offsetParent;
-
-               } while (el);
-
-               el = element;
-
-               do {
-                       if (el === docBody) { break; }
-
-                       top  -= el.scrollTop  || 0;
-                       left -= el.scrollLeft || 0;
-
-                       el = el.parentNode;
-               } while (el);
-
-               return new L.Point(left, top);
-       },
-
-       documentIsLtr: function () {
-               if (!L.DomUtil._docIsLtrCached) {
-                       L.DomUtil._docIsLtrCached = true;
-                       L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 
'direction') === 'ltr';
-               }
-               return L.DomUtil._docIsLtr;
-       },
-
-       create: function (tagName, className, container) {
-
-               var el = document.createElement(tagName);
-               el.className = className;
-
-               if (container) {
-                       container.appendChild(el);
-               }
-
-               return el;
-       },
-
-       hasClass: function (el, name) {
-               if (el.classList !== undefined) {
-                       return el.classList.contains(name);
-               }
-               var className = L.DomUtil._getClass(el);
-               return className.length > 0 && new RegExp('(^|\\s)' + name + 
'(\\s|$)').test(className);
-       },
-
-       addClass: function (el, name) {
-               if (el.classList !== undefined) {
-                       var classes = L.Util.splitWords(name);
-                       for (var i = 0, len = classes.length; i < len; i++) {
-                               el.classList.add(classes[i]);
-                       }
-               } else if (!L.DomUtil.hasClass(el, name)) {
-                       var className = L.DomUtil._getClass(el);
-                       L.DomUtil._setClass(el, (className ? className + ' ' : 
'') + name);
-               }
-       },
-
-       removeClass: function (el, name) {
-               if (el.classList !== undefined) {
-                       el.classList.remove(name);
-               } else {
-                       L.DomUtil._setClass(el, L.Util.trim((' ' + 
L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
-               }
-       },
-
-       _setClass: function (el, name) {
-               if (el.className.baseVal === undefined) {
-                       el.className = name;
-               } else {
-                       // in case of SVG element
-                       el.className.baseVal = name;
-               }
-       },
-
-       _getClass: function (el) {
-               return el.className.baseVal === undefined ? el.className : 
el.className.baseVal;
-       },
-
-       setOpacity: function (el, value) {
-
-               if ('opacity' in el.style) {
-                       el.style.opacity = value;
-
-               } else if ('filter' in el.style) {
-
-                       var filter = false,
-                           filterName = 'DXImageTransform.Microsoft.Alpha';
-
-                       // filters collection throws an error if we try to 
retrieve a filter that doesn't exist
-                       try {
-                               filter = el.filters.item(filterName);
-                       } catch (e) {
-                               // don't set opacity to 1 if we haven't already 
set an opacity,
-                               // it isn't needed and breaks transparent pngs.
-                               if (value === 1) { return; }
-                       }
-
-                       value = Math.round(value * 100);
-
-                       if (filter) {
-                               filter.Enabled = (value !== 100);
-                               filter.Opacity = value;
-                       } else {
-                               el.style.filter += ' progid:' + filterName + 
'(opacity=' + value + ')';
-                       }
-               }
-       },
-
-       testProp: function (props) {
-
-               var style = document.documentElement.style;
-
-               for (var i = 0; i < props.length; i++) {
-                       if (props[i] in style) {
-                               return props[i];
-                       }
-               }
-               return false;
-       },
-
-       getTranslateString: function (point) {
-               // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using 
translate3d instead of translate
-               // makes animation smoother as it ensures HW accel is used. 
Firefox 13 doesn't care
-               // (same speed either way), Opera 12 doesn't support translate3d
-
-               var is3d = L.Browser.webkit3d,
-                   open = 'translate' + (is3d ? '3d' : '') + '(',
-                   close = (is3d ? ',0' : '') + ')';
-
-               return open + point.x + 'px,' + point.y + 'px' + close;
-       },
-
-       getScaleString: function (scale, origin) {
-
-               var preTranslateStr = 
L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),
-                   scaleStr = ' scale(' + scale + ') ';
-
-               return preTranslateStr + scaleStr;
-       },
-
-       setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, 
Boolean])
-
-               // jshint camelcase: false
-               el._leaflet_pos = point;
-
-               if (!disable3D && L.Browser.any3d) {
-                       el.style[L.DomUtil.TRANSFORM] =  
L.DomUtil.getTranslateString(point);
-               } else {
-                       el.style.left = point.x + 'px';
-                       el.style.top = point.y + 'px';
-               }
-       },
-
-       getPosition: function (el) {
-               // this method is only used for elements previously positioned 
using setPosition,
-               // so it's safe to cache the position for performance
-
-               // jshint camelcase: false
-               return el._leaflet_pos;
-       }
-};
-
-
-// prefix style property names
-
-L.DomUtil.TRANSFORM = L.DomUtil.testProp(
-        ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 
'msTransform']);
-
-// webkitTransition comes first because some browser versions that drop vendor 
prefix don't do
-// the same for the transitionend event, in particular the Android 4.1 stock 
browser
-
-L.DomUtil.TRANSITION = L.DomUtil.testProp(
-        ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 
'msTransition']);
-
-L.DomUtil.TRANSITION_END =
-        L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION 
=== 'OTransition' ?
-        L.DomUtil.TRANSITION + 'End' : 'transitionend';
-
-(function () {
-    if ('onselectstart' in document) {
-        L.extend(L.DomUtil, {
-            disableTextSelection: function () {
-                L.DomEvent.on(window, 'selectstart', 
L.DomEvent.preventDefault);
-            },
-
-            enableTextSelection: function () {
-                L.DomEvent.off(window, 'selectstart', 
L.DomEvent.preventDefault);
-            }
-        });
-    } else {
-        var userSelectProperty = L.DomUtil.testProp(
-            ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 
'msUserSelect']);
-
-        L.extend(L.DomUtil, {
-            disableTextSelection: function () {
-                if (userSelectProperty) {
-                    var style = document.documentElement.style;
-                    this._userSelect = style[userSelectProperty];
-                    style[userSelectProperty] = 'none';
-                }
-            },
-
-            enableTextSelection: function () {
-                if (userSelectProperty) {
-                    document.documentElement.style[userSelectProperty] = 
this._userSelect;
-                    delete this._userSelect;
-                }
-            }
-        });
-    }
-
-       L.extend(L.DomUtil, {
-               disableImageDrag: function () {
-                       L.DomEvent.on(window, 'dragstart', 
L.DomEvent.preventDefault);
-               },
-
-               enableImageDrag: function () {
-                       L.DomEvent.off(window, 'dragstart', 
L.DomEvent.preventDefault);
-               }
-       });
-})();
-
-
-/*
- * L.LatLng represents a geographical point with latitude and longitude 
coordinates.
- */
-
-L.LatLng = function (lat, lng, alt) { // (Number, Number, Number)
-       lat = parseFloat(lat);
-       lng = parseFloat(lng);
-
-       if (isNaN(lat) || isNaN(lng)) {
-               throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + 
')');
-       }
-
-       this.lat = lat;
-       this.lng = lng;
-
-       if (alt !== undefined) {
-               this.alt = parseFloat(alt);
-       }
-};
-
-L.extend(L.LatLng, {
-       DEG_TO_RAD: Math.PI / 180,
-       RAD_TO_DEG: 180 / Math.PI,
-       MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check
-});
-
-L.LatLng.prototype = {
-       equals: function (obj) { // (LatLng) -> Boolean
-               if (!obj) { return false; }
-
-               obj = L.latLng(obj);
-
-               var margin = Math.max(
-                       Math.abs(this.lat - obj.lat),
-                       Math.abs(this.lng - obj.lng));
-
-               return margin <= L.LatLng.MAX_MARGIN;
-       },
-
-       toString: function (precision) { // (Number) -> String
-               return 'LatLng(' +
-                       L.Util.formatNum(this.lat, precision) + ', ' +
-                       L.Util.formatNum(this.lng, precision) + ')';
-       },
-
-       // Haversine distance formula, see 
http://en.wikipedia.org/wiki/Haversine_formula
-       // TODO move to projection code, LatLng shouldn't know about Earth
-       distanceTo: function (other) { // (LatLng) -> Number
-               other = L.latLng(other);
-
-               var R = 6378137, // earth radius in meters
-                   d2r = L.LatLng.DEG_TO_RAD,
-                   dLat = (other.lat - this.lat) * d2r,
-                   dLon = (other.lng - this.lng) * d2r,
-                   lat1 = this.lat * d2r,
-                   lat2 = other.lat * d2r,
-                   sin1 = Math.sin(dLat / 2),
-                   sin2 = Math.sin(dLon / 2);
-
-               var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * 
Math.cos(lat2);
-
-               return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
-       },
-
-       wrap: function (a, b) { // (Number, Number) -> LatLng
-               var lng = this.lng;
-
-               a = a || -180;
-               b = b ||  180;
-
-               lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);
-
-               return new L.LatLng(this.lat, lng);
-       }
-};
-
-L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, 
Number)
-       if (a instanceof L.LatLng) {
-               return a;
-       }
-       if (L.Util.isArray(a)) {
-               if (typeof a[0] === 'number' || typeof a[0] === 'string') {
-                       return new L.LatLng(a[0], a[1], a[2]);
-               } else {
-                       return null;
-               }
-       }
-       if (a === undefined || a === null) {
-               return a;
-       }
-       if (typeof a === 'object' && 'lat' in a) {
-               return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);
-       }
-       if (b === undefined) {
-               return null;
-       }
-       return new L.LatLng(a, b);
-};
-
-
-
-/*
- * L.LatLngBounds represents a rectangular area on the map in geographical 
coordinates.
- */
-
-L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or 
(LatLng[])
-       if (!southWest) { return; }
-
-       var latlngs = northEast ? [southWest, northEast] : southWest;
-
-       for (var i = 0, len = latlngs.length; i < len; i++) {
-               this.extend(latlngs[i]);
-       }
-};
-
-L.LatLngBounds.prototype = {
-       // extend the bounds to contain the given point or bounds
-       extend: function (obj) { // (LatLng) or (LatLngBounds)
-               if (!obj) { return this; }
-
-               var latLng = L.latLng(obj);
-               if (latLng !== null) {
-                       obj = latLng;
-               } else {
-                       obj = L.latLngBounds(obj);
-               }
-
-               if (obj instanceof L.LatLng) {
-                       if (!this._southWest && !this._northEast) {
-                               this._southWest = new L.LatLng(obj.lat, 
obj.lng);
-                               this._northEast = new L.LatLng(obj.lat, 
obj.lng);
-                       } else {
-                               this._southWest.lat = Math.min(obj.lat, 
this._southWest.lat);
-                               this._southWest.lng = Math.min(obj.lng, 
this._southWest.lng);
-
-                               this._northEast.lat = Math.max(obj.lat, 
this._northEast.lat);
-                               this._northEast.lng = Math.max(obj.lng, 
this._northEast.lng);
-                       }
-               } else if (obj instanceof L.LatLngBounds) {
-                       this.extend(obj._southWest);
-                       this.extend(obj._northEast);
-               }
-               return this;
-       },
-
-       // extend the bounds by a percentage
-       pad: function (bufferRatio) { // (Number) -> LatLngBounds
-               var sw = this._southWest,
-                   ne = this._northEast,
-                   heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
-                   widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
-
-               return new L.LatLngBounds(
-                       new L.LatLng(sw.lat - heightBuffer, sw.lng - 
widthBuffer),
-                       new L.LatLng(ne.lat + heightBuffer, ne.lng + 
widthBuffer));
-       },
-
-       getCenter: function () { // -> LatLng
-               return new L.LatLng(
-                       (this._southWest.lat + this._northEast.lat) / 2,
-                       (this._southWest.lng + this._northEast.lng) / 2);
-       },
-
-       getSouthWest: function () {
-               return this._southWest;
-       },
-
-       getNorthEast: function () {
-               return this._northEast;
-       },
-
-       getNorthWest: function () {
-               return new L.LatLng(this.getNorth(), this.getWest());
-       },
-
-       getSouthEast: function () {
-               return new L.LatLng(this.getSouth(), this.getEast());
-       },
-
-       getWest: function () {
-               return this._southWest.lng;
-       },
-
-       getSouth: function () {
-               return this._southWest.lat;
-       },
-
-       getEast: function () {
-               return this._northEast.lng;
-       },
-
-       getNorth: function () {
-               return this._northEast.lat;
-       },
-
-       contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
-               if (typeof obj[0] === 'number' || obj instanceof L.LatLng) {
-                       obj = L.latLng(obj);
-               } else {
-                       obj = L.latLngBounds(obj);
-               }
-
-               var sw = this._southWest,
-                   ne = this._northEast,
-                   sw2, ne2;
-
-               if (obj instanceof L.LatLngBounds) {
-                       sw2 = obj.getSouthWest();
-                       ne2 = obj.getNorthEast();
-               } else {
-                       sw2 = ne2 = obj;
-               }
-
-               return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
-                      (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
-       },
-
-       intersects: function (bounds) { // (LatLngBounds)
-               bounds = L.latLngBounds(bounds);
-
-               var sw = this._southWest,
-                   ne = this._northEast,
-                   sw2 = bounds.getSouthWest(),
-                   ne2 = bounds.getNorthEast(),
-
-                   latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
-                   lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
-
-               return latIntersects && lngIntersects;
-       },
-
-       toBBoxString: function () {
-               return [this.getWest(), this.getSouth(), this.getEast(), 
this.getNorth()].join(',');
-       },
-
-       equals: function (bounds) { // (LatLngBounds)
-               if (!bounds) { return false; }
-
-               bounds = L.latLngBounds(bounds);
-
-               return this._southWest.equals(bounds.getSouthWest()) &&
-                      this._northEast.equals(bounds.getNorthEast());
-       },
-
-       isValid: function () {
-               return !!(this._southWest && this._northEast);
-       }
-};
-
-//TODO International date line?
-
-L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)
-       if (!a || a instanceof L.LatLngBounds) {
-               return a;
-       }
-       return new L.LatLngBounds(a, b);
-};
-
-
-/*
- * L.Projection contains various geographical projections used by CRS classes.
- */
-
-L.Projection = {};
-
-
-/*
- * Spherical Mercator is the most popular map projection, used by EPSG:3857 
CRS used by default.
- */
-
-L.Projection.SphericalMercator = {
-       MAX_LATITUDE: 85.0511287798,
-
-       project: function (latlng) { // (LatLng) -> Point
-               var d = L.LatLng.DEG_TO_RAD,
-                   max = this.MAX_LATITUDE,
-                   lat = Math.max(Math.min(max, latlng.lat), -max),
-                   x = latlng.lng * d,
-                   y = lat * d;
-
-               y = Math.log(Math.tan((Math.PI / 4) + (y / 2)));
-
-               return new L.Point(x, y);
-       },
-
-       unproject: function (point) { // (Point, Boolean) -> LatLng
-               var d = L.LatLng.RAD_TO_DEG,
-                   lng = point.x * d,
-                   lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * 
d;
-
-               return new L.LatLng(lat, lng);
-       }
-};
-
-
-/*
- * Simple equirectangular (Plate Carree) projection, used by CRS like 
EPSG:4326 and Simple.
- */
-
-L.Projection.LonLat = {
-       project: function (latlng) {
-               return new L.Point(latlng.lng, latlng.lat);
-       },
-
-       unproject: function (point) {
-               return new L.LatLng(point.y, point.x);
-       }
-};
-
-
-/*
- * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) 
in Leaflet.
- */
-
-L.CRS = {
-       latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point
-               var projectedPoint = this.projection.project(latlng),
-                   scale = this.scale(zoom);
-
-               return this.transformation._transform(projectedPoint, scale);
-       },
-
-       pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) 
-> LatLng
-               var scale = this.scale(zoom),
-                   untransformedPoint = this.transformation.untransform(point, 
scale);
-
-               return this.projection.unproject(untransformedPoint);
-       },
-
-       project: function (latlng) {
-               return this.projection.project(latlng);
-       },
-
-       scale: function (zoom) {
-               return 256 * Math.pow(2, zoom);
-       },
-
-       getSize: function (zoom) {
-               var s = this.scale(zoom);
-               return L.point(s, s);
-       }
-};
-
-
-/*
- * A simple CRS that can be used for flat non-Earth maps like panoramas or 
game maps.
- */
-
-L.CRS.Simple = L.extend({}, L.CRS, {
-       projection: L.Projection.LonLat,
-       transformation: new L.Transformation(1, 0, -1, 0),
-
-       scale: function (zoom) {
-               return Math.pow(2, zoom);
-       }
-});
-
-
-/*
- * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping
- * and is used by Leaflet by default.
- */
-
-L.CRS.EPSG3857 = L.extend({}, L.CRS, {
-       code: 'EPSG:3857',
-
-       projection: L.Projection.SphericalMercator,
-       transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / 
Math.PI, 0.5),
-
-       project: function (latlng) { // (LatLng) -> Point
-               var projectedPoint = this.projection.project(latlng),
-                   earthRadius = 6378137;
-               return projectedPoint.multiplyBy(earthRadius);
-       }
-});
-
-L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {
-       code: 'EPSG:900913'
-});
-
-
-/*
- * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.
- */
-
-L.CRS.EPSG4326 = L.extend({}, L.CRS, {
-       code: 'EPSG:4326',
-
-       projection: L.Projection.LonLat,
-       transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)
-});
-
-
-/*
- * L.Map is the central class of the API - it is used to create a map.
- */
-
-L.Map = L.Class.extend({
-
-       includes: L.Mixin.Events,
-
-       options: {
-               crs: L.CRS.EPSG3857,
-
-               /*
-               center: LatLng,
-               zoom: Number,
-               layers: Array,
-               */
-
-               fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,
-               trackResize: true,
-               markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d
-       },
-
-       initialize: function (id, options) { // (HTMLElement or String, Object)
-               options = L.setOptions(this, options);
-
-
-               this._initContainer(id);
-               this._initLayout();
-
-               // hack for https://github.com/Leaflet/Leaflet/issues/1980
-               this._onResize = L.bind(this._onResize, this);
-
-               this._initEvents();
-
-               if (options.maxBounds) {
-                       this.setMaxBounds(options.maxBounds);
-               }
-
-               if (options.center && options.zoom !== undefined) {
-                       this.setView(L.latLng(options.center), options.zoom, 
{reset: true});
-               }
-
-               this._handlers = [];
-
-               this._layers = {};
-               this._zoomBoundLayers = {};
-               this._tileLayersNum = 0;
-
-               this.callInitHooks();
-
-               this._addLayers(options.layers);
-       },
-
-
-       // public methods that modify map state
-
-       // replaced by animation-powered implementation in Map.PanAnimation.js
-       setView: function (center, zoom) {
-               zoom = zoom === undefined ? this.getZoom() : zoom;
-               this._resetView(L.latLng(center), this._limitZoom(zoom));
-               return this;
-       },
-
-       setZoom: function (zoom, options) {
-               if (!this._loaded) {
-                       this._zoom = this._limitZoom(zoom);
-                       return this;
-               }
-               return this.setView(this.getCenter(), zoom, {zoom: options});
-       },
-
-       zoomIn: function (delta, options) {
-               return this.setZoom(this._zoom + (delta || 1), options);
-       },
-
-       zoomOut: function (delta, options) {
-               return this.setZoom(this._zoom - (delta || 1), options);
-       },
-
-       setZoomAround: function (latlng, zoom, options) {
-               var scale = this.getZoomScale(zoom),
-                   viewHalf = this.getSize().divideBy(2),
-                   containerPoint = latlng instanceof L.Point ? latlng : 
this.latLngToContainerPoint(latlng),
-
-                   centerOffset = 
containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
-                   newCenter = 
this.containerPointToLatLng(viewHalf.add(centerOffset));
-
-               return this.setView(newCenter, zoom, {zoom: options});
-       },
-
-       fitBounds: function (bounds, options) {
-
-               options = options || {};
-               bounds = bounds.getBounds ? bounds.getBounds() : 
L.latLngBounds(bounds);
-
-               var paddingTL = L.point(options.paddingTopLeft || 
options.padding || [0, 0]),
-                   paddingBR = L.point(options.paddingBottomRight || 
options.padding || [0, 0]),
-
-                   zoom = this.getBoundsZoom(bounds, false, 
paddingTL.add(paddingBR)),
-                   paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
-
-                   swPoint = this.project(bounds.getSouthWest(), zoom),
-                   nePoint = this.project(bounds.getNorthEast(), zoom),
-                   center = 
this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
-
-               zoom = options && options.maxZoom ? Math.min(options.maxZoom, 
zoom) : zoom;
-
-               return this.setView(center, zoom, options);
-       },
-
-       fitWorld: function (options) {
-               return this.fitBounds([[-90, -180], [90, 180]], options);
-       },
-
-       panTo: function (center, options) { // (LatLng)
-               return this.setView(center, this._zoom, {pan: options});
-       },
-
-       panBy: function (offset) { // (Point)
-               // replaced with animated panBy in Map.PanAnimation.js
-               this.fire('movestart');
-
-               this._rawPanBy(L.point(offset));
-
-               this.fire('move');
-               return this.fire('moveend');
-       },
-
-       setMaxBounds: function (bounds) {
-               bounds = L.latLngBounds(bounds);
-
-               this.options.maxBounds = bounds;
-
-               if (!bounds) {
-                       return this.off('moveend', this._panInsideMaxBounds, 
this);
-               }
-
-               if (this._loaded) {
-                       this._panInsideMaxBounds();
-               }
-
-               return this.on('moveend', this._panInsideMaxBounds, this);
-       },
-
-       panInsideBounds: function (bounds, options) {
-               var center = this.getCenter(),
-                       newCenter = this._limitCenter(center, this._zoom, 
bounds);
-
-               if (center.equals(newCenter)) { return this; }
-
-               return this.panTo(newCenter, options);
-       },
-
-       addLayer: function (layer) {
-               // TODO method is too big, refactor
-
-               var id = L.stamp(layer);
-
-               if (this._layers[id]) { return this; }
-
-               this._layers[id] = layer;
-
-               // TODO getMaxZoom, getMinZoom in ILayer (instead of options)
-               if (layer.options && (!isNaN(layer.options.maxZoom) || 
!isNaN(layer.options.minZoom))) {
-                       this._zoomBoundLayers[id] = layer;
-                       this._updateZoomLevels();
-               }
-
-               // TODO looks ugly, refactor!!!
-               if (this.options.zoomAnimation && L.TileLayer && (layer 
instanceof L.TileLayer)) {
-                       this._tileLayersNum++;
-                       this._tileLayersToLoad++;
-                       layer.on('load', this._onTileLayerLoad, this);
-               }
-
-               if (this._loaded) {
-                       this._layerAdd(layer);
-               }
-
-               return this;
-       },
-
-       removeLayer: function (layer) {
-               var id = L.stamp(layer);
-
-               if (!this._layers[id]) { return this; }
-
-               if (this._loaded) {
-                       layer.onRemove(this);
-               }
-
-               delete this._layers[id];
-
-               if (this._loaded) {
-                       this.fire('layerremove', {layer: layer});
-               }
-
-               if (this._zoomBoundLayers[id]) {
-                       delete this._zoomBoundLayers[id];
-                       this._updateZoomLevels();
-               }
-
-               // TODO looks ugly, refactor
-               if (this.options.zoomAnimation && L.TileLayer && (layer 
instanceof L.TileLayer)) {
-                       this._tileLayersNum--;
-                       this._tileLayersToLoad--;
-                       layer.off('load', this._onTileLayerLoad, this);
-               }
-
-               return this;
-       },
-
-       hasLayer: function (layer) {
-               if (!layer) { return false; }
-
-               return (L.stamp(layer) in this._layers);
-       },
-
-       eachLayer: function (method, context) {
-               for (var i in this._layers) {
-                       method.call(context, this._layers[i]);
-               }
-               return this;
-       },
-
-       invalidateSize: function (options) {
-               if (!this._loaded) { return this; }
-
-               options = L.extend({
-                       animate: false,
-                       pan: true
-               }, options === true ? {animate: true} : options);
-
-               var oldSize = this.getSize();
-               this._sizeChanged = true;
-               this._initialCenter = null;
-
-               var newSize = this.getSize(),
-                   oldCenter = oldSize.divideBy(2).round(),
-                   newCenter = newSize.divideBy(2).round(),
-                   offset = oldCenter.subtract(newCenter);
-
-               if (!offset.x && !offset.y) { return this; }
-
-               if (options.animate && options.pan) {
-                       this.panBy(offset);
-
-               } else {
-                       if (options.pan) {
-                               this._rawPanBy(offset);
-                       }
-
-                       this.fire('move');
-
-                       if (options.debounceMoveend) {
-                               clearTimeout(this._sizeTimer);
-                               this._sizeTimer = setTimeout(L.bind(this.fire, 
this, 'moveend'), 200);
-                       } else {
-                               this.fire('moveend');
-                       }
-               }
-
-               return this.fire('resize', {
-                       oldSize: oldSize,
-                       newSize: newSize
-               });
-       },
-
-       // TODO handler.addTo
-       addHandler: function (name, HandlerClass) {
-               if (!HandlerClass) { return this; }
-
-               var handler = this[name] = new HandlerClass(this);
-
-               this._handlers.push(handler);
-
-               if (this.options[name]) {
-                       handler.enable();
-               }
-
-               return this;
-       },
-
-       remove: function () {
-               if (this._loaded) {
-                       this.fire('unload');
-               }
-
-               this._initEvents('off');
-
-               try {
-                       // throws error in IE6-8
-                       delete this._container._leaflet;
-               } catch (e) {
-                       this._container._leaflet = undefined;
-               }
-
-               this._clearPanes();
-               if (this._clearControlPos) {
-                       this._clearControlPos();
-               }
-
-               this._clearHandlers();
-
-               return this;
-       },
-
-
-       // public methods for getting map state
-
-       getCenter: function () { // (Boolean) -> LatLng
-               this._checkIfLoaded();
-
-               if (this._initialCenter && !this._moved()) {
-                       return this._initialCenter;
-               }
-               return this.layerPointToLatLng(this._getCenterLayerPoint());
-       },
-
-       getZoom: function () {
-               return this._zoom;
-       },
-
-       getBounds: function () {
-               var bounds = this.getPixelBounds(),
-                   sw = this.unproject(bounds.getBottomLeft()),
-                   ne = this.unproject(bounds.getTopRight());
-
-               return new L.LatLngBounds(sw, ne);
-       },
-
-       getMinZoom: function () {
-               return this.options.minZoom === undefined ?
-                       (this._layersMinZoom === undefined ? 0 : 
this._layersMinZoom) :
-                       this.options.minZoom;
-       },
-
-       getMaxZoom: function () {
-               return this.options.maxZoom === undefined ?
-                       (this._layersMaxZoom === undefined ? Infinity : 
this._layersMaxZoom) :
-                       this.options.maxZoom;
-       },
-
-       getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, 
Boolean, Point]) -> Number
-               bounds = L.latLngBounds(bounds);
-
-               var zoom = this.getMinZoom() - (inside ? 1 : 0),
-                   maxZoom = this.getMaxZoom(),
-                   size = this.getSize(),
-
-                   nw = bounds.getNorthWest(),
-                   se = bounds.getSouthEast(),
-
-                   zoomNotFound = true,
-                   boundsSize;
-
-               padding = L.point(padding || [0, 0]);
-
-               do {
-                       zoom++;
-                       boundsSize = this.project(se, 
zoom).subtract(this.project(nw, zoom)).add(padding);
-                       zoomNotFound = !inside ? size.contains(boundsSize) : 
boundsSize.x < size.x || boundsSize.y < size.y;
-
-               } while (zoomNotFound && zoom <= maxZoom);
-
-               if (zoomNotFound && inside) {
-                       return null;
-               }
-
-               return inside ? zoom : zoom - 1;
-       },
-
-       getSize: function () {
-               if (!this._size || this._sizeChanged) {
-                       this._size = new L.Point(
-                               this._container.clientWidth,
-                               this._container.clientHeight);
-
-                       this._sizeChanged = false;
-               }
-               return this._size.clone();
-       },
-
-       getPixelBounds: function () {
-               var topLeftPoint = this._getTopLeftPoint();
-               return new L.Bounds(topLeftPoint, 
topLeftPoint.add(this.getSize()));
-       },
-
-       getPixelOrigin: function () {
-               this._checkIfLoaded();
-               return this._initialTopLeftPoint;
-       },
-
-       getPanes: function () {
-               return this._panes;
-       },
-
-       getContainer: function () {
-               return this._container;
-       },
-
-
-       // TODO replace with universal implementation after refactoring 
projections
-
-       getZoomScale: function (toZoom) {
-               var crs = this.options.crs;
-               return crs.scale(toZoom) / crs.scale(this._zoom);
-       },
-
-       getScaleZoom: function (scale) {
-               return this._zoom + (Math.log(scale) / Math.LN2);
-       },
-
-
-       // conversion methods
-
-       project: function (latlng, zoom) { // (LatLng[, Number]) -> Point
-               zoom = zoom === undefined ? this._zoom : zoom;
-               return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
-       },
-
-       unproject: function (point, zoom) { // (Point[, Number]) -> LatLng
-               zoom = zoom === undefined ? this._zoom : zoom;
-               return this.options.crs.pointToLatLng(L.point(point), zoom);
-       },
-
-       layerPointToLatLng: function (point) { // (Point)
-               var projectedPoint = L.point(point).add(this.getPixelOrigin());
-               return this.unproject(projectedPoint);
-       },
-
-       latLngToLayerPoint: function (latlng) { // (LatLng)
-               var projectedPoint = this.project(L.latLng(latlng))._round();
-               return projectedPoint._subtract(this.getPixelOrigin());
-       },
-
-       containerPointToLayerPoint: function (point) { // (Point)
-               return L.point(point).subtract(this._getMapPanePos());
-       },
-
-       layerPointToContainerPoint: function (point) { // (Point)
-               return L.point(point).add(this._getMapPanePos());
-       },
-
-       containerPointToLatLng: function (point) {
-               var layerPoint = 
this.containerPointToLayerPoint(L.point(point));
-               return this.layerPointToLatLng(layerPoint);
-       },
-
-       latLngToContainerPoint: function (latlng) {
-               return 
this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
-       },
-
-       mouseEventToContainerPoint: function (e) { // (MouseEvent)
-               return L.DomEvent.getMousePosition(e, this._container);
-       },
-
-       mouseEventToLayerPoint: function (e) { // (MouseEvent)
-               return 
this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
-       },
-
-       mouseEventToLatLng: function (e) { // (MouseEvent)
-               return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
-       },
-
-
-       // map initialization methods
-
-       _initContainer: function (id) {
-               var container = this._container = L.DomUtil.get(id);
-
-               if (!container) {
-                       throw new Error('Map container not found.');
-               } else if (container._leaflet) {
-                       throw new Error('Map container is already 
initialized.');
-               }
-
-               container._leaflet = true;
-       },
-
-       _initLayout: function () {
-               var container = this._container;
-
-               L.DomUtil.addClass(container, 'leaflet-container' +
-                       (L.Browser.touch ? ' leaflet-touch' : '') +
-                       (L.Browser.retina ? ' leaflet-retina' : '') +
-                       (L.Browser.ielt9 ? ' leaflet-oldie' : '') +
-                       (this.options.fadeAnimation ? ' leaflet-fade-anim' : 
''));
-
-               var position = L.DomUtil.getStyle(container, 'position');
-
-               if (position !== 'absolute' && position !== 'relative' && 
position !== 'fixed') {
-                       container.style.position = 'relative';
-               }
-
-               this._initPanes();
-
-               if (this._initControlPos) {
-                       this._initControlPos();
-               }
-       },
-
-       _initPanes: function () {
-               var panes = this._panes = {};
-
-               this._mapPane = panes.mapPane = 
this._createPane('leaflet-map-pane', this._container);
-
-               this._tilePane = panes.tilePane = 
this._createPane('leaflet-tile-pane', this._mapPane);
-               panes.objectsPane = this._createPane('leaflet-objects-pane', 
this._mapPane);
-               panes.shadowPane = this._createPane('leaflet-shadow-pane');
-               panes.overlayPane = this._createPane('leaflet-overlay-pane');
-               panes.markerPane = this._createPane('leaflet-marker-pane');
-               panes.popupPane = this._createPane('leaflet-popup-pane');
-
-               var zoomHide = ' leaflet-zoom-hide';
-
-               if (!this.options.markerZoomAnimation) {
-                       L.DomUtil.addClass(panes.markerPane, zoomHide);
-                       L.DomUtil.addClass(panes.shadowPane, zoomHide);
-                       L.DomUtil.addClass(panes.popupPane, zoomHide);
-               }
-       },
-
-       _createPane: function (className, container) {
-               return L.DomUtil.create('div', className, container || 
this._panes.objectsPane);
-       },
-
-       _clearPanes: function () {
-               this._container.removeChild(this._mapPane);
-       },
-
-       _addLayers: function (layers) {
-               layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) 
: [];
-
-               for (var i = 0, len = layers.length; i < len; i++) {
-                       this.addLayer(layers[i]);
-               }
-       },
-
-
-       // private methods that modify map state
-
-       _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
-
-               var zoomChanged = (this._zoom !== zoom);
-
-               if (!afterZoomAnim) {
-                       this.fire('movestart');
-
-                       if (zoomChanged) {
-                               this.fire('zoomstart');
-                       }
-               }
-
-               this._zoom = zoom;
-               this._initialCenter = center;
-
-               this._initialTopLeftPoint = this._getNewTopLeftPoint(center);
-
-               if (!preserveMapOffset) {
-                       L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
-               } else {
-                       this._initialTopLeftPoint._add(this._getMapPanePos());
-               }
-
-               this._tileLayersToLoad = this._tileLayersNum;
-
-               var loading = !this._loaded;
-               this._loaded = true;
-
-               if (loading) {
-                       this.fire('load');
-                       this.eachLayer(this._layerAdd, this);
-               }
-
-               this.fire('viewreset', {hard: !preserveMapOffset});
-
-               this.fire('move');
-
-               if (zoomChanged || afterZoomAnim) {
-                       this.fire('zoomend');
-               }
-
-               this.fire('moveend', {hard: !preserveMapOffset});
-       },
-
-       _rawPanBy: function (offset) {
-               L.DomUtil.setPosition(this._mapPane, 
this._getMapPanePos().subtract(offset));
-       },
-
-       _getZoomSpan: function () {
-               return this.getMaxZoom() - this.getMinZoom();
-       },
-
-       _updateZoomLevels: function () {
-               var i,
-                       minZoom = Infinity,
-                       maxZoom = -Infinity,
-                       oldZoomSpan = this._getZoomSpan();
-
-               for (i in this._zoomBoundLayers) {
-                       var layer = this._zoomBoundLayers[i];
-                       if (!isNaN(layer.options.minZoom)) {
-                               minZoom = Math.min(minZoom, 
layer.options.minZoom);
-                       }
-                       if (!isNaN(layer.options.maxZoom)) {
-                               maxZoom = Math.max(maxZoom, 
layer.options.maxZoom);
-                       }
-               }
-
-               if (i === undefined) { // we have no tilelayers
-                       this._layersMaxZoom = this._layersMinZoom = undefined;
-               } else {
-                       this._layersMaxZoom = maxZoom;
-                       this._layersMinZoom = minZoom;
-               }
-
-               if (oldZoomSpan !== this._getZoomSpan()) {
-                       this.fire('zoomlevelschange');
-               }
-       },
-
-       _panInsideMaxBounds: function () {
-               this.panInsideBounds(this.options.maxBounds);
-       },
-
-       _checkIfLoaded: function () {
-               if (!this._loaded) {
-                       throw new Error('Set map center and zoom first.');
-               }
-       },
-
-       // map events
-
-       _initEvents: function (onOff) {
-               if (!L.DomEvent) { return; }
-
-               onOff = onOff || 'on';
-
-               L.DomEvent[onOff](this._container, 'click', this._onMouseClick, 
this);
-
-               var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',
-                             'mouseleave', 'mousemove', 'contextmenu'],
-                   i, len;
-
-               for (i = 0, len = events.length; i < len; i++) {
-                       L.DomEvent[onOff](this._container, events[i], 
this._fireMouseEvent, this);
-               }
-
-               if (this.options.trackResize) {
-                       L.DomEvent[onOff](window, 'resize', this._onResize, 
this);
-               }
-       },
-
-       _onResize: function () {
-               L.Util.cancelAnimFrame(this._resizeRequest);
-               this._resizeRequest = L.Util.requestAnimFrame(
-                       function () { this.invalidateSize({debounceMoveend: 
true}); }, this, false, this._container);
-       },
-
-       _onMouseClick: function (e) {
-               if (!this._loaded || (!e._simulated &&
-                       ((this.dragging && this.dragging.moved()) ||
-                        (this.boxZoom  && this.boxZoom.moved()))) ||
-                           L.DomEvent._skipped(e)) { return; }
-
-               this.fire('preclick');
-               this._fireMouseEvent(e);
-       },
-
-       _fireMouseEvent: function (e) {
-               if (!this._loaded || L.DomEvent._skipped(e)) { return; }
-
-               var type = e.type;
-
-               type = (type === 'mouseenter' ? 'mouseover' : (type === 
'mouseleave' ? 'mouseout' : type));
-
-               if (!this.hasEventListeners(type)) { return; }
-
-               if (type === 'contextmenu') {
-                       L.DomEvent.preventDefault(e);
-               }
-
-               var containerPoint = this.mouseEventToContainerPoint(e),
-                   layerPoint = 
this.containerPointToLayerPoint(containerPoint),
-                   latlng = this.layerPointToLatLng(layerPoint);
-
-               this.fire(type, {
-                       latlng: latlng,
-                       layerPoint: layerPoint,
-                       containerPoint: containerPoint,
-                       originalEvent: e
-               });
-       },
-
-       _onTileLayerLoad: function () {
-               this._tileLayersToLoad--;
-               if (this._tileLayersNum && !this._tileLayersToLoad) {
-                       this.fire('tilelayersload');
-               }
-       },
-
-       _clearHandlers: function () {
-               for (var i = 0, len = this._handlers.length; i < len; i++) {
-                       this._handlers[i].disable();
-               }
-       },
-
-       whenReady: function (callback, context) {
-               if (this._loaded) {
-                       callback.call(context || this, this);
-               } else {
-                       this.on('load', callback, context);
-               }
-               return this;
-       },
-
-       _layerAdd: function (layer) {
-               layer.onAdd(this);
-               this.fire('layeradd', {layer: layer});
-       },
-
-
-       // private methods for getting map state
-
-       _getMapPanePos: function () {
-               return L.DomUtil.getPosition(this._mapPane);
-       },
-
-       _moved: function () {
-               var pos = this._getMapPanePos();
-               return pos && !pos.equals([0, 0]);
-       },
-
-       _getTopLeftPoint: function () {
-               return this.getPixelOrigin().subtract(this._getMapPanePos());
-       },
-
-       _getNewTopLeftPoint: function (center, zoom) {
-               var viewHalf = this.getSize()._divideBy(2);
-               // TODO round on display, not calculation to increase precision?
-               return this.project(center, zoom)._subtract(viewHalf)._round();
-       },
-
-       _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
-               var topLeft = this._getNewTopLeftPoint(newCenter, 
newZoom).add(this._getMapPanePos());
-               return this.project(latlng, newZoom)._subtract(topLeft);
-       },
-
-       // layer point of the current center
-       _getCenterLayerPoint: function () {
-               return 
this.containerPointToLayerPoint(this.getSize()._divideBy(2));
-       },
-
-       // offset of the specified place to the current center in pixels
-       _getCenterOffset: function (latlng) {
-               return 
this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
-       },
-
-       // adjust center for view to get inside bounds
-       _limitCenter: function (center, zoom, bounds) {
-
-               if (!bounds) { return center; }
-
-               var centerPoint = this.project(center, zoom),
-                   viewHalf = this.getSize().divideBy(2),
-                   viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), 
centerPoint.add(viewHalf)),
-                   offset = this._getBoundsOffset(viewBounds, bounds, zoom);
-
-               return this.unproject(centerPoint.add(offset), zoom);
-       },
-
-       // adjust offset for view to get inside bounds
-       _limitOffset: function (offset, bounds) {
-               if (!bounds) { return offset; }
-
-               var viewBounds = this.getPixelBounds(),
-                   newBounds = new L.Bounds(viewBounds.min.add(offset), 
viewBounds.max.add(offset));
-
-               return offset.add(this._getBoundsOffset(newBounds, bounds));
-       },
-
-       // returns offset needed for pxBounds to get inside maxBounds at a 
specified zoom
-       _getBoundsOffset: function (pxBounds, maxBounds, zoom) {
-               var nwOffset = this.project(maxBounds.getNorthWest(), 
zoom).subtract(pxBounds.min),
-                   seOffset = this.project(maxBounds.getSouthEast(), 
zoom).subtract(pxBounds.max),
-
-                   dx = this._rebound(nwOffset.x, -seOffset.x),
-                   dy = this._rebound(nwOffset.y, -seOffset.y);
-
-               return new L.Point(dx, dy);
-       },
-
-       _rebound: function (left, right) {
-               return left + right > 0 ?
-                       Math.round(left - right) / 2 :
-                       Math.max(0, Math.ceil(left)) - Math.max(0, 
Math.floor(right));
-       },
-
-       _limitZoom: function (zoom) {
-               var min = this.getMinZoom(),
-                   max = this.getMaxZoom();
-
-               return Math.max(min, Math.min(max, zoom));
-       }
-});
-
-L.map = function (id, options) {
-       return new L.Map(id, options);
-};
-
-
-/*
- * Mercator projection that takes into account that the Earth is not a perfect 
sphere.
- * Less popular than spherical mercator; used by projections like EPSG:3395.
- */
-
-L.Projection.Mercator = {
-       MAX_LATITUDE: 85.0840591556,
-
-       R_MINOR: 6356752.314245179,
-       R_MAJOR: 6378137,
-
-       project: function (latlng) { // (LatLng) -> Point
-               var d = L.LatLng.DEG_TO_RAD,
-                   max = this.MAX_LATITUDE,
-                   lat = Math.max(Math.min(max, latlng.lat), -max),
-                   r = this.R_MAJOR,
-                   r2 = this.R_MINOR,
-                   x = latlng.lng * d * r,
-                   y = lat * d,
-                   tmp = r2 / r,
-                   eccent = Math.sqrt(1.0 - tmp * tmp),
-                   con = eccent * Math.sin(y);
-
-               con = Math.pow((1 - con) / (1 + con), eccent * 0.5);
-
-               var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
-               y = -r * Math.log(ts);
-
-               return new L.Point(x, y);
-       },
-
-       unproject: function (point) { // (Point, Boolean) -> LatLng
-               var d = L.LatLng.RAD_TO_DEG,
-                   r = this.R_MAJOR,
-                   r2 = this.R_MINOR,
-                   lng = point.x * d / r,
-                   tmp = r2 / r,
-                   eccent = Math.sqrt(1 - (tmp * tmp)),
-                   ts = Math.exp(- point.y / r),
-                   phi = (Math.PI / 2) - 2 * Math.atan(ts),
-                   numIter = 15,
-                   tol = 1e-7,
-                   i = numIter,
-                   dphi = 0.1,
-                   con;
-
-               while ((Math.abs(dphi) > tol) && (--i > 0)) {
-                       con = eccent * Math.sin(phi);
-                       dphi = (Math.PI / 2) - 2 * Math.atan(ts *
-                                   Math.pow((1.0 - con) / (1.0 + con), 0.5 * 
eccent)) - phi;
-                       phi += dphi;
-               }
-
-               return new L.LatLng(phi * d, lng);
-       }
-};
-
-
-
-L.CRS.EPSG3395 = L.extend({}, L.CRS, {
-       code: 'EPSG:3395',
-
-       projection: L.Projection.Mercator,
-
-       transformation: (function () {
-               var m = L.Projection.Mercator,
-                   r = m.R_MAJOR,
-                   scale = 0.5 / (Math.PI * r);
-
-               return new L.Transformation(scale, 0.5, -scale, 0.5);
-       }())
-});
-
-
-/*
- * L.TileLayer is used for standard xyz-numbered tile layers.
- */
-
-L.TileLayer = L.Class.extend({
-       includes: L.Mixin.Events,
-
-       options: {
-               minZoom: 0,
-               maxZoom: 18,
-               tileSize: 256,
-               subdomains: 'abc',
-               errorTileUrl: '',
-               attribution: '',
-               zoomOffset: 0,
-               opacity: 1,
-               /*
-               maxNativeZoom: null,
-               zIndex: null,
-               tms: false,
-               continuousWorld: false,
-               noWrap: false,
-               zoomReverse: false,
-               detectRetina: false,
-               reuseTiles: false,
-               bounds: false,
-               */
-               unloadInvisibleTiles: L.Browser.mobile,
-               updateWhenIdle: L.Browser.mobile
-       },
-
-       initialize: function (url, options) {
-               options = L.setOptions(this, options);
-
-               // detecting retina displays, adjusting tileSize and zoom levels
-               if (options.detectRetina && L.Browser.retina && options.maxZoom 
> 0) {
-
-                       options.tileSize = Math.floor(options.tileSize / 2);
-                       options.zoomOffset++;
-
-                       if (options.minZoom > 0) {
-                               options.minZoom--;
-                       }
-                       this.options.maxZoom--;
-               }
-
-               if (options.bounds) {
-                       options.bounds = L.latLngBounds(options.bounds);
-               }
-
-               this._url = url;
-
-               var subdomains = this.options.subdomains;
-
-               if (typeof subdomains === 'string') {
-                       this.options.subdomains = subdomains.split('');
-               }
-       },
-
-       onAdd: function (map) {
-               this._map = map;
-               this._animated = map._zoomAnimated;
-
-               // create a container div for tiles
-               this._initContainer();
-
-               // set up events
-               map.on({
-                       'viewreset': this._reset,
-                       'moveend': this._update
-               }, this);
-
-               if (this._animated) {
-                       map.on({
-                               'zoomanim': this._animateZoom,
-                               'zoomend': this._endZoomAnim
-                       }, this);
-               }
-
-               if (!this.options.updateWhenIdle) {
-                       this._limitedUpdate = 
L.Util.limitExecByInterval(this._update, 150, this);
-                       map.on('move', this._limitedUpdate, this);
-               }
-
-               this._reset();
-               this._update();
-       },
-
-       addTo: function (map) {
-               map.addLayer(this);
-               return this;
-       },
-
-       onRemove: function (map) {
-               this._container.parentNode.removeChild(this._container);
-
-               map.off({
-                       'viewreset': this._reset,
-                       'moveend': this._update
-               }, this);
-
-               if (this._animated) {
-                       map.off({
-                               'zoomanim': this._animateZoom,
-                               'zoomend': this._endZoomAnim
-                       }, this);
-               }
-
-               if (!this.options.updateWhenIdle) {
-                       map.off('move', this._limitedUpdate, this);
-               }
-
-               this._container = null;
-               this._map = null;
-       },
-
-       bringToFront: function () {
-               var pane = this._map._panes.tilePane;
-
-               if (this._container) {
-                       pane.appendChild(this._container);
-                       this._setAutoZIndex(pane, Math.max);
-               }
-
-               return this;
-       },
-
-       bringToBack: function () {
-               var pane = this._map._panes.tilePane;
-
-               if (this._container) {
-                       pane.insertBefore(this._container, pane.firstChild);
-                       this._setAutoZIndex(pane, Math.min);
-               }
-
-               return this;
-       },
-
-       getAttribution: function () {
-               return this.options.attribution;
-       },
-
-       getContainer: function () {
-               return this._container;
-       },
-
-       setOpacity: function (opacity) {
-               this.options.opacity = opacity;
-
-               if (this._map) {
-                       this._updateOpacity();
-               }
-
-               return this;
-       },
-
-       setZIndex: function (zIndex) {
-               this.options.zIndex = zIndex;
-               this._updateZIndex();
-
-               return this;
-       },
-
-       setUrl: function (url, noRedraw) {
-               this._url = url;
-
-               if (!noRedraw) {
-                       this.redraw();
-               }
-
-               return this;
-       },
-
-       redraw: function () {
-               if (this._map) {
-                       this._reset({hard: true});
-                       this._update();
-               }
-               return this;
-       },
-
-       _updateZIndex: function () {
-               if (this._container && this.options.zIndex !== undefined) {
-                       this._container.style.zIndex = this.options.zIndex;
-               }
-       },
-
-       _setAutoZIndex: function (pane, compare) {
-
-               var layers = pane.children,
-                   edgeZIndex = -compare(Infinity, -Infinity), // -Infinity 
for max, Infinity for min
-                   zIndex, i, len;
-
-               for (i = 0, len = layers.length; i < len; i++) {
-
-                       if (layers[i] !== this._container) {
-                               zIndex = parseInt(layers[i].style.zIndex, 10);
-
-                               if (!isNaN(zIndex)) {
-                                       edgeZIndex = compare(edgeZIndex, 
zIndex);
-                               }
-                       }
-               }
-
-               this.options.zIndex = this._container.style.zIndex =
-                       (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, 
-1);
-       },
-
-       _updateOpacity: function () {
-               var i,
-                   tiles = this._tiles;
-
-               if (L.Browser.ielt9) {
-                       for (i in tiles) {
-                               L.DomUtil.setOpacity(tiles[i], 
this.options.opacity);
-                       }
-               } else {
-                       L.DomUtil.setOpacity(this._container, 
this.options.opacity);
-               }
-       },
-
-       _initContainer: function () {
-               var tilePane = this._map._panes.tilePane;
-
-               if (!this._container) {
-                       this._container = L.DomUtil.create('div', 
'leaflet-layer');
-
-                       this._updateZIndex();
-
-                       if (this._animated) {
-                               var className = 'leaflet-tile-container';
-
-                               this._bgBuffer = L.DomUtil.create('div', 
className, this._container);
-                               this._tileContainer = L.DomUtil.create('div', 
className, this._container);
-
-                       } else {
-                               this._tileContainer = this._container;
-                       }
-
-                       tilePane.appendChild(this._container);
-
-                       if (this.options.opacity < 1) {
-                               this._updateOpacity();
-                       }
-               }
-       },
-
-       _reset: function (e) {
-               for (var key in this._tiles) {
-                       this.fire('tileunload', {tile: this._tiles[key]});
-               }
-
-               this._tiles = {};
-               this._tilesToLoad = 0;
-
-               if (this.options.reuseTiles) {
-                       this._unusedTiles = [];
-               }
-
-               this._tileContainer.innerHTML = '';
-
-               if (this._animated && e && e.hard) {
-                       this._clearBgBuffer();
-               }
-
-               this._initContainer();
-       },
-
-       _getTileSize: function () {
-               var map = this._map,
-                   zoom = map.getZoom() + this.options.zoomOffset,
-                   zoomN = this.options.maxNativeZoom,
-                   tileSize = this.options.tileSize;
-
-               if (zoomN && zoom > zoomN) {
-                       tileSize = Math.round(map.getZoomScale(zoom) / 
map.getZoomScale(zoomN) * tileSize);
-               }
-
-               return tileSize;
-       },
-
-       _update: function () {
-
-               if (!this._map) { return; }
-
-               var map = this._map,
-                   bounds = map.getPixelBounds(),
-                   zoom = map.getZoom(),
-                   tileSize = this._getTileSize();
-
-               if (zoom > this.options.maxZoom || zoom < this.options.minZoom) 
{
-                       return;
-               }
-
-               var tileBounds = L.bounds(
-                       bounds.min.divideBy(tileSize)._floor(),
-                       bounds.max.divideBy(tileSize)._floor());
-
-               this._addTilesFromCenterOut(tileBounds);
-
-               if (this.options.unloadInvisibleTiles || 
this.options.reuseTiles) {
-                       this._removeOtherTiles(tileBounds);
-               }
-       },
-
-       _addTilesFromCenterOut: function (bounds) {
-               var queue = [],
-                   center = bounds.getCenter();
-
-               var j, i, point;
-
-               for (j = bounds.min.y; j <= bounds.max.y; j++) {
-                       for (i = bounds.min.x; i <= bounds.max.x; i++) {
-                               point = new L.Point(i, j);
-
-                               if (this._tileShouldBeLoaded(point)) {
-                                       queue.push(point);
-                               }
-                       }
-               }
-
-               var tilesToLoad = queue.length;
-
-               if (tilesToLoad === 0) { return; }
-
-               // load tiles in order of their distance to center
-               queue.sort(function (a, b) {
-                       return a.distanceTo(center) - b.distanceTo(center);
-               });
-
-               var fragment = document.createDocumentFragment();
-
-               // if its the first batch of tiles to load
-               if (!this._tilesToLoad) {
-                       this.fire('loading');
-               }
-
-               this._tilesToLoad += tilesToLoad;
-
-               for (i = 0; i < tilesToLoad; i++) {
-                       this._addTile(queue[i], fragment);
-               }
-
-               this._tileContainer.appendChild(fragment);
-       },
-
-       _tileShouldBeLoaded: function (tilePoint) {
-               if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {
-                       return false; // already loaded
-               }
-
-               var options = this.options;
-
-               if (!options.continuousWorld) {
-                       var limit = this._getWrapTileNum();
-
-                       // don't load if exceeds world bounds
-                       if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x 
>= limit.x)) ||
-                               tilePoint.y < 0 || tilePoint.y >= limit.y) { 
return false; }
-               }
-
-               if (options.bounds) {
-                       var tileSize = options.tileSize,
-                           nwPoint = tilePoint.multiplyBy(tileSize),
-                           sePoint = nwPoint.add([tileSize, tileSize]),
-                           nw = this._map.unproject(nwPoint),
-                           se = this._map.unproject(sePoint);
-
-                       // TODO temporary hack, will be removed after 
refactoring projections
-                       // https://github.com/Leaflet/Leaflet/issues/1618
-                       if (!options.continuousWorld && !options.noWrap) {
-                               nw = nw.wrap();
-                               se = se.wrap();
-                       }
-
-                       if (!options.bounds.intersects([nw, se])) { return 
false; }
-               }
-
-               return true;
-       },
-
-       _removeOtherTiles: function (bounds) {
-               var kArr, x, y, key;
-
-               for (key in this._tiles) {
-                       kArr = key.split(':');
-                       x = parseInt(kArr[0], 10);
-                       y = parseInt(kArr[1], 10);
-
-                       // remove tile if it's out of bounds
-                       if (x < bounds.min.x || x > bounds.max.x || y < 
bounds.min.y || y > bounds.max.y) {
-                               this._removeTile(key);
-                       }
-               }
-       },
-
-       _removeTile: function (key) {
-               var tile = this._tiles[key];
-
-               this.fire('tileunload', {tile: tile, url: tile.src});
-
-               if (this.options.reuseTiles) {
-                       L.DomUtil.removeClass(tile, 'leaflet-tile-loaded');
-                       this._unusedTiles.push(tile);
-
-               } else if (tile.parentNode === this._tileContainer) {
-                       this._tileContainer.removeChild(tile);
-               }
-
-               // for https://github.com/CloudMade/Leaflet/issues/137
-               if (!L.Browser.android) {
-                       tile.onload = null;
-                       tile.src = L.Util.emptyImageUrl;
-               }
-
-               delete this._tiles[key];
-       },
-
-       _addTile: function (tilePoint, container) {
-               var tilePos = this._getTilePos(tilePoint);
-
-               // get unused tile - or create a new tile
-               var tile = this._getTile();
-
-               /*
-               Chrome 20 layouts much faster with top/left (verify with 
timeline, frames)
-               Android 4 browser has display issues with top/left and requires 
transform instead
-               (other browsers don't currently care) - see 
debug/hacks/jitter.html for an example
-               */
-               L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);
-
-               this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;
-
-               this._loadTile(tile, tilePoint);
-
-               if (tile.parentNode !== this._tileContainer) {
-                       container.appendChild(tile);
-               }
-       },
-
-       _getZoomForUrl: function () {
-
-               var options = this.options,
-                   zoom = this._map.getZoom();
-
-               if (options.zoomReverse) {
-                       zoom = options.maxZoom - zoom;
-               }
-
-               zoom += options.zoomOffset;
-
-               return options.maxNativeZoom ? Math.min(zoom, 
options.maxNativeZoom) : zoom;
-       },
-
-       _getTilePos: function (tilePoint) {
-               var origin = this._map.getPixelOrigin(),
-                   tileSize = this._getTileSize();
-
-               return tilePoint.multiplyBy(tileSize).subtract(origin);
-       },
-
-       // image-specific code (override to implement e.g. Canvas or SVG tile 
layer)
-
-       getTileUrl: function (tilePoint) {
-               return L.Util.template(this._url, L.extend({
-                       s: this._getSubdomain(tilePoint),
-                       z: tilePoint.z,
-                       x: tilePoint.x,
-                       y: tilePoint.y
-               }, this.options));
-       },
-
-       _getWrapTileNum: function () {
-               var crs = this._map.options.crs,
-                   size = crs.getSize(this._map.getZoom());
-               return size.divideBy(this._getTileSize())._floor();
-       },
-
-       _adjustTilePoint: function (tilePoint) {
-
-               var limit = this._getWrapTileNum();
-
-               // wrap tile coordinates
-               if (!this.options.continuousWorld && !this.options.noWrap) {
-                       tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % 
limit.x;
-               }
-
-               if (this.options.tms) {
-                       tilePoint.y = limit.y - tilePoint.y - 1;
-               }
-
-               tilePoint.z = this._getZoomForUrl();
-       },
-
-       _getSubdomain: function (tilePoint) {
-               var index = Math.abs(tilePoint.x + tilePoint.y) % 
this.options.subdomains.length;
-               return this.options.subdomains[index];
-       },
-
-       _getTile: function () {
-               if (this.options.reuseTiles && this._unusedTiles.length > 0) {
-                       var tile = this._unusedTiles.pop();
-                       this._resetTile(tile);
-                       return tile;
-               }
-               return this._createTile();
-       },
-
-       // Override if data stored on a tile needs to be cleaned up before reuse
-       _resetTile: function (/*tile*/) {},
-
-       _createTile: function () {
-               var tile = L.DomUtil.create('img', 'leaflet-tile');
-               tile.style.width = tile.style.height = this._getTileSize() + 
'px';
-               tile.galleryimg = 'no';
-
-               tile.onselectstart = tile.onmousemove = L.Util.falseFn;
-
-               if (L.Browser.ielt9 && this.options.opacity !== undefined) {
-                       L.DomUtil.setOpacity(tile, this.options.opacity);
-               }
-               // without this hack, tiles disappear after zoom on Chrome for 
Android
-               // https://github.com/Leaflet/Leaflet/issues/2078
-               if (L.Browser.mobileWebkit3d) {
-                       tile.style.WebkitBackfaceVisibility = 'hidden';
-               }
-               return tile;
-       },
-
-       _loadTile: function (tile, tilePoint) {
-               tile._layer  = this;
-               tile.onload  = this._tileOnLoad;
-               tile.onerror = this._tileOnError;
-
-               this._adjustTilePoint(tilePoint);
-               tile.src     = this.getTileUrl(tilePoint);
-
-               this.fire('tileloadstart', {
-                       tile: tile,
-                       url: tile.src
-               });
-       },
-
-       _tileLoaded: function () {
-               this._tilesToLoad--;
-
-               if (this._animated) {
-                       L.DomUtil.addClass(this._tileContainer, 
'leaflet-zoom-animated');
-               }
-
-               if (!this._tilesToLoad) {
-                       this.fire('load');
-
-                       if (this._animated) {
-                               // clear scaled tiles after all new tiles are 
loaded (for performance)
-                               clearTimeout(this._clearBgBufferTimer);
-                               this._clearBgBufferTimer = 
setTimeout(L.bind(this._clearBgBuffer, this), 500);
-                       }
-               }
-       },
-
-       _tileOnLoad: function () {
-               var layer = this._layer;
-
-               //Only if we are loading an actual image
-               if (this.src !== L.Util.emptyImageUrl) {
-                       L.DomUtil.addClass(this, 'leaflet-tile-loaded');
-
-                       layer.fire('tileload', {
-                               tile: this,
-                               url: this.src
-                       });
-               }
-
-               layer._tileLoaded();
-       },
-
-       _tileOnError: function () {
-               var layer = this._layer;
-
-               layer.fire('tileerror', {
-                       tile: this,
-                       url: this.src
-               });
-
-               var newUrl = layer.options.errorTileUrl;
-               if (newUrl) {
-                       this.src = newUrl;
-               }
-
-               layer._tileLoaded();
-       }
-});
-
-L.tileLayer = function (url, options) {
-       return new L.TileLayer(url, options);
-};
-
-
-/*
- * L.TileLayer.WMS is used for putting WMS tile layers on the map.
- */
-
-L.TileLayer.WMS = L.TileLayer.extend({
-
-       defaultWmsParams: {
-               service: 'WMS',
-               request: 'GetMap',
-               version: '1.1.1',
-               layers: '',
-               styles: '',
-               format: 'image/jpeg',
-               transparent: false
-       },
-
-       initialize: function (url, options) { // (String, Object)
-
-               this._url = url;
-
-               var wmsParams = L.extend({}, this.defaultWmsParams),
-                   tileSize = options.tileSize || this.options.tileSize;
-
-               if (options.detectRetina && L.Browser.retina) {
-                       wmsParams.width = wmsParams.height = tileSize * 2;
-               } else {
-                       wmsParams.width = wmsParams.height = tileSize;
-               }
-
-               for (var i in options) {
-                       // all keys that are not TileLayer options go to WMS 
params
-                       if (!this.options.hasOwnProperty(i) && i !== 'crs') {
-                               wmsParams[i] = options[i];
-                       }
-               }
-
-               this.wmsParams = wmsParams;
-
-               L.setOptions(this, options);
-       },
-
-       onAdd: function (map) {
-
-               this._crs = this.options.crs || map.options.crs;
-
-               this._wmsVersion = parseFloat(this.wmsParams.version);
-
-               var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
-               this.wmsParams[projectionKey] = this._crs.code;
-
-               L.TileLayer.prototype.onAdd.call(this, map);
-       },
-
-       getTileUrl: function (tilePoint) { // (Point, Number) -> String
-
-               var map = this._map,
-                   tileSize = this.options.tileSize,
-
-                   nwPoint = tilePoint.multiplyBy(tileSize),
-                   sePoint = nwPoint.add([tileSize, tileSize]),
-
-                   nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),
-                   se = this._crs.project(map.unproject(sePoint, tilePoint.z)),
-                   bbox = this._wmsVersion >= 1.3 && this._crs === 
L.CRS.EPSG4326 ?
-                       [se.y, nw.x, nw.y, se.x].join(',') :
-                       [nw.x, se.y, se.x, nw.y].join(','),
-
-                   url = L.Util.template(this._url, {s: 
this._getSubdomain(tilePoint)});
-
-               return url + L.Util.getParamString(this.wmsParams, url, true) + 
'&BBOX=' + bbox;
-       },
-
-       setParams: function (params, noRedraw) {
-
-               L.extend(this.wmsParams, params);
-
-               if (!noRedraw) {
-                       this.redraw();
-               }
-
-               return this;
-       }
-});
-
-L.tileLayer.wms = function (url, options) {
-       return new L.TileLayer.WMS(url, options);
-};
-
-
-/*
- * L.TileLayer.Canvas is a class that you can use as a base for creating
- * dynamically drawn Canvas-based tile layers.
- */
-
-L.TileLayer.Canvas = L.TileLayer.extend({
-       options: {
-               async: false
-       },
-
-       initialize: function (options) {
-               L.setOptions(this, options);
-       },
-
-       redraw: function () {
-               if (this._map) {
-                       this._reset({hard: true});
-                       this._update();
-               }
-
-               for (var i in this._tiles) {
-                       this._redrawTile(this._tiles[i]);
-               }
-               return this;
-       },
-
-       _redrawTile: function (tile) {
-               this.drawTile(tile, tile._tilePoint, this._map._zoom);
-       },
-
-       _createTile: function () {
-               var tile = L.DomUtil.create('canvas', 'leaflet-tile');
-               tile.width = tile.height = this.options.tileSize;
-               tile.onselectstart = tile.onmousemove = L.Util.falseFn;
-               return tile;
-       },
-
-       _loadTile: function (tile, tilePoint) {
-               tile._layer = this;
-               tile._tilePoint = tilePoint;
-
-               this._redrawTile(tile);
-
-               if (!this.options.async) {
-                       this.tileDrawn(tile);
-               }
-       },
-
-       drawTile: function (/*tile, tilePoint*/) {
-               // override with rendering code
-       },
-
-       tileDrawn: function (tile) {
-               this._tileOnLoad.call(tile);
-       }
-});
-
-
-L.tileLayer.canvas = function (options) {
-       return new L.TileLayer.Canvas(options);
-};
-
-
-/*
- * L.ImageOverlay is used to overlay images over the map (to specific 
geographical bounds).
- */
-
-L.ImageOverlay = L.Class.extend({
-       includes: L.Mixin.Events,
-
-       options: {
-               opacity: 1
-       },
-
-       initialize: function (url, bounds, options) { // (String, LatLngBounds, 
Object)
-               this._url = url;
-               this._bounds = L.latLngBounds(bounds);
-
-               L.setOptions(this, options);
-       },
-
-       onAdd: function (map) {
-               this._map = map;
-
-               if (!this._image) {
-                       this._initImage();
-               }
-
-               map._panes.overlayPane.appendChild(this._image);
-
-               map.on('viewreset', this._reset, this);
-
-               if (map.options.zoomAnimation && L.Browser.any3d) {
-                       map.on('zoomanim', this._animateZoom, this);
-               }
-
-               this._reset();
-       },
-
-       onRemove: function (map) {
-               map.getPanes().overlayPane.removeChild(this._image);
-
-               map.off('viewreset', this._reset, this);
-
-               if (map.options.zoomAnimation) {
-                       map.off('zoomanim', this._animateZoom, this);
-               }
-       },
-
-       addTo: function (map) {
-               map.addLayer(this);
-               return this;
-       },
-
-       setOpacity: function (opacity) {
-               this.options.opacity = opacity;
-               this._updateOpacity();
-               return this;
-       },
-
-       // TODO remove bringToFront/bringToBack duplication from TileLayer/Path
-       bringToFront: function () {
-               if (this._image) {
-                       this._map._panes.overlayPane.appendChild(this._image);
-               }
-               return this;
-       },
-
-       bringToBack: function () {
-               var pane = this._map._panes.overlayPane;
-               if (this._image) {
-                       pane.insertBefore(this._image, pane.firstChild);
-               }
-               return this;
-       },
-
-       setUrl: function (url) {
-               this._url = url;
-               this._image.src = this._url;
-       },
-
-       getAttribution: function () {
-               return this.options.attribution;
-       },
-
-       _initImage: function () {
-               this._image = L.DomUtil.create('img', 'leaflet-image-layer');
-
-               if (this._map.options.zoomAnimation && L.Browser.any3d) {
-                       L.DomUtil.addClass(this._image, 
'leaflet-zoom-animated');
-               } else {
-                       L.DomUtil.addClass(this._image, 'leaflet-zoom-hide');
-               }
-
-               this._updateOpacity();
-
-               //TODO createImage util method to remove duplication
-               L.extend(this._image, {
-                       galleryimg: 'no',
-                       onselectstart: L.Util.falseFn,
-                       onmousemove: L.Util.falseFn,
-                       onload: L.bind(this._onImageLoad, this),
-                       src: this._url
-               });
-       },
-
-       _animateZoom: function (e) {
-               var map = this._map,
-                   image = this._image,
-                   scale = map.getZoomScale(e.zoom),
-                   nw = this._bounds.getNorthWest(),
-                   se = this._bounds.getSouthEast(),
-
-                   topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),
-                   size = map._latLngToNewLayerPoint(se, e.zoom, 
e.center)._subtract(topLeft),
-                   origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / 
scale)));
-
-               image.style[L.DomUtil.TRANSFORM] =
-                       L.DomUtil.getTranslateString(origin) + ' scale(' + 
scale + ') ';
-       },
-
-       _reset: function () {
-               var image   = this._image,
-                   topLeft = 
this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
-                   size = 
this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);
-
-               L.DomUtil.setPosition(image, topLeft);
-
-               image.style.width  = size.x + 'px';
-               image.style.height = size.y + 'px';
-       },
-
-       _onImageLoad: function () {
-               this.fire('load');
-       },
-
-       _updateOpacity: function () {
-               L.DomUtil.setOpacity(this._image, this.options.opacity);
-       }
-});
-
-L.imageOverlay = function (url, bounds, options) {
-       return new L.ImageOverlay(url, bounds, options);
-};
-
-
-/*
- * L.Icon is an image-based icon class that you can use with L.Marker for 
custom markers.
- */
-
-L.Icon = L.Class.extend({
-       options: {
-               /*
-               iconUrl: (String) (required)
-               iconRetinaUrl: (String) (optional, used for retina devices if 
detected)
-               iconSize: (Point) (can be set through CSS)
-               iconAnchor: (Point) (centered by default, can be set in CSS 
with negative margins)
-               popupAnchor: (Point) (if not specified, popup opens in the 
anchor point)
-               shadowUrl: (String) (no shadow by default)
-               shadowRetinaUrl: (String) (optional, used for retina devices if 
detected)
-               shadowSize: (Point)
-               shadowAnchor: (Point)
-               */
-               className: ''
-       },
-
-       initialize: function (options) {
-               L.setOptions(this, options);
-       },
-
-       createIcon: function (oldIcon) {
-               return this._createIcon('icon', oldIcon);
-       },
-
-       createShadow: function (oldIcon) {
-               return this._createIcon('shadow', oldIcon);
-       },
-
-       _createIcon: function (name, oldIcon) {
-               var src = this._getIconUrl(name);
-
-               if (!src) {
-                       if (name === 'icon') {
-                               throw new Error('iconUrl not set in Icon 
options (see the docs).');
-                       }
-                       return null;
-               }
-
-               var img;
-               if (!oldIcon || oldIcon.tagName !== 'IMG') {
-                       img = this._createImg(src);
-               } else {
-                       img = this._createImg(src, oldIcon);
-               }
-               this._setIconStyles(img, name);
-
-               return img;
-       },
-
-       _setIconStyles: function (img, name) {
-               var options = this.options,
-                   size = L.point(options[name + 'Size']),
-                   anchor;
-
-               if (name === 'shadow') {
-                       anchor = L.point(options.shadowAnchor || 
options.iconAnchor);
-               } else {
-                       anchor = L.point(options.iconAnchor);
-               }
-
-               if (!anchor && size) {
-                       anchor = size.divideBy(2, true);
-               }
-
-               img.className = 'leaflet-marker-' + name + ' ' + 
options.className;
-
-               if (anchor) {
-                       img.style.marginLeft = (-anchor.x) + 'px';
-                       img.style.marginTop  = (-anchor.y) + 'px';
-               }
-
-               if (size) {
-                       img.style.width  = size.x + 'px';
-                       img.style.height = size.y + 'px';
-               }
-       },
-
-       _createImg: function (src, el) {
-               el = el || document.createElement('img');
-               el.src = src;
-               return el;
-       },
-
-       _getIconUrl: function (name) {
-               if (L.Browser.retina && this.options[name + 'RetinaUrl']) {
-                       return this.options[name + 'RetinaUrl'];
-               }
-               return this.options[name + 'Url'];
-       }
-});
-
-L.icon = function (options) {
-       return new L.Icon(options);
-};
-
-
-/*
- * L.Icon.Default is the blue marker icon used by default in Leaflet.
- */
-
-L.Icon.Default = L.Icon.extend({
-
-       options: {
-               iconSize: [25, 41],
-               iconAnchor: [12, 41],
-               popupAnchor: [1, -34],
-
-               shadowSize: [41, 41]
-       },
-
-       _getIconUrl: function (name) {
-               var key = name + 'Url';
-
-               if (this.options[key]) {
-                       return this.options[key];
-               }
-
-               if (L.Browser.retina && name === 'icon') {
-                       name += '-2x';
-               }
-
-               var path = L.Icon.Default.imagePath;
-
-               if (!path) {
-                       throw new Error('Couldn\'t autodetect 
L.Icon.Default.imagePath, set it manually.');
-               }
-
-               return path + '/marker-' + name + '.png';
-       }
-});
-
-L.Icon.Default.imagePath = (function () {
-       var scripts = document.getElementsByTagName('script'),
-           leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;
-
-       var i, len, src, matches, path;
-
-       for (i = 0, len = scripts.length; i < len; i++) {
-               src = scripts[i].src;
-               matches = src.match(leafletRe);
-
-               if (matches) {
-                       path = src.split(leafletRe)[0];
-                       return (path ? path + '/' : '') + 'images';
-               }
-       }
-}());
-
-
-/*
- * L.Marker is used to display clickable/draggable icons on the map.
- */
-
-L.Marker = L.Class.extend({
-
-       includes: L.Mixin.Events,
-
-       options: {
-               icon: new L.Icon.Default(),
-               title: '',
-               alt: '',
-               clickable: true,
-               draggable: false,
-               keyboard: true,
-               zIndexOffset: 0,
-               opacity: 1,
-               riseOnHover: false,
-               riseOffset: 250
-       },
-
-       initialize: function (latlng, options) {
-               L.setOptions(this, options);
-               this._latlng = L.latLng(latlng);
-       },
-
-       onAdd: function (map) {
-               this._map = map;
-
-               map.on('viewreset', this.update, this);
-
-               this._initIcon();
-               this.update();
-               this.fire('add');
-
-               if (map.options.zoomAnimation && 
map.options.markerZoomAnimation) {
-                       map.on('zoomanim', this._animateZoom, this);
-               }
-       },
-
-       addTo: function (map) {
-               map.addLayer(this);
-               return this;
-       },
-
-       onRemove: function (map) {
-               if (this.dragging) {

... etc. - the rest is truncated
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to